(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-elementUI"],{"12f2":function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\n\nexports.default = function (ref) {\n return {\n methods: {\n focus: function focus() {\n this.$refs[ref].focus();\n }\n }\n };\n};\n\n;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvbWl4aW5zL2ZvY3VzLmpzPzEyZjIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjEyZjIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKHJlZikge1xuICByZXR1cm4ge1xuICAgIG1ldGhvZHM6IHtcbiAgICAgIGZvY3VzOiBmdW5jdGlvbiBmb2N1cygpIHtcbiAgICAgICAgdGhpcy4kcmVmc1tyZWZdLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcblxuOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///12f2\n")},"14e9":function(module,exports,__webpack_require__){eval("module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"/dist/\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 133);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 133:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n\n// EXTERNAL MODULE: external \"element-ui/lib/utils/resize-event\"\nvar resize_event_ = __webpack_require__(16);\n\n// EXTERNAL MODULE: external \"element-ui/lib/utils/scrollbar-width\"\nvar scrollbar_width_ = __webpack_require__(39);\nvar scrollbar_width_default = /*#__PURE__*/__webpack_require__.n(scrollbar_width_);\n\n// EXTERNAL MODULE: external \"element-ui/lib/utils/util\"\nvar util_ = __webpack_require__(3);\n\n// EXTERNAL MODULE: external \"element-ui/lib/utils/dom\"\nvar dom_ = __webpack_require__(2);\n\n// CONCATENATED MODULE: ./packages/scrollbar/src/util.js\nvar BAR_MAP = {\n vertical: {\n offset: 'offsetHeight',\n scroll: 'scrollTop',\n scrollSize: 'scrollHeight',\n size: 'height',\n key: 'vertical',\n axis: 'Y',\n client: 'clientY',\n direction: 'top'\n },\n horizontal: {\n offset: 'offsetWidth',\n scroll: 'scrollLeft',\n scrollSize: 'scrollWidth',\n size: 'width',\n key: 'horizontal',\n axis: 'X',\n client: 'clientX',\n direction: 'left'\n }\n};\n\nfunction renderThumbStyle(_ref) {\n var move = _ref.move,\n size = _ref.size,\n bar = _ref.bar;\n\n var style = {};\n var translate = 'translate' + bar.axis + '(' + move + '%)';\n\n style[bar.size] = size;\n style.transform = translate;\n style.msTransform = translate;\n style.webkitTransform = translate;\n\n return style;\n};\n// CONCATENATED MODULE: ./packages/scrollbar/src/bar.js\n\n\n\n/* istanbul ignore next */\n/* harmony default export */ var src_bar = ({\n name: 'Bar',\n\n props: {\n vertical: Boolean,\n size: String,\n move: Number\n },\n\n computed: {\n bar: function bar() {\n return BAR_MAP[this.vertical ? 'vertical' : 'horizontal'];\n },\n wrap: function wrap() {\n return this.$parent.wrap;\n }\n },\n\n render: function render(h) {\n var size = this.size,\n move = this.move,\n bar = this.bar;\n\n\n return h(\n 'div',\n {\n 'class': ['el-scrollbar__bar', 'is-' + bar.key],\n on: {\n 'mousedown': this.clickTrackHandler\n }\n },\n [h('div', {\n ref: 'thumb',\n 'class': 'el-scrollbar__thumb',\n on: {\n 'mousedown': this.clickThumbHandler\n },\n\n style: renderThumbStyle({ size: size, move: move, bar: bar }) })]\n );\n },\n\n\n methods: {\n clickThumbHandler: function clickThumbHandler(e) {\n // prevent click event of right button\n if (e.ctrlKey || e.button === 2) {\n return;\n }\n this.startDrag(e);\n this[this.bar.axis] = e.currentTarget[this.bar.offset] - (e[this.bar.client] - e.currentTarget.getBoundingClientRect()[this.bar.direction]);\n },\n clickTrackHandler: function clickTrackHandler(e) {\n var offset = Math.abs(e.target.getBoundingClientRect()[this.bar.direction] - e[this.bar.client]);\n var thumbHalf = this.$refs.thumb[this.bar.offset] / 2;\n var thumbPositionPercentage = (offset - thumbHalf) * 100 / this.$el[this.bar.offset];\n\n this.wrap[this.bar.scroll] = thumbPositionPercentage * this.wrap[this.bar.scrollSize] / 100;\n },\n startDrag: function startDrag(e) {\n e.stopImmediatePropagation();\n this.cursorDown = true;\n\n Object(dom_[\"on\"])(document, 'mousemove', this.mouseMoveDocumentHandler);\n Object(dom_[\"on\"])(document, 'mouseup', this.mouseUpDocumentHandler);\n document.onselectstart = function () {\n return false;\n };\n },\n mouseMoveDocumentHandler: function mouseMoveDocumentHandler(e) {\n if (this.cursorDown === false) return;\n var prevPage = this[this.bar.axis];\n\n if (!prevPage) return;\n\n var offset = (this.$el.getBoundingClientRect()[this.bar.direction] - e[this.bar.client]) * -1;\n var thumbClickPosition = this.$refs.thumb[this.bar.offset] - prevPage;\n var thumbPositionPercentage = (offset - thumbClickPosition) * 100 / this.$el[this.bar.offset];\n\n this.wrap[this.bar.scroll] = thumbPositionPercentage * this.wrap[this.bar.scrollSize] / 100;\n },\n mouseUpDocumentHandler: function mouseUpDocumentHandler(e) {\n this.cursorDown = false;\n this[this.bar.axis] = 0;\n Object(dom_[\"off\"])(document, 'mousemove', this.mouseMoveDocumentHandler);\n document.onselectstart = null;\n }\n },\n\n destroyed: function destroyed() {\n Object(dom_[\"off\"])(document, 'mouseup', this.mouseUpDocumentHandler);\n }\n});\n// CONCATENATED MODULE: ./packages/scrollbar/src/main.js\n// reference https://github.com/noeldelgado/gemini-scrollbar/blob/master/index.js\n\n\n\n\n\n\n/* istanbul ignore next */\n/* harmony default export */ var main = ({\n name: 'ElScrollbar',\n\n components: { Bar: src_bar },\n\n props: {\n native: Boolean,\n wrapStyle: {},\n wrapClass: {},\n viewClass: {},\n viewStyle: {},\n noresize: Boolean, // 如果 container 尺寸不会发生变化,最好设置它可以优化性能\n tag: {\n type: String,\n default: 'div'\n }\n },\n\n data: function data() {\n return {\n sizeWidth: '0',\n sizeHeight: '0',\n moveX: 0,\n moveY: 0\n };\n },\n\n\n computed: {\n wrap: function wrap() {\n return this.$refs.wrap;\n }\n },\n\n render: function render(h) {\n var gutter = scrollbar_width_default()();\n var style = this.wrapStyle;\n\n if (gutter) {\n var gutterWith = '-' + gutter + 'px';\n var gutterStyle = 'margin-bottom: ' + gutterWith + '; margin-right: ' + gutterWith + ';';\n\n if (Array.isArray(this.wrapStyle)) {\n style = Object(util_[\"toObject\"])(this.wrapStyle);\n style.marginRight = style.marginBottom = gutterWith;\n } else if (typeof this.wrapStyle === 'string') {\n style += gutterStyle;\n } else {\n style = gutterStyle;\n }\n }\n var view = h(this.tag, {\n class: ['el-scrollbar__view', this.viewClass],\n style: this.viewStyle,\n ref: 'resize'\n }, this.$slots.default);\n var wrap = h(\n 'div',\n {\n ref: 'wrap',\n style: style,\n on: {\n 'scroll': this.handleScroll\n },\n\n 'class': [this.wrapClass, 'el-scrollbar__wrap', gutter ? '' : 'el-scrollbar__wrap--hidden-default'] },\n [[view]]\n );\n var nodes = void 0;\n\n if (!this.native) {\n nodes = [wrap, h(src_bar, {\n attrs: {\n move: this.moveX,\n size: this.sizeWidth }\n }), h(src_bar, {\n attrs: {\n vertical: true,\n move: this.moveY,\n size: this.sizeHeight }\n })];\n } else {\n nodes = [h(\n 'div',\n {\n ref: 'wrap',\n 'class': [this.wrapClass, 'el-scrollbar__wrap'],\n style: style },\n [[view]]\n )];\n }\n return h('div', { class: 'el-scrollbar' }, nodes);\n },\n\n\n methods: {\n handleScroll: function handleScroll() {\n var wrap = this.wrap;\n\n this.moveY = wrap.scrollTop * 100 / wrap.clientHeight;\n this.moveX = wrap.scrollLeft * 100 / wrap.clientWidth;\n },\n update: function update() {\n var heightPercentage = void 0,\n widthPercentage = void 0;\n var wrap = this.wrap;\n if (!wrap) return;\n\n heightPercentage = wrap.clientHeight * 100 / wrap.scrollHeight;\n widthPercentage = wrap.clientWidth * 100 / wrap.scrollWidth;\n\n this.sizeHeight = heightPercentage < 100 ? heightPercentage + '%' : '';\n this.sizeWidth = widthPercentage < 100 ? widthPercentage + '%' : '';\n }\n },\n\n mounted: function mounted() {\n if (this.native) return;\n this.$nextTick(this.update);\n !this.noresize && Object(resize_event_[\"addResizeListener\"])(this.$refs.resize, this.update);\n },\n beforeDestroy: function beforeDestroy() {\n if (this.native) return;\n !this.noresize && Object(resize_event_[\"removeResizeListener\"])(this.$refs.resize, this.update);\n }\n});\n// CONCATENATED MODULE: ./packages/scrollbar/index.js\n\n\n/* istanbul ignore next */\nmain.install = function (Vue) {\n Vue.component(main.name, main);\n};\n\n/* harmony default export */ var scrollbar = __webpack_exports__[\"default\"] = (main);\n\n/***/ }),\n\n/***/ 16:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"4010\");\n\n/***/ }),\n\n/***/ 2:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"5924\");\n\n/***/ }),\n\n/***/ 3:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"8122\");\n\n/***/ }),\n\n/***/ 39:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"e62d\");\n\n/***/ })\n\n/******/ });\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvc2Nyb2xsYmFyLmpzPzE0ZTkiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0QsZ0NBQWdDO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRSxrQkFBa0I7QUFDbEY7QUFDQSx5REFBeUQsY0FBYztBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxpQ0FBaUM7QUFDbEYsd0hBQXdILG1CQUFtQixFQUFFO0FBQzdJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQywwQkFBMEIsRUFBRTtBQUMvRCx5Q0FBeUMsZUFBZTtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThELCtEQUErRDtBQUM3SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQsaUNBQWlDLG1DQUFtQyxHQUFHO0FBQ3ZFO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7O0FBRUEsZUFBZSxlQUFlOztBQUU5QjtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGlCQUFpQjtBQUNqQixpQkFBaUI7QUFDakIsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMkRBQTJELGtDQUFrQzs7QUFFN0Y7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVCw2R0FBNkc7QUFDN0c7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLHdCQUF3QjtBQUM3QyxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsT0FBTzs7QUFFUDtBQUNBOztBQUVBLGlCQUFpQixtQkFBTyxDQUFDLE1BQW1DOztBQUU1RCxPQUFPOztBQUVQO0FBQ0E7O0FBRUEsaUJBQWlCLG1CQUFPLENBQUMsTUFBMEI7O0FBRW5ELE9BQU87O0FBRVA7QUFDQTs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQyxNQUEyQjs7QUFFcEQsT0FBTzs7QUFFUDtBQUNBOztBQUVBLGlCQUFpQixtQkFBTyxDQUFDLE1BQXNDOztBQUUvRCxPQUFPOztBQUVQLFVBQVUiLCJmaWxlIjoiMTRlOS5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID1cbi8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4vKioqKioqLyBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4vKioqKioqLyBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuLyoqKioqKi8gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbi8qKioqKiovIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuLyoqKioqKi8gXHRcdHJldHVybiBucztcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCIvZGlzdC9cIjtcbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMTMzKTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKHtcblxuLyoqKi8gMTMzOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL3V0aWxzL3Jlc2l6ZS1ldmVudFwiXG52YXIgcmVzaXplX2V2ZW50XyA9IF9fd2VicGFja19yZXF1aXJlX18oMTYpO1xuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvdXRpbHMvc2Nyb2xsYmFyLXdpZHRoXCJcbnZhciBzY3JvbGxiYXJfd2lkdGhfID0gX193ZWJwYWNrX3JlcXVpcmVfXygzOSk7XG52YXIgc2Nyb2xsYmFyX3dpZHRoX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKHNjcm9sbGJhcl93aWR0aF8pO1xuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvdXRpbHMvdXRpbFwiXG52YXIgdXRpbF8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvdXRpbHMvZG9tXCJcbnZhciBkb21fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zY3JvbGxiYXIvc3JjL3V0aWwuanNcbnZhciBCQVJfTUFQID0ge1xuICB2ZXJ0aWNhbDoge1xuICAgIG9mZnNldDogJ29mZnNldEhlaWdodCcsXG4gICAgc2Nyb2xsOiAnc2Nyb2xsVG9wJyxcbiAgICBzY3JvbGxTaXplOiAnc2Nyb2xsSGVpZ2h0JyxcbiAgICBzaXplOiAnaGVpZ2h0JyxcbiAgICBrZXk6ICd2ZXJ0aWNhbCcsXG4gICAgYXhpczogJ1knLFxuICAgIGNsaWVudDogJ2NsaWVudFknLFxuICAgIGRpcmVjdGlvbjogJ3RvcCdcbiAgfSxcbiAgaG9yaXpvbnRhbDoge1xuICAgIG9mZnNldDogJ29mZnNldFdpZHRoJyxcbiAgICBzY3JvbGw6ICdzY3JvbGxMZWZ0JyxcbiAgICBzY3JvbGxTaXplOiAnc2Nyb2xsV2lkdGgnLFxuICAgIHNpemU6ICd3aWR0aCcsXG4gICAga2V5OiAnaG9yaXpvbnRhbCcsXG4gICAgYXhpczogJ1gnLFxuICAgIGNsaWVudDogJ2NsaWVudFgnLFxuICAgIGRpcmVjdGlvbjogJ2xlZnQnXG4gIH1cbn07XG5cbmZ1bmN0aW9uIHJlbmRlclRodW1iU3R5bGUoX3JlZikge1xuICB2YXIgbW92ZSA9IF9yZWYubW92ZSxcbiAgICAgIHNpemUgPSBfcmVmLnNpemUsXG4gICAgICBiYXIgPSBfcmVmLmJhcjtcblxuICB2YXIgc3R5bGUgPSB7fTtcbiAgdmFyIHRyYW5zbGF0ZSA9ICd0cmFuc2xhdGUnICsgYmFyLmF4aXMgKyAnKCcgKyBtb3ZlICsgJyUpJztcblxuICBzdHlsZVtiYXIuc2l6ZV0gPSBzaXplO1xuICBzdHlsZS50cmFuc2Zvcm0gPSB0cmFuc2xhdGU7XG4gIHN0eWxlLm1zVHJhbnNmb3JtID0gdHJhbnNsYXRlO1xuICBzdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSB0cmFuc2xhdGU7XG5cbiAgcmV0dXJuIHN0eWxlO1xufTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc2Nyb2xsYmFyL3NyYy9iYXIuanNcblxuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfYmFyID0gKHtcbiAgbmFtZTogJ0JhcicsXG5cbiAgcHJvcHM6IHtcbiAgICB2ZXJ0aWNhbDogQm9vbGVhbixcbiAgICBzaXplOiBTdHJpbmcsXG4gICAgbW92ZTogTnVtYmVyXG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBiYXI6IGZ1bmN0aW9uIGJhcigpIHtcbiAgICAgIHJldHVybiBCQVJfTUFQW3RoaXMudmVydGljYWwgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnXTtcbiAgICB9LFxuICAgIHdyYXA6IGZ1bmN0aW9uIHdyYXAoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcGFyZW50LndyYXA7XG4gICAgfVxuICB9LFxuXG4gIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKGgpIHtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuc2l6ZSxcbiAgICAgICAgbW92ZSA9IHRoaXMubW92ZSxcbiAgICAgICAgYmFyID0gdGhpcy5iYXI7XG5cblxuICAgIHJldHVybiBoKFxuICAgICAgJ2RpdicsXG4gICAgICB7XG4gICAgICAgICdjbGFzcyc6IFsnZWwtc2Nyb2xsYmFyX19iYXInLCAnaXMtJyArIGJhci5rZXldLFxuICAgICAgICBvbjoge1xuICAgICAgICAgICdtb3VzZWRvd24nOiB0aGlzLmNsaWNrVHJhY2tIYW5kbGVyXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbaCgnZGl2Jywge1xuICAgICAgICByZWY6ICd0aHVtYicsXG4gICAgICAgICdjbGFzcyc6ICdlbC1zY3JvbGxiYXJfX3RodW1iJyxcbiAgICAgICAgb246IHtcbiAgICAgICAgICAnbW91c2Vkb3duJzogdGhpcy5jbGlja1RodW1iSGFuZGxlclxuICAgICAgICB9LFxuXG4gICAgICAgIHN0eWxlOiByZW5kZXJUaHVtYlN0eWxlKHsgc2l6ZTogc2l6ZSwgbW92ZTogbW92ZSwgYmFyOiBiYXIgfSkgfSldXG4gICAgKTtcbiAgfSxcblxuXG4gIG1ldGhvZHM6IHtcbiAgICBjbGlja1RodW1iSGFuZGxlcjogZnVuY3Rpb24gY2xpY2tUaHVtYkhhbmRsZXIoZSkge1xuICAgICAgLy8gcHJldmVudCBjbGljayBldmVudCBvZiByaWdodCBidXR0b25cbiAgICAgIGlmIChlLmN0cmxLZXkgfHwgZS5idXR0b24gPT09IDIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zdGFydERyYWcoZSk7XG4gICAgICB0aGlzW3RoaXMuYmFyLmF4aXNdID0gZS5jdXJyZW50VGFyZ2V0W3RoaXMuYmFyLm9mZnNldF0gLSAoZVt0aGlzLmJhci5jbGllbnRdIC0gZS5jdXJyZW50VGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW3RoaXMuYmFyLmRpcmVjdGlvbl0pO1xuICAgIH0sXG4gICAgY2xpY2tUcmFja0hhbmRsZXI6IGZ1bmN0aW9uIGNsaWNrVHJhY2tIYW5kbGVyKGUpIHtcbiAgICAgIHZhciBvZmZzZXQgPSBNYXRoLmFicyhlLnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVt0aGlzLmJhci5kaXJlY3Rpb25dIC0gZVt0aGlzLmJhci5jbGllbnRdKTtcbiAgICAgIHZhciB0aHVtYkhhbGYgPSB0aGlzLiRyZWZzLnRodW1iW3RoaXMuYmFyLm9mZnNldF0gLyAyO1xuICAgICAgdmFyIHRodW1iUG9zaXRpb25QZXJjZW50YWdlID0gKG9mZnNldCAtIHRodW1iSGFsZikgKiAxMDAgLyB0aGlzLiRlbFt0aGlzLmJhci5vZmZzZXRdO1xuXG4gICAgICB0aGlzLndyYXBbdGhpcy5iYXIuc2Nyb2xsXSA9IHRodW1iUG9zaXRpb25QZXJjZW50YWdlICogdGhpcy53cmFwW3RoaXMuYmFyLnNjcm9sbFNpemVdIC8gMTAwO1xuICAgIH0sXG4gICAgc3RhcnREcmFnOiBmdW5jdGlvbiBzdGFydERyYWcoZSkge1xuICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuY3Vyc29yRG93biA9IHRydWU7XG5cbiAgICAgIE9iamVjdChkb21fW1wib25cIl0pKGRvY3VtZW50LCAnbW91c2Vtb3ZlJywgdGhpcy5tb3VzZU1vdmVEb2N1bWVudEhhbmRsZXIpO1xuICAgICAgT2JqZWN0KGRvbV9bXCJvblwiXSkoZG9jdW1lbnQsICdtb3VzZXVwJywgdGhpcy5tb3VzZVVwRG9jdW1lbnRIYW5kbGVyKTtcbiAgICAgIGRvY3VtZW50Lm9uc2VsZWN0c3RhcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH07XG4gICAgfSxcbiAgICBtb3VzZU1vdmVEb2N1bWVudEhhbmRsZXI6IGZ1bmN0aW9uIG1vdXNlTW92ZURvY3VtZW50SGFuZGxlcihlKSB7XG4gICAgICBpZiAodGhpcy5jdXJzb3JEb3duID09PSBmYWxzZSkgcmV0dXJuO1xuICAgICAgdmFyIHByZXZQYWdlID0gdGhpc1t0aGlzLmJhci5heGlzXTtcblxuICAgICAgaWYgKCFwcmV2UGFnZSkgcmV0dXJuO1xuXG4gICAgICB2YXIgb2Zmc2V0ID0gKHRoaXMuJGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW3RoaXMuYmFyLmRpcmVjdGlvbl0gLSBlW3RoaXMuYmFyLmNsaWVudF0pICogLTE7XG4gICAgICB2YXIgdGh1bWJDbGlja1Bvc2l0aW9uID0gdGhpcy4kcmVmcy50aHVtYlt0aGlzLmJhci5vZmZzZXRdIC0gcHJldlBhZ2U7XG4gICAgICB2YXIgdGh1bWJQb3NpdGlvblBlcmNlbnRhZ2UgPSAob2Zmc2V0IC0gdGh1bWJDbGlja1Bvc2l0aW9uKSAqIDEwMCAvIHRoaXMuJGVsW3RoaXMuYmFyLm9mZnNldF07XG5cbiAgICAgIHRoaXMud3JhcFt0aGlzLmJhci5zY3JvbGxdID0gdGh1bWJQb3NpdGlvblBlcmNlbnRhZ2UgKiB0aGlzLndyYXBbdGhpcy5iYXIuc2Nyb2xsU2l6ZV0gLyAxMDA7XG4gICAgfSxcbiAgICBtb3VzZVVwRG9jdW1lbnRIYW5kbGVyOiBmdW5jdGlvbiBtb3VzZVVwRG9jdW1lbnRIYW5kbGVyKGUpIHtcbiAgICAgIHRoaXMuY3Vyc29yRG93biA9IGZhbHNlO1xuICAgICAgdGhpc1t0aGlzLmJhci5heGlzXSA9IDA7XG4gICAgICBPYmplY3QoZG9tX1tcIm9mZlwiXSkoZG9jdW1lbnQsICdtb3VzZW1vdmUnLCB0aGlzLm1vdXNlTW92ZURvY3VtZW50SGFuZGxlcik7XG4gICAgICBkb2N1bWVudC5vbnNlbGVjdHN0YXJ0ID0gbnVsbDtcbiAgICB9XG4gIH0sXG5cbiAgZGVzdHJveWVkOiBmdW5jdGlvbiBkZXN0cm95ZWQoKSB7XG4gICAgT2JqZWN0KGRvbV9bXCJvZmZcIl0pKGRvY3VtZW50LCAnbW91c2V1cCcsIHRoaXMubW91c2VVcERvY3VtZW50SGFuZGxlcik7XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zY3JvbGxiYXIvc3JjL21haW4uanNcbi8vIHJlZmVyZW5jZSBodHRwczovL2dpdGh1Yi5jb20vbm9lbGRlbGdhZG8vZ2VtaW5pLXNjcm9sbGJhci9ibG9iL21hc3Rlci9pbmRleC5qc1xuXG5cblxuXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIG1haW4gPSAoe1xuICBuYW1lOiAnRWxTY3JvbGxiYXInLFxuXG4gIGNvbXBvbmVudHM6IHsgQmFyOiBzcmNfYmFyIH0sXG5cbiAgcHJvcHM6IHtcbiAgICBuYXRpdmU6IEJvb2xlYW4sXG4gICAgd3JhcFN0eWxlOiB7fSxcbiAgICB3cmFwQ2xhc3M6IHt9LFxuICAgIHZpZXdDbGFzczoge30sXG4gICAgdmlld1N0eWxlOiB7fSxcbiAgICBub3Jlc2l6ZTogQm9vbGVhbiwgLy8g5aaC5p6cIGNvbnRhaW5lciDlsLrlr7jkuI3kvJrlj5HnlJ/lj5jljJbvvIzmnIDlpb3orr7nva7lroPlj6/ku6XkvJjljJbmgKfog71cbiAgICB0YWc6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdkaXYnXG4gICAgfVxuICB9LFxuXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNpemVXaWR0aDogJzAnLFxuICAgICAgc2l6ZUhlaWdodDogJzAnLFxuICAgICAgbW92ZVg6IDAsXG4gICAgICBtb3ZlWTogMFxuICAgIH07XG4gIH0sXG5cblxuICBjb21wdXRlZDoge1xuICAgIHdyYXA6IGZ1bmN0aW9uIHdyYXAoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcmVmcy53cmFwO1xuICAgIH1cbiAgfSxcblxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcihoKSB7XG4gICAgdmFyIGd1dHRlciA9IHNjcm9sbGJhcl93aWR0aF9kZWZhdWx0KCkoKTtcbiAgICB2YXIgc3R5bGUgPSB0aGlzLndyYXBTdHlsZTtcblxuICAgIGlmIChndXR0ZXIpIHtcbiAgICAgIHZhciBndXR0ZXJXaXRoID0gJy0nICsgZ3V0dGVyICsgJ3B4JztcbiAgICAgIHZhciBndXR0ZXJTdHlsZSA9ICdtYXJnaW4tYm90dG9tOiAnICsgZ3V0dGVyV2l0aCArICc7IG1hcmdpbi1yaWdodDogJyArIGd1dHRlcldpdGggKyAnOyc7XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMud3JhcFN0eWxlKSkge1xuICAgICAgICBzdHlsZSA9IE9iamVjdCh1dGlsX1tcInRvT2JqZWN0XCJdKSh0aGlzLndyYXBTdHlsZSk7XG4gICAgICAgIHN0eWxlLm1hcmdpblJpZ2h0ID0gc3R5bGUubWFyZ2luQm90dG9tID0gZ3V0dGVyV2l0aDtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMud3JhcFN0eWxlID09PSAnc3RyaW5nJykge1xuICAgICAgICBzdHlsZSArPSBndXR0ZXJTdHlsZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0eWxlID0gZ3V0dGVyU3R5bGU7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciB2aWV3ID0gaCh0aGlzLnRhZywge1xuICAgICAgY2xhc3M6IFsnZWwtc2Nyb2xsYmFyX192aWV3JywgdGhpcy52aWV3Q2xhc3NdLFxuICAgICAgc3R5bGU6IHRoaXMudmlld1N0eWxlLFxuICAgICAgcmVmOiAncmVzaXplJ1xuICAgIH0sIHRoaXMuJHNsb3RzLmRlZmF1bHQpO1xuICAgIHZhciB3cmFwID0gaChcbiAgICAgICdkaXYnLFxuICAgICAge1xuICAgICAgICByZWY6ICd3cmFwJyxcbiAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICBvbjoge1xuICAgICAgICAgICdzY3JvbGwnOiB0aGlzLmhhbmRsZVNjcm9sbFxuICAgICAgICB9LFxuXG4gICAgICAgICdjbGFzcyc6IFt0aGlzLndyYXBDbGFzcywgJ2VsLXNjcm9sbGJhcl9fd3JhcCcsIGd1dHRlciA/ICcnIDogJ2VsLXNjcm9sbGJhcl9fd3JhcC0taGlkZGVuLWRlZmF1bHQnXSB9LFxuICAgICAgW1t2aWV3XV1cbiAgICApO1xuICAgIHZhciBub2RlcyA9IHZvaWQgMDtcblxuICAgIGlmICghdGhpcy5uYXRpdmUpIHtcbiAgICAgIG5vZGVzID0gW3dyYXAsIGgoc3JjX2Jhciwge1xuICAgICAgICBhdHRyczoge1xuICAgICAgICAgIG1vdmU6IHRoaXMubW92ZVgsXG4gICAgICAgICAgc2l6ZTogdGhpcy5zaXplV2lkdGggfVxuICAgICAgfSksIGgoc3JjX2Jhciwge1xuICAgICAgICBhdHRyczoge1xuICAgICAgICAgIHZlcnRpY2FsOiB0cnVlLFxuICAgICAgICAgIG1vdmU6IHRoaXMubW92ZVksXG4gICAgICAgICAgc2l6ZTogdGhpcy5zaXplSGVpZ2h0IH1cbiAgICAgIH0pXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZXMgPSBbaChcbiAgICAgICAgJ2RpdicsXG4gICAgICAgIHtcbiAgICAgICAgICByZWY6ICd3cmFwJyxcbiAgICAgICAgICAnY2xhc3MnOiBbdGhpcy53cmFwQ2xhc3MsICdlbC1zY3JvbGxiYXJfX3dyYXAnXSxcbiAgICAgICAgICBzdHlsZTogc3R5bGUgfSxcbiAgICAgICAgW1t2aWV3XV1cbiAgICAgICldO1xuICAgIH1cbiAgICByZXR1cm4gaCgnZGl2JywgeyBjbGFzczogJ2VsLXNjcm9sbGJhcicgfSwgbm9kZXMpO1xuICB9LFxuXG5cbiAgbWV0aG9kczoge1xuICAgIGhhbmRsZVNjcm9sbDogZnVuY3Rpb24gaGFuZGxlU2Nyb2xsKCkge1xuICAgICAgdmFyIHdyYXAgPSB0aGlzLndyYXA7XG5cbiAgICAgIHRoaXMubW92ZVkgPSB3cmFwLnNjcm9sbFRvcCAqIDEwMCAvIHdyYXAuY2xpZW50SGVpZ2h0O1xuICAgICAgdGhpcy5tb3ZlWCA9IHdyYXAuc2Nyb2xsTGVmdCAqIDEwMCAvIHdyYXAuY2xpZW50V2lkdGg7XG4gICAgfSxcbiAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICAgIHZhciBoZWlnaHRQZXJjZW50YWdlID0gdm9pZCAwLFxuICAgICAgICAgIHdpZHRoUGVyY2VudGFnZSA9IHZvaWQgMDtcbiAgICAgIHZhciB3cmFwID0gdGhpcy53cmFwO1xuICAgICAgaWYgKCF3cmFwKSByZXR1cm47XG5cbiAgICAgIGhlaWdodFBlcmNlbnRhZ2UgPSB3cmFwLmNsaWVudEhlaWdodCAqIDEwMCAvIHdyYXAuc2Nyb2xsSGVpZ2h0O1xuICAgICAgd2lkdGhQZXJjZW50YWdlID0gd3JhcC5jbGllbnRXaWR0aCAqIDEwMCAvIHdyYXAuc2Nyb2xsV2lkdGg7XG5cbiAgICAgIHRoaXMuc2l6ZUhlaWdodCA9IGhlaWdodFBlcmNlbnRhZ2UgPCAxMDAgPyBoZWlnaHRQZXJjZW50YWdlICsgJyUnIDogJyc7XG4gICAgICB0aGlzLnNpemVXaWR0aCA9IHdpZHRoUGVyY2VudGFnZSA8IDEwMCA/IHdpZHRoUGVyY2VudGFnZSArICclJyA6ICcnO1xuICAgIH1cbiAgfSxcblxuICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkgcmV0dXJuO1xuICAgIHRoaXMuJG5leHRUaWNrKHRoaXMudXBkYXRlKTtcbiAgICAhdGhpcy5ub3Jlc2l6ZSAmJiBPYmplY3QocmVzaXplX2V2ZW50X1tcImFkZFJlc2l6ZUxpc3RlbmVyXCJdKSh0aGlzLiRyZWZzLnJlc2l6ZSwgdGhpcy51cGRhdGUpO1xuICB9LFxuICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkgcmV0dXJuO1xuICAgICF0aGlzLm5vcmVzaXplICYmIE9iamVjdChyZXNpemVfZXZlbnRfW1wicmVtb3ZlUmVzaXplTGlzdGVuZXJcIl0pKHRoaXMuJHJlZnMucmVzaXplLCB0aGlzLnVwZGF0ZSk7XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zY3JvbGxiYXIvaW5kZXguanNcblxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xubWFpbi5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KG1haW4ubmFtZSwgbWFpbik7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzY3JvbGxiYXIgPSBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IChtYWluKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDE2OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi91dGlscy9yZXNpemUtZXZlbnRcIik7XG5cbi8qKiovIH0pLFxuXG4vKioqLyAyOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi91dGlscy9kb21cIik7XG5cbi8qKiovIH0pLFxuXG4vKioqLyAzOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi91dGlscy91dGlsXCIpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMzk6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL3V0aWxzL3Njcm9sbGJhci13aWR0aFwiKTtcblxuLyoqKi8gfSlcblxuLyoqKioqKi8gfSk7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///14e9\n")},"299c":function(module,exports,__webpack_require__){eval("module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"/dist/\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 138);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 138:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n\n// EXTERNAL MODULE: external \"element-ui/lib/utils/vue-popper\"\nvar vue_popper_ = __webpack_require__(5);\nvar vue_popper_default = /*#__PURE__*/__webpack_require__.n(vue_popper_);\n\n// EXTERNAL MODULE: external \"throttle-debounce/debounce\"\nvar debounce_ = __webpack_require__(19);\nvar debounce_default = /*#__PURE__*/__webpack_require__.n(debounce_);\n\n// EXTERNAL MODULE: external \"element-ui/lib/utils/dom\"\nvar dom_ = __webpack_require__(2);\n\n// EXTERNAL MODULE: external \"element-ui/lib/utils/util\"\nvar util_ = __webpack_require__(3);\n\n// EXTERNAL MODULE: external \"vue\"\nvar external_vue_ = __webpack_require__(7);\nvar external_vue_default = /*#__PURE__*/__webpack_require__.n(external_vue_);\n\n// CONCATENATED MODULE: ./packages/tooltip/src/main.js\n\n\n\n\n\n\n/* harmony default export */ var main = ({\n name: 'ElTooltip',\n\n mixins: [vue_popper_default.a],\n\n props: {\n openDelay: {\n type: Number,\n default: 0\n },\n disabled: Boolean,\n manual: Boolean,\n effect: {\n type: String,\n default: 'dark'\n },\n arrowOffset: {\n type: Number,\n default: 0\n },\n popperClass: String,\n content: String,\n visibleArrow: {\n default: true\n },\n transition: {\n type: String,\n default: 'el-fade-in-linear'\n },\n popperOptions: {\n default: function _default() {\n return {\n boundariesPadding: 10,\n gpuAcceleration: false\n };\n }\n },\n enterable: {\n type: Boolean,\n default: true\n },\n hideAfter: {\n type: Number,\n default: 0\n },\n tabindex: {\n type: Number,\n default: 0\n }\n },\n\n data: function data() {\n return {\n tooltipId: 'el-tooltip-' + Object(util_[\"generateId\"])(),\n timeoutPending: null,\n focusing: false\n };\n },\n beforeCreate: function beforeCreate() {\n var _this = this;\n\n if (this.$isServer) return;\n\n this.popperVM = new external_vue_default.a({\n data: { node: '' },\n render: function render(h) {\n return this.node;\n }\n }).$mount();\n\n this.debounceClose = debounce_default()(200, function () {\n return _this.handleClosePopper();\n });\n },\n render: function render(h) {\n var _this2 = this;\n\n if (this.popperVM) {\n this.popperVM.node = h(\n 'transition',\n {\n attrs: {\n name: this.transition\n },\n on: {\n 'afterLeave': this.doDestroy\n }\n },\n [h(\n 'div',\n {\n on: {\n 'mouseleave': function mouseleave() {\n _this2.setExpectedState(false);_this2.debounceClose();\n },\n 'mouseenter': function mouseenter() {\n _this2.setExpectedState(true);\n }\n },\n\n ref: 'popper',\n attrs: { role: 'tooltip',\n id: this.tooltipId,\n 'aria-hidden': this.disabled || !this.showPopper ? 'true' : 'false'\n },\n directives: [{\n name: 'show',\n value: !this.disabled && this.showPopper\n }],\n\n 'class': ['el-tooltip__popper', 'is-' + this.effect, this.popperClass] },\n [this.$slots.content || this.content]\n )]\n );\n }\n\n var firstElement = this.getFirstElement();\n if (!firstElement) return null;\n\n var data = firstElement.data = firstElement.data || {};\n data.staticClass = this.addTooltipClass(data.staticClass);\n\n return firstElement;\n },\n mounted: function mounted() {\n var _this3 = this;\n\n this.referenceElm = this.$el;\n if (this.$el.nodeType === 1) {\n this.$el.setAttribute('aria-describedby', this.tooltipId);\n this.$el.setAttribute('tabindex', this.tabindex);\n Object(dom_[\"on\"])(this.referenceElm, 'mouseenter', this.show);\n Object(dom_[\"on\"])(this.referenceElm, 'mouseleave', this.hide);\n Object(dom_[\"on\"])(this.referenceElm, 'focus', function () {\n if (!_this3.$slots.default || !_this3.$slots.default.length) {\n _this3.handleFocus();\n return;\n }\n var instance = _this3.$slots.default[0].componentInstance;\n if (instance && instance.focus) {\n instance.focus();\n } else {\n _this3.handleFocus();\n }\n });\n Object(dom_[\"on\"])(this.referenceElm, 'blur', this.handleBlur);\n Object(dom_[\"on\"])(this.referenceElm, 'click', this.removeFocusing);\n }\n // fix issue https://github.com/ElemeFE/element/issues/14424\n if (this.value && this.popperVM) {\n this.popperVM.$nextTick(function () {\n if (_this3.value) {\n _this3.updatePopper();\n }\n });\n }\n },\n\n watch: {\n focusing: function focusing(val) {\n if (val) {\n Object(dom_[\"addClass\"])(this.referenceElm, 'focusing');\n } else {\n Object(dom_[\"removeClass\"])(this.referenceElm, 'focusing');\n }\n }\n },\n methods: {\n show: function show() {\n this.setExpectedState(true);\n this.handleShowPopper();\n },\n hide: function hide() {\n this.setExpectedState(false);\n this.debounceClose();\n },\n handleFocus: function handleFocus() {\n this.focusing = true;\n this.show();\n },\n handleBlur: function handleBlur() {\n this.focusing = false;\n this.hide();\n },\n removeFocusing: function removeFocusing() {\n this.focusing = false;\n },\n addTooltipClass: function addTooltipClass(prev) {\n if (!prev) {\n return 'el-tooltip';\n } else {\n return 'el-tooltip ' + prev.replace('el-tooltip', '');\n }\n },\n handleShowPopper: function handleShowPopper() {\n var _this4 = this;\n\n if (!this.expectedState || this.manual) return;\n clearTimeout(this.timeout);\n this.timeout = setTimeout(function () {\n _this4.showPopper = true;\n }, this.openDelay);\n\n if (this.hideAfter > 0) {\n this.timeoutPending = setTimeout(function () {\n _this4.showPopper = false;\n }, this.hideAfter);\n }\n },\n handleClosePopper: function handleClosePopper() {\n if (this.enterable && this.expectedState || this.manual) return;\n clearTimeout(this.timeout);\n\n if (this.timeoutPending) {\n clearTimeout(this.timeoutPending);\n }\n this.showPopper = false;\n\n if (this.disabled) {\n this.doDestroy();\n }\n },\n setExpectedState: function setExpectedState(expectedState) {\n if (expectedState === false) {\n clearTimeout(this.timeoutPending);\n }\n this.expectedState = expectedState;\n },\n getFirstElement: function getFirstElement() {\n var slots = this.$slots.default;\n if (!Array.isArray(slots)) return null;\n var element = null;\n for (var index = 0; index < slots.length; index++) {\n if (slots[index] && slots[index].tag) {\n element = slots[index];\n break;\n };\n }\n return element;\n }\n },\n\n beforeDestroy: function beforeDestroy() {\n this.popperVM && this.popperVM.$destroy();\n },\n destroyed: function destroyed() {\n var reference = this.referenceElm;\n if (reference.nodeType === 1) {\n Object(dom_[\"off\"])(reference, 'mouseenter', this.show);\n Object(dom_[\"off\"])(reference, 'mouseleave', this.hide);\n Object(dom_[\"off\"])(reference, 'focus', this.handleFocus);\n Object(dom_[\"off\"])(reference, 'blur', this.handleBlur);\n Object(dom_[\"off\"])(reference, 'click', this.removeFocusing);\n }\n }\n});\n// CONCATENATED MODULE: ./packages/tooltip/index.js\n\n\n/* istanbul ignore next */\nmain.install = function (Vue) {\n Vue.component(main.name, main);\n};\n\n/* harmony default export */ var tooltip = __webpack_exports__[\"default\"] = (main);\n\n/***/ }),\n\n/***/ 19:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"0e15\");\n\n/***/ }),\n\n/***/ 2:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"5924\");\n\n/***/ }),\n\n/***/ 3:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"8122\");\n\n/***/ }),\n\n/***/ 5:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"e974\");\n\n/***/ }),\n\n/***/ 7:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"2b0e\");\n\n/***/ })\n\n/******/ });\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvdG9vbHRpcC5qcz8yOTljIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtELGdDQUFnQztBQUNsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnRUFBZ0Usa0JBQWtCO0FBQ2xGO0FBQ0EseURBQXlELGNBQWM7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsaUNBQWlDO0FBQ2xGLHdIQUF3SCxtQkFBbUIsRUFBRTtBQUM3STtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsMEJBQTBCLEVBQUU7QUFDL0QseUNBQXlDLGVBQWU7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RCwrREFBK0Q7QUFDN0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOzs7Ozs7O0FBT0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxhQUFhLFdBQVc7QUFDeEI7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQyxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGFBQWE7O0FBRWIsb0ZBQW9GO0FBQ3BGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsc0JBQXNCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0E7O0FBRUEsaUJBQWlCLG1CQUFPLENBQUMsTUFBNEI7O0FBRXJELE9BQU87O0FBRVA7QUFDQTs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQyxNQUEwQjs7QUFFbkQsT0FBTzs7QUFFUDtBQUNBOztBQUVBLGlCQUFpQixtQkFBTyxDQUFDLE1BQTJCOztBQUVwRCxPQUFPOztBQUVQO0FBQ0E7O0FBRUEsaUJBQWlCLG1CQUFPLENBQUMsTUFBaUM7O0FBRTFELE9BQU87O0FBRVA7QUFDQTs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQyxNQUFLOztBQUU5QixPQUFPOztBQUVQLFVBQVUiLCJmaWxlIjoiMjk5Yy5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID1cbi8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4vKioqKioqLyBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4vKioqKioqLyBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuLyoqKioqKi8gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbi8qKioqKiovIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuLyoqKioqKi8gXHRcdHJldHVybiBucztcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCIvZGlzdC9cIjtcbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMTM4KTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKHtcblxuLyoqKi8gMTM4OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL3V0aWxzL3Z1ZS1wb3BwZXJcIlxudmFyIHZ1ZV9wb3BwZXJfID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcbnZhciB2dWVfcG9wcGVyX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKHZ1ZV9wb3BwZXJfKTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcInRocm90dGxlLWRlYm91bmNlL2RlYm91bmNlXCJcbnZhciBkZWJvdW5jZV8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KTtcbnZhciBkZWJvdW5jZV9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihkZWJvdW5jZV8pO1xuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvdXRpbHMvZG9tXCJcbnZhciBkb21fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL3V0aWxzL3V0aWxcIlxudmFyIHV0aWxfID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcInZ1ZVwiXG52YXIgZXh0ZXJuYWxfdnVlXyA9IF9fd2VicGFja19yZXF1aXJlX18oNyk7XG52YXIgZXh0ZXJuYWxfdnVlX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGV4dGVybmFsX3Z1ZV8pO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3Rvb2x0aXAvc3JjL21haW4uanNcblxuXG5cblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIG1haW4gPSAoe1xuICBuYW1lOiAnRWxUb29sdGlwJyxcblxuICBtaXhpbnM6IFt2dWVfcG9wcGVyX2RlZmF1bHQuYV0sXG5cbiAgcHJvcHM6IHtcbiAgICBvcGVuRGVsYXk6IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGRlZmF1bHQ6IDBcbiAgICB9LFxuICAgIGRpc2FibGVkOiBCb29sZWFuLFxuICAgIG1hbnVhbDogQm9vbGVhbixcbiAgICBlZmZlY3Q6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdkYXJrJ1xuICAgIH0sXG4gICAgYXJyb3dPZmZzZXQ6IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGRlZmF1bHQ6IDBcbiAgICB9LFxuICAgIHBvcHBlckNsYXNzOiBTdHJpbmcsXG4gICAgY29udGVudDogU3RyaW5nLFxuICAgIHZpc2libGVBcnJvdzoge1xuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgdHJhbnNpdGlvbjoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ2VsLWZhZGUtaW4tbGluZWFyJ1xuICAgIH0sXG4gICAgcG9wcGVyT3B0aW9uczoge1xuICAgICAgZGVmYXVsdDogZnVuY3Rpb24gX2RlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYm91bmRhcmllc1BhZGRpbmc6IDEwLFxuICAgICAgICAgIGdwdUFjY2VsZXJhdGlvbjogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGVudGVyYWJsZToge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIGhpZGVBZnRlcjoge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZGVmYXVsdDogMFxuICAgIH0sXG4gICAgdGFiaW5kZXg6IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGRlZmF1bHQ6IDBcbiAgICB9XG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdG9vbHRpcElkOiAnZWwtdG9vbHRpcC0nICsgT2JqZWN0KHV0aWxfW1wiZ2VuZXJhdGVJZFwiXSkoKSxcbiAgICAgIHRpbWVvdXRQZW5kaW5nOiBudWxsLFxuICAgICAgZm9jdXNpbmc6IGZhbHNlXG4gICAgfTtcbiAgfSxcbiAgYmVmb3JlQ3JlYXRlOiBmdW5jdGlvbiBiZWZvcmVDcmVhdGUoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIGlmICh0aGlzLiRpc1NlcnZlcikgcmV0dXJuO1xuXG4gICAgdGhpcy5wb3BwZXJWTSA9IG5ldyBleHRlcm5hbF92dWVfZGVmYXVsdC5hKHtcbiAgICAgIGRhdGE6IHsgbm9kZTogJycgfSxcbiAgICAgIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZTtcbiAgICAgIH1cbiAgICB9KS4kbW91bnQoKTtcblxuICAgIHRoaXMuZGVib3VuY2VDbG9zZSA9IGRlYm91bmNlX2RlZmF1bHQoKSgyMDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5oYW5kbGVDbG9zZVBvcHBlcigpO1xuICAgIH0pO1xuICB9LFxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcihoKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICBpZiAodGhpcy5wb3BwZXJWTSkge1xuICAgICAgdGhpcy5wb3BwZXJWTS5ub2RlID0gaChcbiAgICAgICAgJ3RyYW5zaXRpb24nLFxuICAgICAgICB7XG4gICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgIG5hbWU6IHRoaXMudHJhbnNpdGlvblxuICAgICAgICAgIH0sXG4gICAgICAgICAgb246IHtcbiAgICAgICAgICAgICdhZnRlckxlYXZlJzogdGhpcy5kb0Rlc3Ryb3lcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtoKFxuICAgICAgICAgICdkaXYnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICdtb3VzZWxlYXZlJzogZnVuY3Rpb24gbW91c2VsZWF2ZSgpIHtcbiAgICAgICAgICAgICAgICBfdGhpczIuc2V0RXhwZWN0ZWRTdGF0ZShmYWxzZSk7X3RoaXMyLmRlYm91bmNlQ2xvc2UoKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgJ21vdXNlZW50ZXInOiBmdW5jdGlvbiBtb3VzZWVudGVyKCkge1xuICAgICAgICAgICAgICAgIF90aGlzMi5zZXRFeHBlY3RlZFN0YXRlKHRydWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICByZWY6ICdwb3BwZXInLFxuICAgICAgICAgICAgYXR0cnM6IHsgcm9sZTogJ3Rvb2x0aXAnLFxuICAgICAgICAgICAgICBpZDogdGhpcy50b29sdGlwSWQsXG4gICAgICAgICAgICAgICdhcmlhLWhpZGRlbic6IHRoaXMuZGlzYWJsZWQgfHwgIXRoaXMuc2hvd1BvcHBlciA/ICd0cnVlJyA6ICdmYWxzZSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkaXJlY3RpdmVzOiBbe1xuICAgICAgICAgICAgICBuYW1lOiAnc2hvdycsXG4gICAgICAgICAgICAgIHZhbHVlOiAhdGhpcy5kaXNhYmxlZCAmJiB0aGlzLnNob3dQb3BwZXJcbiAgICAgICAgICAgIH1dLFxuXG4gICAgICAgICAgICAnY2xhc3MnOiBbJ2VsLXRvb2x0aXBfX3BvcHBlcicsICdpcy0nICsgdGhpcy5lZmZlY3QsIHRoaXMucG9wcGVyQ2xhc3NdIH0sXG4gICAgICAgICAgW3RoaXMuJHNsb3RzLmNvbnRlbnQgfHwgdGhpcy5jb250ZW50XVxuICAgICAgICApXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB2YXIgZmlyc3RFbGVtZW50ID0gdGhpcy5nZXRGaXJzdEVsZW1lbnQoKTtcbiAgICBpZiAoIWZpcnN0RWxlbWVudCkgcmV0dXJuIG51bGw7XG5cbiAgICB2YXIgZGF0YSA9IGZpcnN0RWxlbWVudC5kYXRhID0gZmlyc3RFbGVtZW50LmRhdGEgfHwge307XG4gICAgZGF0YS5zdGF0aWNDbGFzcyA9IHRoaXMuYWRkVG9vbHRpcENsYXNzKGRhdGEuc3RhdGljQ2xhc3MpO1xuXG4gICAgcmV0dXJuIGZpcnN0RWxlbWVudDtcbiAgfSxcbiAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcbiAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgIHRoaXMucmVmZXJlbmNlRWxtID0gdGhpcy4kZWw7XG4gICAgaWYgKHRoaXMuJGVsLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICB0aGlzLiRlbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknLCB0aGlzLnRvb2x0aXBJZCk7XG4gICAgICB0aGlzLiRlbC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgdGhpcy50YWJpbmRleCk7XG4gICAgICBPYmplY3QoZG9tX1tcIm9uXCJdKSh0aGlzLnJlZmVyZW5jZUVsbSwgJ21vdXNlZW50ZXInLCB0aGlzLnNob3cpO1xuICAgICAgT2JqZWN0KGRvbV9bXCJvblwiXSkodGhpcy5yZWZlcmVuY2VFbG0sICdtb3VzZWxlYXZlJywgdGhpcy5oaWRlKTtcbiAgICAgIE9iamVjdChkb21fW1wib25cIl0pKHRoaXMucmVmZXJlbmNlRWxtLCAnZm9jdXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghX3RoaXMzLiRzbG90cy5kZWZhdWx0IHx8ICFfdGhpczMuJHNsb3RzLmRlZmF1bHQubGVuZ3RoKSB7XG4gICAgICAgICAgX3RoaXMzLmhhbmRsZUZvY3VzKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IF90aGlzMy4kc2xvdHMuZGVmYXVsdFswXS5jb21wb25lbnRJbnN0YW5jZTtcbiAgICAgICAgaWYgKGluc3RhbmNlICYmIGluc3RhbmNlLmZvY3VzKSB7XG4gICAgICAgICAgaW5zdGFuY2UuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfdGhpczMuaGFuZGxlRm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBPYmplY3QoZG9tX1tcIm9uXCJdKSh0aGlzLnJlZmVyZW5jZUVsbSwgJ2JsdXInLCB0aGlzLmhhbmRsZUJsdXIpO1xuICAgICAgT2JqZWN0KGRvbV9bXCJvblwiXSkodGhpcy5yZWZlcmVuY2VFbG0sICdjbGljaycsIHRoaXMucmVtb3ZlRm9jdXNpbmcpO1xuICAgIH1cbiAgICAvLyBmaXggaXNzdWUgaHR0cHM6Ly9naXRodWIuY29tL0VsZW1lRkUvZWxlbWVudC9pc3N1ZXMvMTQ0MjRcbiAgICBpZiAodGhpcy52YWx1ZSAmJiB0aGlzLnBvcHBlclZNKSB7XG4gICAgICB0aGlzLnBvcHBlclZNLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChfdGhpczMudmFsdWUpIHtcbiAgICAgICAgICBfdGhpczMudXBkYXRlUG9wcGVyKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIGZvY3VzaW5nOiBmdW5jdGlvbiBmb2N1c2luZyh2YWwpIHtcbiAgICAgIGlmICh2YWwpIHtcbiAgICAgICAgT2JqZWN0KGRvbV9bXCJhZGRDbGFzc1wiXSkodGhpcy5yZWZlcmVuY2VFbG0sICdmb2N1c2luZycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgT2JqZWN0KGRvbV9bXCJyZW1vdmVDbGFzc1wiXSkodGhpcy5yZWZlcmVuY2VFbG0sICdmb2N1c2luZycpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgbWV0aG9kczoge1xuICAgIHNob3c6IGZ1bmN0aW9uIHNob3coKSB7XG4gICAgICB0aGlzLnNldEV4cGVjdGVkU3RhdGUodHJ1ZSk7XG4gICAgICB0aGlzLmhhbmRsZVNob3dQb3BwZXIoKTtcbiAgICB9LFxuICAgIGhpZGU6IGZ1bmN0aW9uIGhpZGUoKSB7XG4gICAgICB0aGlzLnNldEV4cGVjdGVkU3RhdGUoZmFsc2UpO1xuICAgICAgdGhpcy5kZWJvdW5jZUNsb3NlKCk7XG4gICAgfSxcbiAgICBoYW5kbGVGb2N1czogZnVuY3Rpb24gaGFuZGxlRm9jdXMoKSB7XG4gICAgICB0aGlzLmZvY3VzaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2hvdygpO1xuICAgIH0sXG4gICAgaGFuZGxlQmx1cjogZnVuY3Rpb24gaGFuZGxlQmx1cigpIHtcbiAgICAgIHRoaXMuZm9jdXNpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgIH0sXG4gICAgcmVtb3ZlRm9jdXNpbmc6IGZ1bmN0aW9uIHJlbW92ZUZvY3VzaW5nKCkge1xuICAgICAgdGhpcy5mb2N1c2luZyA9IGZhbHNlO1xuICAgIH0sXG4gICAgYWRkVG9vbHRpcENsYXNzOiBmdW5jdGlvbiBhZGRUb29sdGlwQ2xhc3MocHJldikge1xuICAgICAgaWYgKCFwcmV2KSB7XG4gICAgICAgIHJldHVybiAnZWwtdG9vbHRpcCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gJ2VsLXRvb2x0aXAgJyArIHByZXYucmVwbGFjZSgnZWwtdG9vbHRpcCcsICcnKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGhhbmRsZVNob3dQb3BwZXI6IGZ1bmN0aW9uIGhhbmRsZVNob3dQb3BwZXIoKSB7XG4gICAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgICAgaWYgKCF0aGlzLmV4cGVjdGVkU3RhdGUgfHwgdGhpcy5tYW51YWwpIHJldHVybjtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xuICAgICAgdGhpcy50aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzNC5zaG93UG9wcGVyID0gdHJ1ZTtcbiAgICAgIH0sIHRoaXMub3BlbkRlbGF5KTtcblxuICAgICAgaWYgKHRoaXMuaGlkZUFmdGVyID4gMCkge1xuICAgICAgICB0aGlzLnRpbWVvdXRQZW5kaW5nID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXM0LnNob3dQb3BwZXIgPSBmYWxzZTtcbiAgICAgICAgfSwgdGhpcy5oaWRlQWZ0ZXIpO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlQ2xvc2VQb3BwZXI6IGZ1bmN0aW9uIGhhbmRsZUNsb3NlUG9wcGVyKCkge1xuICAgICAgaWYgKHRoaXMuZW50ZXJhYmxlICYmIHRoaXMuZXhwZWN0ZWRTdGF0ZSB8fCB0aGlzLm1hbnVhbCkgcmV0dXJuO1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XG5cbiAgICAgIGlmICh0aGlzLnRpbWVvdXRQZW5kaW5nKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRQZW5kaW5nKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2hvd1BvcHBlciA9IGZhbHNlO1xuXG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICB0aGlzLmRvRGVzdHJveSgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgc2V0RXhwZWN0ZWRTdGF0ZTogZnVuY3Rpb24gc2V0RXhwZWN0ZWRTdGF0ZShleHBlY3RlZFN0YXRlKSB7XG4gICAgICBpZiAoZXhwZWN0ZWRTdGF0ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dFBlbmRpbmcpO1xuICAgICAgfVxuICAgICAgdGhpcy5leHBlY3RlZFN0YXRlID0gZXhwZWN0ZWRTdGF0ZTtcbiAgICB9LFxuICAgIGdldEZpcnN0RWxlbWVudDogZnVuY3Rpb24gZ2V0Rmlyc3RFbGVtZW50KCkge1xuICAgICAgdmFyIHNsb3RzID0gdGhpcy4kc2xvdHMuZGVmYXVsdDtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShzbG90cykpIHJldHVybiBudWxsO1xuICAgICAgdmFyIGVsZW1lbnQgPSBudWxsO1xuICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHNsb3RzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBpZiAoc2xvdHNbaW5kZXhdICYmIHNsb3RzW2luZGV4XS50YWcpIHtcbiAgICAgICAgICBlbGVtZW50ID0gc2xvdHNbaW5kZXhdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuICB9LFxuXG4gIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG4gICAgdGhpcy5wb3BwZXJWTSAmJiB0aGlzLnBvcHBlclZNLiRkZXN0cm95KCk7XG4gIH0sXG4gIGRlc3Ryb3llZDogZnVuY3Rpb24gZGVzdHJveWVkKCkge1xuICAgIHZhciByZWZlcmVuY2UgPSB0aGlzLnJlZmVyZW5jZUVsbTtcbiAgICBpZiAocmVmZXJlbmNlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICBPYmplY3QoZG9tX1tcIm9mZlwiXSkocmVmZXJlbmNlLCAnbW91c2VlbnRlcicsIHRoaXMuc2hvdyk7XG4gICAgICBPYmplY3QoZG9tX1tcIm9mZlwiXSkocmVmZXJlbmNlLCAnbW91c2VsZWF2ZScsIHRoaXMuaGlkZSk7XG4gICAgICBPYmplY3QoZG9tX1tcIm9mZlwiXSkocmVmZXJlbmNlLCAnZm9jdXMnLCB0aGlzLmhhbmRsZUZvY3VzKTtcbiAgICAgIE9iamVjdChkb21fW1wib2ZmXCJdKShyZWZlcmVuY2UsICdibHVyJywgdGhpcy5oYW5kbGVCbHVyKTtcbiAgICAgIE9iamVjdChkb21fW1wib2ZmXCJdKShyZWZlcmVuY2UsICdjbGljaycsIHRoaXMucmVtb3ZlRm9jdXNpbmcpO1xuICAgIH1cbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3Rvb2x0aXAvaW5kZXguanNcblxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xubWFpbi5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KG1haW4ubmFtZSwgbWFpbik7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciB0b29sdGlwID0gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSAobWFpbik7XG5cbi8qKiovIH0pLFxuXG4vKioqLyAxOTpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwidGhyb3R0bGUtZGVib3VuY2UvZGVib3VuY2VcIik7XG5cbi8qKiovIH0pLFxuXG4vKioqLyAyOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi91dGlscy9kb21cIik7XG5cbi8qKiovIH0pLFxuXG4vKioqLyAzOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi91dGlscy91dGlsXCIpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNTpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvdXRpbHMvdnVlLXBvcHBlclwiKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDc6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInZ1ZVwiKTtcblxuLyoqKi8gfSlcblxuLyoqKioqKi8gfSk7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///299c\n")},"2a5e":function(module,exports,__webpack_require__){"use strict";eval('\n\nexports.__esModule = true;\nexports.default = scrollIntoView;\n\nvar _vue = __webpack_require__("2b0e");\n\nvar _vue2 = _interopRequireDefault(_vue);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction scrollIntoView(container, selected) {\n if (_vue2.default.prototype.$isServer) return;\n\n if (!selected) {\n container.scrollTop = 0;\n return;\n }\n\n var offsetParents = [];\n var pointer = selected.offsetParent;\n while (pointer && container !== pointer && container.contains(pointer)) {\n offsetParents.push(pointer);\n pointer = pointer.offsetParent;\n }\n var top = selected.offsetTop + offsetParents.reduce(function (prev, curr) {\n return prev + curr.offsetTop;\n }, 0);\n var bottom = top + selected.offsetHeight;\n var viewRectTop = container.scrollTop;\n var viewRectBottom = viewRectTop + container.clientHeight;\n\n if (top < viewRectTop) {\n container.scrollTop = top;\n } else if (bottom > viewRectBottom) {\n container.scrollTop = bottom - container.clientHeight;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvdXRpbHMvc2Nyb2xsLWludG8tdmlldy5qcz8yYTVlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7O0FBRUEsV0FBVyxtQkFBTyxDQUFDLE1BQUs7O0FBRXhCOztBQUVBLHNDQUFzQyx1Q0FBdUMsZ0JBQWdCOztBQUU3RjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBIiwiZmlsZSI6IjJhNWUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmRlZmF1bHQgPSBzY3JvbGxJbnRvVmlldztcblxudmFyIF92dWUgPSByZXF1aXJlKCd2dWUnKTtcblxudmFyIF92dWUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdnVlKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gc2Nyb2xsSW50b1ZpZXcoY29udGFpbmVyLCBzZWxlY3RlZCkge1xuICBpZiAoX3Z1ZTIuZGVmYXVsdC5wcm90b3R5cGUuJGlzU2VydmVyKSByZXR1cm47XG5cbiAgaWYgKCFzZWxlY3RlZCkge1xuICAgIGNvbnRhaW5lci5zY3JvbGxUb3AgPSAwO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBvZmZzZXRQYXJlbnRzID0gW107XG4gIHZhciBwb2ludGVyID0gc2VsZWN0ZWQub2Zmc2V0UGFyZW50O1xuICB3aGlsZSAocG9pbnRlciAmJiBjb250YWluZXIgIT09IHBvaW50ZXIgJiYgY29udGFpbmVyLmNvbnRhaW5zKHBvaW50ZXIpKSB7XG4gICAgb2Zmc2V0UGFyZW50cy5wdXNoKHBvaW50ZXIpO1xuICAgIHBvaW50ZXIgPSBwb2ludGVyLm9mZnNldFBhcmVudDtcbiAgfVxuICB2YXIgdG9wID0gc2VsZWN0ZWQub2Zmc2V0VG9wICsgb2Zmc2V0UGFyZW50cy5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGN1cnIpIHtcbiAgICByZXR1cm4gcHJldiArIGN1cnIub2Zmc2V0VG9wO1xuICB9LCAwKTtcbiAgdmFyIGJvdHRvbSA9IHRvcCArIHNlbGVjdGVkLm9mZnNldEhlaWdodDtcbiAgdmFyIHZpZXdSZWN0VG9wID0gY29udGFpbmVyLnNjcm9sbFRvcDtcbiAgdmFyIHZpZXdSZWN0Qm90dG9tID0gdmlld1JlY3RUb3AgKyBjb250YWluZXIuY2xpZW50SGVpZ2h0O1xuXG4gIGlmICh0b3AgPCB2aWV3UmVjdFRvcCkge1xuICAgIGNvbnRhaW5lci5zY3JvbGxUb3AgPSB0b3A7XG4gIH0gZWxzZSBpZiAoYm90dG9tID4gdmlld1JlY3RCb3R0b20pIHtcbiAgICBjb250YWluZXIuc2Nyb2xsVG9wID0gYm90dG9tIC0gY29udGFpbmVyLmNsaWVudEhlaWdodDtcbiAgfVxufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2a5e\n')},"2bb5":function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\n\nvar _util = __webpack_require__(\"8122\");\n\n/**\n * Show migrating guide in browser console.\n *\n * Usage:\n * import Migrating from 'element-ui/src/mixins/migrating';\n *\n * mixins: [Migrating]\n *\n * add getMigratingConfig method for your component.\n * getMigratingConfig() {\n * return {\n * props: {\n * 'allow-no-selection': 'allow-no-selection is removed.',\n * 'selection-mode': 'selection-mode is removed.'\n * },\n * events: {\n * selectionchange: 'selectionchange is renamed to selection-change.'\n * }\n * };\n * },\n */\nexports.default = {\n mounted: function mounted() {\n if (true) return;\n if (!this.$vnode) return;\n\n var _getMigratingConfig = this.getMigratingConfig(),\n _getMigratingConfig$p = _getMigratingConfig.props,\n props = _getMigratingConfig$p === undefined ? {} : _getMigratingConfig$p,\n _getMigratingConfig$e = _getMigratingConfig.events,\n events = _getMigratingConfig$e === undefined ? {} : _getMigratingConfig$e;\n\n var _$vnode = this.$vnode,\n data = _$vnode.data,\n componentOptions = _$vnode.componentOptions;\n\n var definedProps = data.attrs || {};\n var definedEvents = componentOptions.listeners || {};\n\n for (var propName in definedProps) {\n propName = (0, _util.kebabCase)(propName); // compatible with camel case\n if (props[propName]) {\n console.warn('[Element Migrating][' + this.$options.name + '][Attribute]: ' + props[propName]);\n }\n }\n\n for (var eventName in definedEvents) {\n eventName = (0, _util.kebabCase)(eventName); // compatible with camel case\n if (events[eventName]) {\n console.warn('[Element Migrating][' + this.$options.name + '][Event]: ' + events[eventName]);\n }\n }\n },\n\n methods: {\n getMigratingConfig: function getMigratingConfig() {\n return {\n props: {},\n events: {}\n };\n }\n }\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvbWl4aW5zL21pZ3JhdGluZy5qcz8yYmI1Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViOztBQUVBLFlBQVksbUJBQU8sQ0FBQyxNQUEyQjs7QUFFL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxRQUFRLElBQXFDO0FBQzdDOztBQUVBO0FBQ0E7QUFDQSx3REFBd0Q7QUFDeEQ7QUFDQSx5REFBeUQ7O0FBRXpEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0RBQWtEO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIyYmI1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX3V0aWwgPSByZXF1aXJlKCdlbGVtZW50LXVpL2xpYi91dGlscy91dGlsJyk7XG5cbi8qKlxuICogU2hvdyBtaWdyYXRpbmcgZ3VpZGUgaW4gYnJvd3NlciBjb25zb2xlLlxuICpcbiAqIFVzYWdlOlxuICogaW1wb3J0IE1pZ3JhdGluZyBmcm9tICdlbGVtZW50LXVpL3NyYy9taXhpbnMvbWlncmF0aW5nJztcbiAqXG4gKiBtaXhpbnM6IFtNaWdyYXRpbmddXG4gKlxuICogYWRkIGdldE1pZ3JhdGluZ0NvbmZpZyBtZXRob2QgZm9yIHlvdXIgY29tcG9uZW50LlxuICogIGdldE1pZ3JhdGluZ0NvbmZpZygpIHtcbiAqICAgIHJldHVybiB7XG4gKiAgICAgIHByb3BzOiB7XG4gKiAgICAgICAgJ2FsbG93LW5vLXNlbGVjdGlvbic6ICdhbGxvdy1uby1zZWxlY3Rpb24gaXMgcmVtb3ZlZC4nLFxuICogICAgICAgICdzZWxlY3Rpb24tbW9kZSc6ICdzZWxlY3Rpb24tbW9kZSBpcyByZW1vdmVkLidcbiAqICAgICAgfSxcbiAqICAgICAgZXZlbnRzOiB7XG4gKiAgICAgICAgc2VsZWN0aW9uY2hhbmdlOiAnc2VsZWN0aW9uY2hhbmdlIGlzIHJlbmFtZWQgdG8gc2VsZWN0aW9uLWNoYW5nZS4nXG4gKiAgICAgIH1cbiAqICAgIH07XG4gKiAgfSxcbiAqL1xuZXhwb3J0cy5kZWZhdWx0ID0ge1xuICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLiR2bm9kZSkgcmV0dXJuO1xuXG4gICAgdmFyIF9nZXRNaWdyYXRpbmdDb25maWcgPSB0aGlzLmdldE1pZ3JhdGluZ0NvbmZpZygpLFxuICAgICAgICBfZ2V0TWlncmF0aW5nQ29uZmlnJHAgPSBfZ2V0TWlncmF0aW5nQ29uZmlnLnByb3BzLFxuICAgICAgICBwcm9wcyA9IF9nZXRNaWdyYXRpbmdDb25maWckcCA9PT0gdW5kZWZpbmVkID8ge30gOiBfZ2V0TWlncmF0aW5nQ29uZmlnJHAsXG4gICAgICAgIF9nZXRNaWdyYXRpbmdDb25maWckZSA9IF9nZXRNaWdyYXRpbmdDb25maWcuZXZlbnRzLFxuICAgICAgICBldmVudHMgPSBfZ2V0TWlncmF0aW5nQ29uZmlnJGUgPT09IHVuZGVmaW5lZCA/IHt9IDogX2dldE1pZ3JhdGluZ0NvbmZpZyRlO1xuXG4gICAgdmFyIF8kdm5vZGUgPSB0aGlzLiR2bm9kZSxcbiAgICAgICAgZGF0YSA9IF8kdm5vZGUuZGF0YSxcbiAgICAgICAgY29tcG9uZW50T3B0aW9ucyA9IF8kdm5vZGUuY29tcG9uZW50T3B0aW9ucztcblxuICAgIHZhciBkZWZpbmVkUHJvcHMgPSBkYXRhLmF0dHJzIHx8IHt9O1xuICAgIHZhciBkZWZpbmVkRXZlbnRzID0gY29tcG9uZW50T3B0aW9ucy5saXN0ZW5lcnMgfHwge307XG5cbiAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBkZWZpbmVkUHJvcHMpIHtcbiAgICAgIHByb3BOYW1lID0gKDAsIF91dGlsLmtlYmFiQ2FzZSkocHJvcE5hbWUpOyAvLyBjb21wYXRpYmxlIHdpdGggY2FtZWwgY2FzZVxuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tFbGVtZW50IE1pZ3JhdGluZ11bJyArIHRoaXMuJG9wdGlvbnMubmFtZSArICddW0F0dHJpYnV0ZV06ICcgKyBwcm9wc1twcm9wTmFtZV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIGV2ZW50TmFtZSBpbiBkZWZpbmVkRXZlbnRzKSB7XG4gICAgICBldmVudE5hbWUgPSAoMCwgX3V0aWwua2ViYWJDYXNlKShldmVudE5hbWUpOyAvLyBjb21wYXRpYmxlIHdpdGggY2FtZWwgY2FzZVxuICAgICAgaWYgKGV2ZW50c1tldmVudE5hbWVdKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW0VsZW1lbnQgTWlncmF0aW5nXVsnICsgdGhpcy4kb3B0aW9ucy5uYW1lICsgJ11bRXZlbnRdOiAnICsgZXZlbnRzW2V2ZW50TmFtZV0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0TWlncmF0aW5nQ29uZmlnOiBmdW5jdGlvbiBnZXRNaWdyYXRpbmdDb25maWcoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm9wczoge30sXG4gICAgICAgIGV2ZW50czoge31cbiAgICAgIH07XG4gICAgfVxuICB9XG59OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2bb5\n")},4010:function(module,exports,__webpack_require__){"use strict";eval('\n\nexports.__esModule = true;\nexports.removeResizeListener = exports.addResizeListener = undefined;\n\nvar _resizeObserverPolyfill = __webpack_require__("6dd8");\n\nvar _resizeObserverPolyfill2 = _interopRequireDefault(_resizeObserverPolyfill);\n\nvar _throttleDebounce = __webpack_require__("9619");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar isServer = typeof window === \'undefined\';\n\n/* istanbul ignore next */\nvar resizeHandler = function resizeHandler(entries) {\n for (var _iterator = entries, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n var _ref;\n\n if (_isArray) {\n if (_i >= _iterator.length) break;\n _ref = _iterator[_i++];\n } else {\n _i = _iterator.next();\n if (_i.done) break;\n _ref = _i.value;\n }\n\n var entry = _ref;\n\n var listeners = entry.target.__resizeListeners__ || [];\n if (listeners.length) {\n listeners.forEach(function (fn) {\n fn();\n });\n }\n }\n};\n\n/* istanbul ignore next */\nvar addResizeListener = exports.addResizeListener = function addResizeListener(element, fn) {\n if (isServer) return;\n if (!element.__resizeListeners__) {\n element.__resizeListeners__ = [];\n element.__ro__ = new _resizeObserverPolyfill2.default((0, _throttleDebounce.debounce)(16, resizeHandler));\n element.__ro__.observe(element);\n }\n element.__resizeListeners__.push(fn);\n};\n\n/* istanbul ignore next */\nvar removeResizeListener = exports.removeResizeListener = function removeResizeListener(element, fn) {\n if (!element || !element.__resizeListeners__) return;\n element.__resizeListeners__.splice(element.__resizeListeners__.indexOf(fn), 1);\n if (!element.__resizeListeners__.length) {\n element.__ro__.disconnect();\n }\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvdXRpbHMvcmVzaXplLWV2ZW50LmpzPzQwMTAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTs7QUFFQSw4QkFBOEIsbUJBQU8sQ0FBQyxNQUEwQjs7QUFFaEU7O0FBRUEsd0JBQXdCLG1CQUFPLENBQUMsTUFBbUI7O0FBRW5ELHNDQUFzQyx1Q0FBdUMsZ0JBQWdCOztBQUU3Rjs7QUFFQTtBQUNBO0FBQ0EsOElBQThJO0FBQzlJOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiI0MDEwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5yZW1vdmVSZXNpemVMaXN0ZW5lciA9IGV4cG9ydHMuYWRkUmVzaXplTGlzdGVuZXIgPSB1bmRlZmluZWQ7XG5cbnZhciBfcmVzaXplT2JzZXJ2ZXJQb2x5ZmlsbCA9IHJlcXVpcmUoJ3Jlc2l6ZS1vYnNlcnZlci1wb2x5ZmlsbCcpO1xuXG52YXIgX3Jlc2l6ZU9ic2VydmVyUG9seWZpbGwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVzaXplT2JzZXJ2ZXJQb2x5ZmlsbCk7XG5cbnZhciBfdGhyb3R0bGVEZWJvdW5jZSA9IHJlcXVpcmUoJ3Rocm90dGxlLWRlYm91bmNlJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbnZhciBpc1NlcnZlciA9IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xudmFyIHJlc2l6ZUhhbmRsZXIgPSBmdW5jdGlvbiByZXNpemVIYW5kbGVyKGVudHJpZXMpIHtcbiAgZm9yICh2YXIgX2l0ZXJhdG9yID0gZW50cmllcywgX2lzQXJyYXkgPSBBcnJheS5pc0FycmF5KF9pdGVyYXRvciksIF9pID0gMCwgX2l0ZXJhdG9yID0gX2lzQXJyYXkgPyBfaXRlcmF0b3IgOiBfaXRlcmF0b3JbU3ltYm9sLml0ZXJhdG9yXSgpOzspIHtcbiAgICB2YXIgX3JlZjtcblxuICAgIGlmIChfaXNBcnJheSkge1xuICAgICAgaWYgKF9pID49IF9pdGVyYXRvci5sZW5ndGgpIGJyZWFrO1xuICAgICAgX3JlZiA9IF9pdGVyYXRvcltfaSsrXTtcbiAgICB9IGVsc2Uge1xuICAgICAgX2kgPSBfaXRlcmF0b3IubmV4dCgpO1xuICAgICAgaWYgKF9pLmRvbmUpIGJyZWFrO1xuICAgICAgX3JlZiA9IF9pLnZhbHVlO1xuICAgIH1cblxuICAgIHZhciBlbnRyeSA9IF9yZWY7XG5cbiAgICB2YXIgbGlzdGVuZXJzID0gZW50cnkudGFyZ2V0Ll9fcmVzaXplTGlzdGVuZXJzX18gfHwgW107XG4gICAgaWYgKGxpc3RlbmVycy5sZW5ndGgpIHtcbiAgICAgIGxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChmbikge1xuICAgICAgICBmbigpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59O1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xudmFyIGFkZFJlc2l6ZUxpc3RlbmVyID0gZXhwb3J0cy5hZGRSZXNpemVMaXN0ZW5lciA9IGZ1bmN0aW9uIGFkZFJlc2l6ZUxpc3RlbmVyKGVsZW1lbnQsIGZuKSB7XG4gIGlmIChpc1NlcnZlcikgcmV0dXJuO1xuICBpZiAoIWVsZW1lbnQuX19yZXNpemVMaXN0ZW5lcnNfXykge1xuICAgIGVsZW1lbnQuX19yZXNpemVMaXN0ZW5lcnNfXyA9IFtdO1xuICAgIGVsZW1lbnQuX19yb19fID0gbmV3IF9yZXNpemVPYnNlcnZlclBvbHlmaWxsMi5kZWZhdWx0KCgwLCBfdGhyb3R0bGVEZWJvdW5jZS5kZWJvdW5jZSkoMTYsIHJlc2l6ZUhhbmRsZXIpKTtcbiAgICBlbGVtZW50Ll9fcm9fXy5vYnNlcnZlKGVsZW1lbnQpO1xuICB9XG4gIGVsZW1lbnQuX19yZXNpemVMaXN0ZW5lcnNfXy5wdXNoKGZuKTtcbn07XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG52YXIgcmVtb3ZlUmVzaXplTGlzdGVuZXIgPSBleHBvcnRzLnJlbW92ZVJlc2l6ZUxpc3RlbmVyID0gZnVuY3Rpb24gcmVtb3ZlUmVzaXplTGlzdGVuZXIoZWxlbWVudCwgZm4pIHtcbiAgaWYgKCFlbGVtZW50IHx8ICFlbGVtZW50Ll9fcmVzaXplTGlzdGVuZXJzX18pIHJldHVybjtcbiAgZWxlbWVudC5fX3Jlc2l6ZUxpc3RlbmVyc19fLnNwbGljZShlbGVtZW50Ll9fcmVzaXplTGlzdGVuZXJzX18uaW5kZXhPZihmbiksIDEpO1xuICBpZiAoIWVsZW1lbnQuX19yZXNpemVMaXN0ZW5lcnNfXy5sZW5ndGgpIHtcbiAgICBlbGVtZW50Ll9fcm9fXy5kaXNjb25uZWN0KCk7XG4gIH1cbn07Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4010\n')},"417f":function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\n\nvar _vue = __webpack_require__(\"2b0e\");\n\nvar _vue2 = _interopRequireDefault(_vue);\n\nvar _dom = __webpack_require__(\"5924\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar nodeList = [];\nvar ctx = '@@clickoutsideContext';\n\nvar startClick = void 0;\nvar seed = 0;\n\n!_vue2.default.prototype.$isServer && (0, _dom.on)(document, 'mousedown', function (e) {\n return startClick = e;\n});\n\n!_vue2.default.prototype.$isServer && (0, _dom.on)(document, 'mouseup', function (e) {\n nodeList.forEach(function (node) {\n return node[ctx].documentHandler(e, startClick);\n });\n});\n\nfunction createDocumentHandler(el, binding, vnode) {\n return function () {\n var mouseup = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var mousedown = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (!vnode || !vnode.context || !mouseup.target || !mousedown.target || el.contains(mouseup.target) || el.contains(mousedown.target) || el === mouseup.target || vnode.context.popperElm && (vnode.context.popperElm.contains(mouseup.target) || vnode.context.popperElm.contains(mousedown.target))) return;\n\n if (binding.expression && el[ctx].methodName && vnode.context[el[ctx].methodName]) {\n vnode.context[el[ctx].methodName]();\n } else {\n el[ctx].bindingFn && el[ctx].bindingFn();\n }\n };\n}\n\n/**\n * v-clickoutside\n * @desc 点击元素外面才会触发的事件\n * @example\n * ```vue\n *
\n * ```\n */\nexports.default = {\n bind: function bind(el, binding, vnode) {\n nodeList.push(el);\n var id = seed++;\n el[ctx] = {\n id: id,\n documentHandler: createDocumentHandler(el, binding, vnode),\n methodName: binding.expression,\n bindingFn: binding.value\n };\n },\n update: function update(el, binding, vnode) {\n el[ctx].documentHandler = createDocumentHandler(el, binding, vnode);\n el[ctx].methodName = binding.expression;\n el[ctx].bindingFn = binding.value;\n },\n unbind: function unbind(el) {\n var len = nodeList.length;\n\n for (var i = 0; i < len; i++) {\n if (nodeList[i][ctx].id === el[ctx].id) {\n nodeList.splice(i, 1);\n break;\n }\n }\n delete el[ctx];\n }\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvdXRpbHMvY2xpY2tvdXRzaWRlLmpzPzQxN2YiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7O0FBRUEsV0FBVyxtQkFBTyxDQUFDLE1BQUs7O0FBRXhCOztBQUVBLFdBQVcsbUJBQU8sQ0FBQyxNQUEwQjs7QUFFN0Msc0NBQXNDLHVDQUF1QyxnQkFBZ0I7O0FBRTdGO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBLG1CQUFtQixTQUFTO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNDE3Zi5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF92dWUgPSByZXF1aXJlKCd2dWUnKTtcblxudmFyIF92dWUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdnVlKTtcblxudmFyIF9kb20gPSByZXF1aXJlKCdlbGVtZW50LXVpL2xpYi91dGlscy9kb20nKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIG5vZGVMaXN0ID0gW107XG52YXIgY3R4ID0gJ0BAY2xpY2tvdXRzaWRlQ29udGV4dCc7XG5cbnZhciBzdGFydENsaWNrID0gdm9pZCAwO1xudmFyIHNlZWQgPSAwO1xuXG4hX3Z1ZTIuZGVmYXVsdC5wcm90b3R5cGUuJGlzU2VydmVyICYmICgwLCBfZG9tLm9uKShkb2N1bWVudCwgJ21vdXNlZG93bicsIGZ1bmN0aW9uIChlKSB7XG4gIHJldHVybiBzdGFydENsaWNrID0gZTtcbn0pO1xuXG4hX3Z1ZTIuZGVmYXVsdC5wcm90b3R5cGUuJGlzU2VydmVyICYmICgwLCBfZG9tLm9uKShkb2N1bWVudCwgJ21vdXNldXAnLCBmdW5jdGlvbiAoZSkge1xuICBub2RlTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGVbY3R4XS5kb2N1bWVudEhhbmRsZXIoZSwgc3RhcnRDbGljayk7XG4gIH0pO1xufSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZURvY3VtZW50SGFuZGxlcihlbCwgYmluZGluZywgdm5vZGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbW91c2V1cCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgdmFyIG1vdXNlZG93biA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICBpZiAoIXZub2RlIHx8ICF2bm9kZS5jb250ZXh0IHx8ICFtb3VzZXVwLnRhcmdldCB8fCAhbW91c2Vkb3duLnRhcmdldCB8fCBlbC5jb250YWlucyhtb3VzZXVwLnRhcmdldCkgfHwgZWwuY29udGFpbnMobW91c2Vkb3duLnRhcmdldCkgfHwgZWwgPT09IG1vdXNldXAudGFyZ2V0IHx8IHZub2RlLmNvbnRleHQucG9wcGVyRWxtICYmICh2bm9kZS5jb250ZXh0LnBvcHBlckVsbS5jb250YWlucyhtb3VzZXVwLnRhcmdldCkgfHwgdm5vZGUuY29udGV4dC5wb3BwZXJFbG0uY29udGFpbnMobW91c2Vkb3duLnRhcmdldCkpKSByZXR1cm47XG5cbiAgICBpZiAoYmluZGluZy5leHByZXNzaW9uICYmIGVsW2N0eF0ubWV0aG9kTmFtZSAmJiB2bm9kZS5jb250ZXh0W2VsW2N0eF0ubWV0aG9kTmFtZV0pIHtcbiAgICAgIHZub2RlLmNvbnRleHRbZWxbY3R4XS5tZXRob2ROYW1lXSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbFtjdHhdLmJpbmRpbmdGbiAmJiBlbFtjdHhdLmJpbmRpbmdGbigpO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiB2LWNsaWNrb3V0c2lkZVxuICogQGRlc2Mg54K55Ye75YWD57Sg5aSW6Z2i5omN5Lya6Kem5Y+R55qE5LqL5Lu2XG4gKiBAZXhhbXBsZVxuICogYGBgdnVlXG4gKiA8ZGl2IHYtZWxlbWVudC1jbGlja291dHNpZGU9XCJoYW5kbGVDbG9zZVwiPlxuICogYGBgXG4gKi9cbmV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgYmluZDogZnVuY3Rpb24gYmluZChlbCwgYmluZGluZywgdm5vZGUpIHtcbiAgICBub2RlTGlzdC5wdXNoKGVsKTtcbiAgICB2YXIgaWQgPSBzZWVkKys7XG4gICAgZWxbY3R4XSA9IHtcbiAgICAgIGlkOiBpZCxcbiAgICAgIGRvY3VtZW50SGFuZGxlcjogY3JlYXRlRG9jdW1lbnRIYW5kbGVyKGVsLCBiaW5kaW5nLCB2bm9kZSksXG4gICAgICBtZXRob2ROYW1lOiBiaW5kaW5nLmV4cHJlc3Npb24sXG4gICAgICBiaW5kaW5nRm46IGJpbmRpbmcudmFsdWVcbiAgICB9O1xuICB9LFxuICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShlbCwgYmluZGluZywgdm5vZGUpIHtcbiAgICBlbFtjdHhdLmRvY3VtZW50SGFuZGxlciA9IGNyZWF0ZURvY3VtZW50SGFuZGxlcihlbCwgYmluZGluZywgdm5vZGUpO1xuICAgIGVsW2N0eF0ubWV0aG9kTmFtZSA9IGJpbmRpbmcuZXhwcmVzc2lvbjtcbiAgICBlbFtjdHhdLmJpbmRpbmdGbiA9IGJpbmRpbmcudmFsdWU7XG4gIH0sXG4gIHVuYmluZDogZnVuY3Rpb24gdW5iaW5kKGVsKSB7XG4gICAgdmFyIGxlbiA9IG5vZGVMaXN0Lmxlbmd0aDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmIChub2RlTGlzdFtpXVtjdHhdLmlkID09PSBlbFtjdHhdLmlkKSB7XG4gICAgICAgIG5vZGVMaXN0LnNwbGljZShpLCAxKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGRlbGV0ZSBlbFtjdHhdO1xuICB9XG59OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///417f\n")},"41f8":function(module,exports,__webpack_require__){"use strict";eval('\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };\n\nexports.isVNode = isVNode;\n\nvar _util = __webpack_require__("8122");\n\nfunction isVNode(node) {\n return node !== null && (typeof node === \'undefined\' ? \'undefined\' : _typeof(node)) === \'object\' && (0, _util.hasOwn)(node, \'componentOptions\');\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvdXRpbHMvdmRvbS5qcz80MWY4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViOztBQUVBLG9HQUFvRyxtQkFBbUIsRUFBRSxtQkFBbUIsOEhBQThIOztBQUUxUTs7QUFFQSxZQUFZLG1CQUFPLENBQUMsTUFBMkI7O0FBRS9DO0FBQ0E7QUFDQSIsImZpbGUiOiI0MWY4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbmV4cG9ydHMuaXNWTm9kZSA9IGlzVk5vZGU7XG5cbnZhciBfdXRpbCA9IHJlcXVpcmUoJ2VsZW1lbnQtdWkvbGliL3V0aWxzL3V0aWwnKTtcblxuZnVuY3Rpb24gaXNWTm9kZShub2RlKSB7XG4gIHJldHVybiBub2RlICE9PSBudWxsICYmICh0eXBlb2Ygbm9kZSA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2Yobm9kZSkpID09PSAnb2JqZWN0JyAmJiAoMCwgX3V0aWwuaGFzT3duKShub2RlLCAnY29tcG9uZW50T3B0aW9ucycpO1xufTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///41f8\n')},4726:function(module,exports,__webpack_require__){eval("module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"/dist/\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 61);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return normalizeComponent; });\n/* globals __VUE_SSR_CONTEXT__ */\n\n// IMPORTANT: Do NOT use ES2015 features in this file (except for modules).\n// This module is a runtime utility for cleaner component module output and will\n// be included in the final webpack user bundle.\n\nfunction normalizeComponent (\n scriptExports,\n render,\n staticRenderFns,\n functionalTemplate,\n injectStyles,\n scopeId,\n moduleIdentifier, /* server only */\n shadowMode /* vue-cli only */\n) {\n // Vue.extend constructor export interop\n var options = typeof scriptExports === 'function'\n ? scriptExports.options\n : scriptExports\n\n // render functions\n if (render) {\n options.render = render\n options.staticRenderFns = staticRenderFns\n options._compiled = true\n }\n\n // functional template\n if (functionalTemplate) {\n options.functional = true\n }\n\n // scopedId\n if (scopeId) {\n options._scopeId = 'data-v-' + scopeId\n }\n\n var hook\n if (moduleIdentifier) { // server build\n hook = function (context) {\n // 2.3 injection\n context =\n context || // cached call\n (this.$vnode && this.$vnode.ssrContext) || // stateful\n (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional\n // 2.2 with runInNewContext: true\n if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {\n context = __VUE_SSR_CONTEXT__\n }\n // inject component styles\n if (injectStyles) {\n injectStyles.call(this, context)\n }\n // register component module identifier for async chunk inferrence\n if (context && context._registeredComponents) {\n context._registeredComponents.add(moduleIdentifier)\n }\n }\n // used by ssr in case component is cached and beforeCreate\n // never gets called\n options._ssrRegister = hook\n } else if (injectStyles) {\n hook = shadowMode\n ? function () { injectStyles.call(this, this.$root.$options.shadowRoot) }\n : injectStyles\n }\n\n if (hook) {\n if (options.functional) {\n // for template-only hot-reload because in that case the render fn doesn't\n // go through the normalizer\n options._injectStyles = hook\n // register for functioal component in vue file\n var originalRender = options.render\n options.render = function renderWithStyleInjection (h, context) {\n hook.call(context)\n return originalRender(h, context)\n }\n } else {\n // inject component registration as beforeCreate hook\n var existing = options.beforeCreate\n options.beforeCreate = existing\n ? [].concat(existing, hook)\n : [hook]\n }\n }\n\n return {\n exports: scriptExports,\n options: options\n }\n}\n\n\n/***/ }),\n\n/***/ 15:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"14e9\");\n\n/***/ }),\n\n/***/ 18:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"dcdc\");\n\n/***/ }),\n\n/***/ 21:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"d397\");\n\n/***/ }),\n\n/***/ 26:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"92fa\");\n\n/***/ }),\n\n/***/ 3:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"8122\");\n\n/***/ }),\n\n/***/ 31:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"2a5e\");\n\n/***/ }),\n\n/***/ 41:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"e452\");\n\n/***/ }),\n\n/***/ 52:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"f494\");\n\n/***/ }),\n\n/***/ 6:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"6b7c\");\n\n/***/ }),\n\n/***/ 61:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/cascader-panel/src/cascader-panel.vue?vue&type=template&id=34932346&\nvar cascader_panelvue_type_template_id_34932346_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n {\n class: [\"el-cascader-panel\", _vm.border && \"is-bordered\"],\n on: { keydown: _vm.handleKeyDown }\n },\n _vm._l(_vm.menus, function(menu, index) {\n return _c(\"cascader-menu\", {\n key: index,\n ref: \"menu\",\n refInFor: true,\n attrs: { index: index, nodes: menu }\n })\n }),\n 1\n )\n}\nvar staticRenderFns = []\ncascader_panelvue_type_template_id_34932346_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/cascader-panel/src/cascader-panel.vue?vue&type=template&id=34932346&\n\n// EXTERNAL MODULE: external \"babel-helper-vue-jsx-merge-props\"\nvar external_babel_helper_vue_jsx_merge_props_ = __webpack_require__(26);\nvar external_babel_helper_vue_jsx_merge_props_default = /*#__PURE__*/__webpack_require__.n(external_babel_helper_vue_jsx_merge_props_);\n\n// EXTERNAL MODULE: external \"element-ui/lib/scrollbar\"\nvar scrollbar_ = __webpack_require__(15);\nvar scrollbar_default = /*#__PURE__*/__webpack_require__.n(scrollbar_);\n\n// EXTERNAL MODULE: external \"element-ui/lib/checkbox\"\nvar checkbox_ = __webpack_require__(18);\nvar checkbox_default = /*#__PURE__*/__webpack_require__.n(checkbox_);\n\n// EXTERNAL MODULE: external \"element-ui/lib/radio\"\nvar radio_ = __webpack_require__(52);\nvar radio_default = /*#__PURE__*/__webpack_require__.n(radio_);\n\n// EXTERNAL MODULE: external \"element-ui/lib/utils/util\"\nvar util_ = __webpack_require__(3);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/cascader-panel/src/cascader-node.vue?vue&type=script&lang=js&\n\n\n\n\n\n\nvar stopPropagation = function stopPropagation(e) {\n return e.stopPropagation();\n};\n\n/* harmony default export */ var cascader_nodevue_type_script_lang_js_ = ({\n inject: ['panel'],\n\n components: {\n ElCheckbox: checkbox_default.a,\n ElRadio: radio_default.a\n },\n\n props: {\n node: {\n required: true\n },\n nodeId: String\n },\n\n computed: {\n config: function config() {\n return this.panel.config;\n },\n isLeaf: function isLeaf() {\n return this.node.isLeaf;\n },\n isDisabled: function isDisabled() {\n return this.node.isDisabled;\n },\n checkedValue: function checkedValue() {\n return this.panel.checkedValue;\n },\n isChecked: function isChecked() {\n return this.node.isSameNode(this.checkedValue);\n },\n inActivePath: function inActivePath() {\n return this.isInPath(this.panel.activePath);\n },\n inCheckedPath: function inCheckedPath() {\n var _this = this;\n\n if (!this.config.checkStrictly) return false;\n\n return this.panel.checkedNodePaths.some(function (checkedPath) {\n return _this.isInPath(checkedPath);\n });\n },\n value: function value() {\n return this.node.getValueByOption();\n }\n },\n\n methods: {\n handleExpand: function handleExpand() {\n var _this2 = this;\n\n var panel = this.panel,\n node = this.node,\n isDisabled = this.isDisabled,\n config = this.config;\n var multiple = config.multiple,\n checkStrictly = config.checkStrictly;\n\n\n if (!checkStrictly && isDisabled || node.loading) return;\n\n if (config.lazy && !node.loaded) {\n panel.lazyLoad(node, function () {\n // do not use cached leaf value here, invoke this.isLeaf to get new value.\n var isLeaf = _this2.isLeaf;\n\n\n if (!isLeaf) _this2.handleExpand();\n if (multiple) {\n // if leaf sync checked state, else clear checked state\n var checked = isLeaf ? node.checked : false;\n _this2.handleMultiCheckChange(checked);\n }\n });\n } else {\n panel.handleExpand(node);\n }\n },\n handleCheckChange: function handleCheckChange() {\n var panel = this.panel,\n value = this.value,\n node = this.node;\n\n panel.handleCheckChange(value);\n panel.handleExpand(node);\n },\n handleMultiCheckChange: function handleMultiCheckChange(checked) {\n this.node.doCheck(checked);\n this.panel.calculateMultiCheckedValue();\n },\n isInPath: function isInPath(pathNodes) {\n var node = this.node;\n\n var selectedPathNode = pathNodes[node.level - 1] || {};\n return selectedPathNode.uid === node.uid;\n },\n renderPrefix: function renderPrefix(h) {\n var isLeaf = this.isLeaf,\n isChecked = this.isChecked,\n config = this.config;\n var checkStrictly = config.checkStrictly,\n multiple = config.multiple;\n\n\n if (multiple) {\n return this.renderCheckbox(h);\n } else if (checkStrictly) {\n return this.renderRadio(h);\n } else if (isLeaf && isChecked) {\n return this.renderCheckIcon(h);\n }\n\n return null;\n },\n renderPostfix: function renderPostfix(h) {\n var node = this.node,\n isLeaf = this.isLeaf;\n\n\n if (node.loading) {\n return this.renderLoadingIcon(h);\n } else if (!isLeaf) {\n return this.renderExpandIcon(h);\n }\n\n return null;\n },\n renderCheckbox: function renderCheckbox(h) {\n var node = this.node,\n config = this.config,\n isDisabled = this.isDisabled;\n\n var events = {\n on: { change: this.handleMultiCheckChange },\n nativeOn: {}\n };\n\n if (config.checkStrictly) {\n // when every node is selectable, click event should not trigger expand event.\n events.nativeOn.click = stopPropagation;\n }\n\n return h('el-checkbox', external_babel_helper_vue_jsx_merge_props_default()([{\n attrs: {\n value: node.checked,\n indeterminate: node.indeterminate,\n disabled: isDisabled\n }\n }, events]));\n },\n renderRadio: function renderRadio(h) {\n var checkedValue = this.checkedValue,\n value = this.value,\n isDisabled = this.isDisabled;\n\n // to keep same reference if value cause radio's checked state is calculated by reference comparision;\n\n if (Object(util_[\"isEqual\"])(value, checkedValue)) {\n value = checkedValue;\n }\n\n return h(\n 'el-radio',\n {\n attrs: {\n value: checkedValue,\n label: value,\n disabled: isDisabled\n },\n on: {\n 'change': this.handleCheckChange\n },\n nativeOn: {\n 'click': stopPropagation\n }\n },\n [h('span')]\n );\n },\n renderCheckIcon: function renderCheckIcon(h) {\n return h('i', { 'class': 'el-icon-check el-cascader-node__prefix' });\n },\n renderLoadingIcon: function renderLoadingIcon(h) {\n return h('i', { 'class': 'el-icon-loading el-cascader-node__postfix' });\n },\n renderExpandIcon: function renderExpandIcon(h) {\n return h('i', { 'class': 'el-icon-arrow-right el-cascader-node__postfix' });\n },\n renderContent: function renderContent(h) {\n var panel = this.panel,\n node = this.node;\n\n var render = panel.renderLabelFn;\n var vnode = render ? render({ node: node, data: node.data }) : null;\n\n return h(\n 'span',\n { 'class': 'el-cascader-node__label' },\n [vnode || node.label]\n );\n }\n },\n\n render: function render(h) {\n var _this3 = this;\n\n var inActivePath = this.inActivePath,\n inCheckedPath = this.inCheckedPath,\n isChecked = this.isChecked,\n isLeaf = this.isLeaf,\n isDisabled = this.isDisabled,\n config = this.config,\n nodeId = this.nodeId;\n var expandTrigger = config.expandTrigger,\n checkStrictly = config.checkStrictly,\n multiple = config.multiple;\n\n var disabled = !checkStrictly && isDisabled;\n var events = { on: {} };\n\n if (expandTrigger === 'click') {\n events.on.click = this.handleExpand;\n } else {\n events.on.mouseenter = function (e) {\n _this3.handleExpand();\n _this3.$emit('expand', e);\n };\n events.on.focus = function (e) {\n _this3.handleExpand();\n _this3.$emit('expand', e);\n };\n }\n if (isLeaf && !isDisabled && !checkStrictly && !multiple) {\n events.on.click = this.handleCheckChange;\n }\n\n return h(\n 'li',\n external_babel_helper_vue_jsx_merge_props_default()([{\n attrs: {\n role: 'menuitem',\n id: nodeId,\n 'aria-expanded': inActivePath,\n tabindex: disabled ? null : -1\n },\n 'class': {\n 'el-cascader-node': true,\n 'is-selectable': checkStrictly,\n 'in-active-path': inActivePath,\n 'in-checked-path': inCheckedPath,\n 'is-active': isChecked,\n 'is-disabled': disabled\n }\n }, events]),\n [this.renderPrefix(h), this.renderContent(h), this.renderPostfix(h)]\n );\n }\n});\n// CONCATENATED MODULE: ./packages/cascader-panel/src/cascader-node.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_cascader_nodevue_type_script_lang_js_ = (cascader_nodevue_type_script_lang_js_); \n// EXTERNAL MODULE: ./node_modules/vue-loader/lib/runtime/componentNormalizer.js\nvar componentNormalizer = __webpack_require__(0);\n\n// CONCATENATED MODULE: ./packages/cascader-panel/src/cascader-node.vue\nvar cascader_node_render, cascader_node_staticRenderFns\n\n\n\n\n/* normalize component */\n\nvar component = Object(componentNormalizer[\"a\" /* default */])(\n src_cascader_nodevue_type_script_lang_js_,\n cascader_node_render,\n cascader_node_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = \"packages/cascader-panel/src/cascader-node.vue\"\n/* harmony default export */ var cascader_node = (component.exports);\n// EXTERNAL MODULE: external \"element-ui/lib/mixins/locale\"\nvar locale_ = __webpack_require__(6);\nvar locale_default = /*#__PURE__*/__webpack_require__.n(locale_);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/cascader-panel/src/cascader-menu.vue?vue&type=script&lang=js&\n\n\n\n\n\n\n\n/* harmony default export */ var cascader_menuvue_type_script_lang_js_ = ({\n name: 'ElCascaderMenu',\n\n mixins: [locale_default.a],\n\n inject: ['panel'],\n\n components: {\n ElScrollbar: scrollbar_default.a,\n CascaderNode: cascader_node\n },\n\n props: {\n nodes: {\n type: Array,\n required: true\n },\n index: Number\n },\n\n data: function data() {\n return {\n activeNode: null,\n hoverTimer: null,\n id: Object(util_[\"generateId\"])()\n };\n },\n\n\n computed: {\n isEmpty: function isEmpty() {\n return !this.nodes.length;\n },\n menuId: function menuId() {\n return 'cascader-menu-' + this.id + '-' + this.index;\n }\n },\n\n methods: {\n handleExpand: function handleExpand(e) {\n this.activeNode = e.target;\n },\n handleMouseMove: function handleMouseMove(e) {\n var activeNode = this.activeNode,\n hoverTimer = this.hoverTimer;\n var hoverZone = this.$refs.hoverZone;\n\n\n if (!activeNode || !hoverZone) return;\n\n if (activeNode.contains(e.target)) {\n clearTimeout(hoverTimer);\n\n var _$el$getBoundingClien = this.$el.getBoundingClientRect(),\n left = _$el$getBoundingClien.left;\n\n var startX = e.clientX - left;\n var _$el = this.$el,\n offsetWidth = _$el.offsetWidth,\n offsetHeight = _$el.offsetHeight;\n\n var top = activeNode.offsetTop;\n var bottom = top + activeNode.offsetHeight;\n\n hoverZone.innerHTML = '\\n \\n \\n ';\n } else if (!hoverTimer) {\n this.hoverTimer = setTimeout(this.clearHoverZone, this.panel.config.hoverThreshold);\n }\n },\n clearHoverZone: function clearHoverZone() {\n var hoverZone = this.$refs.hoverZone;\n\n if (!hoverZone) return;\n hoverZone.innerHTML = '';\n },\n renderEmptyText: function renderEmptyText(h) {\n return h(\n 'div',\n { 'class': 'el-cascader-menu__empty-text' },\n [this.t('el.cascader.noData')]\n );\n },\n renderNodeList: function renderNodeList(h) {\n var menuId = this.menuId;\n var isHoverMenu = this.panel.isHoverMenu;\n\n var events = { on: {} };\n\n if (isHoverMenu) {\n events.on.expand = this.handleExpand;\n }\n\n var nodes = this.nodes.map(function (node, index) {\n var hasChildren = node.hasChildren;\n\n return h('cascader-node', external_babel_helper_vue_jsx_merge_props_default()([{\n key: node.uid,\n attrs: { node: node,\n 'node-id': menuId + '-' + index,\n 'aria-haspopup': hasChildren,\n 'aria-owns': hasChildren ? menuId : null\n }\n }, events]));\n });\n\n return [].concat(nodes, [isHoverMenu ? h('svg', { ref: 'hoverZone', 'class': 'el-cascader-menu__hover-zone' }) : null]);\n }\n },\n\n render: function render(h) {\n var isEmpty = this.isEmpty,\n menuId = this.menuId;\n\n var events = { nativeOn: {} };\n\n // optimize hover to expand experience (#8010)\n if (this.panel.isHoverMenu) {\n events.nativeOn.mousemove = this.handleMouseMove;\n // events.nativeOn.mouseleave = this.clearHoverZone;\n }\n\n return h(\n 'el-scrollbar',\n external_babel_helper_vue_jsx_merge_props_default()([{\n attrs: {\n tag: 'ul',\n role: 'menu',\n id: menuId,\n\n 'wrap-class': 'el-cascader-menu__wrap',\n 'view-class': {\n 'el-cascader-menu__list': true,\n 'is-empty': isEmpty\n }\n },\n 'class': 'el-cascader-menu' }, events]),\n [isEmpty ? this.renderEmptyText(h) : this.renderNodeList(h)]\n );\n }\n});\n// CONCATENATED MODULE: ./packages/cascader-panel/src/cascader-menu.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_cascader_menuvue_type_script_lang_js_ = (cascader_menuvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/cascader-panel/src/cascader-menu.vue\nvar cascader_menu_render, cascader_menu_staticRenderFns\n\n\n\n\n/* normalize component */\n\nvar cascader_menu_component = Object(componentNormalizer[\"a\" /* default */])(\n src_cascader_menuvue_type_script_lang_js_,\n cascader_menu_render,\n cascader_menu_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var cascader_menu_api; }\ncascader_menu_component.options.__file = \"packages/cascader-panel/src/cascader-menu.vue\"\n/* harmony default export */ var cascader_menu = (cascader_menu_component.exports);\n// EXTERNAL MODULE: external \"element-ui/lib/utils/shared\"\nvar shared_ = __webpack_require__(21);\n\n// CONCATENATED MODULE: ./packages/cascader-panel/src/node.js\nvar _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; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\n\nvar uid = 0;\n\nvar node_Node = function () {\n function Node(data, config, parentNode) {\n _classCallCheck(this, Node);\n\n this.data = data;\n this.config = config;\n this.parent = parentNode || null;\n this.level = !this.parent ? 1 : this.parent.level + 1;\n this.uid = uid++;\n\n this.initState();\n this.initChildren();\n }\n\n Node.prototype.initState = function initState() {\n var _config = this.config,\n valueKey = _config.value,\n labelKey = _config.label;\n\n\n this.value = this.data[valueKey];\n this.label = this.data[labelKey];\n this.pathNodes = this.calculatePathNodes();\n this.path = this.pathNodes.map(function (node) {\n return node.value;\n });\n this.pathLabels = this.pathNodes.map(function (node) {\n return node.label;\n });\n\n // lazy load\n this.loading = false;\n this.loaded = false;\n };\n\n Node.prototype.initChildren = function initChildren() {\n var _this = this;\n\n var config = this.config;\n\n var childrenKey = config.children;\n var childrenData = this.data[childrenKey];\n this.hasChildren = Array.isArray(childrenData);\n this.children = (childrenData || []).map(function (child) {\n return new Node(child, config, _this);\n });\n };\n\n Node.prototype.calculatePathNodes = function calculatePathNodes() {\n var nodes = [this];\n var parent = this.parent;\n\n while (parent) {\n nodes.unshift(parent);\n parent = parent.parent;\n }\n\n return nodes;\n };\n\n Node.prototype.getPath = function getPath() {\n return this.path;\n };\n\n Node.prototype.getValue = function getValue() {\n return this.value;\n };\n\n Node.prototype.getValueByOption = function getValueByOption() {\n return this.config.emitPath ? this.getPath() : this.getValue();\n };\n\n Node.prototype.getText = function getText(allLevels, separator) {\n return allLevels ? this.pathLabels.join(separator) : this.label;\n };\n\n Node.prototype.isSameNode = function isSameNode(checkedValue) {\n var value = this.getValueByOption();\n return this.config.multiple && Array.isArray(checkedValue) ? checkedValue.some(function (val) {\n return Object(util_[\"isEqual\"])(val, value);\n }) : Object(util_[\"isEqual\"])(checkedValue, value);\n };\n\n Node.prototype.broadcast = function broadcast(event) {\n for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var handlerName = 'onParent' + Object(util_[\"capitalize\"])(event);\n\n this.children.forEach(function (child) {\n if (child) {\n // bottom up\n child.broadcast.apply(child, [event].concat(args));\n child[handlerName] && child[handlerName].apply(child, args);\n }\n });\n };\n\n Node.prototype.emit = function emit(event) {\n var parent = this.parent;\n\n var handlerName = 'onChild' + Object(util_[\"capitalize\"])(event);\n if (parent) {\n for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n parent[handlerName] && parent[handlerName].apply(parent, args);\n parent.emit.apply(parent, [event].concat(args));\n }\n };\n\n Node.prototype.onParentCheck = function onParentCheck(checked) {\n if (!this.isDisabled) {\n this.setCheckState(checked);\n }\n };\n\n Node.prototype.onChildCheck = function onChildCheck() {\n var children = this.children;\n\n var validChildren = children.filter(function (child) {\n return !child.isDisabled;\n });\n var checked = validChildren.length ? validChildren.every(function (child) {\n return child.checked;\n }) : false;\n\n this.setCheckState(checked);\n };\n\n Node.prototype.setCheckState = function setCheckState(checked) {\n var totalNum = this.children.length;\n var checkedNum = this.children.reduce(function (c, p) {\n var num = p.checked ? 1 : p.indeterminate ? 0.5 : 0;\n return c + num;\n }, 0);\n\n this.checked = checked;\n this.indeterminate = checkedNum !== totalNum && checkedNum > 0;\n };\n\n Node.prototype.syncCheckState = function syncCheckState(checkedValue) {\n var value = this.getValueByOption();\n var checked = this.isSameNode(checkedValue, value);\n\n this.doCheck(checked);\n };\n\n Node.prototype.doCheck = function doCheck(checked) {\n if (this.checked !== checked) {\n if (this.config.checkStrictly) {\n this.checked = checked;\n } else {\n // bottom up to unify the calculation of the indeterminate state\n this.broadcast('check', checked);\n this.setCheckState(checked);\n this.emit('check');\n }\n }\n };\n\n _createClass(Node, [{\n key: 'isDisabled',\n get: function get() {\n var data = this.data,\n parent = this.parent,\n config = this.config;\n\n var disabledKey = config.disabled;\n var checkStrictly = config.checkStrictly;\n\n return data[disabledKey] || !checkStrictly && parent && parent.isDisabled;\n }\n }, {\n key: 'isLeaf',\n get: function get() {\n var data = this.data,\n loaded = this.loaded,\n hasChildren = this.hasChildren,\n children = this.children;\n var _config2 = this.config,\n lazy = _config2.lazy,\n leafKey = _config2.leaf;\n\n if (lazy) {\n var isLeaf = Object(shared_[\"isDef\"])(data[leafKey]) ? data[leafKey] : loaded ? !children.length : false;\n this.hasChildren = !isLeaf;\n return isLeaf;\n }\n return !hasChildren;\n }\n }]);\n\n return Node;\n}();\n\n/* harmony default export */ var src_node = (node_Node);\n// CONCATENATED MODULE: ./packages/cascader-panel/src/store.js\nfunction store_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\n\nvar flatNodes = function flatNodes(data, leafOnly) {\n return data.reduce(function (res, node) {\n if (node.isLeaf) {\n res.push(node);\n } else {\n !leafOnly && res.push(node);\n res = res.concat(flatNodes(node.children, leafOnly));\n }\n return res;\n }, []);\n};\n\nvar store_Store = function () {\n function Store(data, config) {\n store_classCallCheck(this, Store);\n\n this.config = config;\n this.initNodes(data);\n }\n\n Store.prototype.initNodes = function initNodes(data) {\n var _this = this;\n\n data = Object(util_[\"coerceTruthyValueToArray\"])(data);\n this.nodes = data.map(function (nodeData) {\n return new src_node(nodeData, _this.config);\n });\n this.flattedNodes = this.getFlattedNodes(false, false);\n this.leafNodes = this.getFlattedNodes(true, false);\n };\n\n Store.prototype.appendNode = function appendNode(nodeData, parentNode) {\n var node = new src_node(nodeData, this.config, parentNode);\n var children = parentNode ? parentNode.children : this.nodes;\n\n children.push(node);\n };\n\n Store.prototype.appendNodes = function appendNodes(nodeDataList, parentNode) {\n var _this2 = this;\n\n nodeDataList = Object(util_[\"coerceTruthyValueToArray\"])(nodeDataList);\n nodeDataList.forEach(function (nodeData) {\n return _this2.appendNode(nodeData, parentNode);\n });\n };\n\n Store.prototype.getNodes = function getNodes() {\n return this.nodes;\n };\n\n Store.prototype.getFlattedNodes = function getFlattedNodes(leafOnly) {\n var cached = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n var cachedNodes = leafOnly ? this.leafNodes : this.flattedNodes;\n return cached ? cachedNodes : flatNodes(this.nodes, leafOnly);\n };\n\n Store.prototype.getNodeByValue = function getNodeByValue(value) {\n var nodes = this.getFlattedNodes(false, !this.config.lazy).filter(function (node) {\n return Object(util_[\"valueEquals\"])(node.path, value) || node.value === value;\n });\n return nodes && nodes.length ? nodes[0] : null;\n };\n\n return Store;\n}();\n\n/* harmony default export */ var src_store = (store_Store);\n// EXTERNAL MODULE: external \"element-ui/lib/utils/merge\"\nvar merge_ = __webpack_require__(9);\nvar merge_default = /*#__PURE__*/__webpack_require__.n(merge_);\n\n// EXTERNAL MODULE: external \"element-ui/lib/utils/aria-utils\"\nvar aria_utils_ = __webpack_require__(41);\nvar aria_utils_default = /*#__PURE__*/__webpack_require__.n(aria_utils_);\n\n// EXTERNAL MODULE: external \"element-ui/lib/utils/scroll-into-view\"\nvar scroll_into_view_ = __webpack_require__(31);\nvar scroll_into_view_default = /*#__PURE__*/__webpack_require__.n(scroll_into_view_);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/cascader-panel/src/cascader-panel.vue?vue&type=script&lang=js&\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\n\nvar KeyCode = aria_utils_default.a.keys;\n\nvar DefaultProps = {\n expandTrigger: 'click', // or hover\n multiple: false,\n checkStrictly: false, // whether all nodes can be selected\n emitPath: true, // wether to emit an array of all levels value in which node is located\n lazy: false,\n lazyLoad: util_[\"noop\"],\n value: 'value',\n label: 'label',\n children: 'children',\n leaf: 'leaf',\n disabled: 'disabled',\n hoverThreshold: 500\n};\n\nvar cascader_panelvue_type_script_lang_js_isLeaf = function isLeaf(el) {\n return !el.getAttribute('aria-owns');\n};\n\nvar getSibling = function getSibling(el, distance) {\n var parentNode = el.parentNode;\n\n if (parentNode) {\n var siblings = parentNode.querySelectorAll('.el-cascader-node[tabindex=\"-1\"]');\n var index = Array.prototype.indexOf.call(siblings, el);\n return siblings[index + distance] || null;\n }\n return null;\n};\n\nvar getMenuIndex = function getMenuIndex(el, distance) {\n if (!el) return;\n var pieces = el.id.split('-');\n return Number(pieces[pieces.length - 2]);\n};\n\nvar focusNode = function focusNode(el) {\n if (!el) return;\n el.focus();\n !cascader_panelvue_type_script_lang_js_isLeaf(el) && el.click();\n};\n\nvar checkNode = function checkNode(el) {\n if (!el) return;\n\n var input = el.querySelector('input');\n if (input) {\n input.click();\n } else if (cascader_panelvue_type_script_lang_js_isLeaf(el)) {\n el.click();\n }\n};\n\n/* harmony default export */ var cascader_panelvue_type_script_lang_js_ = ({\n name: 'ElCascaderPanel',\n\n components: {\n CascaderMenu: cascader_menu\n },\n\n props: {\n value: {},\n options: Array,\n props: Object,\n border: {\n type: Boolean,\n default: true\n },\n renderLabel: Function\n },\n\n provide: function provide() {\n return {\n panel: this\n };\n },\n data: function data() {\n return {\n checkedValue: null,\n checkedNodePaths: [],\n store: [],\n menus: [],\n activePath: [],\n loadCount: 0\n };\n },\n\n\n computed: {\n config: function config() {\n return merge_default()(_extends({}, DefaultProps), this.props || {});\n },\n multiple: function multiple() {\n return this.config.multiple;\n },\n checkStrictly: function checkStrictly() {\n return this.config.checkStrictly;\n },\n leafOnly: function leafOnly() {\n return !this.checkStrictly;\n },\n isHoverMenu: function isHoverMenu() {\n return this.config.expandTrigger === 'hover';\n },\n renderLabelFn: function renderLabelFn() {\n return this.renderLabel || this.$scopedSlots.default;\n }\n },\n\n watch: {\n value: function value() {\n this.syncCheckedValue();\n this.checkStrictly && this.calculateCheckedNodePaths();\n },\n\n options: {\n handler: function handler() {\n this.initStore();\n },\n immediate: true,\n deep: true\n },\n checkedValue: function checkedValue(val) {\n if (!Object(util_[\"isEqual\"])(val, this.value)) {\n this.checkStrictly && this.calculateCheckedNodePaths();\n this.$emit('input', val);\n this.$emit('change', val);\n }\n }\n },\n\n mounted: function mounted() {\n if (!this.isEmptyValue(this.value)) {\n this.syncCheckedValue();\n }\n },\n\n\n methods: {\n initStore: function initStore() {\n var config = this.config,\n options = this.options;\n\n if (config.lazy && Object(util_[\"isEmpty\"])(options)) {\n this.lazyLoad();\n } else {\n this.store = new src_store(options, config);\n this.menus = [this.store.getNodes()];\n this.syncMenuState();\n }\n },\n syncCheckedValue: function syncCheckedValue() {\n var value = this.value,\n checkedValue = this.checkedValue;\n\n if (!Object(util_[\"isEqual\"])(value, checkedValue)) {\n this.activePath = [];\n this.checkedValue = value;\n this.syncMenuState();\n }\n },\n syncMenuState: function syncMenuState() {\n var multiple = this.multiple,\n checkStrictly = this.checkStrictly;\n\n this.syncActivePath();\n multiple && this.syncMultiCheckState();\n checkStrictly && this.calculateCheckedNodePaths();\n this.$nextTick(this.scrollIntoView);\n },\n syncMultiCheckState: function syncMultiCheckState() {\n var _this = this;\n\n var nodes = this.getFlattedNodes(this.leafOnly);\n\n nodes.forEach(function (node) {\n node.syncCheckState(_this.checkedValue);\n });\n },\n isEmptyValue: function isEmptyValue(val) {\n var multiple = this.multiple,\n config = this.config;\n var emitPath = config.emitPath;\n\n if (multiple || emitPath) {\n return Object(util_[\"isEmpty\"])(val);\n }\n return false;\n },\n syncActivePath: function syncActivePath() {\n var _this2 = this;\n\n var store = this.store,\n multiple = this.multiple,\n activePath = this.activePath,\n checkedValue = this.checkedValue;\n\n\n if (!Object(util_[\"isEmpty\"])(activePath)) {\n var nodes = activePath.map(function (node) {\n return _this2.getNodeByValue(node.getValue());\n });\n this.expandNodes(nodes);\n } else if (!this.isEmptyValue(checkedValue)) {\n var value = multiple ? checkedValue[0] : checkedValue;\n var checkedNode = this.getNodeByValue(value) || {};\n var _nodes = (checkedNode.pathNodes || []).slice(0, -1);\n this.expandNodes(_nodes);\n } else {\n this.activePath = [];\n this.menus = [store.getNodes()];\n }\n },\n expandNodes: function expandNodes(nodes) {\n var _this3 = this;\n\n nodes.forEach(function (node) {\n return _this3.handleExpand(node, true /* silent */);\n });\n },\n calculateCheckedNodePaths: function calculateCheckedNodePaths() {\n var _this4 = this;\n\n var checkedValue = this.checkedValue,\n multiple = this.multiple;\n\n var checkedValues = multiple ? Object(util_[\"coerceTruthyValueToArray\"])(checkedValue) : [checkedValue];\n this.checkedNodePaths = checkedValues.map(function (v) {\n var checkedNode = _this4.getNodeByValue(v);\n return checkedNode ? checkedNode.pathNodes : [];\n });\n },\n handleKeyDown: function handleKeyDown(e) {\n var target = e.target,\n keyCode = e.keyCode;\n\n\n switch (keyCode) {\n case KeyCode.up:\n var prev = getSibling(target, -1);\n focusNode(prev);\n break;\n case KeyCode.down:\n var next = getSibling(target, 1);\n focusNode(next);\n break;\n case KeyCode.left:\n var preMenu = this.$refs.menu[getMenuIndex(target) - 1];\n if (preMenu) {\n var expandedNode = preMenu.$el.querySelector('.el-cascader-node[aria-expanded=\"true\"]');\n focusNode(expandedNode);\n }\n break;\n case KeyCode.right:\n var nextMenu = this.$refs.menu[getMenuIndex(target) + 1];\n if (nextMenu) {\n var firstNode = nextMenu.$el.querySelector('.el-cascader-node[tabindex=\"-1\"]');\n focusNode(firstNode);\n }\n break;\n case KeyCode.enter:\n checkNode(target);\n break;\n case KeyCode.esc:\n case KeyCode.tab:\n this.$emit('close');\n break;\n default:\n return;\n }\n },\n handleExpand: function handleExpand(node, silent) {\n var activePath = this.activePath;\n var level = node.level;\n\n var path = activePath.slice(0, level - 1);\n var menus = this.menus.slice(0, level);\n\n if (!node.isLeaf) {\n path.push(node);\n menus.push(node.children);\n }\n\n this.activePath = path;\n this.menus = menus;\n\n if (!silent) {\n var pathValues = path.map(function (node) {\n return node.getValue();\n });\n var activePathValues = activePath.map(function (node) {\n return node.getValue();\n });\n if (!Object(util_[\"valueEquals\"])(pathValues, activePathValues)) {\n this.$emit('active-item-change', pathValues); // Deprecated\n this.$emit('expand-change', pathValues);\n }\n }\n },\n handleCheckChange: function handleCheckChange(value) {\n this.checkedValue = value;\n },\n lazyLoad: function lazyLoad(node, onFullfiled) {\n var _this5 = this;\n\n var config = this.config;\n\n if (!node) {\n node = node || { root: true, level: 0 };\n this.store = new src_store([], config);\n this.menus = [this.store.getNodes()];\n }\n node.loading = true;\n var resolve = function resolve(dataList) {\n var parent = node.root ? null : node;\n dataList && dataList.length && _this5.store.appendNodes(dataList, parent);\n node.loading = false;\n node.loaded = true;\n\n // dispose default value on lazy load mode\n if (Array.isArray(_this5.checkedValue)) {\n var nodeValue = _this5.checkedValue[_this5.loadCount++];\n var valueKey = _this5.config.value;\n var leafKey = _this5.config.leaf;\n\n if (Array.isArray(dataList) && dataList.filter(function (item) {\n return item[valueKey] === nodeValue;\n }).length > 0) {\n var checkedNode = _this5.store.getNodeByValue(nodeValue);\n\n if (!checkedNode.data[leafKey]) {\n _this5.lazyLoad(checkedNode, function () {\n _this5.handleExpand(checkedNode);\n });\n }\n\n if (_this5.loadCount === _this5.checkedValue.length) {\n _this5.$parent.computePresentText();\n }\n }\n }\n\n onFullfiled && onFullfiled(dataList);\n };\n config.lazyLoad(node, resolve);\n },\n\n\n /**\n * public methods\n */\n calculateMultiCheckedValue: function calculateMultiCheckedValue() {\n this.checkedValue = this.getCheckedNodes(this.leafOnly).map(function (node) {\n return node.getValueByOption();\n });\n },\n scrollIntoView: function scrollIntoView() {\n if (this.$isServer) return;\n\n var menus = this.$refs.menu || [];\n menus.forEach(function (menu) {\n var menuElement = menu.$el;\n if (menuElement) {\n var container = menuElement.querySelector('.el-scrollbar__wrap');\n var activeNode = menuElement.querySelector('.el-cascader-node.is-active') || menuElement.querySelector('.el-cascader-node.in-active-path');\n scroll_into_view_default()(container, activeNode);\n }\n });\n },\n getNodeByValue: function getNodeByValue(val) {\n return this.store.getNodeByValue(val);\n },\n getFlattedNodes: function getFlattedNodes(leafOnly) {\n var cached = !this.config.lazy;\n return this.store.getFlattedNodes(leafOnly, cached);\n },\n getCheckedNodes: function getCheckedNodes(leafOnly) {\n var checkedValue = this.checkedValue,\n multiple = this.multiple;\n\n if (multiple) {\n var nodes = this.getFlattedNodes(leafOnly);\n return nodes.filter(function (node) {\n return node.checked;\n });\n } else {\n return this.isEmptyValue(checkedValue) ? [] : [this.getNodeByValue(checkedValue)];\n }\n },\n clearCheckedNodes: function clearCheckedNodes() {\n var config = this.config,\n leafOnly = this.leafOnly;\n var multiple = config.multiple,\n emitPath = config.emitPath;\n\n if (multiple) {\n this.getCheckedNodes(leafOnly).filter(function (node) {\n return !node.isDisabled;\n }).forEach(function (node) {\n return node.doCheck(false);\n });\n this.calculateMultiCheckedValue();\n } else {\n this.checkedValue = emitPath ? [] : null;\n }\n }\n }\n});\n// CONCATENATED MODULE: ./packages/cascader-panel/src/cascader-panel.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_cascader_panelvue_type_script_lang_js_ = (cascader_panelvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/cascader-panel/src/cascader-panel.vue\n\n\n\n\n\n/* normalize component */\n\nvar cascader_panel_component = Object(componentNormalizer[\"a\" /* default */])(\n src_cascader_panelvue_type_script_lang_js_,\n cascader_panelvue_type_template_id_34932346_render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var cascader_panel_api; }\ncascader_panel_component.options.__file = \"packages/cascader-panel/src/cascader-panel.vue\"\n/* harmony default export */ var cascader_panel = (cascader_panel_component.exports);\n// CONCATENATED MODULE: ./packages/cascader-panel/index.js\n\n\n/* istanbul ignore next */\ncascader_panel.install = function (Vue) {\n Vue.component(cascader_panel.name, cascader_panel);\n};\n\n/* harmony default export */ var packages_cascader_panel = __webpack_exports__[\"default\"] = (cascader_panel);\n\n/***/ }),\n\n/***/ 9:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__(\"7f4d\");\n\n/***/ })\n\n/******/ });\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvY2FzY2FkZXItcGFuZWwuanM/NDcyNiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCxnQ0FBZ0M7QUFDbEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFLGtCQUFrQjtBQUNsRjtBQUNBLHlEQUF5RCxjQUFjO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELGlDQUFpQztBQUNsRix3SEFBd0gsbUJBQW1CLEVBQUU7QUFDN0k7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLDBCQUEwQixFQUFFO0FBQy9ELHlDQUF5QyxlQUFlO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQsK0RBQStEO0FBQzdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDJGQUEyRiwyQkFBMkIsRUFBRTtBQUN4SDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87O0FBRVA7QUFDQTs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQyxNQUEwQjs7QUFFbkQsT0FBTzs7QUFFUDtBQUNBOztBQUVBLGlCQUFpQixtQkFBTyxDQUFDLE1BQXlCOztBQUVsRCxPQUFPOztBQUVQO0FBQ0E7O0FBRUEsaUJBQWlCLG1CQUFPLENBQUMsTUFBNkI7O0FBRXRELE9BQU87O0FBRVA7QUFDQTs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQyxNQUFrQzs7QUFFM0QsT0FBTzs7QUFFUDtBQUNBOztBQUVBLGlCQUFpQixtQkFBTyxDQUFDLE1BQTJCOztBQUVwRCxPQUFPOztBQUVQO0FBQ0E7O0FBRUEsaUJBQWlCLG1CQUFPLENBQUMsTUFBdUM7O0FBRWhFLE9BQU87O0FBRVA7QUFDQTs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQyxNQUFpQzs7QUFFMUQsT0FBTzs7QUFFUDtBQUNBOztBQUVBLGlCQUFpQixtQkFBTyxDQUFDLE1BQXNCOztBQUUvQyxPQUFPOztBQUVQO0FBQ0E7O0FBRUEsaUJBQWlCLG1CQUFPLENBQUMsTUFBOEI7O0FBRXZELE9BQU87O0FBRVA7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQixPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOzs7Ozs7O0FBT0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsYUFBYSxzQ0FBc0M7QUFDbkQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EscUJBQXFCLG9EQUFvRDtBQUN6RSxLQUFLO0FBQ0w7QUFDQSxxQkFBcUIsdURBQXVEO0FBQzVFLEtBQUs7QUFDTDtBQUNBLHFCQUFxQiwyREFBMkQ7QUFDaEYsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1DQUFtQyw4QkFBOEI7O0FBRWpFO0FBQ0E7QUFDQSxTQUFTLHFDQUFxQztBQUM5QztBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IsT0FBTzs7QUFFekI7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLHNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7OztBQUtBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxXQUFXLFlBQVk7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7QUFRQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsNkVBQTZFLDJJQUEySTtBQUN4TixPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsU0FBUywwQ0FBMEM7QUFDbkQ7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLE9BQU87O0FBRTNCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTzs7QUFFUCx1REFBdUQsNERBQTREO0FBQ25IO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLGFBQWE7O0FBRS9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0Esc0g7QUFDQTtBQUNBOzs7OztBQUtBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxXQUFXLDBCQUEwQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdDQUFnQywyQ0FBMkMsZ0JBQWdCLGtCQUFrQixPQUFPLDJCQUEyQix3REFBd0QsZ0NBQWdDLHVEQUF1RCwyREFBMkQsRUFBRSxFQUFFLHlEQUF5RCxxRUFBcUUsNkRBQTZELG9CQUFvQixHQUFHLEVBQUU7O0FBRWpqQixpREFBaUQsMENBQTBDLDBEQUEwRCxFQUFFOzs7OztBQUt2Sjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBLHNGQUFzRixhQUFhO0FBQ25HO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRGQUE0RixlQUFlO0FBQzNHO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0Esc0RBQXNELDBDQUEwQywwREFBMEQsRUFBRTs7Ozs7QUFLNUo7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbURBQW1ELGdCQUFnQixzQkFBc0IsT0FBTywyQkFBMkIsMEJBQTBCLHlEQUF5RCwyQkFBMkIsRUFBRSxFQUFFLEVBQUUsZUFBZTs7QUFFOVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7OztBQVNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQSx3Q0FBd0MsaUNBQWlDO0FBQ3pFLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLHVEQUF1RDtBQUN2RDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBOztBQUVBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLHdIO0FBQ0E7Ozs7OztBQU1BOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxXQUFXLDJCQUEyQjtBQUN0QztBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLE9BQU87O0FBRVA7QUFDQTs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQyxNQUE0Qjs7QUFFckQsT0FBTzs7QUFFUCxVQUFVIiwiZmlsZSI6IjQ3MjYuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9XG4vKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuLyoqKioqKi8gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4vKioqKioqLyBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuLyoqKioqKi8gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4vKioqKioqLyBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gbnM7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiL2Rpc3QvXCI7XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDYxKTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKHtcblxuLyoqKi8gMDpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiYVwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIG5vcm1hbGl6ZUNvbXBvbmVudDsgfSk7XG4vKiBnbG9iYWxzIF9fVlVFX1NTUl9DT05URVhUX18gKi9cblxuLy8gSU1QT1JUQU5UOiBEbyBOT1QgdXNlIEVTMjAxNSBmZWF0dXJlcyBpbiB0aGlzIGZpbGUgKGV4Y2VwdCBmb3IgbW9kdWxlcykuXG4vLyBUaGlzIG1vZHVsZSBpcyBhIHJ1bnRpbWUgdXRpbGl0eSBmb3IgY2xlYW5lciBjb21wb25lbnQgbW9kdWxlIG91dHB1dCBhbmQgd2lsbFxuLy8gYmUgaW5jbHVkZWQgaW4gdGhlIGZpbmFsIHdlYnBhY2sgdXNlciBidW5kbGUuXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbXBvbmVudCAoXG4gIHNjcmlwdEV4cG9ydHMsXG4gIHJlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmdW5jdGlvbmFsVGVtcGxhdGUsXG4gIGluamVjdFN0eWxlcyxcbiAgc2NvcGVJZCxcbiAgbW9kdWxlSWRlbnRpZmllciwgLyogc2VydmVyIG9ubHkgKi9cbiAgc2hhZG93TW9kZSAvKiB2dWUtY2xpIG9ubHkgKi9cbikge1xuICAvLyBWdWUuZXh0ZW5kIGNvbnN0cnVjdG9yIGV4cG9ydCBpbnRlcm9wXG4gIHZhciBvcHRpb25zID0gdHlwZW9mIHNjcmlwdEV4cG9ydHMgPT09ICdmdW5jdGlvbidcbiAgICA/IHNjcmlwdEV4cG9ydHMub3B0aW9uc1xuICAgIDogc2NyaXB0RXhwb3J0c1xuXG4gIC8vIHJlbmRlciBmdW5jdGlvbnNcbiAgaWYgKHJlbmRlcikge1xuICAgIG9wdGlvbnMucmVuZGVyID0gcmVuZGVyXG4gICAgb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnMgPSBzdGF0aWNSZW5kZXJGbnNcbiAgICBvcHRpb25zLl9jb21waWxlZCA9IHRydWVcbiAgfVxuXG4gIC8vIGZ1bmN0aW9uYWwgdGVtcGxhdGVcbiAgaWYgKGZ1bmN0aW9uYWxUZW1wbGF0ZSkge1xuICAgIG9wdGlvbnMuZnVuY3Rpb25hbCA9IHRydWVcbiAgfVxuXG4gIC8vIHNjb3BlZElkXG4gIGlmIChzY29wZUlkKSB7XG4gICAgb3B0aW9ucy5fc2NvcGVJZCA9ICdkYXRhLXYtJyArIHNjb3BlSWRcbiAgfVxuXG4gIHZhciBob29rXG4gIGlmIChtb2R1bGVJZGVudGlmaWVyKSB7IC8vIHNlcnZlciBidWlsZFxuICAgIGhvb2sgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgLy8gMi4zIGluamVjdGlvblxuICAgICAgY29udGV4dCA9XG4gICAgICAgIGNvbnRleHQgfHwgLy8gY2FjaGVkIGNhbGxcbiAgICAgICAgKHRoaXMuJHZub2RlICYmIHRoaXMuJHZub2RlLnNzckNvbnRleHQpIHx8IC8vIHN0YXRlZnVsXG4gICAgICAgICh0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC4kdm5vZGUgJiYgdGhpcy5wYXJlbnQuJHZub2RlLnNzckNvbnRleHQpIC8vIGZ1bmN0aW9uYWxcbiAgICAgIC8vIDIuMiB3aXRoIHJ1bkluTmV3Q29udGV4dDogdHJ1ZVxuICAgICAgaWYgKCFjb250ZXh0ICYmIHR5cGVvZiBfX1ZVRV9TU1JfQ09OVEVYVF9fICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjb250ZXh0ID0gX19WVUVfU1NSX0NPTlRFWFRfX1xuICAgICAgfVxuICAgICAgLy8gaW5qZWN0IGNvbXBvbmVudCBzdHlsZXNcbiAgICAgIGlmIChpbmplY3RTdHlsZXMpIHtcbiAgICAgICAgaW5qZWN0U3R5bGVzLmNhbGwodGhpcywgY29udGV4dClcbiAgICAgIH1cbiAgICAgIC8vIHJlZ2lzdGVyIGNvbXBvbmVudCBtb2R1bGUgaWRlbnRpZmllciBmb3IgYXN5bmMgY2h1bmsgaW5mZXJyZW5jZVxuICAgICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5fcmVnaXN0ZXJlZENvbXBvbmVudHMpIHtcbiAgICAgICAgY29udGV4dC5fcmVnaXN0ZXJlZENvbXBvbmVudHMuYWRkKG1vZHVsZUlkZW50aWZpZXIpXG4gICAgICB9XG4gICAgfVxuICAgIC8vIHVzZWQgYnkgc3NyIGluIGNhc2UgY29tcG9uZW50IGlzIGNhY2hlZCBhbmQgYmVmb3JlQ3JlYXRlXG4gICAgLy8gbmV2ZXIgZ2V0cyBjYWxsZWRcbiAgICBvcHRpb25zLl9zc3JSZWdpc3RlciA9IGhvb2tcbiAgfSBlbHNlIGlmIChpbmplY3RTdHlsZXMpIHtcbiAgICBob29rID0gc2hhZG93TW9kZVxuICAgICAgPyBmdW5jdGlvbiAoKSB7IGluamVjdFN0eWxlcy5jYWxsKHRoaXMsIHRoaXMuJHJvb3QuJG9wdGlvbnMuc2hhZG93Um9vdCkgfVxuICAgICAgOiBpbmplY3RTdHlsZXNcbiAgfVxuXG4gIGlmIChob29rKSB7XG4gICAgaWYgKG9wdGlvbnMuZnVuY3Rpb25hbCkge1xuICAgICAgLy8gZm9yIHRlbXBsYXRlLW9ubHkgaG90LXJlbG9hZCBiZWNhdXNlIGluIHRoYXQgY2FzZSB0aGUgcmVuZGVyIGZuIGRvZXNuJ3RcbiAgICAgIC8vIGdvIHRocm91Z2ggdGhlIG5vcm1hbGl6ZXJcbiAgICAgIG9wdGlvbnMuX2luamVjdFN0eWxlcyA9IGhvb2tcbiAgICAgIC8vIHJlZ2lzdGVyIGZvciBmdW5jdGlvYWwgY29tcG9uZW50IGluIHZ1ZSBmaWxlXG4gICAgICB2YXIgb3JpZ2luYWxSZW5kZXIgPSBvcHRpb25zLnJlbmRlclxuICAgICAgb3B0aW9ucy5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXJXaXRoU3R5bGVJbmplY3Rpb24gKGgsIGNvbnRleHQpIHtcbiAgICAgICAgaG9vay5jYWxsKGNvbnRleHQpXG4gICAgICAgIHJldHVybiBvcmlnaW5hbFJlbmRlcihoLCBjb250ZXh0KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpbmplY3QgY29tcG9uZW50IHJlZ2lzdHJhdGlvbiBhcyBiZWZvcmVDcmVhdGUgaG9va1xuICAgICAgdmFyIGV4aXN0aW5nID0gb3B0aW9ucy5iZWZvcmVDcmVhdGVcbiAgICAgIG9wdGlvbnMuYmVmb3JlQ3JlYXRlID0gZXhpc3RpbmdcbiAgICAgICAgPyBbXS5jb25jYXQoZXhpc3RpbmcsIGhvb2spXG4gICAgICAgIDogW2hvb2tdXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBleHBvcnRzOiBzY3JpcHRFeHBvcnRzLFxuICAgIG9wdGlvbnM6IG9wdGlvbnNcbiAgfVxufVxuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAxNTpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvc2Nyb2xsYmFyXCIpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMTg6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL2NoZWNrYm94XCIpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMjE6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL3V0aWxzL3NoYXJlZFwiKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDI2OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJiYWJlbC1oZWxwZXItdnVlLWpzeC1tZXJnZS1wcm9wc1wiKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDM6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL3V0aWxzL3V0aWxcIik7XG5cbi8qKiovIH0pLFxuXG4vKioqLyAzMTpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvdXRpbHMvc2Nyb2xsLWludG8tdmlld1wiKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDQxOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi91dGlscy9hcmlhLXV0aWxzXCIpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNTI6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL3JhZGlvXCIpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNjpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvbWl4aW5zL2xvY2FsZVwiKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDYxOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvY2FzY2FkZXItcGFuZWwudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTM0OTMyMzQ2JlxudmFyIGNhc2NhZGVyX3BhbmVsdnVlX3R5cGVfdGVtcGxhdGVfaWRfMzQ5MzIzNDZfcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwiZGl2XCIsXG4gICAge1xuICAgICAgY2xhc3M6IFtcImVsLWNhc2NhZGVyLXBhbmVsXCIsIF92bS5ib3JkZXIgJiYgXCJpcy1ib3JkZXJlZFwiXSxcbiAgICAgIG9uOiB7IGtleWRvd246IF92bS5oYW5kbGVLZXlEb3duIH1cbiAgICB9LFxuICAgIF92bS5fbChfdm0ubWVudXMsIGZ1bmN0aW9uKG1lbnUsIGluZGV4KSB7XG4gICAgICByZXR1cm4gX2MoXCJjYXNjYWRlci1tZW51XCIsIHtcbiAgICAgICAga2V5OiBpbmRleCxcbiAgICAgICAgcmVmOiBcIm1lbnVcIixcbiAgICAgICAgcmVmSW5Gb3I6IHRydWUsXG4gICAgICAgIGF0dHJzOiB7IGluZGV4OiBpbmRleCwgbm9kZXM6IG1lbnUgfVxuICAgICAgfSlcbiAgICB9KSxcbiAgICAxXG4gIClcbn1cbnZhciBzdGF0aWNSZW5kZXJGbnMgPSBbXVxuY2FzY2FkZXJfcGFuZWx2dWVfdHlwZV90ZW1wbGF0ZV9pZF8zNDkzMjM0Nl9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2Nhc2NhZGVyLXBhbmVsL3NyYy9jYXNjYWRlci1wYW5lbC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MzQ5MzIzNDYmXG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJiYWJlbC1oZWxwZXItdnVlLWpzeC1tZXJnZS1wcm9wc1wiXG52YXIgZXh0ZXJuYWxfYmFiZWxfaGVscGVyX3Z1ZV9qc3hfbWVyZ2VfcHJvcHNfID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNik7XG52YXIgZXh0ZXJuYWxfYmFiZWxfaGVscGVyX3Z1ZV9qc3hfbWVyZ2VfcHJvcHNfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oZXh0ZXJuYWxfYmFiZWxfaGVscGVyX3Z1ZV9qc3hfbWVyZ2VfcHJvcHNfKTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL3Njcm9sbGJhclwiXG52YXIgc2Nyb2xsYmFyXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpO1xudmFyIHNjcm9sbGJhcl9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihzY3JvbGxiYXJfKTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL2NoZWNrYm94XCJcbnZhciBjaGVja2JveF8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE4KTtcbnZhciBjaGVja2JveF9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjaGVja2JveF8pO1xuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvcmFkaW9cIlxudmFyIHJhZGlvXyA9IF9fd2VicGFja19yZXF1aXJlX18oNTIpO1xudmFyIHJhZGlvX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKHJhZGlvXyk7XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi91dGlscy91dGlsXCJcbnZhciB1dGlsXyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2Nhc2NhZGVyLXBhbmVsL3NyYy9jYXNjYWRlci1ub2RlLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcblxuXG5cblxuXG5cbnZhciBzdG9wUHJvcGFnYXRpb24gPSBmdW5jdGlvbiBzdG9wUHJvcGFnYXRpb24oZSkge1xuICByZXR1cm4gZS5zdG9wUHJvcGFnYXRpb24oKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGNhc2NhZGVyX25vZGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoe1xuICBpbmplY3Q6IFsncGFuZWwnXSxcblxuICBjb21wb25lbnRzOiB7XG4gICAgRWxDaGVja2JveDogY2hlY2tib3hfZGVmYXVsdC5hLFxuICAgIEVsUmFkaW86IHJhZGlvX2RlZmF1bHQuYVxuICB9LFxuXG4gIHByb3BzOiB7XG4gICAgbm9kZToge1xuICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICB9LFxuICAgIG5vZGVJZDogU3RyaW5nXG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBjb25maWc6IGZ1bmN0aW9uIGNvbmZpZygpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhbmVsLmNvbmZpZztcbiAgICB9LFxuICAgIGlzTGVhZjogZnVuY3Rpb24gaXNMZWFmKCkge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZS5pc0xlYWY7XG4gICAgfSxcbiAgICBpc0Rpc2FibGVkOiBmdW5jdGlvbiBpc0Rpc2FibGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZS5pc0Rpc2FibGVkO1xuICAgIH0sXG4gICAgY2hlY2tlZFZhbHVlOiBmdW5jdGlvbiBjaGVja2VkVmFsdWUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYW5lbC5jaGVja2VkVmFsdWU7XG4gICAgfSxcbiAgICBpc0NoZWNrZWQ6IGZ1bmN0aW9uIGlzQ2hlY2tlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGUuaXNTYW1lTm9kZSh0aGlzLmNoZWNrZWRWYWx1ZSk7XG4gICAgfSxcbiAgICBpbkFjdGl2ZVBhdGg6IGZ1bmN0aW9uIGluQWN0aXZlUGF0aCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzSW5QYXRoKHRoaXMucGFuZWwuYWN0aXZlUGF0aCk7XG4gICAgfSxcbiAgICBpbkNoZWNrZWRQYXRoOiBmdW5jdGlvbiBpbkNoZWNrZWRQYXRoKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgaWYgKCF0aGlzLmNvbmZpZy5jaGVja1N0cmljdGx5KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHJldHVybiB0aGlzLnBhbmVsLmNoZWNrZWROb2RlUGF0aHMuc29tZShmdW5jdGlvbiAoY2hlY2tlZFBhdGgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLmlzSW5QYXRoKGNoZWNrZWRQYXRoKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKCkge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZS5nZXRWYWx1ZUJ5T3B0aW9uKCk7XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBoYW5kbGVFeHBhbmQ6IGZ1bmN0aW9uIGhhbmRsZUV4cGFuZCgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgcGFuZWwgPSB0aGlzLnBhbmVsLFxuICAgICAgICAgIG5vZGUgPSB0aGlzLm5vZGUsXG4gICAgICAgICAgaXNEaXNhYmxlZCA9IHRoaXMuaXNEaXNhYmxlZCxcbiAgICAgICAgICBjb25maWcgPSB0aGlzLmNvbmZpZztcbiAgICAgIHZhciBtdWx0aXBsZSA9IGNvbmZpZy5tdWx0aXBsZSxcbiAgICAgICAgICBjaGVja1N0cmljdGx5ID0gY29uZmlnLmNoZWNrU3RyaWN0bHk7XG5cblxuICAgICAgaWYgKCFjaGVja1N0cmljdGx5ICYmIGlzRGlzYWJsZWQgfHwgbm9kZS5sb2FkaW5nKSByZXR1cm47XG5cbiAgICAgIGlmIChjb25maWcubGF6eSAmJiAhbm9kZS5sb2FkZWQpIHtcbiAgICAgICAgcGFuZWwubGF6eUxvYWQobm9kZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIGRvIG5vdCB1c2UgY2FjaGVkIGxlYWYgdmFsdWUgaGVyZSwgaW52b2tlIHRoaXMuaXNMZWFmIHRvIGdldCBuZXcgdmFsdWUuXG4gICAgICAgICAgdmFyIGlzTGVhZiA9IF90aGlzMi5pc0xlYWY7XG5cblxuICAgICAgICAgIGlmICghaXNMZWFmKSBfdGhpczIuaGFuZGxlRXhwYW5kKCk7XG4gICAgICAgICAgaWYgKG11bHRpcGxlKSB7XG4gICAgICAgICAgICAvLyBpZiBsZWFmIHN5bmMgY2hlY2tlZCBzdGF0ZSwgZWxzZSBjbGVhciBjaGVja2VkIHN0YXRlXG4gICAgICAgICAgICB2YXIgY2hlY2tlZCA9IGlzTGVhZiA/IG5vZGUuY2hlY2tlZCA6IGZhbHNlO1xuICAgICAgICAgICAgX3RoaXMyLmhhbmRsZU11bHRpQ2hlY2tDaGFuZ2UoY2hlY2tlZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhbmVsLmhhbmRsZUV4cGFuZChub2RlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGhhbmRsZUNoZWNrQ2hhbmdlOiBmdW5jdGlvbiBoYW5kbGVDaGVja0NoYW5nZSgpIHtcbiAgICAgIHZhciBwYW5lbCA9IHRoaXMucGFuZWwsXG4gICAgICAgICAgdmFsdWUgPSB0aGlzLnZhbHVlLFxuICAgICAgICAgIG5vZGUgPSB0aGlzLm5vZGU7XG5cbiAgICAgIHBhbmVsLmhhbmRsZUNoZWNrQ2hhbmdlKHZhbHVlKTtcbiAgICAgIHBhbmVsLmhhbmRsZUV4cGFuZChub2RlKTtcbiAgICB9LFxuICAgIGhhbmRsZU11bHRpQ2hlY2tDaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZU11bHRpQ2hlY2tDaGFuZ2UoY2hlY2tlZCkge1xuICAgICAgdGhpcy5ub2RlLmRvQ2hlY2soY2hlY2tlZCk7XG4gICAgICB0aGlzLnBhbmVsLmNhbGN1bGF0ZU11bHRpQ2hlY2tlZFZhbHVlKCk7XG4gICAgfSxcbiAgICBpc0luUGF0aDogZnVuY3Rpb24gaXNJblBhdGgocGF0aE5vZGVzKSB7XG4gICAgICB2YXIgbm9kZSA9IHRoaXMubm9kZTtcblxuICAgICAgdmFyIHNlbGVjdGVkUGF0aE5vZGUgPSBwYXRoTm9kZXNbbm9kZS5sZXZlbCAtIDFdIHx8IHt9O1xuICAgICAgcmV0dXJuIHNlbGVjdGVkUGF0aE5vZGUudWlkID09PSBub2RlLnVpZDtcbiAgICB9LFxuICAgIHJlbmRlclByZWZpeDogZnVuY3Rpb24gcmVuZGVyUHJlZml4KGgpIHtcbiAgICAgIHZhciBpc0xlYWYgPSB0aGlzLmlzTGVhZixcbiAgICAgICAgICBpc0NoZWNrZWQgPSB0aGlzLmlzQ2hlY2tlZCxcbiAgICAgICAgICBjb25maWcgPSB0aGlzLmNvbmZpZztcbiAgICAgIHZhciBjaGVja1N0cmljdGx5ID0gY29uZmlnLmNoZWNrU3RyaWN0bHksXG4gICAgICAgICAgbXVsdGlwbGUgPSBjb25maWcubXVsdGlwbGU7XG5cblxuICAgICAgaWYgKG11bHRpcGxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlckNoZWNrYm94KGgpO1xuICAgICAgfSBlbHNlIGlmIChjaGVja1N0cmljdGx5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlclJhZGlvKGgpO1xuICAgICAgfSBlbHNlIGlmIChpc0xlYWYgJiYgaXNDaGVja2VkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlckNoZWNrSWNvbihoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICByZW5kZXJQb3N0Zml4OiBmdW5jdGlvbiByZW5kZXJQb3N0Zml4KGgpIHtcbiAgICAgIHZhciBub2RlID0gdGhpcy5ub2RlLFxuICAgICAgICAgIGlzTGVhZiA9IHRoaXMuaXNMZWFmO1xuXG5cbiAgICAgIGlmIChub2RlLmxvYWRpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyTG9hZGluZ0ljb24oaCk7XG4gICAgICB9IGVsc2UgaWYgKCFpc0xlYWYpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyRXhwYW5kSWNvbihoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICByZW5kZXJDaGVja2JveDogZnVuY3Rpb24gcmVuZGVyQ2hlY2tib3goaCkge1xuICAgICAgdmFyIG5vZGUgPSB0aGlzLm5vZGUsXG4gICAgICAgICAgY29uZmlnID0gdGhpcy5jb25maWcsXG4gICAgICAgICAgaXNEaXNhYmxlZCA9IHRoaXMuaXNEaXNhYmxlZDtcblxuICAgICAgdmFyIGV2ZW50cyA9IHtcbiAgICAgICAgb246IHsgY2hhbmdlOiB0aGlzLmhhbmRsZU11bHRpQ2hlY2tDaGFuZ2UgfSxcbiAgICAgICAgbmF0aXZlT246IHt9XG4gICAgICB9O1xuXG4gICAgICBpZiAoY29uZmlnLmNoZWNrU3RyaWN0bHkpIHtcbiAgICAgICAgLy8gd2hlbiBldmVyeSBub2RlIGlzIHNlbGVjdGFibGUsIGNsaWNrIGV2ZW50IHNob3VsZCBub3QgdHJpZ2dlciBleHBhbmQgZXZlbnQuXG4gICAgICAgIGV2ZW50cy5uYXRpdmVPbi5jbGljayA9IHN0b3BQcm9wYWdhdGlvbjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGgoJ2VsLWNoZWNrYm94JywgZXh0ZXJuYWxfYmFiZWxfaGVscGVyX3Z1ZV9qc3hfbWVyZ2VfcHJvcHNfZGVmYXVsdCgpKFt7XG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgdmFsdWU6IG5vZGUuY2hlY2tlZCxcbiAgICAgICAgICBpbmRldGVybWluYXRlOiBub2RlLmluZGV0ZXJtaW5hdGUsXG4gICAgICAgICAgZGlzYWJsZWQ6IGlzRGlzYWJsZWRcbiAgICAgICAgfVxuICAgICAgfSwgZXZlbnRzXSkpO1xuICAgIH0sXG4gICAgcmVuZGVyUmFkaW86IGZ1bmN0aW9uIHJlbmRlclJhZGlvKGgpIHtcbiAgICAgIHZhciBjaGVja2VkVmFsdWUgPSB0aGlzLmNoZWNrZWRWYWx1ZSxcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMudmFsdWUsXG4gICAgICAgICAgaXNEaXNhYmxlZCA9IHRoaXMuaXNEaXNhYmxlZDtcblxuICAgICAgLy8gdG8ga2VlcCBzYW1lIHJlZmVyZW5jZSBpZiB2YWx1ZSBjYXVzZSByYWRpbydzIGNoZWNrZWQgc3RhdGUgaXMgY2FsY3VsYXRlZCBieSByZWZlcmVuY2UgY29tcGFyaXNpb247XG5cbiAgICAgIGlmIChPYmplY3QodXRpbF9bXCJpc0VxdWFsXCJdKSh2YWx1ZSwgY2hlY2tlZFZhbHVlKSkge1xuICAgICAgICB2YWx1ZSA9IGNoZWNrZWRWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGgoXG4gICAgICAgICdlbC1yYWRpbycsXG4gICAgICAgIHtcbiAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgdmFsdWU6IGNoZWNrZWRWYWx1ZSxcbiAgICAgICAgICAgIGxhYmVsOiB2YWx1ZSxcbiAgICAgICAgICAgIGRpc2FibGVkOiBpc0Rpc2FibGVkXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgJ2NoYW5nZSc6IHRoaXMuaGFuZGxlQ2hlY2tDaGFuZ2VcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5hdGl2ZU9uOiB7XG4gICAgICAgICAgICAnY2xpY2snOiBzdG9wUHJvcGFnYXRpb25cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtoKCdzcGFuJyldXG4gICAgICApO1xuICAgIH0sXG4gICAgcmVuZGVyQ2hlY2tJY29uOiBmdW5jdGlvbiByZW5kZXJDaGVja0ljb24oaCkge1xuICAgICAgcmV0dXJuIGgoJ2knLCB7ICdjbGFzcyc6ICdlbC1pY29uLWNoZWNrIGVsLWNhc2NhZGVyLW5vZGVfX3ByZWZpeCcgfSk7XG4gICAgfSxcbiAgICByZW5kZXJMb2FkaW5nSWNvbjogZnVuY3Rpb24gcmVuZGVyTG9hZGluZ0ljb24oaCkge1xuICAgICAgcmV0dXJuIGgoJ2knLCB7ICdjbGFzcyc6ICdlbC1pY29uLWxvYWRpbmcgZWwtY2FzY2FkZXItbm9kZV9fcG9zdGZpeCcgfSk7XG4gICAgfSxcbiAgICByZW5kZXJFeHBhbmRJY29uOiBmdW5jdGlvbiByZW5kZXJFeHBhbmRJY29uKGgpIHtcbiAgICAgIHJldHVybiBoKCdpJywgeyAnY2xhc3MnOiAnZWwtaWNvbi1hcnJvdy1yaWdodCBlbC1jYXNjYWRlci1ub2RlX19wb3N0Zml4JyB9KTtcbiAgICB9LFxuICAgIHJlbmRlckNvbnRlbnQ6IGZ1bmN0aW9uIHJlbmRlckNvbnRlbnQoaCkge1xuICAgICAgdmFyIHBhbmVsID0gdGhpcy5wYW5lbCxcbiAgICAgICAgICBub2RlID0gdGhpcy5ub2RlO1xuXG4gICAgICB2YXIgcmVuZGVyID0gcGFuZWwucmVuZGVyTGFiZWxGbjtcbiAgICAgIHZhciB2bm9kZSA9IHJlbmRlciA/IHJlbmRlcih7IG5vZGU6IG5vZGUsIGRhdGE6IG5vZGUuZGF0YSB9KSA6IG51bGw7XG5cbiAgICAgIHJldHVybiBoKFxuICAgICAgICAnc3BhbicsXG4gICAgICAgIHsgJ2NsYXNzJzogJ2VsLWNhc2NhZGVyLW5vZGVfX2xhYmVsJyB9LFxuICAgICAgICBbdm5vZGUgfHwgbm9kZS5sYWJlbF1cbiAgICAgICk7XG4gICAgfVxuICB9LFxuXG4gIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKGgpIHtcbiAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgIHZhciBpbkFjdGl2ZVBhdGggPSB0aGlzLmluQWN0aXZlUGF0aCxcbiAgICAgICAgaW5DaGVja2VkUGF0aCA9IHRoaXMuaW5DaGVja2VkUGF0aCxcbiAgICAgICAgaXNDaGVja2VkID0gdGhpcy5pc0NoZWNrZWQsXG4gICAgICAgIGlzTGVhZiA9IHRoaXMuaXNMZWFmLFxuICAgICAgICBpc0Rpc2FibGVkID0gdGhpcy5pc0Rpc2FibGVkLFxuICAgICAgICBjb25maWcgPSB0aGlzLmNvbmZpZyxcbiAgICAgICAgbm9kZUlkID0gdGhpcy5ub2RlSWQ7XG4gICAgdmFyIGV4cGFuZFRyaWdnZXIgPSBjb25maWcuZXhwYW5kVHJpZ2dlcixcbiAgICAgICAgY2hlY2tTdHJpY3RseSA9IGNvbmZpZy5jaGVja1N0cmljdGx5LFxuICAgICAgICBtdWx0aXBsZSA9IGNvbmZpZy5tdWx0aXBsZTtcblxuICAgIHZhciBkaXNhYmxlZCA9ICFjaGVja1N0cmljdGx5ICYmIGlzRGlzYWJsZWQ7XG4gICAgdmFyIGV2ZW50cyA9IHsgb246IHt9IH07XG5cbiAgICBpZiAoZXhwYW5kVHJpZ2dlciA9PT0gJ2NsaWNrJykge1xuICAgICAgZXZlbnRzLm9uLmNsaWNrID0gdGhpcy5oYW5kbGVFeHBhbmQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV2ZW50cy5vbi5tb3VzZWVudGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgX3RoaXMzLmhhbmRsZUV4cGFuZCgpO1xuICAgICAgICBfdGhpczMuJGVtaXQoJ2V4cGFuZCcsIGUpO1xuICAgICAgfTtcbiAgICAgIGV2ZW50cy5vbi5mb2N1cyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIF90aGlzMy5oYW5kbGVFeHBhbmQoKTtcbiAgICAgICAgX3RoaXMzLiRlbWl0KCdleHBhbmQnLCBlKTtcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChpc0xlYWYgJiYgIWlzRGlzYWJsZWQgJiYgIWNoZWNrU3RyaWN0bHkgJiYgIW11bHRpcGxlKSB7XG4gICAgICBldmVudHMub24uY2xpY2sgPSB0aGlzLmhhbmRsZUNoZWNrQ2hhbmdlO1xuICAgIH1cblxuICAgIHJldHVybiBoKFxuICAgICAgJ2xpJyxcbiAgICAgIGV4dGVybmFsX2JhYmVsX2hlbHBlcl92dWVfanN4X21lcmdlX3Byb3BzX2RlZmF1bHQoKShbe1xuICAgICAgICBhdHRyczoge1xuICAgICAgICAgIHJvbGU6ICdtZW51aXRlbScsXG4gICAgICAgICAgaWQ6IG5vZGVJZCxcbiAgICAgICAgICAnYXJpYS1leHBhbmRlZCc6IGluQWN0aXZlUGF0aCxcbiAgICAgICAgICB0YWJpbmRleDogZGlzYWJsZWQgPyBudWxsIDogLTFcbiAgICAgICAgfSxcbiAgICAgICAgJ2NsYXNzJzoge1xuICAgICAgICAgICdlbC1jYXNjYWRlci1ub2RlJzogdHJ1ZSxcbiAgICAgICAgICAnaXMtc2VsZWN0YWJsZSc6IGNoZWNrU3RyaWN0bHksXG4gICAgICAgICAgJ2luLWFjdGl2ZS1wYXRoJzogaW5BY3RpdmVQYXRoLFxuICAgICAgICAgICdpbi1jaGVja2VkLXBhdGgnOiBpbkNoZWNrZWRQYXRoLFxuICAgICAgICAgICdpcy1hY3RpdmUnOiBpc0NoZWNrZWQsXG4gICAgICAgICAgJ2lzLWRpc2FibGVkJzogZGlzYWJsZWRcbiAgICAgICAgfVxuICAgICAgfSwgZXZlbnRzXSksXG4gICAgICBbdGhpcy5yZW5kZXJQcmVmaXgoaCksIHRoaXMucmVuZGVyQ29udGVudChoKSwgdGhpcy5yZW5kZXJQb3N0Zml4KGgpXVxuICAgICk7XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvY2FzY2FkZXItbm9kZS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX2Nhc2NhZGVyX25vZGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoY2FzY2FkZXJfbm9kZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9ydW50aW1lL2NvbXBvbmVudE5vcm1hbGl6ZXIuanNcbnZhciBjb21wb25lbnROb3JtYWxpemVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvY2FzY2FkZXItbm9kZS52dWVcbnZhciBjYXNjYWRlcl9ub2RlX3JlbmRlciwgY2FzY2FkZXJfbm9kZV9zdGF0aWNSZW5kZXJGbnNcblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgY29tcG9uZW50ID0gT2JqZWN0KGNvbXBvbmVudE5vcm1hbGl6ZXJbXCJhXCIgLyogZGVmYXVsdCAqL10pKFxuICBzcmNfY2FzY2FkZXJfbm9kZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgY2FzY2FkZXJfbm9kZV9yZW5kZXIsXG4gIGNhc2NhZGVyX25vZGVfc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBhcGk7IH1cbmNvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvY2FzY2FkZXItcGFuZWwvc3JjL2Nhc2NhZGVyLW5vZGUudnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGNhc2NhZGVyX25vZGUgPSAoY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL21peGlucy9sb2NhbGVcIlxudmFyIGxvY2FsZV8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpO1xudmFyIGxvY2FsZV9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihsb2NhbGVfKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvY2FzY2FkZXItcGFuZWwvc3JjL2Nhc2NhZGVyLW1lbnUudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuXG5cblxuXG5cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBjYXNjYWRlcl9tZW51dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ0VsQ2FzY2FkZXJNZW51JyxcblxuICBtaXhpbnM6IFtsb2NhbGVfZGVmYXVsdC5hXSxcblxuICBpbmplY3Q6IFsncGFuZWwnXSxcblxuICBjb21wb25lbnRzOiB7XG4gICAgRWxTY3JvbGxiYXI6IHNjcm9sbGJhcl9kZWZhdWx0LmEsXG4gICAgQ2FzY2FkZXJOb2RlOiBjYXNjYWRlcl9ub2RlXG4gIH0sXG5cbiAgcHJvcHM6IHtcbiAgICBub2Rlczoge1xuICAgICAgdHlwZTogQXJyYXksXG4gICAgICByZXF1aXJlZDogdHJ1ZVxuICAgIH0sXG4gICAgaW5kZXg6IE51bWJlclxuICB9LFxuXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGl2ZU5vZGU6IG51bGwsXG4gICAgICBob3ZlclRpbWVyOiBudWxsLFxuICAgICAgaWQ6IE9iamVjdCh1dGlsX1tcImdlbmVyYXRlSWRcIl0pKClcbiAgICB9O1xuICB9LFxuXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBpc0VtcHR5OiBmdW5jdGlvbiBpc0VtcHR5KCkge1xuICAgICAgcmV0dXJuICF0aGlzLm5vZGVzLmxlbmd0aDtcbiAgICB9LFxuICAgIG1lbnVJZDogZnVuY3Rpb24gbWVudUlkKCkge1xuICAgICAgcmV0dXJuICdjYXNjYWRlci1tZW51LScgKyB0aGlzLmlkICsgJy0nICsgdGhpcy5pbmRleDtcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGhhbmRsZUV4cGFuZDogZnVuY3Rpb24gaGFuZGxlRXhwYW5kKGUpIHtcbiAgICAgIHRoaXMuYWN0aXZlTm9kZSA9IGUudGFyZ2V0O1xuICAgIH0sXG4gICAgaGFuZGxlTW91c2VNb3ZlOiBmdW5jdGlvbiBoYW5kbGVNb3VzZU1vdmUoZSkge1xuICAgICAgdmFyIGFjdGl2ZU5vZGUgPSB0aGlzLmFjdGl2ZU5vZGUsXG4gICAgICAgICAgaG92ZXJUaW1lciA9IHRoaXMuaG92ZXJUaW1lcjtcbiAgICAgIHZhciBob3ZlclpvbmUgPSB0aGlzLiRyZWZzLmhvdmVyWm9uZTtcblxuXG4gICAgICBpZiAoIWFjdGl2ZU5vZGUgfHwgIWhvdmVyWm9uZSkgcmV0dXJuO1xuXG4gICAgICBpZiAoYWN0aXZlTm9kZS5jb250YWlucyhlLnRhcmdldCkpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGhvdmVyVGltZXIpO1xuXG4gICAgICAgIHZhciBfJGVsJGdldEJvdW5kaW5nQ2xpZW4gPSB0aGlzLiRlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgICAgIGxlZnQgPSBfJGVsJGdldEJvdW5kaW5nQ2xpZW4ubGVmdDtcblxuICAgICAgICB2YXIgc3RhcnRYID0gZS5jbGllbnRYIC0gbGVmdDtcbiAgICAgICAgdmFyIF8kZWwgPSB0aGlzLiRlbCxcbiAgICAgICAgICAgIG9mZnNldFdpZHRoID0gXyRlbC5vZmZzZXRXaWR0aCxcbiAgICAgICAgICAgIG9mZnNldEhlaWdodCA9IF8kZWwub2Zmc2V0SGVpZ2h0O1xuXG4gICAgICAgIHZhciB0b3AgPSBhY3RpdmVOb2RlLm9mZnNldFRvcDtcbiAgICAgICAgdmFyIGJvdHRvbSA9IHRvcCArIGFjdGl2ZU5vZGUub2Zmc2V0SGVpZ2h0O1xuXG4gICAgICAgIGhvdmVyWm9uZS5pbm5lckhUTUwgPSAnXFxuICAgICAgICAgIDxwYXRoIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IGF1dG87XCIgZmlsbD1cInRyYW5zcGFyZW50XCIgZD1cIk0nICsgc3RhcnRYICsgJyAnICsgdG9wICsgJyBMJyArIG9mZnNldFdpZHRoICsgJyAwIFYnICsgdG9wICsgJyBaXCIgLz5cXG4gICAgICAgICAgPHBhdGggc3R5bGU9XCJwb2ludGVyLWV2ZW50czogYXV0bztcIiBmaWxsPVwidHJhbnNwYXJlbnRcIiBkPVwiTScgKyBzdGFydFggKyAnICcgKyBib3R0b20gKyAnIEwnICsgb2Zmc2V0V2lkdGggKyAnICcgKyBvZmZzZXRIZWlnaHQgKyAnIFYnICsgYm90dG9tICsgJyBaXCIgLz5cXG4gICAgICAgICc7XG4gICAgICB9IGVsc2UgaWYgKCFob3ZlclRpbWVyKSB7XG4gICAgICAgIHRoaXMuaG92ZXJUaW1lciA9IHNldFRpbWVvdXQodGhpcy5jbGVhckhvdmVyWm9uZSwgdGhpcy5wYW5lbC5jb25maWcuaG92ZXJUaHJlc2hvbGQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgY2xlYXJIb3ZlclpvbmU6IGZ1bmN0aW9uIGNsZWFySG92ZXJab25lKCkge1xuICAgICAgdmFyIGhvdmVyWm9uZSA9IHRoaXMuJHJlZnMuaG92ZXJab25lO1xuXG4gICAgICBpZiAoIWhvdmVyWm9uZSkgcmV0dXJuO1xuICAgICAgaG92ZXJab25lLmlubmVySFRNTCA9ICcnO1xuICAgIH0sXG4gICAgcmVuZGVyRW1wdHlUZXh0OiBmdW5jdGlvbiByZW5kZXJFbXB0eVRleHQoaCkge1xuICAgICAgcmV0dXJuIGgoXG4gICAgICAgICdkaXYnLFxuICAgICAgICB7ICdjbGFzcyc6ICdlbC1jYXNjYWRlci1tZW51X19lbXB0eS10ZXh0JyB9LFxuICAgICAgICBbdGhpcy50KCdlbC5jYXNjYWRlci5ub0RhdGEnKV1cbiAgICAgICk7XG4gICAgfSxcbiAgICByZW5kZXJOb2RlTGlzdDogZnVuY3Rpb24gcmVuZGVyTm9kZUxpc3QoaCkge1xuICAgICAgdmFyIG1lbnVJZCA9IHRoaXMubWVudUlkO1xuICAgICAgdmFyIGlzSG92ZXJNZW51ID0gdGhpcy5wYW5lbC5pc0hvdmVyTWVudTtcblxuICAgICAgdmFyIGV2ZW50cyA9IHsgb246IHt9IH07XG5cbiAgICAgIGlmIChpc0hvdmVyTWVudSkge1xuICAgICAgICBldmVudHMub24uZXhwYW5kID0gdGhpcy5oYW5kbGVFeHBhbmQ7XG4gICAgICB9XG5cbiAgICAgIHZhciBub2RlcyA9IHRoaXMubm9kZXMubWFwKGZ1bmN0aW9uIChub2RlLCBpbmRleCkge1xuICAgICAgICB2YXIgaGFzQ2hpbGRyZW4gPSBub2RlLmhhc0NoaWxkcmVuO1xuXG4gICAgICAgIHJldHVybiBoKCdjYXNjYWRlci1ub2RlJywgZXh0ZXJuYWxfYmFiZWxfaGVscGVyX3Z1ZV9qc3hfbWVyZ2VfcHJvcHNfZGVmYXVsdCgpKFt7XG4gICAgICAgICAga2V5OiBub2RlLnVpZCxcbiAgICAgICAgICBhdHRyczogeyBub2RlOiBub2RlLFxuICAgICAgICAgICAgJ25vZGUtaWQnOiBtZW51SWQgKyAnLScgKyBpbmRleCxcbiAgICAgICAgICAgICdhcmlhLWhhc3BvcHVwJzogaGFzQ2hpbGRyZW4sXG4gICAgICAgICAgICAnYXJpYS1vd25zJzogaGFzQ2hpbGRyZW4gPyBtZW51SWQgOiBudWxsXG4gICAgICAgICAgfVxuICAgICAgICB9LCBldmVudHNdKSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIFtdLmNvbmNhdChub2RlcywgW2lzSG92ZXJNZW51ID8gaCgnc3ZnJywgeyByZWY6ICdob3ZlclpvbmUnLCAnY2xhc3MnOiAnZWwtY2FzY2FkZXItbWVudV9faG92ZXItem9uZScgfSkgOiBudWxsXSk7XG4gICAgfVxuICB9LFxuXG4gIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKGgpIHtcbiAgICB2YXIgaXNFbXB0eSA9IHRoaXMuaXNFbXB0eSxcbiAgICAgICAgbWVudUlkID0gdGhpcy5tZW51SWQ7XG5cbiAgICB2YXIgZXZlbnRzID0geyBuYXRpdmVPbjoge30gfTtcblxuICAgIC8vIG9wdGltaXplIGhvdmVyIHRvIGV4cGFuZCBleHBlcmllbmNlICgjODAxMClcbiAgICBpZiAodGhpcy5wYW5lbC5pc0hvdmVyTWVudSkge1xuICAgICAgZXZlbnRzLm5hdGl2ZU9uLm1vdXNlbW92ZSA9IHRoaXMuaGFuZGxlTW91c2VNb3ZlO1xuICAgICAgLy8gZXZlbnRzLm5hdGl2ZU9uLm1vdXNlbGVhdmUgPSB0aGlzLmNsZWFySG92ZXJab25lO1xuICAgIH1cblxuICAgIHJldHVybiBoKFxuICAgICAgJ2VsLXNjcm9sbGJhcicsXG4gICAgICBleHRlcm5hbF9iYWJlbF9oZWxwZXJfdnVlX2pzeF9tZXJnZV9wcm9wc19kZWZhdWx0KCkoW3tcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICB0YWc6ICd1bCcsXG4gICAgICAgICAgcm9sZTogJ21lbnUnLFxuICAgICAgICAgIGlkOiBtZW51SWQsXG5cbiAgICAgICAgICAnd3JhcC1jbGFzcyc6ICdlbC1jYXNjYWRlci1tZW51X193cmFwJyxcbiAgICAgICAgICAndmlldy1jbGFzcyc6IHtcbiAgICAgICAgICAgICdlbC1jYXNjYWRlci1tZW51X19saXN0JzogdHJ1ZSxcbiAgICAgICAgICAgICdpcy1lbXB0eSc6IGlzRW1wdHlcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICdjbGFzcyc6ICdlbC1jYXNjYWRlci1tZW51JyB9LCBldmVudHNdKSxcbiAgICAgIFtpc0VtcHR5ID8gdGhpcy5yZW5kZXJFbXB0eVRleHQoaCkgOiB0aGlzLnJlbmRlck5vZGVMaXN0KGgpXVxuICAgICk7XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvY2FzY2FkZXItbWVudS52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX2Nhc2NhZGVyX21lbnV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoY2FzY2FkZXJfbWVudXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvY2FzY2FkZXItbWVudS52dWVcbnZhciBjYXNjYWRlcl9tZW51X3JlbmRlciwgY2FzY2FkZXJfbWVudV9zdGF0aWNSZW5kZXJGbnNcblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgY2FzY2FkZXJfbWVudV9jb21wb25lbnQgPSBPYmplY3QoY29tcG9uZW50Tm9ybWFsaXplcltcImFcIiAvKiBkZWZhdWx0ICovXSkoXG4gIHNyY19jYXNjYWRlcl9tZW51dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBjYXNjYWRlcl9tZW51X3JlbmRlcixcbiAgY2FzY2FkZXJfbWVudV9zdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIGNhc2NhZGVyX21lbnVfYXBpOyB9XG5jYXNjYWRlcl9tZW51X2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvY2FzY2FkZXItcGFuZWwvc3JjL2Nhc2NhZGVyLW1lbnUudnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGNhc2NhZGVyX21lbnUgPSAoY2FzY2FkZXJfbWVudV9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvdXRpbHMvc2hhcmVkXCJcbnZhciBzaGFyZWRfID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMSk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2FzY2FkZXItcGFuZWwvc3JjL25vZGUuanNcbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cblxuXG5cbnZhciB1aWQgPSAwO1xuXG52YXIgbm9kZV9Ob2RlID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBOb2RlKGRhdGEsIGNvbmZpZywgcGFyZW50Tm9kZSkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBOb2RlKTtcblxuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnROb2RlIHx8IG51bGw7XG4gICAgdGhpcy5sZXZlbCA9ICF0aGlzLnBhcmVudCA/IDEgOiB0aGlzLnBhcmVudC5sZXZlbCArIDE7XG4gICAgdGhpcy51aWQgPSB1aWQrKztcblxuICAgIHRoaXMuaW5pdFN0YXRlKCk7XG4gICAgdGhpcy5pbml0Q2hpbGRyZW4oKTtcbiAgfVxuXG4gIE5vZGUucHJvdG90eXBlLmluaXRTdGF0ZSA9IGZ1bmN0aW9uIGluaXRTdGF0ZSgpIHtcbiAgICB2YXIgX2NvbmZpZyA9IHRoaXMuY29uZmlnLFxuICAgICAgICB2YWx1ZUtleSA9IF9jb25maWcudmFsdWUsXG4gICAgICAgIGxhYmVsS2V5ID0gX2NvbmZpZy5sYWJlbDtcblxuXG4gICAgdGhpcy52YWx1ZSA9IHRoaXMuZGF0YVt2YWx1ZUtleV07XG4gICAgdGhpcy5sYWJlbCA9IHRoaXMuZGF0YVtsYWJlbEtleV07XG4gICAgdGhpcy5wYXRoTm9kZXMgPSB0aGlzLmNhbGN1bGF0ZVBhdGhOb2RlcygpO1xuICAgIHRoaXMucGF0aCA9IHRoaXMucGF0aE5vZGVzLm1hcChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgcmV0dXJuIG5vZGUudmFsdWU7XG4gICAgfSk7XG4gICAgdGhpcy5wYXRoTGFiZWxzID0gdGhpcy5wYXRoTm9kZXMubWFwKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICByZXR1cm4gbm9kZS5sYWJlbDtcbiAgICB9KTtcblxuICAgIC8vIGxhenkgbG9hZFxuICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMubG9hZGVkID0gZmFsc2U7XG4gIH07XG5cbiAgTm9kZS5wcm90b3R5cGUuaW5pdENoaWxkcmVuID0gZnVuY3Rpb24gaW5pdENoaWxkcmVuKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgY29uZmlnID0gdGhpcy5jb25maWc7XG5cbiAgICB2YXIgY2hpbGRyZW5LZXkgPSBjb25maWcuY2hpbGRyZW47XG4gICAgdmFyIGNoaWxkcmVuRGF0YSA9IHRoaXMuZGF0YVtjaGlsZHJlbktleV07XG4gICAgdGhpcy5oYXNDaGlsZHJlbiA9IEFycmF5LmlzQXJyYXkoY2hpbGRyZW5EYXRhKTtcbiAgICB0aGlzLmNoaWxkcmVuID0gKGNoaWxkcmVuRGF0YSB8fCBbXSkubWFwKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgcmV0dXJuIG5ldyBOb2RlKGNoaWxkLCBjb25maWcsIF90aGlzKTtcbiAgICB9KTtcbiAgfTtcblxuICBOb2RlLnByb3RvdHlwZS5jYWxjdWxhdGVQYXRoTm9kZXMgPSBmdW5jdGlvbiBjYWxjdWxhdGVQYXRoTm9kZXMoKSB7XG4gICAgdmFyIG5vZGVzID0gW3RoaXNdO1xuICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDtcblxuICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgIG5vZGVzLnVuc2hpZnQocGFyZW50KTtcbiAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGVzO1xuICB9O1xuXG4gIE5vZGUucHJvdG90eXBlLmdldFBhdGggPSBmdW5jdGlvbiBnZXRQYXRoKCkge1xuICAgIHJldHVybiB0aGlzLnBhdGg7XG4gIH07XG5cbiAgTm9kZS5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbiBnZXRWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgfTtcblxuICBOb2RlLnByb3RvdHlwZS5nZXRWYWx1ZUJ5T3B0aW9uID0gZnVuY3Rpb24gZ2V0VmFsdWVCeU9wdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZW1pdFBhdGggPyB0aGlzLmdldFBhdGgoKSA6IHRoaXMuZ2V0VmFsdWUoKTtcbiAgfTtcblxuICBOb2RlLnByb3RvdHlwZS5nZXRUZXh0ID0gZnVuY3Rpb24gZ2V0VGV4dChhbGxMZXZlbHMsIHNlcGFyYXRvcikge1xuICAgIHJldHVybiBhbGxMZXZlbHMgPyB0aGlzLnBhdGhMYWJlbHMuam9pbihzZXBhcmF0b3IpIDogdGhpcy5sYWJlbDtcbiAgfTtcblxuICBOb2RlLnByb3RvdHlwZS5pc1NhbWVOb2RlID0gZnVuY3Rpb24gaXNTYW1lTm9kZShjaGVja2VkVmFsdWUpIHtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLmdldFZhbHVlQnlPcHRpb24oKTtcbiAgICByZXR1cm4gdGhpcy5jb25maWcubXVsdGlwbGUgJiYgQXJyYXkuaXNBcnJheShjaGVja2VkVmFsdWUpID8gY2hlY2tlZFZhbHVlLnNvbWUoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgcmV0dXJuIE9iamVjdCh1dGlsX1tcImlzRXF1YWxcIl0pKHZhbCwgdmFsdWUpO1xuICAgIH0pIDogT2JqZWN0KHV0aWxfW1wiaXNFcXVhbFwiXSkoY2hlY2tlZFZhbHVlLCB2YWx1ZSk7XG4gIH07XG5cbiAgTm9kZS5wcm90b3R5cGUuYnJvYWRjYXN0ID0gZnVuY3Rpb24gYnJvYWRjYXN0KGV2ZW50KSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICB2YXIgaGFuZGxlck5hbWUgPSAnb25QYXJlbnQnICsgT2JqZWN0KHV0aWxfW1wiY2FwaXRhbGl6ZVwiXSkoZXZlbnQpO1xuXG4gICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgIC8vIGJvdHRvbSB1cFxuICAgICAgICBjaGlsZC5icm9hZGNhc3QuYXBwbHkoY2hpbGQsIFtldmVudF0uY29uY2F0KGFyZ3MpKTtcbiAgICAgICAgY2hpbGRbaGFuZGxlck5hbWVdICYmIGNoaWxkW2hhbmRsZXJOYW1lXS5hcHBseShjaGlsZCwgYXJncyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgTm9kZS5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIGVtaXQoZXZlbnQpIHtcbiAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG5cbiAgICB2YXIgaGFuZGxlck5hbWUgPSAnb25DaGlsZCcgKyBPYmplY3QodXRpbF9bXCJjYXBpdGFsaXplXCJdKShldmVudCk7XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICBwYXJlbnRbaGFuZGxlck5hbWVdICYmIHBhcmVudFtoYW5kbGVyTmFtZV0uYXBwbHkocGFyZW50LCBhcmdzKTtcbiAgICAgIHBhcmVudC5lbWl0LmFwcGx5KHBhcmVudCwgW2V2ZW50XS5jb25jYXQoYXJncykpO1xuICAgIH1cbiAgfTtcblxuICBOb2RlLnByb3RvdHlwZS5vblBhcmVudENoZWNrID0gZnVuY3Rpb24gb25QYXJlbnRDaGVjayhjaGVja2VkKSB7XG4gICAgaWYgKCF0aGlzLmlzRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuc2V0Q2hlY2tTdGF0ZShjaGVja2VkKTtcbiAgICB9XG4gIH07XG5cbiAgTm9kZS5wcm90b3R5cGUub25DaGlsZENoZWNrID0gZnVuY3Rpb24gb25DaGlsZENoZWNrKCkge1xuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47XG5cbiAgICB2YXIgdmFsaWRDaGlsZHJlbiA9IGNoaWxkcmVuLmZpbHRlcihmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIHJldHVybiAhY2hpbGQuaXNEaXNhYmxlZDtcbiAgICB9KTtcbiAgICB2YXIgY2hlY2tlZCA9IHZhbGlkQ2hpbGRyZW4ubGVuZ3RoID8gdmFsaWRDaGlsZHJlbi5ldmVyeShmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIHJldHVybiBjaGlsZC5jaGVja2VkO1xuICAgIH0pIDogZmFsc2U7XG5cbiAgICB0aGlzLnNldENoZWNrU3RhdGUoY2hlY2tlZCk7XG4gIH07XG5cbiAgTm9kZS5wcm90b3R5cGUuc2V0Q2hlY2tTdGF0ZSA9IGZ1bmN0aW9uIHNldENoZWNrU3RhdGUoY2hlY2tlZCkge1xuICAgIHZhciB0b3RhbE51bSA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoO1xuICAgIHZhciBjaGVja2VkTnVtID0gdGhpcy5jaGlsZHJlbi5yZWR1Y2UoZnVuY3Rpb24gKGMsIHApIHtcbiAgICAgIHZhciBudW0gPSBwLmNoZWNrZWQgPyAxIDogcC5pbmRldGVybWluYXRlID8gMC41IDogMDtcbiAgICAgIHJldHVybiBjICsgbnVtO1xuICAgIH0sIDApO1xuXG4gICAgdGhpcy5jaGVja2VkID0gY2hlY2tlZDtcbiAgICB0aGlzLmluZGV0ZXJtaW5hdGUgPSBjaGVja2VkTnVtICE9PSB0b3RhbE51bSAmJiBjaGVja2VkTnVtID4gMDtcbiAgfTtcblxuICBOb2RlLnByb3RvdHlwZS5zeW5jQ2hlY2tTdGF0ZSA9IGZ1bmN0aW9uIHN5bmNDaGVja1N0YXRlKGNoZWNrZWRWYWx1ZSkge1xuICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWVCeU9wdGlvbigpO1xuICAgIHZhciBjaGVja2VkID0gdGhpcy5pc1NhbWVOb2RlKGNoZWNrZWRWYWx1ZSwgdmFsdWUpO1xuXG4gICAgdGhpcy5kb0NoZWNrKGNoZWNrZWQpO1xuICB9O1xuXG4gIE5vZGUucHJvdG90eXBlLmRvQ2hlY2sgPSBmdW5jdGlvbiBkb0NoZWNrKGNoZWNrZWQpIHtcbiAgICBpZiAodGhpcy5jaGVja2VkICE9PSBjaGVja2VkKSB7XG4gICAgICBpZiAodGhpcy5jb25maWcuY2hlY2tTdHJpY3RseSkge1xuICAgICAgICB0aGlzLmNoZWNrZWQgPSBjaGVja2VkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gYm90dG9tIHVwIHRvIHVuaWZ5IHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgaW5kZXRlcm1pbmF0ZSBzdGF0ZVxuICAgICAgICB0aGlzLmJyb2FkY2FzdCgnY2hlY2snLCBjaGVja2VkKTtcbiAgICAgICAgdGhpcy5zZXRDaGVja1N0YXRlKGNoZWNrZWQpO1xuICAgICAgICB0aGlzLmVtaXQoJ2NoZWNrJyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyhOb2RlLCBbe1xuICAgIGtleTogJ2lzRGlzYWJsZWQnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEsXG4gICAgICAgICAgcGFyZW50ID0gdGhpcy5wYXJlbnQsXG4gICAgICAgICAgY29uZmlnID0gdGhpcy5jb25maWc7XG5cbiAgICAgIHZhciBkaXNhYmxlZEtleSA9IGNvbmZpZy5kaXNhYmxlZDtcbiAgICAgIHZhciBjaGVja1N0cmljdGx5ID0gY29uZmlnLmNoZWNrU3RyaWN0bHk7XG5cbiAgICAgIHJldHVybiBkYXRhW2Rpc2FibGVkS2V5XSB8fCAhY2hlY2tTdHJpY3RseSAmJiBwYXJlbnQgJiYgcGFyZW50LmlzRGlzYWJsZWQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnaXNMZWFmJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5kYXRhLFxuICAgICAgICAgIGxvYWRlZCA9IHRoaXMubG9hZGVkLFxuICAgICAgICAgIGhhc0NoaWxkcmVuID0gdGhpcy5oYXNDaGlsZHJlbixcbiAgICAgICAgICBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47XG4gICAgICB2YXIgX2NvbmZpZzIgPSB0aGlzLmNvbmZpZyxcbiAgICAgICAgICBsYXp5ID0gX2NvbmZpZzIubGF6eSxcbiAgICAgICAgICBsZWFmS2V5ID0gX2NvbmZpZzIubGVhZjtcblxuICAgICAgaWYgKGxhenkpIHtcbiAgICAgICAgdmFyIGlzTGVhZiA9IE9iamVjdChzaGFyZWRfW1wiaXNEZWZcIl0pKGRhdGFbbGVhZktleV0pID8gZGF0YVtsZWFmS2V5XSA6IGxvYWRlZCA/ICFjaGlsZHJlbi5sZW5ndGggOiBmYWxzZTtcbiAgICAgICAgdGhpcy5oYXNDaGlsZHJlbiA9ICFpc0xlYWY7XG4gICAgICAgIHJldHVybiBpc0xlYWY7XG4gICAgICB9XG4gICAgICByZXR1cm4gIWhhc0NoaWxkcmVuO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBOb2RlO1xufSgpO1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfbm9kZSA9IChub2RlX05vZGUpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvc3RvcmUuanNcbmZ1bmN0aW9uIHN0b3JlX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuXG5cblxudmFyIGZsYXROb2RlcyA9IGZ1bmN0aW9uIGZsYXROb2RlcyhkYXRhLCBsZWFmT25seSkge1xuICByZXR1cm4gZGF0YS5yZWR1Y2UoZnVuY3Rpb24gKHJlcywgbm9kZSkge1xuICAgIGlmIChub2RlLmlzTGVhZikge1xuICAgICAgcmVzLnB1c2gobm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICFsZWFmT25seSAmJiByZXMucHVzaChub2RlKTtcbiAgICAgIHJlcyA9IHJlcy5jb25jYXQoZmxhdE5vZGVzKG5vZGUuY2hpbGRyZW4sIGxlYWZPbmx5KSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH0sIFtdKTtcbn07XG5cbnZhciBzdG9yZV9TdG9yZSA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU3RvcmUoZGF0YSwgY29uZmlnKSB7XG4gICAgc3RvcmVfY2xhc3NDYWxsQ2hlY2sodGhpcywgU3RvcmUpO1xuXG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5pbml0Tm9kZXMoZGF0YSk7XG4gIH1cblxuICBTdG9yZS5wcm90b3R5cGUuaW5pdE5vZGVzID0gZnVuY3Rpb24gaW5pdE5vZGVzKGRhdGEpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgZGF0YSA9IE9iamVjdCh1dGlsX1tcImNvZXJjZVRydXRoeVZhbHVlVG9BcnJheVwiXSkoZGF0YSk7XG4gICAgdGhpcy5ub2RlcyA9IGRhdGEubWFwKGZ1bmN0aW9uIChub2RlRGF0YSkge1xuICAgICAgcmV0dXJuIG5ldyBzcmNfbm9kZShub2RlRGF0YSwgX3RoaXMuY29uZmlnKTtcbiAgICB9KTtcbiAgICB0aGlzLmZsYXR0ZWROb2RlcyA9IHRoaXMuZ2V0RmxhdHRlZE5vZGVzKGZhbHNlLCBmYWxzZSk7XG4gICAgdGhpcy5sZWFmTm9kZXMgPSB0aGlzLmdldEZsYXR0ZWROb2Rlcyh0cnVlLCBmYWxzZSk7XG4gIH07XG5cbiAgU3RvcmUucHJvdG90eXBlLmFwcGVuZE5vZGUgPSBmdW5jdGlvbiBhcHBlbmROb2RlKG5vZGVEYXRhLCBwYXJlbnROb2RlKSB7XG4gICAgdmFyIG5vZGUgPSBuZXcgc3JjX25vZGUobm9kZURhdGEsIHRoaXMuY29uZmlnLCBwYXJlbnROb2RlKTtcbiAgICB2YXIgY2hpbGRyZW4gPSBwYXJlbnROb2RlID8gcGFyZW50Tm9kZS5jaGlsZHJlbiA6IHRoaXMubm9kZXM7XG5cbiAgICBjaGlsZHJlbi5wdXNoKG5vZGUpO1xuICB9O1xuXG4gIFN0b3JlLnByb3RvdHlwZS5hcHBlbmROb2RlcyA9IGZ1bmN0aW9uIGFwcGVuZE5vZGVzKG5vZGVEYXRhTGlzdCwgcGFyZW50Tm9kZSkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgbm9kZURhdGFMaXN0ID0gT2JqZWN0KHV0aWxfW1wiY29lcmNlVHJ1dGh5VmFsdWVUb0FycmF5XCJdKShub2RlRGF0YUxpc3QpO1xuICAgIG5vZGVEYXRhTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlRGF0YSkge1xuICAgICAgcmV0dXJuIF90aGlzMi5hcHBlbmROb2RlKG5vZGVEYXRhLCBwYXJlbnROb2RlKTtcbiAgICB9KTtcbiAgfTtcblxuICBTdG9yZS5wcm90b3R5cGUuZ2V0Tm9kZXMgPSBmdW5jdGlvbiBnZXROb2RlcygpIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlcztcbiAgfTtcblxuICBTdG9yZS5wcm90b3R5cGUuZ2V0RmxhdHRlZE5vZGVzID0gZnVuY3Rpb24gZ2V0RmxhdHRlZE5vZGVzKGxlYWZPbmx5KSB7XG4gICAgdmFyIGNhY2hlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcblxuICAgIHZhciBjYWNoZWROb2RlcyA9IGxlYWZPbmx5ID8gdGhpcy5sZWFmTm9kZXMgOiB0aGlzLmZsYXR0ZWROb2RlcztcbiAgICByZXR1cm4gY2FjaGVkID8gY2FjaGVkTm9kZXMgOiBmbGF0Tm9kZXModGhpcy5ub2RlcywgbGVhZk9ubHkpO1xuICB9O1xuXG4gIFN0b3JlLnByb3RvdHlwZS5nZXROb2RlQnlWYWx1ZSA9IGZ1bmN0aW9uIGdldE5vZGVCeVZhbHVlKHZhbHVlKSB7XG4gICAgdmFyIG5vZGVzID0gdGhpcy5nZXRGbGF0dGVkTm9kZXMoZmFsc2UsICF0aGlzLmNvbmZpZy5sYXp5KS5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIHJldHVybiBPYmplY3QodXRpbF9bXCJ2YWx1ZUVxdWFsc1wiXSkobm9kZS5wYXRoLCB2YWx1ZSkgfHwgbm9kZS52YWx1ZSA9PT0gdmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIG5vZGVzICYmIG5vZGVzLmxlbmd0aCA/IG5vZGVzWzBdIDogbnVsbDtcbiAgfTtcblxuICByZXR1cm4gU3RvcmU7XG59KCk7XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19zdG9yZSA9IChzdG9yZV9TdG9yZSk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvdXRpbHMvbWVyZ2VcIlxudmFyIG1lcmdlXyA9IF9fd2VicGFja19yZXF1aXJlX18oOSk7XG52YXIgbWVyZ2VfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4obWVyZ2VfKTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL3V0aWxzL2FyaWEtdXRpbHNcIlxudmFyIGFyaWFfdXRpbHNfID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MSk7XG52YXIgYXJpYV91dGlsc19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihhcmlhX3V0aWxzXyk7XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi91dGlscy9zY3JvbGwtaW50by12aWV3XCJcbnZhciBzY3JvbGxfaW50b192aWV3XyA9IF9fd2VicGFja19yZXF1aXJlX18oMzEpO1xudmFyIHNjcm9sbF9pbnRvX3ZpZXdfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oc2Nyb2xsX2ludG9fdmlld18pO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvY2FzY2FkZXItcGFuZWwudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuXG5cblxuXG5cblxuXG52YXIgS2V5Q29kZSA9IGFyaWFfdXRpbHNfZGVmYXVsdC5hLmtleXM7XG5cbnZhciBEZWZhdWx0UHJvcHMgPSB7XG4gIGV4cGFuZFRyaWdnZXI6ICdjbGljaycsIC8vIG9yIGhvdmVyXG4gIG11bHRpcGxlOiBmYWxzZSxcbiAgY2hlY2tTdHJpY3RseTogZmFsc2UsIC8vIHdoZXRoZXIgYWxsIG5vZGVzIGNhbiBiZSBzZWxlY3RlZFxuICBlbWl0UGF0aDogdHJ1ZSwgLy8gd2V0aGVyIHRvIGVtaXQgYW4gYXJyYXkgb2YgYWxsIGxldmVscyB2YWx1ZSBpbiB3aGljaCBub2RlIGlzIGxvY2F0ZWRcbiAgbGF6eTogZmFsc2UsXG4gIGxhenlMb2FkOiB1dGlsX1tcIm5vb3BcIl0sXG4gIHZhbHVlOiAndmFsdWUnLFxuICBsYWJlbDogJ2xhYmVsJyxcbiAgY2hpbGRyZW46ICdjaGlsZHJlbicsXG4gIGxlYWY6ICdsZWFmJyxcbiAgZGlzYWJsZWQ6ICdkaXNhYmxlZCcsXG4gIGhvdmVyVGhyZXNob2xkOiA1MDBcbn07XG5cbnZhciBjYXNjYWRlcl9wYW5lbHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2lzTGVhZiA9IGZ1bmN0aW9uIGlzTGVhZihlbCkge1xuICByZXR1cm4gIWVsLmdldEF0dHJpYnV0ZSgnYXJpYS1vd25zJyk7XG59O1xuXG52YXIgZ2V0U2libGluZyA9IGZ1bmN0aW9uIGdldFNpYmxpbmcoZWwsIGRpc3RhbmNlKSB7XG4gIHZhciBwYXJlbnROb2RlID0gZWwucGFyZW50Tm9kZTtcblxuICBpZiAocGFyZW50Tm9kZSkge1xuICAgIHZhciBzaWJsaW5ncyA9IHBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbCgnLmVsLWNhc2NhZGVyLW5vZGVbdGFiaW5kZXg9XCItMVwiXScpO1xuICAgIHZhciBpbmRleCA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoc2libGluZ3MsIGVsKTtcbiAgICByZXR1cm4gc2libGluZ3NbaW5kZXggKyBkaXN0YW5jZV0gfHwgbnVsbDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbnZhciBnZXRNZW51SW5kZXggPSBmdW5jdGlvbiBnZXRNZW51SW5kZXgoZWwsIGRpc3RhbmNlKSB7XG4gIGlmICghZWwpIHJldHVybjtcbiAgdmFyIHBpZWNlcyA9IGVsLmlkLnNwbGl0KCctJyk7XG4gIHJldHVybiBOdW1iZXIocGllY2VzW3BpZWNlcy5sZW5ndGggLSAyXSk7XG59O1xuXG52YXIgZm9jdXNOb2RlID0gZnVuY3Rpb24gZm9jdXNOb2RlKGVsKSB7XG4gIGlmICghZWwpIHJldHVybjtcbiAgZWwuZm9jdXMoKTtcbiAgIWNhc2NhZGVyX3BhbmVsdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfaXNMZWFmKGVsKSAmJiBlbC5jbGljaygpO1xufTtcblxudmFyIGNoZWNrTm9kZSA9IGZ1bmN0aW9uIGNoZWNrTm9kZShlbCkge1xuICBpZiAoIWVsKSByZXR1cm47XG5cbiAgdmFyIGlucHV0ID0gZWwucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcbiAgaWYgKGlucHV0KSB7XG4gICAgaW5wdXQuY2xpY2soKTtcbiAgfSBlbHNlIGlmIChjYXNjYWRlcl9wYW5lbHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzX2lzTGVhZihlbCkpIHtcbiAgICBlbC5jbGljaygpO1xuICB9XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBjYXNjYWRlcl9wYW5lbHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdFbENhc2NhZGVyUGFuZWwnLFxuXG4gIGNvbXBvbmVudHM6IHtcbiAgICBDYXNjYWRlck1lbnU6IGNhc2NhZGVyX21lbnVcbiAgfSxcblxuICBwcm9wczoge1xuICAgIHZhbHVlOiB7fSxcbiAgICBvcHRpb25zOiBBcnJheSxcbiAgICBwcm9wczogT2JqZWN0LFxuICAgIGJvcmRlcjoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIHJlbmRlckxhYmVsOiBGdW5jdGlvblxuICB9LFxuXG4gIHByb3ZpZGU6IGZ1bmN0aW9uIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhbmVsOiB0aGlzXG4gICAgfTtcbiAgfSxcbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2hlY2tlZFZhbHVlOiBudWxsLFxuICAgICAgY2hlY2tlZE5vZGVQYXRoczogW10sXG4gICAgICBzdG9yZTogW10sXG4gICAgICBtZW51czogW10sXG4gICAgICBhY3RpdmVQYXRoOiBbXSxcbiAgICAgIGxvYWRDb3VudDogMFxuICAgIH07XG4gIH0sXG5cblxuICBjb21wdXRlZDoge1xuICAgIGNvbmZpZzogZnVuY3Rpb24gY29uZmlnKCkge1xuICAgICAgcmV0dXJuIG1lcmdlX2RlZmF1bHQoKShfZXh0ZW5kcyh7fSwgRGVmYXVsdFByb3BzKSwgdGhpcy5wcm9wcyB8fCB7fSk7XG4gICAgfSxcbiAgICBtdWx0aXBsZTogZnVuY3Rpb24gbXVsdGlwbGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25maWcubXVsdGlwbGU7XG4gICAgfSxcbiAgICBjaGVja1N0cmljdGx5OiBmdW5jdGlvbiBjaGVja1N0cmljdGx5KCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmNoZWNrU3RyaWN0bHk7XG4gICAgfSxcbiAgICBsZWFmT25seTogZnVuY3Rpb24gbGVhZk9ubHkoKSB7XG4gICAgICByZXR1cm4gIXRoaXMuY2hlY2tTdHJpY3RseTtcbiAgICB9LFxuICAgIGlzSG92ZXJNZW51OiBmdW5jdGlvbiBpc0hvdmVyTWVudSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5leHBhbmRUcmlnZ2VyID09PSAnaG92ZXInO1xuICAgIH0sXG4gICAgcmVuZGVyTGFiZWxGbjogZnVuY3Rpb24gcmVuZGVyTGFiZWxGbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlckxhYmVsIHx8IHRoaXMuJHNjb3BlZFNsb3RzLmRlZmF1bHQ7XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKCkge1xuICAgICAgdGhpcy5zeW5jQ2hlY2tlZFZhbHVlKCk7XG4gICAgICB0aGlzLmNoZWNrU3RyaWN0bHkgJiYgdGhpcy5jYWxjdWxhdGVDaGVja2VkTm9kZVBhdGhzKCk7XG4gICAgfSxcblxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIoKSB7XG4gICAgICAgIHRoaXMuaW5pdFN0b3JlKCk7XG4gICAgICB9LFxuICAgICAgaW1tZWRpYXRlOiB0cnVlLFxuICAgICAgZGVlcDogdHJ1ZVxuICAgIH0sXG4gICAgY2hlY2tlZFZhbHVlOiBmdW5jdGlvbiBjaGVja2VkVmFsdWUodmFsKSB7XG4gICAgICBpZiAoIU9iamVjdCh1dGlsX1tcImlzRXF1YWxcIl0pKHZhbCwgdGhpcy52YWx1ZSkpIHtcbiAgICAgICAgdGhpcy5jaGVja1N0cmljdGx5ICYmIHRoaXMuY2FsY3VsYXRlQ2hlY2tlZE5vZGVQYXRocygpO1xuICAgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbCk7XG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIHZhbCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG4gICAgaWYgKCF0aGlzLmlzRW1wdHlWYWx1ZSh0aGlzLnZhbHVlKSkge1xuICAgICAgdGhpcy5zeW5jQ2hlY2tlZFZhbHVlKCk7XG4gICAgfVxuICB9LFxuXG5cbiAgbWV0aG9kczoge1xuICAgIGluaXRTdG9yZTogZnVuY3Rpb24gaW5pdFN0b3JlKCkge1xuICAgICAgdmFyIGNvbmZpZyA9IHRoaXMuY29uZmlnLFxuICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAgIGlmIChjb25maWcubGF6eSAmJiBPYmplY3QodXRpbF9bXCJpc0VtcHR5XCJdKShvcHRpb25zKSkge1xuICAgICAgICB0aGlzLmxhenlMb2FkKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0b3JlID0gbmV3IHNyY19zdG9yZShvcHRpb25zLCBjb25maWcpO1xuICAgICAgICB0aGlzLm1lbnVzID0gW3RoaXMuc3RvcmUuZ2V0Tm9kZXMoKV07XG4gICAgICAgIHRoaXMuc3luY01lbnVTdGF0ZSgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgc3luY0NoZWNrZWRWYWx1ZTogZnVuY3Rpb24gc3luY0NoZWNrZWRWYWx1ZSgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWUsXG4gICAgICAgICAgY2hlY2tlZFZhbHVlID0gdGhpcy5jaGVja2VkVmFsdWU7XG5cbiAgICAgIGlmICghT2JqZWN0KHV0aWxfW1wiaXNFcXVhbFwiXSkodmFsdWUsIGNoZWNrZWRWYWx1ZSkpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVQYXRoID0gW107XG4gICAgICAgIHRoaXMuY2hlY2tlZFZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuc3luY01lbnVTdGF0ZSgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgc3luY01lbnVTdGF0ZTogZnVuY3Rpb24gc3luY01lbnVTdGF0ZSgpIHtcbiAgICAgIHZhciBtdWx0aXBsZSA9IHRoaXMubXVsdGlwbGUsXG4gICAgICAgICAgY2hlY2tTdHJpY3RseSA9IHRoaXMuY2hlY2tTdHJpY3RseTtcblxuICAgICAgdGhpcy5zeW5jQWN0aXZlUGF0aCgpO1xuICAgICAgbXVsdGlwbGUgJiYgdGhpcy5zeW5jTXVsdGlDaGVja1N0YXRlKCk7XG4gICAgICBjaGVja1N0cmljdGx5ICYmIHRoaXMuY2FsY3VsYXRlQ2hlY2tlZE5vZGVQYXRocygpO1xuICAgICAgdGhpcy4kbmV4dFRpY2sodGhpcy5zY3JvbGxJbnRvVmlldyk7XG4gICAgfSxcbiAgICBzeW5jTXVsdGlDaGVja1N0YXRlOiBmdW5jdGlvbiBzeW5jTXVsdGlDaGVja1N0YXRlKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIG5vZGVzID0gdGhpcy5nZXRGbGF0dGVkTm9kZXModGhpcy5sZWFmT25seSk7XG5cbiAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgbm9kZS5zeW5jQ2hlY2tTdGF0ZShfdGhpcy5jaGVja2VkVmFsdWUpO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBpc0VtcHR5VmFsdWU6IGZ1bmN0aW9uIGlzRW1wdHlWYWx1ZSh2YWwpIHtcbiAgICAgIHZhciBtdWx0aXBsZSA9IHRoaXMubXVsdGlwbGUsXG4gICAgICAgICAgY29uZmlnID0gdGhpcy5jb25maWc7XG4gICAgICB2YXIgZW1pdFBhdGggPSBjb25maWcuZW1pdFBhdGg7XG5cbiAgICAgIGlmIChtdWx0aXBsZSB8fCBlbWl0UGF0aCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0KHV0aWxfW1wiaXNFbXB0eVwiXSkodmFsKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICAgIHN5bmNBY3RpdmVQYXRoOiBmdW5jdGlvbiBzeW5jQWN0aXZlUGF0aCgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgc3RvcmUgPSB0aGlzLnN0b3JlLFxuICAgICAgICAgIG11bHRpcGxlID0gdGhpcy5tdWx0aXBsZSxcbiAgICAgICAgICBhY3RpdmVQYXRoID0gdGhpcy5hY3RpdmVQYXRoLFxuICAgICAgICAgIGNoZWNrZWRWYWx1ZSA9IHRoaXMuY2hlY2tlZFZhbHVlO1xuXG5cbiAgICAgIGlmICghT2JqZWN0KHV0aWxfW1wiaXNFbXB0eVwiXSkoYWN0aXZlUGF0aCkpIHtcbiAgICAgICAgdmFyIG5vZGVzID0gYWN0aXZlUGF0aC5tYXAoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMyLmdldE5vZGVCeVZhbHVlKG5vZGUuZ2V0VmFsdWUoKSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmV4cGFuZE5vZGVzKG5vZGVzKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNFbXB0eVZhbHVlKGNoZWNrZWRWYWx1ZSkpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gbXVsdGlwbGUgPyBjaGVja2VkVmFsdWVbMF0gOiBjaGVja2VkVmFsdWU7XG4gICAgICAgIHZhciBjaGVja2VkTm9kZSA9IHRoaXMuZ2V0Tm9kZUJ5VmFsdWUodmFsdWUpIHx8IHt9O1xuICAgICAgICB2YXIgX25vZGVzID0gKGNoZWNrZWROb2RlLnBhdGhOb2RlcyB8fCBbXSkuc2xpY2UoMCwgLTEpO1xuICAgICAgICB0aGlzLmV4cGFuZE5vZGVzKF9ub2Rlcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFjdGl2ZVBhdGggPSBbXTtcbiAgICAgICAgdGhpcy5tZW51cyA9IFtzdG9yZS5nZXROb2RlcygpXTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGV4cGFuZE5vZGVzOiBmdW5jdGlvbiBleHBhbmROb2Rlcyhub2Rlcykge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMy5oYW5kbGVFeHBhbmQobm9kZSwgdHJ1ZSAvKiBzaWxlbnQgKi8pO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBjYWxjdWxhdGVDaGVja2VkTm9kZVBhdGhzOiBmdW5jdGlvbiBjYWxjdWxhdGVDaGVja2VkTm9kZVBhdGhzKCkge1xuICAgICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICAgIHZhciBjaGVja2VkVmFsdWUgPSB0aGlzLmNoZWNrZWRWYWx1ZSxcbiAgICAgICAgICBtdWx0aXBsZSA9IHRoaXMubXVsdGlwbGU7XG5cbiAgICAgIHZhciBjaGVja2VkVmFsdWVzID0gbXVsdGlwbGUgPyBPYmplY3QodXRpbF9bXCJjb2VyY2VUcnV0aHlWYWx1ZVRvQXJyYXlcIl0pKGNoZWNrZWRWYWx1ZSkgOiBbY2hlY2tlZFZhbHVlXTtcbiAgICAgIHRoaXMuY2hlY2tlZE5vZGVQYXRocyA9IGNoZWNrZWRWYWx1ZXMubWFwKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIHZhciBjaGVja2VkTm9kZSA9IF90aGlzNC5nZXROb2RlQnlWYWx1ZSh2KTtcbiAgICAgICAgcmV0dXJuIGNoZWNrZWROb2RlID8gY2hlY2tlZE5vZGUucGF0aE5vZGVzIDogW107XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGhhbmRsZUtleURvd246IGZ1bmN0aW9uIGhhbmRsZUtleURvd24oZSkge1xuICAgICAgdmFyIHRhcmdldCA9IGUudGFyZ2V0LFxuICAgICAgICAgIGtleUNvZGUgPSBlLmtleUNvZGU7XG5cblxuICAgICAgc3dpdGNoIChrZXlDb2RlKSB7XG4gICAgICAgIGNhc2UgS2V5Q29kZS51cDpcbiAgICAgICAgICB2YXIgcHJldiA9IGdldFNpYmxpbmcodGFyZ2V0LCAtMSk7XG4gICAgICAgICAgZm9jdXNOb2RlKHByZXYpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEtleUNvZGUuZG93bjpcbiAgICAgICAgICB2YXIgbmV4dCA9IGdldFNpYmxpbmcodGFyZ2V0LCAxKTtcbiAgICAgICAgICBmb2N1c05vZGUobmV4dCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgS2V5Q29kZS5sZWZ0OlxuICAgICAgICAgIHZhciBwcmVNZW51ID0gdGhpcy4kcmVmcy5tZW51W2dldE1lbnVJbmRleCh0YXJnZXQpIC0gMV07XG4gICAgICAgICAgaWYgKHByZU1lbnUpIHtcbiAgICAgICAgICAgIHZhciBleHBhbmRlZE5vZGUgPSBwcmVNZW51LiRlbC5xdWVyeVNlbGVjdG9yKCcuZWwtY2FzY2FkZXItbm9kZVthcmlhLWV4cGFuZGVkPVwidHJ1ZVwiXScpO1xuICAgICAgICAgICAgZm9jdXNOb2RlKGV4cGFuZGVkTm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEtleUNvZGUucmlnaHQ6XG4gICAgICAgICAgdmFyIG5leHRNZW51ID0gdGhpcy4kcmVmcy5tZW51W2dldE1lbnVJbmRleCh0YXJnZXQpICsgMV07XG4gICAgICAgICAgaWYgKG5leHRNZW51KSB7XG4gICAgICAgICAgICB2YXIgZmlyc3ROb2RlID0gbmV4dE1lbnUuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5lbC1jYXNjYWRlci1ub2RlW3RhYmluZGV4PVwiLTFcIl0nKTtcbiAgICAgICAgICAgIGZvY3VzTm9kZShmaXJzdE5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBLZXlDb2RlLmVudGVyOlxuICAgICAgICAgIGNoZWNrTm9kZSh0YXJnZXQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEtleUNvZGUuZXNjOlxuICAgICAgICBjYXNlIEtleUNvZGUudGFiOlxuICAgICAgICAgIHRoaXMuJGVtaXQoJ2Nsb3NlJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlRXhwYW5kOiBmdW5jdGlvbiBoYW5kbGVFeHBhbmQobm9kZSwgc2lsZW50KSB7XG4gICAgICB2YXIgYWN0aXZlUGF0aCA9IHRoaXMuYWN0aXZlUGF0aDtcbiAgICAgIHZhciBsZXZlbCA9IG5vZGUubGV2ZWw7XG5cbiAgICAgIHZhciBwYXRoID0gYWN0aXZlUGF0aC5zbGljZSgwLCBsZXZlbCAtIDEpO1xuICAgICAgdmFyIG1lbnVzID0gdGhpcy5tZW51cy5zbGljZSgwLCBsZXZlbCk7XG5cbiAgICAgIGlmICghbm9kZS5pc0xlYWYpIHtcbiAgICAgICAgcGF0aC5wdXNoKG5vZGUpO1xuICAgICAgICBtZW51cy5wdXNoKG5vZGUuY2hpbGRyZW4pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFjdGl2ZVBhdGggPSBwYXRoO1xuICAgICAgdGhpcy5tZW51cyA9IG1lbnVzO1xuXG4gICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICB2YXIgcGF0aFZhbHVlcyA9IHBhdGgubWFwKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0VmFsdWUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBhY3RpdmVQYXRoVmFsdWVzID0gYWN0aXZlUGF0aC5tYXAoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZS5nZXRWYWx1ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFPYmplY3QodXRpbF9bXCJ2YWx1ZUVxdWFsc1wiXSkocGF0aFZhbHVlcywgYWN0aXZlUGF0aFZhbHVlcykpIHtcbiAgICAgICAgICB0aGlzLiRlbWl0KCdhY3RpdmUtaXRlbS1jaGFuZ2UnLCBwYXRoVmFsdWVzKTsgLy8gRGVwcmVjYXRlZFxuICAgICAgICAgIHRoaXMuJGVtaXQoJ2V4cGFuZC1jaGFuZ2UnLCBwYXRoVmFsdWVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlQ2hlY2tDaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZUNoZWNrQ2hhbmdlKHZhbHVlKSB7XG4gICAgICB0aGlzLmNoZWNrZWRWYWx1ZSA9IHZhbHVlO1xuICAgIH0sXG4gICAgbGF6eUxvYWQ6IGZ1bmN0aW9uIGxhenlMb2FkKG5vZGUsIG9uRnVsbGZpbGVkKSB7XG4gICAgICB2YXIgX3RoaXM1ID0gdGhpcztcblxuICAgICAgdmFyIGNvbmZpZyA9IHRoaXMuY29uZmlnO1xuXG4gICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgbm9kZSA9IG5vZGUgfHwgeyByb290OiB0cnVlLCBsZXZlbDogMCB9O1xuICAgICAgICB0aGlzLnN0b3JlID0gbmV3IHNyY19zdG9yZShbXSwgY29uZmlnKTtcbiAgICAgICAgdGhpcy5tZW51cyA9IFt0aGlzLnN0b3JlLmdldE5vZGVzKCldO1xuICAgICAgfVxuICAgICAgbm9kZS5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgIHZhciByZXNvbHZlID0gZnVuY3Rpb24gcmVzb2x2ZShkYXRhTGlzdCkge1xuICAgICAgICB2YXIgcGFyZW50ID0gbm9kZS5yb290ID8gbnVsbCA6IG5vZGU7XG4gICAgICAgIGRhdGFMaXN0ICYmIGRhdGFMaXN0Lmxlbmd0aCAmJiBfdGhpczUuc3RvcmUuYXBwZW5kTm9kZXMoZGF0YUxpc3QsIHBhcmVudCk7XG4gICAgICAgIG5vZGUubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICBub2RlLmxvYWRlZCA9IHRydWU7XG5cbiAgICAgICAgLy8gZGlzcG9zZSBkZWZhdWx0IHZhbHVlIG9uIGxhenkgbG9hZCBtb2RlXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KF90aGlzNS5jaGVja2VkVmFsdWUpKSB7XG4gICAgICAgICAgdmFyIG5vZGVWYWx1ZSA9IF90aGlzNS5jaGVja2VkVmFsdWVbX3RoaXM1LmxvYWRDb3VudCsrXTtcbiAgICAgICAgICB2YXIgdmFsdWVLZXkgPSBfdGhpczUuY29uZmlnLnZhbHVlO1xuICAgICAgICAgIHZhciBsZWFmS2V5ID0gX3RoaXM1LmNvbmZpZy5sZWFmO1xuXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YUxpc3QpICYmIGRhdGFMaXN0LmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW1bdmFsdWVLZXldID09PSBub2RlVmFsdWU7XG4gICAgICAgICAgfSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmFyIGNoZWNrZWROb2RlID0gX3RoaXM1LnN0b3JlLmdldE5vZGVCeVZhbHVlKG5vZGVWYWx1ZSk7XG5cbiAgICAgICAgICAgIGlmICghY2hlY2tlZE5vZGUuZGF0YVtsZWFmS2V5XSkge1xuICAgICAgICAgICAgICBfdGhpczUubGF6eUxvYWQoY2hlY2tlZE5vZGUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdGhpczUuaGFuZGxlRXhwYW5kKGNoZWNrZWROb2RlKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChfdGhpczUubG9hZENvdW50ID09PSBfdGhpczUuY2hlY2tlZFZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICBfdGhpczUuJHBhcmVudC5jb21wdXRlUHJlc2VudFRleHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBvbkZ1bGxmaWxlZCAmJiBvbkZ1bGxmaWxlZChkYXRhTGlzdCk7XG4gICAgICB9O1xuICAgICAgY29uZmlnLmxhenlMb2FkKG5vZGUsIHJlc29sdmUpO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIHB1YmxpYyBtZXRob2RzXG4gICAgKi9cbiAgICBjYWxjdWxhdGVNdWx0aUNoZWNrZWRWYWx1ZTogZnVuY3Rpb24gY2FsY3VsYXRlTXVsdGlDaGVja2VkVmFsdWUoKSB7XG4gICAgICB0aGlzLmNoZWNrZWRWYWx1ZSA9IHRoaXMuZ2V0Q2hlY2tlZE5vZGVzKHRoaXMubGVhZk9ubHkpLm1hcChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5nZXRWYWx1ZUJ5T3B0aW9uKCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHNjcm9sbEludG9WaWV3OiBmdW5jdGlvbiBzY3JvbGxJbnRvVmlldygpIHtcbiAgICAgIGlmICh0aGlzLiRpc1NlcnZlcikgcmV0dXJuO1xuXG4gICAgICB2YXIgbWVudXMgPSB0aGlzLiRyZWZzLm1lbnUgfHwgW107XG4gICAgICBtZW51cy5mb3JFYWNoKGZ1bmN0aW9uIChtZW51KSB7XG4gICAgICAgIHZhciBtZW51RWxlbWVudCA9IG1lbnUuJGVsO1xuICAgICAgICBpZiAobWVudUVsZW1lbnQpIHtcbiAgICAgICAgICB2YXIgY29udGFpbmVyID0gbWVudUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmVsLXNjcm9sbGJhcl9fd3JhcCcpO1xuICAgICAgICAgIHZhciBhY3RpdmVOb2RlID0gbWVudUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmVsLWNhc2NhZGVyLW5vZGUuaXMtYWN0aXZlJykgfHwgbWVudUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmVsLWNhc2NhZGVyLW5vZGUuaW4tYWN0aXZlLXBhdGgnKTtcbiAgICAgICAgICBzY3JvbGxfaW50b192aWV3X2RlZmF1bHQoKShjb250YWluZXIsIGFjdGl2ZU5vZGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGdldE5vZGVCeVZhbHVlOiBmdW5jdGlvbiBnZXROb2RlQnlWYWx1ZSh2YWwpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0b3JlLmdldE5vZGVCeVZhbHVlKHZhbCk7XG4gICAgfSxcbiAgICBnZXRGbGF0dGVkTm9kZXM6IGZ1bmN0aW9uIGdldEZsYXR0ZWROb2RlcyhsZWFmT25seSkge1xuICAgICAgdmFyIGNhY2hlZCA9ICF0aGlzLmNvbmZpZy5sYXp5O1xuICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0RmxhdHRlZE5vZGVzKGxlYWZPbmx5LCBjYWNoZWQpO1xuICAgIH0sXG4gICAgZ2V0Q2hlY2tlZE5vZGVzOiBmdW5jdGlvbiBnZXRDaGVja2VkTm9kZXMobGVhZk9ubHkpIHtcbiAgICAgIHZhciBjaGVja2VkVmFsdWUgPSB0aGlzLmNoZWNrZWRWYWx1ZSxcbiAgICAgICAgICBtdWx0aXBsZSA9IHRoaXMubXVsdGlwbGU7XG5cbiAgICAgIGlmIChtdWx0aXBsZSkge1xuICAgICAgICB2YXIgbm9kZXMgPSB0aGlzLmdldEZsYXR0ZWROb2RlcyhsZWFmT25seSk7XG4gICAgICAgIHJldHVybiBub2Rlcy5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZS5jaGVja2VkO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzRW1wdHlWYWx1ZShjaGVja2VkVmFsdWUpID8gW10gOiBbdGhpcy5nZXROb2RlQnlWYWx1ZShjaGVja2VkVmFsdWUpXTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGNsZWFyQ2hlY2tlZE5vZGVzOiBmdW5jdGlvbiBjbGVhckNoZWNrZWROb2RlcygpIHtcbiAgICAgIHZhciBjb25maWcgPSB0aGlzLmNvbmZpZyxcbiAgICAgICAgICBsZWFmT25seSA9IHRoaXMubGVhZk9ubHk7XG4gICAgICB2YXIgbXVsdGlwbGUgPSBjb25maWcubXVsdGlwbGUsXG4gICAgICAgICAgZW1pdFBhdGggPSBjb25maWcuZW1pdFBhdGg7XG5cbiAgICAgIGlmIChtdWx0aXBsZSkge1xuICAgICAgICB0aGlzLmdldENoZWNrZWROb2RlcyhsZWFmT25seSkuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgcmV0dXJuICFub2RlLmlzRGlzYWJsZWQ7XG4gICAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZS5kb0NoZWNrKGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlTXVsdGlDaGVja2VkVmFsdWUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2hlY2tlZFZhbHVlID0gZW1pdFBhdGggPyBbXSA6IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2FzY2FkZXItcGFuZWwvc3JjL2Nhc2NhZGVyLXBhbmVsLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfY2FzY2FkZXJfcGFuZWx2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoY2FzY2FkZXJfcGFuZWx2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2FzY2FkZXItcGFuZWwvc3JjL2Nhc2NhZGVyLXBhbmVsLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIGNhc2NhZGVyX3BhbmVsX2NvbXBvbmVudCA9IE9iamVjdChjb21wb25lbnROb3JtYWxpemVyW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShcbiAgc3JjX2Nhc2NhZGVyX3BhbmVsdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBjYXNjYWRlcl9wYW5lbHZ1ZV90eXBlX3RlbXBsYXRlX2lkXzM0OTMyMzQ2X3JlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBjYXNjYWRlcl9wYW5lbF9hcGk7IH1cbmNhc2NhZGVyX3BhbmVsX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvY2FzY2FkZXItcGFuZWwvc3JjL2Nhc2NhZGVyLXBhbmVsLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBjYXNjYWRlcl9wYW5lbCA9IChjYXNjYWRlcl9wYW5lbF9jb21wb25lbnQuZXhwb3J0cyk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2Nhc2NhZGVyLXBhbmVsL2luZGV4LmpzXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmNhc2NhZGVyX3BhbmVsLmluc3RhbGwgPSBmdW5jdGlvbiAoVnVlKSB7XG4gIFZ1ZS5jb21wb25lbnQoY2FzY2FkZXJfcGFuZWwubmFtZSwgY2FzY2FkZXJfcGFuZWwpO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfY2FzY2FkZXJfcGFuZWwgPSBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IChjYXNjYWRlcl9wYW5lbCk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA5OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi91dGlscy9tZXJnZVwiKTtcblxuLyoqKi8gfSlcblxuLyoqKioqKi8gfSk7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4726\n")},4897:function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\nexports.i18n = exports.use = exports.t = undefined;\n\nvar _zhCN = __webpack_require__(\"f0d9\");\n\nvar _zhCN2 = _interopRequireDefault(_zhCN);\n\nvar _vue = __webpack_require__(\"2b0e\");\n\nvar _vue2 = _interopRequireDefault(_vue);\n\nvar _deepmerge = __webpack_require__(\"3c4e\");\n\nvar _deepmerge2 = _interopRequireDefault(_deepmerge);\n\nvar _format = __webpack_require__(\"9d7e\");\n\nvar _format2 = _interopRequireDefault(_format);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar format = (0, _format2.default)(_vue2.default);\nvar lang = _zhCN2.default;\nvar merged = false;\nvar i18nHandler = function i18nHandler() {\n var vuei18n = Object.getPrototypeOf(this || _vue2.default).$t;\n if (typeof vuei18n === 'function' && !!_vue2.default.locale) {\n if (!merged) {\n merged = true;\n _vue2.default.locale(_vue2.default.config.lang, (0, _deepmerge2.default)(lang, _vue2.default.locale(_vue2.default.config.lang) || {}, { clone: true }));\n }\n return vuei18n.apply(this, arguments);\n }\n};\n\nvar t = exports.t = function t(path, options) {\n var value = i18nHandler.apply(this, arguments);\n if (value !== null && value !== undefined) return value;\n\n var array = path.split('.');\n var current = lang;\n\n for (var i = 0, j = array.length; i < j; i++) {\n var property = array[i];\n value = current[property];\n if (i === j - 1) return format(value, options);\n if (!value) return '';\n current = value;\n }\n return '';\n};\n\nvar use = exports.use = function use(l) {\n lang = l || lang;\n};\n\nvar i18n = exports.i18n = function i18n(fn) {\n i18nHandler = fn || i18nHandler;\n};\n\nexports.default = { use: use, t: t, i18n: i18n };\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvbG9jYWxlL2luZGV4LmpzPzQ4OTciXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTs7QUFFQSxZQUFZLG1CQUFPLENBQUMsTUFBa0M7O0FBRXREOztBQUVBLFdBQVcsbUJBQU8sQ0FBQyxNQUFLOztBQUV4Qjs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQyxNQUFXOztBQUVwQzs7QUFFQSxjQUFjLG1CQUFPLENBQUMsTUFBVTs7QUFFaEM7O0FBRUEsc0NBQXNDLHVDQUF1QyxnQkFBZ0I7O0FBRTdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwSUFBMEksR0FBRyxjQUFjO0FBQzNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG1DQUFtQyxPQUFPO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIiLCJmaWxlIjoiNDg5Ny5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuaTE4biA9IGV4cG9ydHMudXNlID0gZXhwb3J0cy50ID0gdW5kZWZpbmVkO1xuXG52YXIgX3poQ04gPSByZXF1aXJlKCdlbGVtZW50LXVpL2xpYi9sb2NhbGUvbGFuZy96aC1DTicpO1xuXG52YXIgX3poQ04yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfemhDTik7XG5cbnZhciBfdnVlID0gcmVxdWlyZSgndnVlJyk7XG5cbnZhciBfdnVlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Z1ZSk7XG5cbnZhciBfZGVlcG1lcmdlID0gcmVxdWlyZSgnZGVlcG1lcmdlJyk7XG5cbnZhciBfZGVlcG1lcmdlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlZXBtZXJnZSk7XG5cbnZhciBfZm9ybWF0ID0gcmVxdWlyZSgnLi9mb3JtYXQnKTtcblxudmFyIF9mb3JtYXQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZm9ybWF0KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIGZvcm1hdCA9ICgwLCBfZm9ybWF0Mi5kZWZhdWx0KShfdnVlMi5kZWZhdWx0KTtcbnZhciBsYW5nID0gX3poQ04yLmRlZmF1bHQ7XG52YXIgbWVyZ2VkID0gZmFsc2U7XG52YXIgaTE4bkhhbmRsZXIgPSBmdW5jdGlvbiBpMThuSGFuZGxlcigpIHtcbiAgdmFyIHZ1ZWkxOG4gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyB8fCBfdnVlMi5kZWZhdWx0KS4kdDtcbiAgaWYgKHR5cGVvZiB2dWVpMThuID09PSAnZnVuY3Rpb24nICYmICEhX3Z1ZTIuZGVmYXVsdC5sb2NhbGUpIHtcbiAgICBpZiAoIW1lcmdlZCkge1xuICAgICAgbWVyZ2VkID0gdHJ1ZTtcbiAgICAgIF92dWUyLmRlZmF1bHQubG9jYWxlKF92dWUyLmRlZmF1bHQuY29uZmlnLmxhbmcsICgwLCBfZGVlcG1lcmdlMi5kZWZhdWx0KShsYW5nLCBfdnVlMi5kZWZhdWx0LmxvY2FsZShfdnVlMi5kZWZhdWx0LmNvbmZpZy5sYW5nKSB8fCB7fSwgeyBjbG9uZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIHJldHVybiB2dWVpMThuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cbn07XG5cbnZhciB0ID0gZXhwb3J0cy50ID0gZnVuY3Rpb24gdChwYXRoLCBvcHRpb25zKSB7XG4gIHZhciB2YWx1ZSA9IGkxOG5IYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdmFsdWU7XG5cbiAgdmFyIGFycmF5ID0gcGF0aC5zcGxpdCgnLicpO1xuICB2YXIgY3VycmVudCA9IGxhbmc7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGogPSBhcnJheS5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICB2YXIgcHJvcGVydHkgPSBhcnJheVtpXTtcbiAgICB2YWx1ZSA9IGN1cnJlbnRbcHJvcGVydHldO1xuICAgIGlmIChpID09PSBqIC0gMSkgcmV0dXJuIGZvcm1hdCh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuICcnO1xuICAgIGN1cnJlbnQgPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gJyc7XG59O1xuXG52YXIgdXNlID0gZXhwb3J0cy51c2UgPSBmdW5jdGlvbiB1c2UobCkge1xuICBsYW5nID0gbCB8fCBsYW5nO1xufTtcblxudmFyIGkxOG4gPSBleHBvcnRzLmkxOG4gPSBmdW5jdGlvbiBpMThuKGZuKSB7XG4gIGkxOG5IYW5kbGVyID0gZm4gfHwgaTE4bkhhbmRsZXI7XG59O1xuXG5leHBvcnRzLmRlZmF1bHQgPSB7IHVzZTogdXNlLCB0OiB0LCBpMThuOiBpMThuIH07Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4897\n")},"4b26":function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\n\nvar _vue = __webpack_require__(\"2b0e\");\n\nvar _vue2 = _interopRequireDefault(_vue);\n\nvar _dom = __webpack_require__(\"5924\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar hasModal = false;\nvar hasInitZIndex = false;\nvar zIndex = void 0;\n\nvar getModal = function getModal() {\n if (_vue2.default.prototype.$isServer) return;\n var modalDom = PopupManager.modalDom;\n if (modalDom) {\n hasModal = true;\n } else {\n hasModal = false;\n modalDom = document.createElement('div');\n PopupManager.modalDom = modalDom;\n\n modalDom.addEventListener('touchmove', function (event) {\n event.preventDefault();\n event.stopPropagation();\n });\n\n modalDom.addEventListener('click', function () {\n PopupManager.doOnModalClick && PopupManager.doOnModalClick();\n });\n }\n\n return modalDom;\n};\n\nvar instances = {};\n\nvar PopupManager = {\n modalFade: true,\n\n getInstance: function getInstance(id) {\n return instances[id];\n },\n\n register: function register(id, instance) {\n if (id && instance) {\n instances[id] = instance;\n }\n },\n\n deregister: function deregister(id) {\n if (id) {\n instances[id] = null;\n delete instances[id];\n }\n },\n\n nextZIndex: function nextZIndex() {\n return PopupManager.zIndex++;\n },\n\n modalStack: [],\n\n doOnModalClick: function doOnModalClick() {\n var topItem = PopupManager.modalStack[PopupManager.modalStack.length - 1];\n if (!topItem) return;\n\n var instance = PopupManager.getInstance(topItem.id);\n if (instance && instance.closeOnClickModal) {\n instance.close();\n }\n },\n\n openModal: function openModal(id, zIndex, dom, modalClass, modalFade) {\n if (_vue2.default.prototype.$isServer) return;\n if (!id || zIndex === undefined) return;\n this.modalFade = modalFade;\n\n var modalStack = this.modalStack;\n\n for (var i = 0, j = modalStack.length; i < j; i++) {\n var item = modalStack[i];\n if (item.id === id) {\n return;\n }\n }\n\n var modalDom = getModal();\n\n (0, _dom.addClass)(modalDom, 'v-modal');\n if (this.modalFade && !hasModal) {\n (0, _dom.addClass)(modalDom, 'v-modal-enter');\n }\n if (modalClass) {\n var classArr = modalClass.trim().split(/\\s+/);\n classArr.forEach(function (item) {\n return (0, _dom.addClass)(modalDom, item);\n });\n }\n setTimeout(function () {\n (0, _dom.removeClass)(modalDom, 'v-modal-enter');\n }, 200);\n\n if (dom && dom.parentNode && dom.parentNode.nodeType !== 11) {\n dom.parentNode.appendChild(modalDom);\n } else {\n document.body.appendChild(modalDom);\n }\n\n if (zIndex) {\n modalDom.style.zIndex = zIndex;\n }\n modalDom.tabIndex = 0;\n modalDom.style.display = '';\n\n this.modalStack.push({ id: id, zIndex: zIndex, modalClass: modalClass });\n },\n\n closeModal: function closeModal(id) {\n var modalStack = this.modalStack;\n var modalDom = getModal();\n\n if (modalStack.length > 0) {\n var topItem = modalStack[modalStack.length - 1];\n if (topItem.id === id) {\n if (topItem.modalClass) {\n var classArr = topItem.modalClass.trim().split(/\\s+/);\n classArr.forEach(function (item) {\n return (0, _dom.removeClass)(modalDom, item);\n });\n }\n\n modalStack.pop();\n if (modalStack.length > 0) {\n modalDom.style.zIndex = modalStack[modalStack.length - 1].zIndex;\n }\n } else {\n for (var i = modalStack.length - 1; i >= 0; i--) {\n if (modalStack[i].id === id) {\n modalStack.splice(i, 1);\n break;\n }\n }\n }\n }\n\n if (modalStack.length === 0) {\n if (this.modalFade) {\n (0, _dom.addClass)(modalDom, 'v-modal-leave');\n }\n setTimeout(function () {\n if (modalStack.length === 0) {\n if (modalDom.parentNode) modalDom.parentNode.removeChild(modalDom);\n modalDom.style.display = 'none';\n PopupManager.modalDom = undefined;\n }\n (0, _dom.removeClass)(modalDom, 'v-modal-leave');\n }, 200);\n }\n }\n};\n\nObject.defineProperty(PopupManager, 'zIndex', {\n configurable: true,\n get: function get() {\n if (!hasInitZIndex) {\n zIndex = zIndex || (_vue2.default.prototype.$ELEMENT || {}).zIndex || 2000;\n hasInitZIndex = true;\n }\n return zIndex;\n },\n set: function set(value) {\n zIndex = value;\n }\n});\n\nvar getTopPopup = function getTopPopup() {\n if (_vue2.default.prototype.$isServer) return;\n if (PopupManager.modalStack.length > 0) {\n var topPopup = PopupManager.modalStack[PopupManager.modalStack.length - 1];\n if (!topPopup) return;\n var instance = PopupManager.getInstance(topPopup.id);\n\n return instance;\n }\n};\n\nif (!_vue2.default.prototype.$isServer) {\n // handle `esc` key when the popup is shown\n window.addEventListener('keydown', function (event) {\n if (event.keyCode === 27) {\n var topPopup = getTopPopup();\n\n if (topPopup && topPopup.closeOnPressEscape) {\n topPopup.handleClose ? topPopup.handleClose() : topPopup.handleAction ? topPopup.handleAction('cancel') : topPopup.close();\n }\n }\n });\n}\n\nexports.default = PopupManager;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvdXRpbHMvcG9wdXAvcG9wdXAtbWFuYWdlci5qcz80YjI2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViOztBQUVBLFdBQVcsbUJBQU8sQ0FBQyxNQUFLOztBQUV4Qjs7QUFFQSxXQUFXLG1CQUFPLENBQUMsTUFBMEI7O0FBRTdDLHNDQUFzQyx1Q0FBdUMsZ0JBQWdCOztBQUU3RjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSwwQ0FBMEMsT0FBTztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwwQkFBMEIsaURBQWlEO0FBQzNFLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLDJDQUEyQyxRQUFRO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQSIsImZpbGUiOiI0YjI2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX3Z1ZSA9IHJlcXVpcmUoJ3Z1ZScpO1xuXG52YXIgX3Z1ZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF92dWUpO1xuXG52YXIgX2RvbSA9IHJlcXVpcmUoJ2VsZW1lbnQtdWkvbGliL3V0aWxzL2RvbScpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG52YXIgaGFzTW9kYWwgPSBmYWxzZTtcbnZhciBoYXNJbml0WkluZGV4ID0gZmFsc2U7XG52YXIgekluZGV4ID0gdm9pZCAwO1xuXG52YXIgZ2V0TW9kYWwgPSBmdW5jdGlvbiBnZXRNb2RhbCgpIHtcbiAgaWYgKF92dWUyLmRlZmF1bHQucHJvdG90eXBlLiRpc1NlcnZlcikgcmV0dXJuO1xuICB2YXIgbW9kYWxEb20gPSBQb3B1cE1hbmFnZXIubW9kYWxEb207XG4gIGlmIChtb2RhbERvbSkge1xuICAgIGhhc01vZGFsID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICBoYXNNb2RhbCA9IGZhbHNlO1xuICAgIG1vZGFsRG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgUG9wdXBNYW5hZ2VyLm1vZGFsRG9tID0gbW9kYWxEb207XG5cbiAgICBtb2RhbERvbS5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9KTtcblxuICAgIG1vZGFsRG9tLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgUG9wdXBNYW5hZ2VyLmRvT25Nb2RhbENsaWNrICYmIFBvcHVwTWFuYWdlci5kb09uTW9kYWxDbGljaygpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG1vZGFsRG9tO1xufTtcblxudmFyIGluc3RhbmNlcyA9IHt9O1xuXG52YXIgUG9wdXBNYW5hZ2VyID0ge1xuICBtb2RhbEZhZGU6IHRydWUsXG5cbiAgZ2V0SW5zdGFuY2U6IGZ1bmN0aW9uIGdldEluc3RhbmNlKGlkKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlc1tpZF07XG4gIH0sXG5cbiAgcmVnaXN0ZXI6IGZ1bmN0aW9uIHJlZ2lzdGVyKGlkLCBpbnN0YW5jZSkge1xuICAgIGlmIChpZCAmJiBpbnN0YW5jZSkge1xuICAgICAgaW5zdGFuY2VzW2lkXSA9IGluc3RhbmNlO1xuICAgIH1cbiAgfSxcblxuICBkZXJlZ2lzdGVyOiBmdW5jdGlvbiBkZXJlZ2lzdGVyKGlkKSB7XG4gICAgaWYgKGlkKSB7XG4gICAgICBpbnN0YW5jZXNbaWRdID0gbnVsbDtcbiAgICAgIGRlbGV0ZSBpbnN0YW5jZXNbaWRdO1xuICAgIH1cbiAgfSxcblxuICBuZXh0WkluZGV4OiBmdW5jdGlvbiBuZXh0WkluZGV4KCkge1xuICAgIHJldHVybiBQb3B1cE1hbmFnZXIuekluZGV4Kys7XG4gIH0sXG5cbiAgbW9kYWxTdGFjazogW10sXG5cbiAgZG9Pbk1vZGFsQ2xpY2s6IGZ1bmN0aW9uIGRvT25Nb2RhbENsaWNrKCkge1xuICAgIHZhciB0b3BJdGVtID0gUG9wdXBNYW5hZ2VyLm1vZGFsU3RhY2tbUG9wdXBNYW5hZ2VyLm1vZGFsU3RhY2subGVuZ3RoIC0gMV07XG4gICAgaWYgKCF0b3BJdGVtKSByZXR1cm47XG5cbiAgICB2YXIgaW5zdGFuY2UgPSBQb3B1cE1hbmFnZXIuZ2V0SW5zdGFuY2UodG9wSXRlbS5pZCk7XG4gICAgaWYgKGluc3RhbmNlICYmIGluc3RhbmNlLmNsb3NlT25DbGlja01vZGFsKSB7XG4gICAgICBpbnN0YW5jZS5jbG9zZSgpO1xuICAgIH1cbiAgfSxcblxuICBvcGVuTW9kYWw6IGZ1bmN0aW9uIG9wZW5Nb2RhbChpZCwgekluZGV4LCBkb20sIG1vZGFsQ2xhc3MsIG1vZGFsRmFkZSkge1xuICAgIGlmIChfdnVlMi5kZWZhdWx0LnByb3RvdHlwZS4kaXNTZXJ2ZXIpIHJldHVybjtcbiAgICBpZiAoIWlkIHx8IHpJbmRleCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgdGhpcy5tb2RhbEZhZGUgPSBtb2RhbEZhZGU7XG5cbiAgICB2YXIgbW9kYWxTdGFjayA9IHRoaXMubW9kYWxTdGFjaztcblxuICAgIGZvciAodmFyIGkgPSAwLCBqID0gbW9kYWxTdGFjay5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gbW9kYWxTdGFja1tpXTtcbiAgICAgIGlmIChpdGVtLmlkID09PSBpZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG1vZGFsRG9tID0gZ2V0TW9kYWwoKTtcblxuICAgICgwLCBfZG9tLmFkZENsYXNzKShtb2RhbERvbSwgJ3YtbW9kYWwnKTtcbiAgICBpZiAodGhpcy5tb2RhbEZhZGUgJiYgIWhhc01vZGFsKSB7XG4gICAgICAoMCwgX2RvbS5hZGRDbGFzcykobW9kYWxEb20sICd2LW1vZGFsLWVudGVyJyk7XG4gICAgfVxuICAgIGlmIChtb2RhbENsYXNzKSB7XG4gICAgICB2YXIgY2xhc3NBcnIgPSBtb2RhbENsYXNzLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgY2xhc3NBcnIuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4gKDAsIF9kb20uYWRkQ2xhc3MpKG1vZGFsRG9tLCBpdGVtKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICgwLCBfZG9tLnJlbW92ZUNsYXNzKShtb2RhbERvbSwgJ3YtbW9kYWwtZW50ZXInKTtcbiAgICB9LCAyMDApO1xuXG4gICAgaWYgKGRvbSAmJiBkb20ucGFyZW50Tm9kZSAmJiBkb20ucGFyZW50Tm9kZS5ub2RlVHlwZSAhPT0gMTEpIHtcbiAgICAgIGRvbS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKG1vZGFsRG9tKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChtb2RhbERvbSk7XG4gICAgfVxuXG4gICAgaWYgKHpJbmRleCkge1xuICAgICAgbW9kYWxEb20uc3R5bGUuekluZGV4ID0gekluZGV4O1xuICAgIH1cbiAgICBtb2RhbERvbS50YWJJbmRleCA9IDA7XG4gICAgbW9kYWxEb20uc3R5bGUuZGlzcGxheSA9ICcnO1xuXG4gICAgdGhpcy5tb2RhbFN0YWNrLnB1c2goeyBpZDogaWQsIHpJbmRleDogekluZGV4LCBtb2RhbENsYXNzOiBtb2RhbENsYXNzIH0pO1xuICB9LFxuXG4gIGNsb3NlTW9kYWw6IGZ1bmN0aW9uIGNsb3NlTW9kYWwoaWQpIHtcbiAgICB2YXIgbW9kYWxTdGFjayA9IHRoaXMubW9kYWxTdGFjaztcbiAgICB2YXIgbW9kYWxEb20gPSBnZXRNb2RhbCgpO1xuXG4gICAgaWYgKG1vZGFsU3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgdmFyIHRvcEl0ZW0gPSBtb2RhbFN0YWNrW21vZGFsU3RhY2subGVuZ3RoIC0gMV07XG4gICAgICBpZiAodG9wSXRlbS5pZCA9PT0gaWQpIHtcbiAgICAgICAgaWYgKHRvcEl0ZW0ubW9kYWxDbGFzcykge1xuICAgICAgICAgIHZhciBjbGFzc0FyciA9IHRvcEl0ZW0ubW9kYWxDbGFzcy50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICAgICAgICBjbGFzc0Fyci5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICByZXR1cm4gKDAsIF9kb20ucmVtb3ZlQ2xhc3MpKG1vZGFsRG9tLCBpdGVtKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1vZGFsU3RhY2sucG9wKCk7XG4gICAgICAgIGlmIChtb2RhbFN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBtb2RhbERvbS5zdHlsZS56SW5kZXggPSBtb2RhbFN0YWNrW21vZGFsU3RhY2subGVuZ3RoIC0gMV0uekluZGV4O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBpID0gbW9kYWxTdGFjay5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIGlmIChtb2RhbFN0YWNrW2ldLmlkID09PSBpZCkge1xuICAgICAgICAgICAgbW9kYWxTdGFjay5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobW9kYWxTdGFjay5sZW5ndGggPT09IDApIHtcbiAgICAgIGlmICh0aGlzLm1vZGFsRmFkZSkge1xuICAgICAgICAoMCwgX2RvbS5hZGRDbGFzcykobW9kYWxEb20sICd2LW1vZGFsLWxlYXZlJyk7XG4gICAgICB9XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKG1vZGFsU3RhY2subGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgaWYgKG1vZGFsRG9tLnBhcmVudE5vZGUpIG1vZGFsRG9tLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobW9kYWxEb20pO1xuICAgICAgICAgIG1vZGFsRG9tLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgUG9wdXBNYW5hZ2VyLm1vZGFsRG9tID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgICgwLCBfZG9tLnJlbW92ZUNsYXNzKShtb2RhbERvbSwgJ3YtbW9kYWwtbGVhdmUnKTtcbiAgICAgIH0sIDIwMCk7XG4gICAgfVxuICB9XG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoUG9wdXBNYW5hZ2VyLCAnekluZGV4Jywge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIGlmICghaGFzSW5pdFpJbmRleCkge1xuICAgICAgekluZGV4ID0gekluZGV4IHx8IChfdnVlMi5kZWZhdWx0LnByb3RvdHlwZS4kRUxFTUVOVCB8fCB7fSkuekluZGV4IHx8IDIwMDA7XG4gICAgICBoYXNJbml0WkluZGV4ID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHpJbmRleDtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICB6SW5kZXggPSB2YWx1ZTtcbiAgfVxufSk7XG5cbnZhciBnZXRUb3BQb3B1cCA9IGZ1bmN0aW9uIGdldFRvcFBvcHVwKCkge1xuICBpZiAoX3Z1ZTIuZGVmYXVsdC5wcm90b3R5cGUuJGlzU2VydmVyKSByZXR1cm47XG4gIGlmIChQb3B1cE1hbmFnZXIubW9kYWxTdGFjay5sZW5ndGggPiAwKSB7XG4gICAgdmFyIHRvcFBvcHVwID0gUG9wdXBNYW5hZ2VyLm1vZGFsU3RhY2tbUG9wdXBNYW5hZ2VyLm1vZGFsU3RhY2subGVuZ3RoIC0gMV07XG4gICAgaWYgKCF0b3BQb3B1cCkgcmV0dXJuO1xuICAgIHZhciBpbnN0YW5jZSA9IFBvcHVwTWFuYWdlci5nZXRJbnN0YW5jZSh0b3BQb3B1cC5pZCk7XG5cbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cbn07XG5cbmlmICghX3Z1ZTIuZGVmYXVsdC5wcm90b3R5cGUuJGlzU2VydmVyKSB7XG4gIC8vIGhhbmRsZSBgZXNjYCBrZXkgd2hlbiB0aGUgcG9wdXAgaXMgc2hvd25cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMjcpIHtcbiAgICAgIHZhciB0b3BQb3B1cCA9IGdldFRvcFBvcHVwKCk7XG5cbiAgICAgIGlmICh0b3BQb3B1cCAmJiB0b3BQb3B1cC5jbG9zZU9uUHJlc3NFc2NhcGUpIHtcbiAgICAgICAgdG9wUG9wdXAuaGFuZGxlQ2xvc2UgPyB0b3BQb3B1cC5oYW5kbGVDbG9zZSgpIDogdG9wUG9wdXAuaGFuZGxlQWN0aW9uID8gdG9wUG9wdXAuaGFuZGxlQWN0aW9uKCdjYW5jZWwnKSA6IHRvcFBvcHVwLmNsb3NlKCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gUG9wdXBNYW5hZ2VyOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4b26\n")},"4e4b":function(module,exports,__webpack_require__){eval('module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== \'undefined\' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: \'Module\' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, \'__esModule\', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === \'object\' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, \'default\', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != \'string\') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module[\'default\']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, \'a\', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = "/dist/";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 62);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return normalizeComponent; });\n/* globals __VUE_SSR_CONTEXT__ */\n\n// IMPORTANT: Do NOT use ES2015 features in this file (except for modules).\n// This module is a runtime utility for cleaner component module output and will\n// be included in the final webpack user bundle.\n\nfunction normalizeComponent (\n scriptExports,\n render,\n staticRenderFns,\n functionalTemplate,\n injectStyles,\n scopeId,\n moduleIdentifier, /* server only */\n shadowMode /* vue-cli only */\n) {\n // Vue.extend constructor export interop\n var options = typeof scriptExports === \'function\'\n ? scriptExports.options\n : scriptExports\n\n // render functions\n if (render) {\n options.render = render\n options.staticRenderFns = staticRenderFns\n options._compiled = true\n }\n\n // functional template\n if (functionalTemplate) {\n options.functional = true\n }\n\n // scopedId\n if (scopeId) {\n options._scopeId = \'data-v-\' + scopeId\n }\n\n var hook\n if (moduleIdentifier) { // server build\n hook = function (context) {\n // 2.3 injection\n context =\n context || // cached call\n (this.$vnode && this.$vnode.ssrContext) || // stateful\n (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional\n // 2.2 with runInNewContext: true\n if (!context && typeof __VUE_SSR_CONTEXT__ !== \'undefined\') {\n context = __VUE_SSR_CONTEXT__\n }\n // inject component styles\n if (injectStyles) {\n injectStyles.call(this, context)\n }\n // register component module identifier for async chunk inferrence\n if (context && context._registeredComponents) {\n context._registeredComponents.add(moduleIdentifier)\n }\n }\n // used by ssr in case component is cached and beforeCreate\n // never gets called\n options._ssrRegister = hook\n } else if (injectStyles) {\n hook = shadowMode\n ? function () { injectStyles.call(this, this.$root.$options.shadowRoot) }\n : injectStyles\n }\n\n if (hook) {\n if (options.functional) {\n // for template-only hot-reload because in that case the render fn doesn\'t\n // go through the normalizer\n options._injectStyles = hook\n // register for functioal component in vue file\n var originalRender = options.render\n options.render = function renderWithStyleInjection (h, context) {\n hook.call(context)\n return originalRender(h, context)\n }\n } else {\n // inject component registration as beforeCreate hook\n var existing = options.beforeCreate\n options.beforeCreate = existing\n ? [].concat(existing, hook)\n : [hook]\n }\n }\n\n return {\n exports: scriptExports,\n options: options\n }\n}\n\n\n/***/ }),\n\n/***/ 10:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("f3ad");\n\n/***/ }),\n\n/***/ 12:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("417f");\n\n/***/ }),\n\n/***/ 15:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("14e9");\n\n/***/ }),\n\n/***/ 16:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("4010");\n\n/***/ }),\n\n/***/ 19:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("0e15");\n\n/***/ }),\n\n/***/ 21:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("d397");\n\n/***/ }),\n\n/***/ 22:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("12f2");\n\n/***/ }),\n\n/***/ 3:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("8122");\n\n/***/ }),\n\n/***/ 31:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("2a5e");\n\n/***/ }),\n\n/***/ 33:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/select/src/option.vue?vue&type=template&id=7a44c642&\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "li",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.visible,\n expression: "visible"\n }\n ],\n staticClass: "el-select-dropdown__item",\n class: {\n selected: _vm.itemSelected,\n "is-disabled": _vm.disabled || _vm.groupDisabled || _vm.limitReached,\n hover: _vm.hover\n },\n on: {\n mouseenter: _vm.hoverItem,\n click: function($event) {\n $event.stopPropagation()\n return _vm.selectOptionClick($event)\n }\n }\n },\n [_vm._t("default", [_c("span", [_vm._v(_vm._s(_vm.currentLabel))])])],\n 2\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/select/src/option.vue?vue&type=template&id=7a44c642&\n\n// EXTERNAL MODULE: external "element-ui/lib/mixins/emitter"\nvar emitter_ = __webpack_require__(4);\nvar emitter_default = /*#__PURE__*/__webpack_require__.n(emitter_);\n\n// EXTERNAL MODULE: external "element-ui/lib/utils/util"\nvar util_ = __webpack_require__(3);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/select/src/option.vue?vue&type=script&lang=js&\nvar _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n/* harmony default export */ var optionvue_type_script_lang_js_ = ({\n mixins: [emitter_default.a],\n\n name: \'ElOption\',\n\n componentName: \'ElOption\',\n\n inject: [\'select\'],\n\n props: {\n value: {\n required: true\n },\n label: [String, Number],\n created: Boolean,\n disabled: {\n type: Boolean,\n default: false\n }\n },\n\n data: function data() {\n return {\n index: -1,\n groupDisabled: false,\n visible: true,\n hitState: false,\n hover: false\n };\n },\n\n\n computed: {\n isObject: function isObject() {\n return Object.prototype.toString.call(this.value).toLowerCase() === \'[object object]\';\n },\n currentLabel: function currentLabel() {\n return this.label || (this.isObject ? \'\' : this.value);\n },\n currentValue: function currentValue() {\n return this.value || this.label || \'\';\n },\n itemSelected: function itemSelected() {\n if (!this.select.multiple) {\n return this.isEqual(this.value, this.select.value);\n } else {\n return this.contains(this.select.value, this.value);\n }\n },\n limitReached: function limitReached() {\n if (this.select.multiple) {\n return !this.itemSelected && (this.select.value || []).length >= this.select.multipleLimit && this.select.multipleLimit > 0;\n } else {\n return false;\n }\n }\n },\n\n watch: {\n currentLabel: function currentLabel() {\n if (!this.created && !this.select.remote) this.dispatch(\'ElSelect\', \'setSelected\');\n },\n value: function value(val, oldVal) {\n var _select = this.select,\n remote = _select.remote,\n valueKey = _select.valueKey;\n\n if (!this.created && !remote) {\n if (valueKey && (typeof val === \'undefined\' ? \'undefined\' : _typeof(val)) === \'object\' && (typeof oldVal === \'undefined\' ? \'undefined\' : _typeof(oldVal)) === \'object\' && val[valueKey] === oldVal[valueKey]) {\n return;\n }\n this.dispatch(\'ElSelect\', \'setSelected\');\n }\n }\n },\n\n methods: {\n isEqual: function isEqual(a, b) {\n if (!this.isObject) {\n return a === b;\n } else {\n var valueKey = this.select.valueKey;\n return Object(util_["getValueByPath"])(a, valueKey) === Object(util_["getValueByPath"])(b, valueKey);\n }\n },\n contains: function contains() {\n var arr = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var target = arguments[1];\n\n if (!this.isObject) {\n return arr && arr.indexOf(target) > -1;\n } else {\n var valueKey = this.select.valueKey;\n return arr && arr.some(function (item) {\n return Object(util_["getValueByPath"])(item, valueKey) === Object(util_["getValueByPath"])(target, valueKey);\n });\n }\n },\n handleGroupDisabled: function handleGroupDisabled(val) {\n this.groupDisabled = val;\n },\n hoverItem: function hoverItem() {\n if (!this.disabled && !this.groupDisabled) {\n this.select.hoverIndex = this.select.options.indexOf(this);\n }\n },\n selectOptionClick: function selectOptionClick() {\n if (this.disabled !== true && this.groupDisabled !== true) {\n this.dispatch(\'ElSelect\', \'handleOptionClick\', [this, true]);\n }\n },\n queryChange: function queryChange(query) {\n this.visible = new RegExp(Object(util_["escapeRegexpString"])(query), \'i\').test(this.currentLabel) || this.created;\n if (!this.visible) {\n this.select.filteredOptionsCount--;\n }\n }\n },\n\n created: function created() {\n this.select.options.push(this);\n this.select.cachedOptions.push(this);\n this.select.optionsCount++;\n this.select.filteredOptionsCount++;\n\n this.$on(\'queryChange\', this.queryChange);\n this.$on(\'handleGroupDisabled\', this.handleGroupDisabled);\n },\n beforeDestroy: function beforeDestroy() {\n var _select2 = this.select,\n selected = _select2.selected,\n multiple = _select2.multiple;\n\n var selectedOptions = multiple ? selected : [selected];\n var index = this.select.cachedOptions.indexOf(this);\n var selectedIndex = selectedOptions.indexOf(this);\n\n // if option is not selected, remove it from cache\n if (index > -1 && selectedIndex < 0) {\n this.select.cachedOptions.splice(index, 1);\n }\n this.select.onOptionDestroy(this.select.options.indexOf(this));\n }\n});\n// CONCATENATED MODULE: ./packages/select/src/option.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_optionvue_type_script_lang_js_ = (optionvue_type_script_lang_js_); \n// EXTERNAL MODULE: ./node_modules/vue-loader/lib/runtime/componentNormalizer.js\nvar componentNormalizer = __webpack_require__(0);\n\n// CONCATENATED MODULE: ./packages/select/src/option.vue\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(componentNormalizer["a" /* default */])(\n src_optionvue_type_script_lang_js_,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = "packages/select/src/option.vue"\n/* harmony default export */ var src_option = __webpack_exports__["a"] = (component.exports);\n\n/***/ }),\n\n/***/ 38:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("8bbc");\n\n/***/ }),\n\n/***/ 4:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("d010");\n\n/***/ }),\n\n/***/ 5:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("e974");\n\n/***/ }),\n\n/***/ 6:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("6b7c");\n\n/***/ }),\n\n/***/ 62:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n__webpack_require__.r(__webpack_exports__);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/select/src/select.vue?vue&type=template&id=0e4aade6&\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "div",\n {\n directives: [\n {\n name: "clickoutside",\n rawName: "v-clickoutside",\n value: _vm.handleClose,\n expression: "handleClose"\n }\n ],\n staticClass: "el-select",\n class: [_vm.selectSize ? "el-select--" + _vm.selectSize : ""],\n on: {\n click: function($event) {\n $event.stopPropagation()\n return _vm.toggleMenu($event)\n }\n }\n },\n [\n _vm.multiple\n ? _c(\n "div",\n {\n ref: "tags",\n staticClass: "el-select__tags",\n style: { "max-width": _vm.inputWidth - 32 + "px", width: "100%" }\n },\n [\n _vm.collapseTags && _vm.selected.length\n ? _c(\n "span",\n [\n _c(\n "el-tag",\n {\n attrs: {\n closable: !_vm.selectDisabled,\n size: _vm.collapseTagSize,\n hit: _vm.selected[0].hitState,\n type: "info",\n "disable-transitions": ""\n },\n on: {\n close: function($event) {\n _vm.deleteTag($event, _vm.selected[0])\n }\n }\n },\n [\n _c("span", { staticClass: "el-select__tags-text" }, [\n _vm._v(_vm._s(_vm.selected[0].currentLabel))\n ])\n ]\n ),\n _vm.selected.length > 1\n ? _c(\n "el-tag",\n {\n attrs: {\n closable: false,\n size: _vm.collapseTagSize,\n type: "info",\n "disable-transitions": ""\n }\n },\n [\n _c(\n "span",\n { staticClass: "el-select__tags-text" },\n [_vm._v("+ " + _vm._s(_vm.selected.length - 1))]\n )\n ]\n )\n : _vm._e()\n ],\n 1\n )\n : _vm._e(),\n !_vm.collapseTags\n ? _c(\n "transition-group",\n { on: { "after-leave": _vm.resetInputHeight } },\n _vm._l(_vm.selected, function(item) {\n return _c(\n "el-tag",\n {\n key: _vm.getValueKey(item),\n attrs: {\n closable: !_vm.selectDisabled,\n size: _vm.collapseTagSize,\n hit: item.hitState,\n type: "info",\n "disable-transitions": ""\n },\n on: {\n close: function($event) {\n _vm.deleteTag($event, item)\n }\n }\n },\n [\n _c("span", { staticClass: "el-select__tags-text" }, [\n _vm._v(_vm._s(item.currentLabel))\n ])\n ]\n )\n }),\n 1\n )\n : _vm._e(),\n _vm.filterable\n ? _c("input", {\n directives: [\n {\n name: "model",\n rawName: "v-model",\n value: _vm.query,\n expression: "query"\n }\n ],\n ref: "input",\n staticClass: "el-select__input",\n class: [_vm.selectSize ? "is-" + _vm.selectSize : ""],\n style: {\n "flex-grow": "1",\n width: _vm.inputLength / (_vm.inputWidth - 32) + "%",\n "max-width": _vm.inputWidth - 42 + "px"\n },\n attrs: {\n type: "text",\n disabled: _vm.selectDisabled,\n autocomplete: _vm.autoComplete || _vm.autocomplete\n },\n domProps: { value: _vm.query },\n on: {\n focus: _vm.handleFocus,\n blur: function($event) {\n _vm.softFocus = false\n },\n keyup: _vm.managePlaceholder,\n keydown: [\n _vm.resetInputState,\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "down", 40, $event.key, [\n "Down",\n "ArrowDown"\n ])\n ) {\n return null\n }\n $event.preventDefault()\n _vm.handleNavigate("next")\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "up", 38, $event.key, [\n "Up",\n "ArrowUp"\n ])\n ) {\n return null\n }\n $event.preventDefault()\n _vm.handleNavigate("prev")\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k(\n $event.keyCode,\n "enter",\n 13,\n $event.key,\n "Enter"\n )\n ) {\n return null\n }\n $event.preventDefault()\n return _vm.selectOption($event)\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "esc", 27, $event.key, [\n "Esc",\n "Escape"\n ])\n ) {\n return null\n }\n $event.stopPropagation()\n $event.preventDefault()\n _vm.visible = false\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k(\n $event.keyCode,\n "delete",\n [8, 46],\n $event.key,\n ["Backspace", "Delete", "Del"]\n )\n ) {\n return null\n }\n return _vm.deletePrevTag($event)\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "tab", 9, $event.key, "Tab")\n ) {\n return null\n }\n _vm.visible = false\n }\n ],\n compositionstart: _vm.handleComposition,\n compositionupdate: _vm.handleComposition,\n compositionend: _vm.handleComposition,\n input: [\n function($event) {\n if ($event.target.composing) {\n return\n }\n _vm.query = $event.target.value\n },\n _vm.debouncedQueryChange\n ]\n }\n })\n : _vm._e()\n ],\n 1\n )\n : _vm._e(),\n _c(\n "el-input",\n {\n ref: "reference",\n class: { "is-focus": _vm.visible },\n attrs: {\n type: "text",\n placeholder: _vm.currentPlaceholder,\n name: _vm.name,\n id: _vm.id,\n autocomplete: _vm.autoComplete || _vm.autocomplete,\n size: _vm.selectSize,\n disabled: _vm.selectDisabled,\n readonly: _vm.readonly,\n "validate-event": false,\n tabindex: _vm.multiple && _vm.filterable ? "-1" : null\n },\n on: {\n focus: _vm.handleFocus,\n blur: _vm.handleBlur,\n input: _vm.debouncedOnInputChange,\n compositionstart: _vm.handleComposition,\n compositionupdate: _vm.handleComposition,\n compositionend: _vm.handleComposition\n },\n nativeOn: {\n keydown: [\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "down", 40, $event.key, [\n "Down",\n "ArrowDown"\n ])\n ) {\n return null\n }\n $event.stopPropagation()\n $event.preventDefault()\n _vm.handleNavigate("next")\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "up", 38, $event.key, [\n "Up",\n "ArrowUp"\n ])\n ) {\n return null\n }\n $event.stopPropagation()\n $event.preventDefault()\n _vm.handleNavigate("prev")\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "enter", 13, $event.key, "Enter")\n ) {\n return null\n }\n $event.preventDefault()\n return _vm.selectOption($event)\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "esc", 27, $event.key, [\n "Esc",\n "Escape"\n ])\n ) {\n return null\n }\n $event.stopPropagation()\n $event.preventDefault()\n _vm.visible = false\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "tab", 9, $event.key, "Tab")\n ) {\n return null\n }\n _vm.visible = false\n }\n ],\n mouseenter: function($event) {\n _vm.inputHovering = true\n },\n mouseleave: function($event) {\n _vm.inputHovering = false\n }\n },\n model: {\n value: _vm.selectedLabel,\n callback: function($$v) {\n _vm.selectedLabel = $$v\n },\n expression: "selectedLabel"\n }\n },\n [\n _vm.$slots.prefix\n ? _c("template", { slot: "prefix" }, [_vm._t("prefix")], 2)\n : _vm._e(),\n _c("template", { slot: "suffix" }, [\n _c("i", {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: !_vm.showClose,\n expression: "!showClose"\n }\n ],\n class: [\n "el-select__caret",\n "el-input__icon",\n "el-icon-" + _vm.iconClass\n ]\n }),\n _vm.showClose\n ? _c("i", {\n staticClass:\n "el-select__caret el-input__icon el-icon-circle-close",\n on: { click: _vm.handleClearClick }\n })\n : _vm._e()\n ])\n ],\n 2\n ),\n _c(\n "transition",\n {\n attrs: { name: "el-zoom-in-top" },\n on: {\n "before-enter": _vm.handleMenuEnter,\n "after-leave": _vm.doDestroy\n }\n },\n [\n _c(\n "el-select-menu",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.visible && _vm.emptyText !== false,\n expression: "visible && emptyText !== false"\n }\n ],\n ref: "popper",\n attrs: { "append-to-body": _vm.popperAppendToBody }\n },\n [\n _c(\n "el-scrollbar",\n {\n directives: [\n {\n name: "show",\n rawName: "v-show",\n value: _vm.options.length > 0 && !_vm.loading,\n expression: "options.length > 0 && !loading"\n }\n ],\n ref: "scrollbar",\n class: {\n "is-empty":\n !_vm.allowCreate &&\n _vm.query &&\n _vm.filteredOptionsCount === 0\n },\n attrs: {\n tag: "ul",\n "wrap-class": "el-select-dropdown__wrap",\n "view-class": "el-select-dropdown__list"\n }\n },\n [\n _vm.showNewOption\n ? _c("el-option", {\n attrs: { value: _vm.query, created: "" }\n })\n : _vm._e(),\n _vm._t("default")\n ],\n 2\n ),\n _vm.emptyText &&\n (!_vm.allowCreate ||\n _vm.loading ||\n (_vm.allowCreate && _vm.options.length === 0))\n ? [\n _vm.$slots.empty\n ? _vm._t("empty")\n : _c("p", { staticClass: "el-select-dropdown__empty" }, [\n _vm._v(\n "\\n " +\n _vm._s(_vm.emptyText) +\n "\\n "\n )\n ])\n ]\n : _vm._e()\n ],\n 2\n )\n ],\n 1\n )\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/select/src/select.vue?vue&type=template&id=0e4aade6&\n\n// EXTERNAL MODULE: external "element-ui/lib/mixins/emitter"\nvar emitter_ = __webpack_require__(4);\nvar emitter_default = /*#__PURE__*/__webpack_require__.n(emitter_);\n\n// EXTERNAL MODULE: external "element-ui/lib/mixins/focus"\nvar focus_ = __webpack_require__(22);\nvar focus_default = /*#__PURE__*/__webpack_require__.n(focus_);\n\n// EXTERNAL MODULE: external "element-ui/lib/mixins/locale"\nvar locale_ = __webpack_require__(6);\nvar locale_default = /*#__PURE__*/__webpack_require__.n(locale_);\n\n// EXTERNAL MODULE: external "element-ui/lib/input"\nvar input_ = __webpack_require__(10);\nvar input_default = /*#__PURE__*/__webpack_require__.n(input_);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/select/src/select-dropdown.vue?vue&type=template&id=06828748&\nvar select_dropdownvue_type_template_id_06828748_render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "div",\n {\n staticClass: "el-select-dropdown el-popper",\n class: [{ "is-multiple": _vm.$parent.multiple }, _vm.popperClass],\n style: { minWidth: _vm.minWidth }\n },\n [_vm._t("default")],\n 2\n )\n}\nvar select_dropdownvue_type_template_id_06828748_staticRenderFns = []\nselect_dropdownvue_type_template_id_06828748_render._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/select/src/select-dropdown.vue?vue&type=template&id=06828748&\n\n// EXTERNAL MODULE: external "element-ui/lib/utils/vue-popper"\nvar vue_popper_ = __webpack_require__(5);\nvar vue_popper_default = /*#__PURE__*/__webpack_require__.n(vue_popper_);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/select/src/select-dropdown.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ var select_dropdownvue_type_script_lang_js_ = ({\n name: \'ElSelectDropdown\',\n\n componentName: \'ElSelectDropdown\',\n\n mixins: [vue_popper_default.a],\n\n props: {\n placement: {\n default: \'bottom-start\'\n },\n\n boundariesPadding: {\n default: 0\n },\n\n popperOptions: {\n default: function _default() {\n return {\n gpuAcceleration: false\n };\n }\n },\n\n visibleArrow: {\n default: true\n },\n\n appendToBody: {\n type: Boolean,\n default: true\n }\n },\n\n data: function data() {\n return {\n minWidth: \'\'\n };\n },\n\n\n computed: {\n popperClass: function popperClass() {\n return this.$parent.popperClass;\n }\n },\n\n watch: {\n \'$parent.inputWidth\': function $parentInputWidth() {\n this.minWidth = this.$parent.$el.getBoundingClientRect().width + \'px\';\n }\n },\n\n mounted: function mounted() {\n var _this = this;\n\n this.referenceElm = this.$parent.$refs.reference.$el;\n this.$parent.popperElm = this.popperElm = this.$el;\n this.$on(\'updatePopper\', function () {\n if (_this.$parent.visible) _this.updatePopper();\n });\n this.$on(\'destroyPopper\', this.destroyPopper);\n }\n});\n// CONCATENATED MODULE: ./packages/select/src/select-dropdown.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_select_dropdownvue_type_script_lang_js_ = (select_dropdownvue_type_script_lang_js_); \n// EXTERNAL MODULE: ./node_modules/vue-loader/lib/runtime/componentNormalizer.js\nvar componentNormalizer = __webpack_require__(0);\n\n// CONCATENATED MODULE: ./packages/select/src/select-dropdown.vue\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(componentNormalizer["a" /* default */])(\n src_select_dropdownvue_type_script_lang_js_,\n select_dropdownvue_type_template_id_06828748_render,\n select_dropdownvue_type_template_id_06828748_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = "packages/select/src/select-dropdown.vue"\n/* harmony default export */ var select_dropdown = (component.exports);\n// EXTERNAL MODULE: ./packages/select/src/option.vue + 4 modules\nvar src_option = __webpack_require__(33);\n\n// EXTERNAL MODULE: external "element-ui/lib/tag"\nvar tag_ = __webpack_require__(38);\nvar tag_default = /*#__PURE__*/__webpack_require__.n(tag_);\n\n// EXTERNAL MODULE: external "element-ui/lib/scrollbar"\nvar scrollbar_ = __webpack_require__(15);\nvar scrollbar_default = /*#__PURE__*/__webpack_require__.n(scrollbar_);\n\n// EXTERNAL MODULE: external "throttle-debounce/debounce"\nvar debounce_ = __webpack_require__(19);\nvar debounce_default = /*#__PURE__*/__webpack_require__.n(debounce_);\n\n// EXTERNAL MODULE: external "element-ui/lib/utils/clickoutside"\nvar clickoutside_ = __webpack_require__(12);\nvar clickoutside_default = /*#__PURE__*/__webpack_require__.n(clickoutside_);\n\n// EXTERNAL MODULE: external "element-ui/lib/utils/resize-event"\nvar resize_event_ = __webpack_require__(16);\n\n// EXTERNAL MODULE: external "element-ui/lib/utils/scroll-into-view"\nvar scroll_into_view_ = __webpack_require__(31);\nvar scroll_into_view_default = /*#__PURE__*/__webpack_require__.n(scroll_into_view_);\n\n// EXTERNAL MODULE: external "element-ui/lib/utils/util"\nvar util_ = __webpack_require__(3);\n\n// CONCATENATED MODULE: ./packages/select/src/navigation-mixin.js\n/* harmony default export */ var navigation_mixin = ({\n data: function data() {\n return {\n hoverOption: -1\n };\n },\n\n\n computed: {\n optionsAllDisabled: function optionsAllDisabled() {\n return this.options.filter(function (option) {\n return option.visible;\n }).every(function (option) {\n return option.disabled;\n });\n }\n },\n\n watch: {\n hoverIndex: function hoverIndex(val) {\n var _this = this;\n\n if (typeof val === \'number\' && val > -1) {\n this.hoverOption = this.options[val] || {};\n }\n this.options.forEach(function (option) {\n option.hover = _this.hoverOption === option;\n });\n }\n },\n\n methods: {\n navigateOptions: function navigateOptions(direction) {\n var _this2 = this;\n\n if (!this.visible) {\n this.visible = true;\n return;\n }\n if (this.options.length === 0 || this.filteredOptionsCount === 0) return;\n if (!this.optionsAllDisabled) {\n if (direction === \'next\') {\n this.hoverIndex++;\n if (this.hoverIndex === this.options.length) {\n this.hoverIndex = 0;\n }\n } else if (direction === \'prev\') {\n this.hoverIndex--;\n if (this.hoverIndex < 0) {\n this.hoverIndex = this.options.length - 1;\n }\n }\n var option = this.options[this.hoverIndex];\n if (option.disabled === true || option.groupDisabled === true || !option.visible) {\n this.navigateOptions(direction);\n }\n this.$nextTick(function () {\n return _this2.scrollToOption(_this2.hoverOption);\n });\n }\n }\n }\n});\n// EXTERNAL MODULE: external "element-ui/lib/utils/shared"\nvar shared_ = __webpack_require__(21);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/select/src/select.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/* harmony default export */ var selectvue_type_script_lang_js_ = ({\n mixins: [emitter_default.a, locale_default.a, focus_default()(\'reference\'), navigation_mixin],\n\n name: \'ElSelect\',\n\n componentName: \'ElSelect\',\n\n inject: {\n elForm: {\n default: \'\'\n },\n\n elFormItem: {\n default: \'\'\n }\n },\n\n provide: function provide() {\n return {\n \'select\': this\n };\n },\n\n\n computed: {\n _elFormItemSize: function _elFormItemSize() {\n return (this.elFormItem || {}).elFormItemSize;\n },\n readonly: function readonly() {\n return !this.filterable || this.multiple || !Object(util_["isIE"])() && !Object(util_["isEdge"])() && !this.visible;\n },\n showClose: function showClose() {\n var hasValue = this.multiple ? Array.isArray(this.value) && this.value.length > 0 : this.value !== undefined && this.value !== null && this.value !== \'\';\n var criteria = this.clearable && !this.selectDisabled && this.inputHovering && hasValue;\n return criteria;\n },\n iconClass: function iconClass() {\n return this.remote && this.filterable ? \'\' : this.visible ? \'arrow-up is-reverse\' : \'arrow-up\';\n },\n debounce: function debounce() {\n return this.remote ? 300 : 0;\n },\n emptyText: function emptyText() {\n if (this.loading) {\n return this.loadingText || this.t(\'el.select.loading\');\n } else {\n if (this.remote && this.query === \'\' && this.options.length === 0) return false;\n if (this.filterable && this.query && this.options.length > 0 && this.filteredOptionsCount === 0) {\n return this.noMatchText || this.t(\'el.select.noMatch\');\n }\n if (this.options.length === 0) {\n return this.noDataText || this.t(\'el.select.noData\');\n }\n }\n return null;\n },\n showNewOption: function showNewOption() {\n var _this = this;\n\n var hasExistingOption = this.options.filter(function (option) {\n return !option.created;\n }).some(function (option) {\n return option.currentLabel === _this.query;\n });\n return this.filterable && this.allowCreate && this.query !== \'\' && !hasExistingOption;\n },\n selectSize: function selectSize() {\n return this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;\n },\n selectDisabled: function selectDisabled() {\n return this.disabled || (this.elForm || {}).disabled;\n },\n collapseTagSize: function collapseTagSize() {\n return [\'small\', \'mini\'].indexOf(this.selectSize) > -1 ? \'mini\' : \'small\';\n },\n propPlaceholder: function propPlaceholder() {\n return typeof this.placeholder !== \'undefined\' ? this.placeholder : this.t(\'el.select.placeholder\');\n }\n },\n\n components: {\n ElInput: input_default.a,\n ElSelectMenu: select_dropdown,\n ElOption: src_option["a" /* default */],\n ElTag: tag_default.a,\n ElScrollbar: scrollbar_default.a\n },\n\n directives: { Clickoutside: clickoutside_default.a },\n\n props: {\n name: String,\n id: String,\n value: {\n required: true\n },\n autocomplete: {\n type: String,\n default: \'off\'\n },\n /** @Deprecated in next major version */\n autoComplete: {\n type: String,\n validator: function validator(val) {\n false && false;\n return true;\n }\n },\n automaticDropdown: Boolean,\n size: String,\n disabled: Boolean,\n clearable: Boolean,\n filterable: Boolean,\n allowCreate: Boolean,\n loading: Boolean,\n popperClass: String,\n remote: Boolean,\n loadingText: String,\n noMatchText: String,\n noDataText: String,\n remoteMethod: Function,\n filterMethod: Function,\n multiple: Boolean,\n multipleLimit: {\n type: Number,\n default: 0\n },\n placeholder: {\n type: String,\n required: false\n },\n defaultFirstOption: Boolean,\n reserveKeyword: Boolean,\n valueKey: {\n type: String,\n default: \'value\'\n },\n collapseTags: Boolean,\n popperAppendToBody: {\n type: Boolean,\n default: true\n }\n },\n\n data: function data() {\n return {\n options: [],\n cachedOptions: [],\n createdLabel: null,\n createdSelected: false,\n selected: this.multiple ? [] : {},\n inputLength: 20,\n inputWidth: 0,\n initialInputHeight: 0,\n cachedPlaceHolder: \'\',\n optionsCount: 0,\n filteredOptionsCount: 0,\n visible: false,\n softFocus: false,\n selectedLabel: \'\',\n hoverIndex: -1,\n query: \'\',\n previousQuery: null,\n inputHovering: false,\n currentPlaceholder: \'\',\n menuVisibleOnFocus: false,\n isOnComposition: false,\n isSilentBlur: false\n };\n },\n\n\n watch: {\n selectDisabled: function selectDisabled() {\n var _this2 = this;\n\n this.$nextTick(function () {\n _this2.resetInputHeight();\n });\n },\n propPlaceholder: function propPlaceholder(val) {\n this.cachedPlaceHolder = this.currentPlaceholder = val;\n },\n value: function value(val, oldVal) {\n if (this.multiple) {\n this.resetInputHeight();\n if (val && val.length > 0 || this.$refs.input && this.query !== \'\') {\n this.currentPlaceholder = \'\';\n } else {\n this.currentPlaceholder = this.cachedPlaceHolder;\n }\n if (this.filterable && !this.reserveKeyword) {\n this.query = \'\';\n this.handleQueryChange(this.query);\n }\n }\n this.setSelected();\n if (this.filterable && !this.multiple) {\n this.inputLength = 20;\n }\n if (!Object(util_["valueEquals"])(val, oldVal)) {\n this.dispatch(\'ElFormItem\', \'el.form.change\', val);\n }\n },\n visible: function visible(val) {\n var _this3 = this;\n\n if (!val) {\n this.broadcast(\'ElSelectDropdown\', \'destroyPopper\');\n if (this.$refs.input) {\n this.$refs.input.blur();\n }\n this.query = \'\';\n this.previousQuery = null;\n this.selectedLabel = \'\';\n this.inputLength = 20;\n this.menuVisibleOnFocus = false;\n this.resetHoverIndex();\n this.$nextTick(function () {\n if (_this3.$refs.input && _this3.$refs.input.value === \'\' && _this3.selected.length === 0) {\n _this3.currentPlaceholder = _this3.cachedPlaceHolder;\n }\n });\n if (!this.multiple) {\n if (this.selected) {\n if (this.filterable && this.allowCreate && this.createdSelected && this.createdLabel) {\n this.selectedLabel = this.createdLabel;\n } else {\n this.selectedLabel = this.selected.currentLabel;\n }\n if (this.filterable) this.query = this.selectedLabel;\n }\n\n if (this.filterable) {\n this.currentPlaceholder = this.cachedPlaceHolder;\n }\n }\n } else {\n this.broadcast(\'ElSelectDropdown\', \'updatePopper\');\n if (this.filterable) {\n this.query = this.remote ? \'\' : this.selectedLabel;\n this.handleQueryChange(this.query);\n if (this.multiple) {\n this.$refs.input.focus();\n } else {\n if (!this.remote) {\n this.broadcast(\'ElOption\', \'queryChange\', \'\');\n this.broadcast(\'ElOptionGroup\', \'queryChange\');\n }\n\n if (this.selectedLabel) {\n this.currentPlaceholder = this.selectedLabel;\n this.selectedLabel = \'\';\n }\n }\n }\n }\n this.$emit(\'visible-change\', val);\n },\n options: function options() {\n var _this4 = this;\n\n if (this.$isServer) return;\n this.$nextTick(function () {\n _this4.broadcast(\'ElSelectDropdown\', \'updatePopper\');\n });\n if (this.multiple) {\n this.resetInputHeight();\n }\n var inputs = this.$el.querySelectorAll(\'input\');\n if ([].indexOf.call(inputs, document.activeElement) === -1) {\n this.setSelected();\n }\n if (this.defaultFirstOption && (this.filterable || this.remote) && this.filteredOptionsCount) {\n this.checkDefaultFirstOption();\n }\n }\n },\n\n methods: {\n handleNavigate: function handleNavigate(direction) {\n if (this.isOnComposition) return;\n\n this.navigateOptions(direction);\n },\n handleComposition: function handleComposition(event) {\n var _this5 = this;\n\n var text = event.target.value;\n if (event.type === \'compositionend\') {\n this.isOnComposition = false;\n this.$nextTick(function (_) {\n return _this5.handleQueryChange(text);\n });\n } else {\n var lastCharacter = text[text.length - 1] || \'\';\n this.isOnComposition = !Object(shared_["isKorean"])(lastCharacter);\n }\n },\n handleQueryChange: function handleQueryChange(val) {\n var _this6 = this;\n\n if (this.previousQuery === val || this.isOnComposition) return;\n if (this.previousQuery === null && (typeof this.filterMethod === \'function\' || typeof this.remoteMethod === \'function\')) {\n this.previousQuery = val;\n return;\n }\n this.previousQuery = val;\n this.$nextTick(function () {\n if (_this6.visible) _this6.broadcast(\'ElSelectDropdown\', \'updatePopper\');\n });\n this.hoverIndex = -1;\n if (this.multiple && this.filterable) {\n this.$nextTick(function () {\n var length = _this6.$refs.input.value.length * 15 + 20;\n _this6.inputLength = _this6.collapseTags ? Math.min(50, length) : length;\n _this6.managePlaceholder();\n _this6.resetInputHeight();\n });\n }\n if (this.remote && typeof this.remoteMethod === \'function\') {\n this.hoverIndex = -1;\n this.remoteMethod(val);\n } else if (typeof this.filterMethod === \'function\') {\n this.filterMethod(val);\n this.broadcast(\'ElOptionGroup\', \'queryChange\');\n } else {\n this.filteredOptionsCount = this.optionsCount;\n this.broadcast(\'ElOption\', \'queryChange\', val);\n this.broadcast(\'ElOptionGroup\', \'queryChange\');\n }\n if (this.defaultFirstOption && (this.filterable || this.remote) && this.filteredOptionsCount) {\n this.checkDefaultFirstOption();\n }\n },\n scrollToOption: function scrollToOption(option) {\n var target = Array.isArray(option) && option[0] ? option[0].$el : option.$el;\n if (this.$refs.popper && target) {\n var menu = this.$refs.popper.$el.querySelector(\'.el-select-dropdown__wrap\');\n scroll_into_view_default()(menu, target);\n }\n this.$refs.scrollbar && this.$refs.scrollbar.handleScroll();\n },\n handleMenuEnter: function handleMenuEnter() {\n var _this7 = this;\n\n this.$nextTick(function () {\n return _this7.scrollToOption(_this7.selected);\n });\n },\n emitChange: function emitChange(val) {\n if (!Object(util_["valueEquals"])(this.value, val)) {\n this.$emit(\'change\', val);\n }\n },\n getOption: function getOption(value) {\n var option = void 0;\n var isObject = Object.prototype.toString.call(value).toLowerCase() === \'[object object]\';\n var isNull = Object.prototype.toString.call(value).toLowerCase() === \'[object null]\';\n var isUndefined = Object.prototype.toString.call(value).toLowerCase() === \'[object undefined]\';\n\n for (var i = this.cachedOptions.length - 1; i >= 0; i--) {\n var cachedOption = this.cachedOptions[i];\n var isEqual = isObject ? Object(util_["getValueByPath"])(cachedOption.value, this.valueKey) === Object(util_["getValueByPath"])(value, this.valueKey) : cachedOption.value === value;\n if (isEqual) {\n option = cachedOption;\n break;\n }\n }\n if (option) return option;\n var label = !isObject && !isNull && !isUndefined ? String(value) : \'\';\n var newOption = {\n value: value,\n currentLabel: label\n };\n if (this.multiple) {\n newOption.hitState = false;\n }\n return newOption;\n },\n setSelected: function setSelected() {\n var _this8 = this;\n\n if (!this.multiple) {\n var option = this.getOption(this.value);\n if (option.created) {\n this.createdLabel = option.currentLabel;\n this.createdSelected = true;\n } else {\n this.createdSelected = false;\n }\n this.selectedLabel = option.currentLabel;\n this.selected = option;\n if (this.filterable) this.query = this.selectedLabel;\n return;\n }\n var result = [];\n if (Array.isArray(this.value)) {\n this.value.forEach(function (value) {\n result.push(_this8.getOption(value));\n });\n }\n this.selected = result;\n this.$nextTick(function () {\n _this8.resetInputHeight();\n });\n },\n handleFocus: function handleFocus(event) {\n if (!this.softFocus) {\n if (this.automaticDropdown || this.filterable) {\n if (this.filterable && !this.visible) {\n this.menuVisibleOnFocus = true;\n }\n this.visible = true;\n }\n this.$emit(\'focus\', event);\n } else {\n this.softFocus = false;\n }\n },\n blur: function blur() {\n this.visible = false;\n this.$refs.reference.blur();\n },\n handleBlur: function handleBlur(event) {\n var _this9 = this;\n\n setTimeout(function () {\n if (_this9.isSilentBlur) {\n _this9.isSilentBlur = false;\n } else {\n _this9.$emit(\'blur\', event);\n }\n }, 50);\n this.softFocus = false;\n },\n handleClearClick: function handleClearClick(event) {\n this.deleteSelected(event);\n },\n doDestroy: function doDestroy() {\n this.$refs.popper && this.$refs.popper.doDestroy();\n },\n handleClose: function handleClose() {\n this.visible = false;\n },\n toggleLastOptionHitState: function toggleLastOptionHitState(hit) {\n if (!Array.isArray(this.selected)) return;\n var option = this.selected[this.selected.length - 1];\n if (!option) return;\n\n if (hit === true || hit === false) {\n option.hitState = hit;\n return hit;\n }\n\n option.hitState = !option.hitState;\n return option.hitState;\n },\n deletePrevTag: function deletePrevTag(e) {\n if (e.target.value.length <= 0 && !this.toggleLastOptionHitState()) {\n var value = this.value.slice();\n value.pop();\n this.$emit(\'input\', value);\n this.emitChange(value);\n }\n },\n managePlaceholder: function managePlaceholder() {\n if (this.currentPlaceholder !== \'\') {\n this.currentPlaceholder = this.$refs.input.value ? \'\' : this.cachedPlaceHolder;\n }\n },\n resetInputState: function resetInputState(e) {\n if (e.keyCode !== 8) this.toggleLastOptionHitState(false);\n this.inputLength = this.$refs.input.value.length * 15 + 20;\n this.resetInputHeight();\n },\n resetInputHeight: function resetInputHeight() {\n var _this10 = this;\n\n if (this.collapseTags && !this.filterable) return;\n this.$nextTick(function () {\n if (!_this10.$refs.reference) return;\n var inputChildNodes = _this10.$refs.reference.$el.childNodes;\n var input = [].filter.call(inputChildNodes, function (item) {\n return item.tagName === \'INPUT\';\n })[0];\n var tags = _this10.$refs.tags;\n var tagsHeight = tags ? Math.round(tags.getBoundingClientRect().height) : 0;\n var sizeInMap = _this10.initialInputHeight || 40;\n input.style.height = _this10.selected.length === 0 ? sizeInMap + \'px\' : Math.max(tags ? tagsHeight + (tagsHeight > sizeInMap ? 6 : 0) : 0, sizeInMap) + \'px\';\n if (_this10.visible && _this10.emptyText !== false) {\n _this10.broadcast(\'ElSelectDropdown\', \'updatePopper\');\n }\n });\n },\n resetHoverIndex: function resetHoverIndex() {\n var _this11 = this;\n\n setTimeout(function () {\n if (!_this11.multiple) {\n _this11.hoverIndex = _this11.options.indexOf(_this11.selected);\n } else {\n if (_this11.selected.length > 0) {\n _this11.hoverIndex = Math.min.apply(null, _this11.selected.map(function (item) {\n return _this11.options.indexOf(item);\n }));\n } else {\n _this11.hoverIndex = -1;\n }\n }\n }, 300);\n },\n handleOptionSelect: function handleOptionSelect(option, byClick) {\n var _this12 = this;\n\n if (this.multiple) {\n var value = (this.value || []).slice();\n var optionIndex = this.getValueIndex(value, option.value);\n if (optionIndex > -1) {\n value.splice(optionIndex, 1);\n } else if (this.multipleLimit <= 0 || value.length < this.multipleLimit) {\n value.push(option.value);\n }\n this.$emit(\'input\', value);\n this.emitChange(value);\n if (option.created) {\n this.query = \'\';\n this.handleQueryChange(\'\');\n this.inputLength = 20;\n }\n if (this.filterable) this.$refs.input.focus();\n } else {\n this.$emit(\'input\', option.value);\n this.emitChange(option.value);\n this.visible = false;\n }\n this.isSilentBlur = byClick;\n this.setSoftFocus();\n if (this.visible) return;\n this.$nextTick(function () {\n _this12.scrollToOption(option);\n });\n },\n setSoftFocus: function setSoftFocus() {\n this.softFocus = true;\n var input = this.$refs.input || this.$refs.reference;\n if (input) {\n input.focus();\n }\n },\n getValueIndex: function getValueIndex() {\n var arr = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var value = arguments[1];\n\n var isObject = Object.prototype.toString.call(value).toLowerCase() === \'[object object]\';\n if (!isObject) {\n return arr.indexOf(value);\n } else {\n var valueKey = this.valueKey;\n var index = -1;\n arr.some(function (item, i) {\n if (Object(util_["getValueByPath"])(item, valueKey) === Object(util_["getValueByPath"])(value, valueKey)) {\n index = i;\n return true;\n }\n return false;\n });\n return index;\n }\n },\n toggleMenu: function toggleMenu() {\n if (!this.selectDisabled) {\n if (this.menuVisibleOnFocus) {\n this.menuVisibleOnFocus = false;\n } else {\n this.visible = !this.visible;\n }\n if (this.visible) {\n (this.$refs.input || this.$refs.reference).focus();\n }\n }\n },\n selectOption: function selectOption() {\n if (!this.visible) {\n this.toggleMenu();\n } else {\n if (this.options[this.hoverIndex]) {\n this.handleOptionSelect(this.options[this.hoverIndex]);\n }\n }\n },\n deleteSelected: function deleteSelected(event) {\n event.stopPropagation();\n var value = this.multiple ? [] : \'\';\n this.$emit(\'input\', value);\n this.emitChange(value);\n this.visible = false;\n this.$emit(\'clear\');\n },\n deleteTag: function deleteTag(event, tag) {\n var index = this.selected.indexOf(tag);\n if (index > -1 && !this.selectDisabled) {\n var value = this.value.slice();\n value.splice(index, 1);\n this.$emit(\'input\', value);\n this.emitChange(value);\n this.$emit(\'remove-tag\', tag.value);\n }\n event.stopPropagation();\n },\n onInputChange: function onInputChange() {\n if (this.filterable && this.query !== this.selectedLabel) {\n this.query = this.selectedLabel;\n this.handleQueryChange(this.query);\n }\n },\n onOptionDestroy: function onOptionDestroy(index) {\n if (index > -1) {\n this.optionsCount--;\n this.filteredOptionsCount--;\n this.options.splice(index, 1);\n }\n },\n resetInputWidth: function resetInputWidth() {\n this.inputWidth = this.$refs.reference.$el.getBoundingClientRect().width;\n },\n handleResize: function handleResize() {\n this.resetInputWidth();\n if (this.multiple) this.resetInputHeight();\n },\n checkDefaultFirstOption: function checkDefaultFirstOption() {\n this.hoverIndex = -1;\n // highlight the created option\n var hasCreated = false;\n for (var i = this.options.length - 1; i >= 0; i--) {\n if (this.options[i].created) {\n hasCreated = true;\n this.hoverIndex = i;\n break;\n }\n }\n if (hasCreated) return;\n for (var _i = 0; _i !== this.options.length; ++_i) {\n var option = this.options[_i];\n if (this.query) {\n // highlight first options that passes the filter\n if (!option.disabled && !option.groupDisabled && option.visible) {\n this.hoverIndex = _i;\n break;\n }\n } else {\n // highlight currently selected option\n if (option.itemSelected) {\n this.hoverIndex = _i;\n break;\n }\n }\n }\n },\n getValueKey: function getValueKey(item) {\n if (Object.prototype.toString.call(item.value).toLowerCase() !== \'[object object]\') {\n return item.value;\n } else {\n return Object(util_["getValueByPath"])(item.value, this.valueKey);\n }\n }\n },\n\n created: function created() {\n var _this13 = this;\n\n this.cachedPlaceHolder = this.currentPlaceholder = this.propPlaceholder;\n if (this.multiple && !Array.isArray(this.value)) {\n this.$emit(\'input\', []);\n }\n if (!this.multiple && Array.isArray(this.value)) {\n this.$emit(\'input\', \'\');\n }\n\n this.debouncedOnInputChange = debounce_default()(this.debounce, function () {\n _this13.onInputChange();\n });\n\n this.debouncedQueryChange = debounce_default()(this.debounce, function (e) {\n _this13.handleQueryChange(e.target.value);\n });\n\n this.$on(\'handleOptionClick\', this.handleOptionSelect);\n this.$on(\'setSelected\', this.setSelected);\n },\n mounted: function mounted() {\n var _this14 = this;\n\n if (this.multiple && Array.isArray(this.value) && this.value.length > 0) {\n this.currentPlaceholder = \'\';\n }\n Object(resize_event_["addResizeListener"])(this.$el, this.handleResize);\n\n var reference = this.$refs.reference;\n if (reference && reference.$el) {\n var sizeMap = {\n medium: 36,\n small: 32,\n mini: 28\n };\n var input = reference.$el.querySelector(\'input\');\n this.initialInputHeight = input.getBoundingClientRect().height || sizeMap[this.selectSize];\n }\n if (this.remote && this.multiple) {\n this.resetInputHeight();\n }\n this.$nextTick(function () {\n if (reference && reference.$el) {\n _this14.inputWidth = reference.$el.getBoundingClientRect().width;\n }\n });\n this.setSelected();\n },\n beforeDestroy: function beforeDestroy() {\n if (this.$el && this.handleResize) Object(resize_event_["removeResizeListener"])(this.$el, this.handleResize);\n }\n});\n// CONCATENATED MODULE: ./packages/select/src/select.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_selectvue_type_script_lang_js_ = (selectvue_type_script_lang_js_); \n// CONCATENATED MODULE: ./packages/select/src/select.vue\n\n\n\n\n\n/* normalize component */\n\nvar select_component = Object(componentNormalizer["a" /* default */])(\n src_selectvue_type_script_lang_js_,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var select_api; }\nselect_component.options.__file = "packages/select/src/select.vue"\n/* harmony default export */ var src_select = (select_component.exports);\n// CONCATENATED MODULE: ./packages/select/index.js\n\n\n/* istanbul ignore next */\nsrc_select.install = function (Vue) {\n Vue.component(src_select.name, src_select);\n};\n\n/* harmony default export */ var packages_select = __webpack_exports__["default"] = (src_select);\n\n/***/ })\n\n/******/ });\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvc2VsZWN0LmpzPzRlNGIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0QsZ0NBQWdDO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRSxrQkFBa0I7QUFDbEY7QUFDQSx5REFBeUQsY0FBYztBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxpQ0FBaUM7QUFDbEYsd0hBQXdILG1CQUFtQixFQUFFO0FBQzdJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQywwQkFBMEIsRUFBRTtBQUMvRCx5Q0FBeUMsZUFBZTtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThELCtEQUErRDtBQUM3SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSwyRkFBMkYsMkJBQTJCLEVBQUU7QUFDeEg7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPOztBQUVQO0FBQ0E7O0FBRUEsaUJBQWlCLG1CQUFPLENBQUMsTUFBc0I7O0FBRS9DLE9BQU87O0FBRVA7QUFDQTs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQyxNQUFtQzs7QUFFNUQsT0FBTzs7QUFFUDtBQUNBOztBQUVBLGlCQUFpQixtQkFBTyxDQUFDLE1BQTBCOztBQUVuRCxPQUFPOztBQUVQO0FBQ0E7O0FBRUEsaUJBQWlCLG1CQUFPLENBQUMsTUFBbUM7O0FBRTVELE9BQU87O0FBRVA7QUFDQTs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQyxNQUE0Qjs7QUFFckQsT0FBTzs7QUFFUDtBQUNBOztBQUVBLGlCQUFpQixtQkFBTyxDQUFDLE1BQTZCOztBQUV0RCxPQUFPOztBQUVQO0FBQ0E7O0FBRUEsaUJBQWlCLG1CQUFPLENBQUMsTUFBNkI7O0FBRXRELE9BQU87O0FBRVA7QUFDQTs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQyxNQUEyQjs7QUFFcEQsT0FBTzs7QUFFUDtBQUNBOztBQUVBLGlCQUFpQixtQkFBTyxDQUFDLE1BQXVDOztBQUVoRSxPQUFPOztBQUVQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxvR0FBb0csbUJBQW1CLEVBQUUsbUJBQW1CLDhIQUE4SDs7QUFFMVE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSx3RztBQUNBO0FBQ0E7O0FBRUE7Ozs7OztBQU1BOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxXQUFXLFlBQVk7QUFDdkI7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0E7O0FBRUEsaUJBQWlCLG1CQUFPLENBQUMsTUFBb0I7O0FBRTdDLE9BQU87O0FBRVA7QUFDQTs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQyxNQUErQjs7QUFFeEQsT0FBTzs7QUFFUDtBQUNBOztBQUVBLGlCQUFpQixtQkFBTyxDQUFDLE1BQWlDOztBQUUxRCxPQUFPOztBQUVQO0FBQ0E7O0FBRUEsaUJBQWlCLG1CQUFPLENBQUMsTUFBOEI7O0FBRXZELE9BQU87O0FBRVA7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QixhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0Esc0NBQXNDLHNDQUFzQztBQUM1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxzQ0FBc0M7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLE1BQU0sc0NBQXNDLEVBQUU7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0Esc0NBQXNDLHNDQUFzQztBQUM1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCLCtCQUErQixtQkFBbUI7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDBCQUEwQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSw4QkFBOEIsaUJBQWlCO0FBQy9DO0FBQ0EsMEJBQTBCLGlCQUFpQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHlCQUF5QjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QixhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsMkNBQTJDO0FBQzVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHNDQUFzQztBQUNyRCxjQUFjO0FBQ2QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSwwSDtBQUNBO0FBQ0E7O0FBRUE7Ozs7OztBQU1BOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxXQUFXLFlBQVk7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBLG1DQUFtQztBQUNuQyxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxLQUFLO0FBQ0w7QUFDQSxzRUFBc0U7QUFDdEUsS0FBSztBQUNMO0FBQ0EsZ0RBQWdEO0FBQ2hELEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSCxlQUFlLHVDQUF1Qzs7QUFFdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLE1BQUssSUFBSSxLQUFLO0FBQ3ZCO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpREFBaUQsUUFBUTtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsUUFBUTtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQiw0QkFBNEI7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSx3RztBQUNBOzs7Ozs7QUFNQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsV0FBVyxtQkFBbUI7QUFDOUI7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxPQUFPOztBQUVQLFVBQVUiLCJmaWxlIjoiNGU0Yi5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID1cbi8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4vKioqKioqLyBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4vKioqKioqLyBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuLyoqKioqKi8gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbi8qKioqKiovIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuLyoqKioqKi8gXHRcdHJldHVybiBucztcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCIvZGlzdC9cIjtcbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gNjIpO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoe1xuXG4vKioqLyAwOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJhXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gbm9ybWFsaXplQ29tcG9uZW50OyB9KTtcbi8qIGdsb2JhbHMgX19WVUVfU1NSX0NPTlRFWFRfXyAqL1xuXG4vLyBJTVBPUlRBTlQ6IERvIE5PVCB1c2UgRVMyMDE1IGZlYXR1cmVzIGluIHRoaXMgZmlsZSAoZXhjZXB0IGZvciBtb2R1bGVzKS5cbi8vIFRoaXMgbW9kdWxlIGlzIGEgcnVudGltZSB1dGlsaXR5IGZvciBjbGVhbmVyIGNvbXBvbmVudCBtb2R1bGUgb3V0cHV0IGFuZCB3aWxsXG4vLyBiZSBpbmNsdWRlZCBpbiB0aGUgZmluYWwgd2VicGFjayB1c2VyIGJ1bmRsZS5cblxuZnVuY3Rpb24gbm9ybWFsaXplQ29tcG9uZW50IChcbiAgc2NyaXB0RXhwb3J0cyxcbiAgcmVuZGVyLFxuICBzdGF0aWNSZW5kZXJGbnMsXG4gIGZ1bmN0aW9uYWxUZW1wbGF0ZSxcbiAgaW5qZWN0U3R5bGVzLFxuICBzY29wZUlkLFxuICBtb2R1bGVJZGVudGlmaWVyLCAvKiBzZXJ2ZXIgb25seSAqL1xuICBzaGFkb3dNb2RlIC8qIHZ1ZS1jbGkgb25seSAqL1xuKSB7XG4gIC8vIFZ1ZS5leHRlbmQgY29uc3RydWN0b3IgZXhwb3J0IGludGVyb3BcbiAgdmFyIG9wdGlvbnMgPSB0eXBlb2Ygc2NyaXB0RXhwb3J0cyA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gc2NyaXB0RXhwb3J0cy5vcHRpb25zXG4gICAgOiBzY3JpcHRFeHBvcnRzXG5cbiAgLy8gcmVuZGVyIGZ1bmN0aW9uc1xuICBpZiAocmVuZGVyKSB7XG4gICAgb3B0aW9ucy5yZW5kZXIgPSByZW5kZXJcbiAgICBvcHRpb25zLnN0YXRpY1JlbmRlckZucyA9IHN0YXRpY1JlbmRlckZuc1xuICAgIG9wdGlvbnMuX2NvbXBpbGVkID0gdHJ1ZVxuICB9XG5cbiAgLy8gZnVuY3Rpb25hbCB0ZW1wbGF0ZVxuICBpZiAoZnVuY3Rpb25hbFRlbXBsYXRlKSB7XG4gICAgb3B0aW9ucy5mdW5jdGlvbmFsID0gdHJ1ZVxuICB9XG5cbiAgLy8gc2NvcGVkSWRcbiAgaWYgKHNjb3BlSWQpIHtcbiAgICBvcHRpb25zLl9zY29wZUlkID0gJ2RhdGEtdi0nICsgc2NvcGVJZFxuICB9XG5cbiAgdmFyIGhvb2tcbiAgaWYgKG1vZHVsZUlkZW50aWZpZXIpIHsgLy8gc2VydmVyIGJ1aWxkXG4gICAgaG9vayA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAvLyAyLjMgaW5qZWN0aW9uXG4gICAgICBjb250ZXh0ID1cbiAgICAgICAgY29udGV4dCB8fCAvLyBjYWNoZWQgY2FsbFxuICAgICAgICAodGhpcy4kdm5vZGUgJiYgdGhpcy4kdm5vZGUuc3NyQ29udGV4dCkgfHwgLy8gc3RhdGVmdWxcbiAgICAgICAgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LiR2bm9kZSAmJiB0aGlzLnBhcmVudC4kdm5vZGUuc3NyQ29udGV4dCkgLy8gZnVuY3Rpb25hbFxuICAgICAgLy8gMi4yIHdpdGggcnVuSW5OZXdDb250ZXh0OiB0cnVlXG4gICAgICBpZiAoIWNvbnRleHQgJiYgdHlwZW9mIF9fVlVFX1NTUl9DT05URVhUX18gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnRleHQgPSBfX1ZVRV9TU1JfQ09OVEVYVF9fXG4gICAgICB9XG4gICAgICAvLyBpbmplY3QgY29tcG9uZW50IHN0eWxlc1xuICAgICAgaWYgKGluamVjdFN0eWxlcykge1xuICAgICAgICBpbmplY3RTdHlsZXMuY2FsbCh0aGlzLCBjb250ZXh0KVxuICAgICAgfVxuICAgICAgLy8gcmVnaXN0ZXIgY29tcG9uZW50IG1vZHVsZSBpZGVudGlmaWVyIGZvciBhc3luYyBjaHVuayBpbmZlcnJlbmNlXG4gICAgICBpZiAoY29udGV4dCAmJiBjb250ZXh0Ll9yZWdpc3RlcmVkQ29tcG9uZW50cykge1xuICAgICAgICBjb250ZXh0Ll9yZWdpc3RlcmVkQ29tcG9uZW50cy5hZGQobW9kdWxlSWRlbnRpZmllcilcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gdXNlZCBieSBzc3IgaW4gY2FzZSBjb21wb25lbnQgaXMgY2FjaGVkIGFuZCBiZWZvcmVDcmVhdGVcbiAgICAvLyBuZXZlciBnZXRzIGNhbGxlZFxuICAgIG9wdGlvbnMuX3NzclJlZ2lzdGVyID0gaG9va1xuICB9IGVsc2UgaWYgKGluamVjdFN0eWxlcykge1xuICAgIGhvb2sgPSBzaGFkb3dNb2RlXG4gICAgICA/IGZ1bmN0aW9uICgpIHsgaW5qZWN0U3R5bGVzLmNhbGwodGhpcywgdGhpcy4kcm9vdC4kb3B0aW9ucy5zaGFkb3dSb290KSB9XG4gICAgICA6IGluamVjdFN0eWxlc1xuICB9XG5cbiAgaWYgKGhvb2spIHtcbiAgICBpZiAob3B0aW9ucy5mdW5jdGlvbmFsKSB7XG4gICAgICAvLyBmb3IgdGVtcGxhdGUtb25seSBob3QtcmVsb2FkIGJlY2F1c2UgaW4gdGhhdCBjYXNlIHRoZSByZW5kZXIgZm4gZG9lc24ndFxuICAgICAgLy8gZ28gdGhyb3VnaCB0aGUgbm9ybWFsaXplclxuICAgICAgb3B0aW9ucy5faW5qZWN0U3R5bGVzID0gaG9va1xuICAgICAgLy8gcmVnaXN0ZXIgZm9yIGZ1bmN0aW9hbCBjb21wb25lbnQgaW4gdnVlIGZpbGVcbiAgICAgIHZhciBvcmlnaW5hbFJlbmRlciA9IG9wdGlvbnMucmVuZGVyXG4gICAgICBvcHRpb25zLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcldpdGhTdHlsZUluamVjdGlvbiAoaCwgY29udGV4dCkge1xuICAgICAgICBob29rLmNhbGwoY29udGV4dClcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsUmVuZGVyKGgsIGNvbnRleHQpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGluamVjdCBjb21wb25lbnQgcmVnaXN0cmF0aW9uIGFzIGJlZm9yZUNyZWF0ZSBob29rXG4gICAgICB2YXIgZXhpc3RpbmcgPSBvcHRpb25zLmJlZm9yZUNyZWF0ZVxuICAgICAgb3B0aW9ucy5iZWZvcmVDcmVhdGUgPSBleGlzdGluZ1xuICAgICAgICA/IFtdLmNvbmNhdChleGlzdGluZywgaG9vaylcbiAgICAgICAgOiBbaG9va11cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGV4cG9ydHM6IHNjcmlwdEV4cG9ydHMsXG4gICAgb3B0aW9uczogb3B0aW9uc1xuICB9XG59XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDEwOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi9pbnB1dFwiKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDEyOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi91dGlscy9jbGlja291dHNpZGVcIik7XG5cbi8qKiovIH0pLFxuXG4vKioqLyAxNTpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvc2Nyb2xsYmFyXCIpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMTY6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL3V0aWxzL3Jlc2l6ZS1ldmVudFwiKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDE5OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ0aHJvdHRsZS1kZWJvdW5jZS9kZWJvdW5jZVwiKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDIxOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi91dGlscy9zaGFyZWRcIik7XG5cbi8qKiovIH0pLFxuXG4vKioqLyAyMjpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvbWl4aW5zL2ZvY3VzXCIpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMzpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvdXRpbHMvdXRpbFwiKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDMxOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi91dGlscy9zY3JvbGwtaW50by12aWV3XCIpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMzM6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3NlbGVjdC9zcmMvb3B0aW9uLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD03YTQ0YzY0MiZcbnZhciByZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXG4gICAgXCJsaVwiLFxuICAgIHtcbiAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwic2hvd1wiLFxuICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgdmFsdWU6IF92bS52aXNpYmxlLFxuICAgICAgICAgIGV4cHJlc3Npb246IFwidmlzaWJsZVwiXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBzdGF0aWNDbGFzczogXCJlbC1zZWxlY3QtZHJvcGRvd25fX2l0ZW1cIixcbiAgICAgIGNsYXNzOiB7XG4gICAgICAgIHNlbGVjdGVkOiBfdm0uaXRlbVNlbGVjdGVkLFxuICAgICAgICBcImlzLWRpc2FibGVkXCI6IF92bS5kaXNhYmxlZCB8fCBfdm0uZ3JvdXBEaXNhYmxlZCB8fCBfdm0ubGltaXRSZWFjaGVkLFxuICAgICAgICBob3ZlcjogX3ZtLmhvdmVyXG4gICAgICB9LFxuICAgICAgb246IHtcbiAgICAgICAgbW91c2VlbnRlcjogX3ZtLmhvdmVySXRlbSxcbiAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgIHJldHVybiBfdm0uc2VsZWN0T3B0aW9uQ2xpY2soJGV2ZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbX3ZtLl90KFwiZGVmYXVsdFwiLCBbX2MoXCJzcGFuXCIsIFtfdm0uX3YoX3ZtLl9zKF92bS5jdXJyZW50TGFiZWwpKV0pXSldLFxuICAgIDJcbiAgKVxufVxudmFyIHN0YXRpY1JlbmRlckZucyA9IFtdXG5yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NlbGVjdC9zcmMvb3B0aW9uLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD03YTQ0YzY0MiZcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL21peGlucy9lbWl0dGVyXCJcbnZhciBlbWl0dGVyXyA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG52YXIgZW1pdHRlcl9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihlbWl0dGVyXyk7XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi91dGlscy91dGlsXCJcbnZhciB1dGlsXyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3NlbGVjdC9zcmMvb3B0aW9uLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIG9wdGlvbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG1peGluczogW2VtaXR0ZXJfZGVmYXVsdC5hXSxcblxuICBuYW1lOiAnRWxPcHRpb24nLFxuXG4gIGNvbXBvbmVudE5hbWU6ICdFbE9wdGlvbicsXG5cbiAgaW5qZWN0OiBbJ3NlbGVjdCddLFxuXG4gIHByb3BzOiB7XG4gICAgdmFsdWU6IHtcbiAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgfSxcbiAgICBsYWJlbDogW1N0cmluZywgTnVtYmVyXSxcbiAgICBjcmVhdGVkOiBCb29sZWFuLFxuICAgIGRpc2FibGVkOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5kZXg6IC0xLFxuICAgICAgZ3JvdXBEaXNhYmxlZDogZmFsc2UsXG4gICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgaGl0U3RhdGU6IGZhbHNlLFxuICAgICAgaG92ZXI6IGZhbHNlXG4gICAgfTtcbiAgfSxcblxuXG4gIGNvbXB1dGVkOiB7XG4gICAgaXNPYmplY3Q6IGZ1bmN0aW9uIGlzT2JqZWN0KCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0aGlzLnZhbHVlKS50b0xvd2VyQ2FzZSgpID09PSAnW29iamVjdCBvYmplY3RdJztcbiAgICB9LFxuICAgIGN1cnJlbnRMYWJlbDogZnVuY3Rpb24gY3VycmVudExhYmVsKCkge1xuICAgICAgcmV0dXJuIHRoaXMubGFiZWwgfHwgKHRoaXMuaXNPYmplY3QgPyAnJyA6IHRoaXMudmFsdWUpO1xuICAgIH0sXG4gICAgY3VycmVudFZhbHVlOiBmdW5jdGlvbiBjdXJyZW50VmFsdWUoKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZSB8fCB0aGlzLmxhYmVsIHx8ICcnO1xuICAgIH0sXG4gICAgaXRlbVNlbGVjdGVkOiBmdW5jdGlvbiBpdGVtU2VsZWN0ZWQoKSB7XG4gICAgICBpZiAoIXRoaXMuc2VsZWN0Lm11bHRpcGxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzRXF1YWwodGhpcy52YWx1ZSwgdGhpcy5zZWxlY3QudmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbnModGhpcy5zZWxlY3QudmFsdWUsIHRoaXMudmFsdWUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgbGltaXRSZWFjaGVkOiBmdW5jdGlvbiBsaW1pdFJlYWNoZWQoKSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3QubXVsdGlwbGUpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLml0ZW1TZWxlY3RlZCAmJiAodGhpcy5zZWxlY3QudmFsdWUgfHwgW10pLmxlbmd0aCA+PSB0aGlzLnNlbGVjdC5tdWx0aXBsZUxpbWl0ICYmIHRoaXMuc2VsZWN0Lm11bHRpcGxlTGltaXQgPiAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIGN1cnJlbnRMYWJlbDogZnVuY3Rpb24gY3VycmVudExhYmVsKCkge1xuICAgICAgaWYgKCF0aGlzLmNyZWF0ZWQgJiYgIXRoaXMuc2VsZWN0LnJlbW90ZSkgdGhpcy5kaXNwYXRjaCgnRWxTZWxlY3QnLCAnc2V0U2VsZWN0ZWQnKTtcbiAgICB9LFxuICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwsIG9sZFZhbCkge1xuICAgICAgdmFyIF9zZWxlY3QgPSB0aGlzLnNlbGVjdCxcbiAgICAgICAgICByZW1vdGUgPSBfc2VsZWN0LnJlbW90ZSxcbiAgICAgICAgICB2YWx1ZUtleSA9IF9zZWxlY3QudmFsdWVLZXk7XG5cbiAgICAgIGlmICghdGhpcy5jcmVhdGVkICYmICFyZW1vdGUpIHtcbiAgICAgICAgaWYgKHZhbHVlS2V5ICYmICh0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZih2YWwpKSA9PT0gJ29iamVjdCcgJiYgKHR5cGVvZiBvbGRWYWwgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKG9sZFZhbCkpID09PSAnb2JqZWN0JyAmJiB2YWxbdmFsdWVLZXldID09PSBvbGRWYWxbdmFsdWVLZXldKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGlzcGF0Y2goJ0VsU2VsZWN0JywgJ3NldFNlbGVjdGVkJyk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBpc0VxdWFsOiBmdW5jdGlvbiBpc0VxdWFsKGEsIGIpIHtcbiAgICAgIGlmICghdGhpcy5pc09iamVjdCkge1xuICAgICAgICByZXR1cm4gYSA9PT0gYjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciB2YWx1ZUtleSA9IHRoaXMuc2VsZWN0LnZhbHVlS2V5O1xuICAgICAgICByZXR1cm4gT2JqZWN0KHV0aWxfW1wiZ2V0VmFsdWVCeVBhdGhcIl0pKGEsIHZhbHVlS2V5KSA9PT0gT2JqZWN0KHV0aWxfW1wiZ2V0VmFsdWVCeVBhdGhcIl0pKGIsIHZhbHVlS2V5KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGNvbnRhaW5zOiBmdW5jdGlvbiBjb250YWlucygpIHtcbiAgICAgIHZhciBhcnIgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFtdO1xuICAgICAgdmFyIHRhcmdldCA9IGFyZ3VtZW50c1sxXTtcblxuICAgICAgaWYgKCF0aGlzLmlzT2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBhcnIgJiYgYXJyLmluZGV4T2YodGFyZ2V0KSA+IC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHZhbHVlS2V5ID0gdGhpcy5zZWxlY3QudmFsdWVLZXk7XG4gICAgICAgIHJldHVybiBhcnIgJiYgYXJyLnNvbWUoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gT2JqZWN0KHV0aWxfW1wiZ2V0VmFsdWVCeVBhdGhcIl0pKGl0ZW0sIHZhbHVlS2V5KSA9PT0gT2JqZWN0KHV0aWxfW1wiZ2V0VmFsdWVCeVBhdGhcIl0pKHRhcmdldCwgdmFsdWVLZXkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGhhbmRsZUdyb3VwRGlzYWJsZWQ6IGZ1bmN0aW9uIGhhbmRsZUdyb3VwRGlzYWJsZWQodmFsKSB7XG4gICAgICB0aGlzLmdyb3VwRGlzYWJsZWQgPSB2YWw7XG4gICAgfSxcbiAgICBob3Zlckl0ZW06IGZ1bmN0aW9uIGhvdmVySXRlbSgpIHtcbiAgICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiAhdGhpcy5ncm91cERpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0LmhvdmVySW5kZXggPSB0aGlzLnNlbGVjdC5vcHRpb25zLmluZGV4T2YodGhpcyk7XG4gICAgICB9XG4gICAgfSxcbiAgICBzZWxlY3RPcHRpb25DbGljazogZnVuY3Rpb24gc2VsZWN0T3B0aW9uQ2xpY2soKSB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCAhPT0gdHJ1ZSAmJiB0aGlzLmdyb3VwRGlzYWJsZWQgIT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaCgnRWxTZWxlY3QnLCAnaGFuZGxlT3B0aW9uQ2xpY2snLCBbdGhpcywgdHJ1ZV0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgcXVlcnlDaGFuZ2U6IGZ1bmN0aW9uIHF1ZXJ5Q2hhbmdlKHF1ZXJ5KSB7XG4gICAgICB0aGlzLnZpc2libGUgPSBuZXcgUmVnRXhwKE9iamVjdCh1dGlsX1tcImVzY2FwZVJlZ2V4cFN0cmluZ1wiXSkocXVlcnkpLCAnaScpLnRlc3QodGhpcy5jdXJyZW50TGFiZWwpIHx8IHRoaXMuY3JlYXRlZDtcbiAgICAgIGlmICghdGhpcy52aXNpYmxlKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0LmZpbHRlcmVkT3B0aW9uc0NvdW50LS07XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5zZWxlY3Qub3B0aW9ucy5wdXNoKHRoaXMpO1xuICAgIHRoaXMuc2VsZWN0LmNhY2hlZE9wdGlvbnMucHVzaCh0aGlzKTtcbiAgICB0aGlzLnNlbGVjdC5vcHRpb25zQ291bnQrKztcbiAgICB0aGlzLnNlbGVjdC5maWx0ZXJlZE9wdGlvbnNDb3VudCsrO1xuXG4gICAgdGhpcy4kb24oJ3F1ZXJ5Q2hhbmdlJywgdGhpcy5xdWVyeUNoYW5nZSk7XG4gICAgdGhpcy4kb24oJ2hhbmRsZUdyb3VwRGlzYWJsZWQnLCB0aGlzLmhhbmRsZUdyb3VwRGlzYWJsZWQpO1xuICB9LFxuICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuICAgIHZhciBfc2VsZWN0MiA9IHRoaXMuc2VsZWN0LFxuICAgICAgICBzZWxlY3RlZCA9IF9zZWxlY3QyLnNlbGVjdGVkLFxuICAgICAgICBtdWx0aXBsZSA9IF9zZWxlY3QyLm11bHRpcGxlO1xuXG4gICAgdmFyIHNlbGVjdGVkT3B0aW9ucyA9IG11bHRpcGxlID8gc2VsZWN0ZWQgOiBbc2VsZWN0ZWRdO1xuICAgIHZhciBpbmRleCA9IHRoaXMuc2VsZWN0LmNhY2hlZE9wdGlvbnMuaW5kZXhPZih0aGlzKTtcbiAgICB2YXIgc2VsZWN0ZWRJbmRleCA9IHNlbGVjdGVkT3B0aW9ucy5pbmRleE9mKHRoaXMpO1xuXG4gICAgLy8gaWYgb3B0aW9uIGlzIG5vdCBzZWxlY3RlZCwgcmVtb3ZlIGl0IGZyb20gY2FjaGVcbiAgICBpZiAoaW5kZXggPiAtMSAmJiBzZWxlY3RlZEluZGV4IDwgMCkge1xuICAgICAgdGhpcy5zZWxlY3QuY2FjaGVkT3B0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdC5vbk9wdGlvbkRlc3Ryb3kodGhpcy5zZWxlY3Qub3B0aW9ucy5pbmRleE9mKHRoaXMpKTtcbiAgfVxufSk7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NlbGVjdC9zcmMvb3B0aW9uLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbiAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfb3B0aW9udnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKG9wdGlvbnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyk7IFxuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9ydW50aW1lL2NvbXBvbmVudE5vcm1hbGl6ZXIuanNcbnZhciBjb21wb25lbnROb3JtYWxpemVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zZWxlY3Qvc3JjL29wdGlvbi52dWVcblxuXG5cblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5cbnZhciBjb21wb25lbnQgPSBPYmplY3QoY29tcG9uZW50Tm9ybWFsaXplcltcImFcIiAvKiBkZWZhdWx0ICovXSkoXG4gIHNyY19vcHRpb252dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIHJlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBhcGk7IH1cbmNvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwicGFja2FnZXMvc2VsZWN0L3NyYy9vcHRpb24udnVlXCJcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19vcHRpb24gPSBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChjb21wb25lbnQuZXhwb3J0cyk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyAzODpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvdGFnXCIpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNDpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvbWl4aW5zL2VtaXR0ZXJcIik7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA1OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi91dGlscy92dWUtcG9wcGVyXCIpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNjpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlbWVudC11aS9saWIvbWl4aW5zL2xvY2FsZVwiKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDYyOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9zZWxlY3Qvc3JjL3NlbGVjdC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MGU0YWFkZTYmXG52YXIgcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwiZGl2XCIsXG4gICAge1xuICAgICAgZGlyZWN0aXZlczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJjbGlja291dHNpZGVcIixcbiAgICAgICAgICByYXdOYW1lOiBcInYtY2xpY2tvdXRzaWRlXCIsXG4gICAgICAgICAgdmFsdWU6IF92bS5oYW5kbGVDbG9zZSxcbiAgICAgICAgICBleHByZXNzaW9uOiBcImhhbmRsZUNsb3NlXCJcbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXNlbGVjdFwiLFxuICAgICAgY2xhc3M6IFtfdm0uc2VsZWN0U2l6ZSA/IFwiZWwtc2VsZWN0LS1cIiArIF92bS5zZWxlY3RTaXplIDogXCJcIl0sXG4gICAgICBvbjoge1xuICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgcmV0dXJuIF92bS50b2dnbGVNZW51KCRldmVudClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgX3ZtLm11bHRpcGxlXG4gICAgICAgID8gX2MoXG4gICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICByZWY6IFwidGFnc1wiLFxuICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1zZWxlY3RfX3RhZ3NcIixcbiAgICAgICAgICAgICAgc3R5bGU6IHsgXCJtYXgtd2lkdGhcIjogX3ZtLmlucHV0V2lkdGggLSAzMiArIFwicHhcIiwgd2lkdGg6IFwiMTAwJVwiIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIF92bS5jb2xsYXBzZVRhZ3MgJiYgX3ZtLnNlbGVjdGVkLmxlbmd0aFxuICAgICAgICAgICAgICAgID8gX2MoXG4gICAgICAgICAgICAgICAgICAgIFwic3BhblwiLFxuICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICBcImVsLXRhZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NhYmxlOiAhX3ZtLnNlbGVjdERpc2FibGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IF92bS5jb2xsYXBzZVRhZ1NpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGl0OiBfdm0uc2VsZWN0ZWRbMF0uaGl0U3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpbmZvXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXNhYmxlLXRyYW5zaXRpb25zXCI6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZTogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uZGVsZXRlVGFnKCRldmVudCwgX3ZtLnNlbGVjdGVkWzBdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoXCJzcGFuXCIsIHsgc3RhdGljQ2xhc3M6IFwiZWwtc2VsZWN0X190YWdzLXRleHRcIiB9LCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl92KF92bS5fcyhfdm0uc2VsZWN0ZWRbMF0uY3VycmVudExhYmVsKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgIF92bS5zZWxlY3RlZC5sZW5ndGggPiAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/IF9jKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZWwtdGFnXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2FibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBfdm0uY29sbGFwc2VUYWdTaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImluZm9cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXNhYmxlLXRyYW5zaXRpb25zXCI6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJlbC1zZWxlY3RfX3RhZ3MtdGV4dFwiIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtfdm0uX3YoXCIrIFwiICsgX3ZtLl9zKF92bS5zZWxlY3RlZC5sZW5ndGggLSAxKSldXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgICAgICAhX3ZtLmNvbGxhcHNlVGFnc1xuICAgICAgICAgICAgICAgID8gX2MoXG4gICAgICAgICAgICAgICAgICAgIFwidHJhbnNpdGlvbi1ncm91cFwiLFxuICAgICAgICAgICAgICAgICAgICB7IG9uOiB7IFwiYWZ0ZXItbGVhdmVcIjogX3ZtLnJlc2V0SW5wdXRIZWlnaHQgfSB9LFxuICAgICAgICAgICAgICAgICAgICBfdm0uX2woX3ZtLnNlbGVjdGVkLCBmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJlbC10YWdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBfdm0uZ2V0VmFsdWVLZXkoaXRlbSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2FibGU6ICFfdm0uc2VsZWN0RGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogX3ZtLmNvbGxhcHNlVGFnU2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXQ6IGl0ZW0uaGl0U3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpbmZvXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXNhYmxlLXRyYW5zaXRpb25zXCI6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZTogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uZGVsZXRlVGFnKCRldmVudCwgaXRlbSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jKFwic3BhblwiLCB7IHN0YXRpY0NsYXNzOiBcImVsLXNlbGVjdF9fdGFncy10ZXh0XCIgfSwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fdihfdm0uX3MoaXRlbS5jdXJyZW50TGFiZWwpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgICAgICBfdm0uZmlsdGVyYWJsZVxuICAgICAgICAgICAgICAgID8gX2MoXCJpbnB1dFwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIm1vZGVsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICByYXdOYW1lOiBcInYtbW9kZWxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBfdm0ucXVlcnksXG4gICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBcInF1ZXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIHJlZjogXCJpbnB1dFwiLFxuICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJlbC1zZWxlY3RfX2lucHV0XCIsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzOiBbX3ZtLnNlbGVjdFNpemUgPyBcImlzLVwiICsgX3ZtLnNlbGVjdFNpemUgOiBcIlwiXSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICBcImZsZXgtZ3Jvd1wiOiBcIjFcIixcbiAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogX3ZtLmlucHV0TGVuZ3RoIC8gKF92bS5pbnB1dFdpZHRoIC0gMzIpICsgXCIlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgXCJtYXgtd2lkdGhcIjogX3ZtLmlucHV0V2lkdGggLSA0MiArIFwicHhcIlxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBfdm0uc2VsZWN0RGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlOiBfdm0uYXV0b0NvbXBsZXRlIHx8IF92bS5hdXRvY29tcGxldGVcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZG9tUHJvcHM6IHsgdmFsdWU6IF92bS5xdWVyeSB9LFxuICAgICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICAgIGZvY3VzOiBfdm0uaGFuZGxlRm9jdXMsXG4gICAgICAgICAgICAgICAgICAgICAgYmx1cjogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdm0uc29mdEZvY3VzID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIGtleXVwOiBfdm0ubWFuYWdlUGxhY2Vob2xkZXIsXG4gICAgICAgICAgICAgICAgICAgICAga2V5ZG93bjogW1xuICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLnJlc2V0SW5wdXRTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIShcImJ1dHRvblwiIGluICRldmVudCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZG93blwiLCA0MCwgJGV2ZW50LmtleSwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJEb3duXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkFycm93RG93blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uaGFuZGxlTmF2aWdhdGUoXCJuZXh0XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKFwiYnV0dG9uXCIgaW4gJGV2ZW50KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJ1cFwiLCAzOCwgJGV2ZW50LmtleSwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJVcFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJBcnJvd1VwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5oYW5kbGVOYXZpZ2F0ZShcInByZXZcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoXCJidXR0b25cIiBpbiAkZXZlbnQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl9rKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGV2ZW50LmtleUNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImVudGVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRldmVudC5rZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkVudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5zZWxlY3RPcHRpb24oJGV2ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIShcImJ1dHRvblwiIGluICRldmVudCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZXNjXCIsIDI3LCAkZXZlbnQua2V5LCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkVzY1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJFc2NhcGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF92bS52aXNpYmxlID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoXCJidXR0b25cIiBpbiAkZXZlbnQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl9rKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGV2ZW50LmtleUNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlbGV0ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzgsIDQ2XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRldmVudC5rZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJCYWNrc3BhY2VcIiwgXCJEZWxldGVcIiwgXCJEZWxcIl1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5kZWxldGVQcmV2VGFnKCRldmVudClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoXCJidXR0b25cIiBpbiAkZXZlbnQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcInRhYlwiLCA5LCAkZXZlbnQua2V5LCBcIlRhYlwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF92bS52aXNpYmxlID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uc3RhcnQ6IF92bS5oYW5kbGVDb21wb3NpdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGlvbnVwZGF0ZTogX3ZtLmhhbmRsZUNvbXBvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uZW5kOiBfdm0uaGFuZGxlQ29tcG9zaXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0ucXVlcnkgPSAkZXZlbnQudGFyZ2V0LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLmRlYm91bmNlZFF1ZXJ5Q2hhbmdlXG4gICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIDogX3ZtLl9lKClcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAxXG4gICAgICAgICAgKVxuICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgX2MoXG4gICAgICAgIFwiZWwtaW5wdXRcIixcbiAgICAgICAge1xuICAgICAgICAgIHJlZjogXCJyZWZlcmVuY2VcIixcbiAgICAgICAgICBjbGFzczogeyBcImlzLWZvY3VzXCI6IF92bS52aXNpYmxlIH0sXG4gICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgcGxhY2Vob2xkZXI6IF92bS5jdXJyZW50UGxhY2Vob2xkZXIsXG4gICAgICAgICAgICBuYW1lOiBfdm0ubmFtZSxcbiAgICAgICAgICAgIGlkOiBfdm0uaWQsXG4gICAgICAgICAgICBhdXRvY29tcGxldGU6IF92bS5hdXRvQ29tcGxldGUgfHwgX3ZtLmF1dG9jb21wbGV0ZSxcbiAgICAgICAgICAgIHNpemU6IF92bS5zZWxlY3RTaXplLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IF92bS5zZWxlY3REaXNhYmxlZCxcbiAgICAgICAgICAgIHJlYWRvbmx5OiBfdm0ucmVhZG9ubHksXG4gICAgICAgICAgICBcInZhbGlkYXRlLWV2ZW50XCI6IGZhbHNlLFxuICAgICAgICAgICAgdGFiaW5kZXg6IF92bS5tdWx0aXBsZSAmJiBfdm0uZmlsdGVyYWJsZSA/IFwiLTFcIiA6IG51bGxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICBmb2N1czogX3ZtLmhhbmRsZUZvY3VzLFxuICAgICAgICAgICAgYmx1cjogX3ZtLmhhbmRsZUJsdXIsXG4gICAgICAgICAgICBpbnB1dDogX3ZtLmRlYm91bmNlZE9uSW5wdXRDaGFuZ2UsXG4gICAgICAgICAgICBjb21wb3NpdGlvbnN0YXJ0OiBfdm0uaGFuZGxlQ29tcG9zaXRpb24sXG4gICAgICAgICAgICBjb21wb3NpdGlvbnVwZGF0ZTogX3ZtLmhhbmRsZUNvbXBvc2l0aW9uLFxuICAgICAgICAgICAgY29tcG9zaXRpb25lbmQ6IF92bS5oYW5kbGVDb21wb3NpdGlvblxuICAgICAgICAgIH0sXG4gICAgICAgICAgbmF0aXZlT246IHtcbiAgICAgICAgICAgIGtleWRvd246IFtcbiAgICAgICAgICAgICAgZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgIShcImJ1dHRvblwiIGluICRldmVudCkgJiZcbiAgICAgICAgICAgICAgICAgIF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJkb3duXCIsIDQwLCAkZXZlbnQua2V5LCBbXG4gICAgICAgICAgICAgICAgICAgIFwiRG93blwiLFxuICAgICAgICAgICAgICAgICAgICBcIkFycm93RG93blwiXG4gICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgICBfdm0uaGFuZGxlTmF2aWdhdGUoXCJuZXh0XCIpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICEoXCJidXR0b25cIiBpbiAkZXZlbnQpICYmXG4gICAgICAgICAgICAgICAgICBfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwidXBcIiwgMzgsICRldmVudC5rZXksIFtcbiAgICAgICAgICAgICAgICAgICAgXCJVcFwiLFxuICAgICAgICAgICAgICAgICAgICBcIkFycm93VXBcIlxuICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgICAgX3ZtLmhhbmRsZU5hdmlnYXRlKFwicHJldlwiKVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAhKFwiYnV0dG9uXCIgaW4gJGV2ZW50KSAmJlxuICAgICAgICAgICAgICAgICAgX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVudGVyXCIsIDEzLCAkZXZlbnQua2V5LCBcIkVudGVyXCIpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICAgIHJldHVybiBfdm0uc2VsZWN0T3B0aW9uKCRldmVudClcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgIShcImJ1dHRvblwiIGluICRldmVudCkgJiZcbiAgICAgICAgICAgICAgICAgIF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJlc2NcIiwgMjcsICRldmVudC5rZXksIFtcbiAgICAgICAgICAgICAgICAgICAgXCJFc2NcIixcbiAgICAgICAgICAgICAgICAgICAgXCJFc2NhcGVcIlxuICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgICAgX3ZtLnZpc2libGUgPSBmYWxzZVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAhKFwiYnV0dG9uXCIgaW4gJGV2ZW50KSAmJlxuICAgICAgICAgICAgICAgICAgX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcInRhYlwiLCA5LCAkZXZlbnQua2V5LCBcIlRhYlwiKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgX3ZtLnZpc2libGUgPSBmYWxzZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgbW91c2VlbnRlcjogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgIF92bS5pbnB1dEhvdmVyaW5nID0gdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdXNlbGVhdmU6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICBfdm0uaW5wdXRIb3ZlcmluZyA9IGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBtb2RlbDoge1xuICAgICAgICAgICAgdmFsdWU6IF92bS5zZWxlY3RlZExhYmVsLFxuICAgICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uKCQkdikge1xuICAgICAgICAgICAgICBfdm0uc2VsZWN0ZWRMYWJlbCA9ICQkdlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV4cHJlc3Npb246IFwic2VsZWN0ZWRMYWJlbFwiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbXG4gICAgICAgICAgX3ZtLiRzbG90cy5wcmVmaXhcbiAgICAgICAgICAgID8gX2MoXCJ0ZW1wbGF0ZVwiLCB7IHNsb3Q6IFwicHJlZml4XCIgfSwgW192bS5fdChcInByZWZpeFwiKV0sIDIpXG4gICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgIF9jKFwidGVtcGxhdGVcIiwgeyBzbG90OiBcInN1ZmZpeFwiIH0sIFtcbiAgICAgICAgICAgIF9jKFwiaVwiLCB7XG4gICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBcInNob3dcIixcbiAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogIV92bS5zaG93Q2xvc2UsXG4gICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBcIiFzaG93Q2xvc2VcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgY2xhc3M6IFtcbiAgICAgICAgICAgICAgICBcImVsLXNlbGVjdF9fY2FyZXRcIixcbiAgICAgICAgICAgICAgICBcImVsLWlucHV0X19pY29uXCIsXG4gICAgICAgICAgICAgICAgXCJlbC1pY29uLVwiICsgX3ZtLmljb25DbGFzc1xuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF92bS5zaG93Q2xvc2VcbiAgICAgICAgICAgICAgPyBfYyhcImlcIiwge1xuICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6XG4gICAgICAgICAgICAgICAgICAgIFwiZWwtc2VsZWN0X19jYXJldCBlbC1pbnB1dF9faWNvbiBlbC1pY29uLWNpcmNsZS1jbG9zZVwiLFxuICAgICAgICAgICAgICAgICAgb246IHsgY2xpY2s6IF92bS5oYW5kbGVDbGVhckNsaWNrIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICA6IF92bS5fZSgpXG4gICAgICAgICAgXSlcbiAgICAgICAgXSxcbiAgICAgICAgMlxuICAgICAgKSxcbiAgICAgIF9jKFxuICAgICAgICBcInRyYW5zaXRpb25cIixcbiAgICAgICAge1xuICAgICAgICAgIGF0dHJzOiB7IG5hbWU6IFwiZWwtem9vbS1pbi10b3BcIiB9LFxuICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICBcImJlZm9yZS1lbnRlclwiOiBfdm0uaGFuZGxlTWVudUVudGVyLFxuICAgICAgICAgICAgXCJhZnRlci1sZWF2ZVwiOiBfdm0uZG9EZXN0cm95XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbXG4gICAgICAgICAgX2MoXG4gICAgICAgICAgICBcImVsLXNlbGVjdC1tZW51XCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBcInNob3dcIixcbiAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZtLnZpc2libGUgJiYgX3ZtLmVtcHR5VGV4dCAhPT0gZmFsc2UsXG4gICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBcInZpc2libGUgJiYgZW1wdHlUZXh0ICE9PSBmYWxzZVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICByZWY6IFwicG9wcGVyXCIsXG4gICAgICAgICAgICAgIGF0dHJzOiB7IFwiYXBwZW5kLXRvLWJvZHlcIjogX3ZtLnBvcHBlckFwcGVuZFRvQm9keSB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICBcImVsLXNjcm9sbGJhclwiLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwic2hvd1wiLFxuICAgICAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IF92bS5vcHRpb25zLmxlbmd0aCA+IDAgJiYgIV92bS5sb2FkaW5nLFxuICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IFwib3B0aW9ucy5sZW5ndGggPiAwICYmICFsb2FkaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgIHJlZjogXCJzY3JvbGxiYXJcIixcbiAgICAgICAgICAgICAgICAgIGNsYXNzOiB7XG4gICAgICAgICAgICAgICAgICAgIFwiaXMtZW1wdHlcIjpcbiAgICAgICAgICAgICAgICAgICAgICAhX3ZtLmFsbG93Q3JlYXRlICYmXG4gICAgICAgICAgICAgICAgICAgICAgX3ZtLnF1ZXJ5ICYmXG4gICAgICAgICAgICAgICAgICAgICAgX3ZtLmZpbHRlcmVkT3B0aW9uc0NvdW50ID09PSAwXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgdGFnOiBcInVsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwid3JhcC1jbGFzc1wiOiBcImVsLXNlbGVjdC1kcm9wZG93bl9fd3JhcFwiLFxuICAgICAgICAgICAgICAgICAgICBcInZpZXctY2xhc3NcIjogXCJlbC1zZWxlY3QtZHJvcGRvd25fX2xpc3RcIlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgX3ZtLnNob3dOZXdPcHRpb25cbiAgICAgICAgICAgICAgICAgICAgPyBfYyhcImVsLW9wdGlvblwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyczogeyB2YWx1ZTogX3ZtLnF1ZXJ5LCBjcmVhdGVkOiBcIlwiIH1cbiAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICA6IF92bS5fZSgpLFxuICAgICAgICAgICAgICAgICAgX3ZtLl90KFwiZGVmYXVsdFwiKVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBfdm0uZW1wdHlUZXh0ICYmXG4gICAgICAgICAgICAgICghX3ZtLmFsbG93Q3JlYXRlIHx8XG4gICAgICAgICAgICAgICAgX3ZtLmxvYWRpbmcgfHxcbiAgICAgICAgICAgICAgICAoX3ZtLmFsbG93Q3JlYXRlICYmIF92bS5vcHRpb25zLmxlbmd0aCA9PT0gMCkpXG4gICAgICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAgICAgIF92bS4kc2xvdHMuZW1wdHlcbiAgICAgICAgICAgICAgICAgICAgICA/IF92bS5fdChcImVtcHR5XCIpXG4gICAgICAgICAgICAgICAgICAgICAgOiBfYyhcInBcIiwgeyBzdGF0aWNDbGFzczogXCJlbC1zZWxlY3QtZHJvcGRvd25fX2VtcHR5XCIgfSwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX3YoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcXG4gICAgICAgICAgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLl9zKF92bS5lbXB0eVRleHQpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXFxuICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIDogX3ZtLl9lKClcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAyXG4gICAgICAgICAgKVxuICAgICAgICBdLFxuICAgICAgICAxXG4gICAgICApXG4gICAgXSxcbiAgICAxXG4gIClcbn1cbnZhciBzdGF0aWNSZW5kZXJGbnMgPSBbXVxucmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zZWxlY3Qvc3JjL3NlbGVjdC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MGU0YWFkZTYmXG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi9taXhpbnMvZW1pdHRlclwiXG52YXIgZW1pdHRlcl8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xudmFyIGVtaXR0ZXJfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oZW1pdHRlcl8pO1xuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvbWl4aW5zL2ZvY3VzXCJcbnZhciBmb2N1c18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyKTtcbnZhciBmb2N1c19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihmb2N1c18pO1xuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvbWl4aW5zL2xvY2FsZVwiXG52YXIgbG9jYWxlXyA9IF9fd2VicGFja19yZXF1aXJlX18oNik7XG52YXIgbG9jYWxlX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGxvY2FsZV8pO1xuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvaW5wdXRcIlxudmFyIGlucHV0XyA9IF9fd2VicGFja19yZXF1aXJlX18oMTApO1xudmFyIGlucHV0X2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGlucHV0Xyk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvc2VsZWN0L3NyYy9zZWxlY3QtZHJvcGRvd24udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTA2ODI4NzQ4JlxudmFyIHNlbGVjdF9kcm9wZG93bnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzA2ODI4NzQ4X3JlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBcImRpdlwiLFxuICAgIHtcbiAgICAgIHN0YXRpY0NsYXNzOiBcImVsLXNlbGVjdC1kcm9wZG93biBlbC1wb3BwZXJcIixcbiAgICAgIGNsYXNzOiBbeyBcImlzLW11bHRpcGxlXCI6IF92bS4kcGFyZW50Lm11bHRpcGxlIH0sIF92bS5wb3BwZXJDbGFzc10sXG4gICAgICBzdHlsZTogeyBtaW5XaWR0aDogX3ZtLm1pbldpZHRoIH1cbiAgICB9LFxuICAgIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSxcbiAgICAyXG4gIClcbn1cbnZhciBzZWxlY3RfZHJvcGRvd252dWVfdHlwZV90ZW1wbGF0ZV9pZF8wNjgyODc0OF9zdGF0aWNSZW5kZXJGbnMgPSBbXVxuc2VsZWN0X2Ryb3Bkb3dudnVlX3R5cGVfdGVtcGxhdGVfaWRfMDY4Mjg3NDhfcmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zZWxlY3Qvc3JjL3NlbGVjdC1kcm9wZG93bi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MDY4Mjg3NDgmXG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi91dGlscy92dWUtcG9wcGVyXCJcbnZhciB2dWVfcG9wcGVyXyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7XG52YXIgdnVlX3BvcHBlcl9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubih2dWVfcG9wcGVyXyk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL3NlbGVjdC9zcmMvc2VsZWN0LWRyb3Bkb3duLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNlbGVjdF9kcm9wZG93bnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9ICh7XG4gIG5hbWU6ICdFbFNlbGVjdERyb3Bkb3duJyxcblxuICBjb21wb25lbnROYW1lOiAnRWxTZWxlY3REcm9wZG93bicsXG5cbiAgbWl4aW5zOiBbdnVlX3BvcHBlcl9kZWZhdWx0LmFdLFxuXG4gIHByb3BzOiB7XG4gICAgcGxhY2VtZW50OiB7XG4gICAgICBkZWZhdWx0OiAnYm90dG9tLXN0YXJ0J1xuICAgIH0sXG5cbiAgICBib3VuZGFyaWVzUGFkZGluZzoge1xuICAgICAgZGVmYXVsdDogMFxuICAgIH0sXG5cbiAgICBwb3BwZXJPcHRpb25zOiB7XG4gICAgICBkZWZhdWx0OiBmdW5jdGlvbiBfZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBncHVBY2NlbGVyYXRpb246IGZhbHNlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSxcblxuICAgIHZpc2libGVBcnJvdzoge1xuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG5cbiAgICBhcHBlbmRUb0JvZHk6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfVxuICB9LFxuXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1pbldpZHRoOiAnJ1xuICAgIH07XG4gIH0sXG5cblxuICBjb21wdXRlZDoge1xuICAgIHBvcHBlckNsYXNzOiBmdW5jdGlvbiBwb3BwZXJDbGFzcygpIHtcbiAgICAgIHJldHVybiB0aGlzLiRwYXJlbnQucG9wcGVyQ2xhc3M7XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgJyRwYXJlbnQuaW5wdXRXaWR0aCc6IGZ1bmN0aW9uICRwYXJlbnRJbnB1dFdpZHRoKCkge1xuICAgICAgdGhpcy5taW5XaWR0aCA9IHRoaXMuJHBhcmVudC4kZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggKyAncHgnO1xuICAgIH1cbiAgfSxcblxuICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB0aGlzLnJlZmVyZW5jZUVsbSA9IHRoaXMuJHBhcmVudC4kcmVmcy5yZWZlcmVuY2UuJGVsO1xuICAgIHRoaXMuJHBhcmVudC5wb3BwZXJFbG0gPSB0aGlzLnBvcHBlckVsbSA9IHRoaXMuJGVsO1xuICAgIHRoaXMuJG9uKCd1cGRhdGVQb3BwZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMuJHBhcmVudC52aXNpYmxlKSBfdGhpcy51cGRhdGVQb3BwZXIoKTtcbiAgICB9KTtcbiAgICB0aGlzLiRvbignZGVzdHJveVBvcHBlcicsIHRoaXMuZGVzdHJveVBvcHBlcik7XG4gIH1cbn0pO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zZWxlY3Qvc3JjL3NlbGVjdC1kcm9wZG93bi52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXG4gLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX3NlbGVjdF9kcm9wZG93bnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyA9IChzZWxlY3RfZHJvcGRvd252dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18pOyBcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvcnVudGltZS9jb21wb25lbnROb3JtYWxpemVyLmpzXG52YXIgY29tcG9uZW50Tm9ybWFsaXplciA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc2VsZWN0L3NyYy9zZWxlY3QtZHJvcGRvd24udnVlXG5cblxuXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuXG52YXIgY29tcG9uZW50ID0gT2JqZWN0KGNvbXBvbmVudE5vcm1hbGl6ZXJbXCJhXCIgLyogZGVmYXVsdCAqL10pKFxuICBzcmNfc2VsZWN0X2Ryb3Bkb3dudnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfLFxuICBzZWxlY3RfZHJvcGRvd252dWVfdHlwZV90ZW1wbGF0ZV9pZF8wNjgyODc0OF9yZW5kZXIsXG4gIHNlbGVjdF9kcm9wZG93bnZ1ZV90eXBlX3RlbXBsYXRlX2lkXzA2ODI4NzQ4X3N0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChmYWxzZSkgeyB2YXIgYXBpOyB9XG5jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInBhY2thZ2VzL3NlbGVjdC9zcmMvc2VsZWN0LWRyb3Bkb3duLnZ1ZVwiXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzZWxlY3RfZHJvcGRvd24gPSAoY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL3BhY2thZ2VzL3NlbGVjdC9zcmMvb3B0aW9uLnZ1ZSArIDQgbW9kdWxlc1xudmFyIHNyY19vcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMzKTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL3RhZ1wiXG52YXIgdGFnXyA9IF9fd2VicGFja19yZXF1aXJlX18oMzgpO1xudmFyIHRhZ19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubih0YWdfKTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcImVsZW1lbnQtdWkvbGliL3Njcm9sbGJhclwiXG52YXIgc2Nyb2xsYmFyXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpO1xudmFyIHNjcm9sbGJhcl9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihzY3JvbGxiYXJfKTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCBcInRocm90dGxlLWRlYm91bmNlL2RlYm91bmNlXCJcbnZhciBkZWJvdW5jZV8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KTtcbnZhciBkZWJvdW5jZV9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihkZWJvdW5jZV8pO1xuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvdXRpbHMvY2xpY2tvdXRzaWRlXCJcbnZhciBjbGlja291dHNpZGVfID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7XG52YXIgY2xpY2tvdXRzaWRlX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNsaWNrb3V0c2lkZV8pO1xuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvdXRpbHMvcmVzaXplLWV2ZW50XCJcbnZhciByZXNpemVfZXZlbnRfID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNik7XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi91dGlscy9zY3JvbGwtaW50by12aWV3XCJcbnZhciBzY3JvbGxfaW50b192aWV3XyA9IF9fd2VicGFja19yZXF1aXJlX18oMzEpO1xudmFyIHNjcm9sbF9pbnRvX3ZpZXdfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oc2Nyb2xsX2ludG9fdmlld18pO1xuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvdXRpbHMvdXRpbFwiXG52YXIgdXRpbF8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NlbGVjdC9zcmMvbmF2aWdhdGlvbi1taXhpbi5qc1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgbmF2aWdhdGlvbl9taXhpbiA9ICh7XG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhvdmVyT3B0aW9uOiAtMVxuICAgIH07XG4gIH0sXG5cblxuICBjb21wdXRlZDoge1xuICAgIG9wdGlvbnNBbGxEaXNhYmxlZDogZnVuY3Rpb24gb3B0aW9uc0FsbERpc2FibGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5maWx0ZXIoZnVuY3Rpb24gKG9wdGlvbikge1xuICAgICAgICByZXR1cm4gb3B0aW9uLnZpc2libGU7XG4gICAgICB9KS5ldmVyeShmdW5jdGlvbiAob3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBvcHRpb24uZGlzYWJsZWQ7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBob3ZlckluZGV4OiBmdW5jdGlvbiBob3ZlckluZGV4KHZhbCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInICYmIHZhbCA+IC0xKSB7XG4gICAgICAgIHRoaXMuaG92ZXJPcHRpb24gPSB0aGlzLm9wdGlvbnNbdmFsXSB8fCB7fTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChvcHRpb24pIHtcbiAgICAgICAgb3B0aW9uLmhvdmVyID0gX3RoaXMuaG92ZXJPcHRpb24gPT09IG9wdGlvbjtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgbmF2aWdhdGVPcHRpb25zOiBmdW5jdGlvbiBuYXZpZ2F0ZU9wdGlvbnMoZGlyZWN0aW9uKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgaWYgKCF0aGlzLnZpc2libGUpIHtcbiAgICAgICAgdGhpcy52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5sZW5ndGggPT09IDAgfHwgdGhpcy5maWx0ZXJlZE9wdGlvbnNDb3VudCA9PT0gMCkgcmV0dXJuO1xuICAgICAgaWYgKCF0aGlzLm9wdGlvbnNBbGxEaXNhYmxlZCkge1xuICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAnbmV4dCcpIHtcbiAgICAgICAgICB0aGlzLmhvdmVySW5kZXgrKztcbiAgICAgICAgICBpZiAodGhpcy5ob3ZlckluZGV4ID09PSB0aGlzLm9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmhvdmVySW5kZXggPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09ICdwcmV2Jykge1xuICAgICAgICAgIHRoaXMuaG92ZXJJbmRleC0tO1xuICAgICAgICAgIGlmICh0aGlzLmhvdmVySW5kZXggPCAwKSB7XG4gICAgICAgICAgICB0aGlzLmhvdmVySW5kZXggPSB0aGlzLm9wdGlvbnMubGVuZ3RoIC0gMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG9wdGlvbiA9IHRoaXMub3B0aW9uc1t0aGlzLmhvdmVySW5kZXhdO1xuICAgICAgICBpZiAob3B0aW9uLmRpc2FibGVkID09PSB0cnVlIHx8IG9wdGlvbi5ncm91cERpc2FibGVkID09PSB0cnVlIHx8ICFvcHRpb24udmlzaWJsZSkge1xuICAgICAgICAgIHRoaXMubmF2aWdhdGVPcHRpb25zKGRpcmVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBfdGhpczIuc2Nyb2xsVG9PcHRpb24oX3RoaXMyLmhvdmVyT3B0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59KTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi91dGlscy9zaGFyZWRcIlxudmFyIHNoYXJlZF8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvc2VsZWN0L3NyYy9zZWxlY3QudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc2VsZWN0dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbWl4aW5zOiBbZW1pdHRlcl9kZWZhdWx0LmEsIGxvY2FsZV9kZWZhdWx0LmEsIGZvY3VzX2RlZmF1bHQoKSgncmVmZXJlbmNlJyksIG5hdmlnYXRpb25fbWl4aW5dLFxuXG4gIG5hbWU6ICdFbFNlbGVjdCcsXG5cbiAgY29tcG9uZW50TmFtZTogJ0VsU2VsZWN0JyxcblxuICBpbmplY3Q6IHtcbiAgICBlbEZvcm06IHtcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfSxcblxuICAgIGVsRm9ybUl0ZW06IHtcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfVxuICB9LFxuXG4gIHByb3ZpZGU6IGZ1bmN0aW9uIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdzZWxlY3QnOiB0aGlzXG4gICAgfTtcbiAgfSxcblxuXG4gIGNvbXB1dGVkOiB7XG4gICAgX2VsRm9ybUl0ZW1TaXplOiBmdW5jdGlvbiBfZWxGb3JtSXRlbVNpemUoKSB7XG4gICAgICByZXR1cm4gKHRoaXMuZWxGb3JtSXRlbSB8fCB7fSkuZWxGb3JtSXRlbVNpemU7XG4gICAgfSxcbiAgICByZWFkb25seTogZnVuY3Rpb24gcmVhZG9ubHkoKSB7XG4gICAgICByZXR1cm4gIXRoaXMuZmlsdGVyYWJsZSB8fCB0aGlzLm11bHRpcGxlIHx8ICFPYmplY3QodXRpbF9bXCJpc0lFXCJdKSgpICYmICFPYmplY3QodXRpbF9bXCJpc0VkZ2VcIl0pKCkgJiYgIXRoaXMudmlzaWJsZTtcbiAgICB9LFxuICAgIHNob3dDbG9zZTogZnVuY3Rpb24gc2hvd0Nsb3NlKCkge1xuICAgICAgdmFyIGhhc1ZhbHVlID0gdGhpcy5tdWx0aXBsZSA/IEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkgJiYgdGhpcy52YWx1ZS5sZW5ndGggPiAwIDogdGhpcy52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMudmFsdWUgIT09IG51bGwgJiYgdGhpcy52YWx1ZSAhPT0gJyc7XG4gICAgICB2YXIgY3JpdGVyaWEgPSB0aGlzLmNsZWFyYWJsZSAmJiAhdGhpcy5zZWxlY3REaXNhYmxlZCAmJiB0aGlzLmlucHV0SG92ZXJpbmcgJiYgaGFzVmFsdWU7XG4gICAgICByZXR1cm4gY3JpdGVyaWE7XG4gICAgfSxcbiAgICBpY29uQ2xhc3M6IGZ1bmN0aW9uIGljb25DbGFzcygpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbW90ZSAmJiB0aGlzLmZpbHRlcmFibGUgPyAnJyA6IHRoaXMudmlzaWJsZSA/ICdhcnJvdy11cCBpcy1yZXZlcnNlJyA6ICdhcnJvdy11cCc7XG4gICAgfSxcbiAgICBkZWJvdW5jZTogZnVuY3Rpb24gZGVib3VuY2UoKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW1vdGUgPyAzMDAgOiAwO1xuICAgIH0sXG4gICAgZW1wdHlUZXh0OiBmdW5jdGlvbiBlbXB0eVRleHQoKSB7XG4gICAgICBpZiAodGhpcy5sb2FkaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmdUZXh0IHx8IHRoaXMudCgnZWwuc2VsZWN0LmxvYWRpbmcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnJlbW90ZSAmJiB0aGlzLnF1ZXJ5ID09PSAnJyAmJiB0aGlzLm9wdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmZpbHRlcmFibGUgJiYgdGhpcy5xdWVyeSAmJiB0aGlzLm9wdGlvbnMubGVuZ3RoID4gMCAmJiB0aGlzLmZpbHRlcmVkT3B0aW9uc0NvdW50ID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubm9NYXRjaFRleHQgfHwgdGhpcy50KCdlbC5zZWxlY3Qubm9NYXRjaCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubm9EYXRhVGV4dCB8fCB0aGlzLnQoJ2VsLnNlbGVjdC5ub0RhdGEnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICBzaG93TmV3T3B0aW9uOiBmdW5jdGlvbiBzaG93TmV3T3B0aW9uKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIGhhc0V4aXN0aW5nT3B0aW9uID0gdGhpcy5vcHRpb25zLmZpbHRlcihmdW5jdGlvbiAob3B0aW9uKSB7XG4gICAgICAgIHJldHVybiAhb3B0aW9uLmNyZWF0ZWQ7XG4gICAgICB9KS5zb21lKGZ1bmN0aW9uIChvcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbi5jdXJyZW50TGFiZWwgPT09IF90aGlzLnF1ZXJ5O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXJhYmxlICYmIHRoaXMuYWxsb3dDcmVhdGUgJiYgdGhpcy5xdWVyeSAhPT0gJycgJiYgIWhhc0V4aXN0aW5nT3B0aW9uO1xuICAgIH0sXG4gICAgc2VsZWN0U2l6ZTogZnVuY3Rpb24gc2VsZWN0U2l6ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNpemUgfHwgdGhpcy5fZWxGb3JtSXRlbVNpemUgfHwgKHRoaXMuJEVMRU1FTlQgfHwge30pLnNpemU7XG4gICAgfSxcbiAgICBzZWxlY3REaXNhYmxlZDogZnVuY3Rpb24gc2VsZWN0RGlzYWJsZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZCB8fCAodGhpcy5lbEZvcm0gfHwge30pLmRpc2FibGVkO1xuICAgIH0sXG4gICAgY29sbGFwc2VUYWdTaXplOiBmdW5jdGlvbiBjb2xsYXBzZVRhZ1NpemUoKSB7XG4gICAgICByZXR1cm4gWydzbWFsbCcsICdtaW5pJ10uaW5kZXhPZih0aGlzLnNlbGVjdFNpemUpID4gLTEgPyAnbWluaScgOiAnc21hbGwnO1xuICAgIH0sXG4gICAgcHJvcFBsYWNlaG9sZGVyOiBmdW5jdGlvbiBwcm9wUGxhY2Vob2xkZXIoKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHRoaXMucGxhY2Vob2xkZXIgIT09ICd1bmRlZmluZWQnID8gdGhpcy5wbGFjZWhvbGRlciA6IHRoaXMudCgnZWwuc2VsZWN0LnBsYWNlaG9sZGVyJyk7XG4gICAgfVxuICB9LFxuXG4gIGNvbXBvbmVudHM6IHtcbiAgICBFbElucHV0OiBpbnB1dF9kZWZhdWx0LmEsXG4gICAgRWxTZWxlY3RNZW51OiBzZWxlY3RfZHJvcGRvd24sXG4gICAgRWxPcHRpb246IHNyY19vcHRpb25bXCJhXCIgLyogZGVmYXVsdCAqL10sXG4gICAgRWxUYWc6IHRhZ19kZWZhdWx0LmEsXG4gICAgRWxTY3JvbGxiYXI6IHNjcm9sbGJhcl9kZWZhdWx0LmFcbiAgfSxcblxuICBkaXJlY3RpdmVzOiB7IENsaWNrb3V0c2lkZTogY2xpY2tvdXRzaWRlX2RlZmF1bHQuYSB9LFxuXG4gIHByb3BzOiB7XG4gICAgbmFtZTogU3RyaW5nLFxuICAgIGlkOiBTdHJpbmcsXG4gICAgdmFsdWU6IHtcbiAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgfSxcbiAgICBhdXRvY29tcGxldGU6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdvZmYnXG4gICAgfSxcbiAgICAvKiogQERlcHJlY2F0ZWQgaW4gbmV4dCBtYWpvciB2ZXJzaW9uICovXG4gICAgYXV0b0NvbXBsZXRlOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICB2YWxpZGF0b3I6IGZ1bmN0aW9uIHZhbGlkYXRvcih2YWwpIHtcbiAgICAgICAgIGZhbHNlICYmIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGF1dG9tYXRpY0Ryb3Bkb3duOiBCb29sZWFuLFxuICAgIHNpemU6IFN0cmluZyxcbiAgICBkaXNhYmxlZDogQm9vbGVhbixcbiAgICBjbGVhcmFibGU6IEJvb2xlYW4sXG4gICAgZmlsdGVyYWJsZTogQm9vbGVhbixcbiAgICBhbGxvd0NyZWF0ZTogQm9vbGVhbixcbiAgICBsb2FkaW5nOiBCb29sZWFuLFxuICAgIHBvcHBlckNsYXNzOiBTdHJpbmcsXG4gICAgcmVtb3RlOiBCb29sZWFuLFxuICAgIGxvYWRpbmdUZXh0OiBTdHJpbmcsXG4gICAgbm9NYXRjaFRleHQ6IFN0cmluZyxcbiAgICBub0RhdGFUZXh0OiBTdHJpbmcsXG4gICAgcmVtb3RlTWV0aG9kOiBGdW5jdGlvbixcbiAgICBmaWx0ZXJNZXRob2Q6IEZ1bmN0aW9uLFxuICAgIG11bHRpcGxlOiBCb29sZWFuLFxuICAgIG11bHRpcGxlTGltaXQ6IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGRlZmF1bHQ6IDBcbiAgICB9LFxuICAgIHBsYWNlaG9sZGVyOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICByZXF1aXJlZDogZmFsc2VcbiAgICB9LFxuICAgIGRlZmF1bHRGaXJzdE9wdGlvbjogQm9vbGVhbixcbiAgICByZXNlcnZlS2V5d29yZDogQm9vbGVhbixcbiAgICB2YWx1ZUtleToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ3ZhbHVlJ1xuICAgIH0sXG4gICAgY29sbGFwc2VUYWdzOiBCb29sZWFuLFxuICAgIHBvcHBlckFwcGVuZFRvQm9keToge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9XG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgb3B0aW9uczogW10sXG4gICAgICBjYWNoZWRPcHRpb25zOiBbXSxcbiAgICAgIGNyZWF0ZWRMYWJlbDogbnVsbCxcbiAgICAgIGNyZWF0ZWRTZWxlY3RlZDogZmFsc2UsXG4gICAgICBzZWxlY3RlZDogdGhpcy5tdWx0aXBsZSA/IFtdIDoge30sXG4gICAgICBpbnB1dExlbmd0aDogMjAsXG4gICAgICBpbnB1dFdpZHRoOiAwLFxuICAgICAgaW5pdGlhbElucHV0SGVpZ2h0OiAwLFxuICAgICAgY2FjaGVkUGxhY2VIb2xkZXI6ICcnLFxuICAgICAgb3B0aW9uc0NvdW50OiAwLFxuICAgICAgZmlsdGVyZWRPcHRpb25zQ291bnQ6IDAsXG4gICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgIHNvZnRGb2N1czogZmFsc2UsXG4gICAgICBzZWxlY3RlZExhYmVsOiAnJyxcbiAgICAgIGhvdmVySW5kZXg6IC0xLFxuICAgICAgcXVlcnk6ICcnLFxuICAgICAgcHJldmlvdXNRdWVyeTogbnVsbCxcbiAgICAgIGlucHV0SG92ZXJpbmc6IGZhbHNlLFxuICAgICAgY3VycmVudFBsYWNlaG9sZGVyOiAnJyxcbiAgICAgIG1lbnVWaXNpYmxlT25Gb2N1czogZmFsc2UsXG4gICAgICBpc09uQ29tcG9zaXRpb246IGZhbHNlLFxuICAgICAgaXNTaWxlbnRCbHVyOiBmYWxzZVxuICAgIH07XG4gIH0sXG5cblxuICB3YXRjaDoge1xuICAgIHNlbGVjdERpc2FibGVkOiBmdW5jdGlvbiBzZWxlY3REaXNhYmxlZCgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMi5yZXNldElucHV0SGVpZ2h0KCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHByb3BQbGFjZWhvbGRlcjogZnVuY3Rpb24gcHJvcFBsYWNlaG9sZGVyKHZhbCkge1xuICAgICAgdGhpcy5jYWNoZWRQbGFjZUhvbGRlciA9IHRoaXMuY3VycmVudFBsYWNlaG9sZGVyID0gdmFsO1xuICAgIH0sXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCwgb2xkVmFsKSB7XG4gICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICB0aGlzLnJlc2V0SW5wdXRIZWlnaHQoKTtcbiAgICAgICAgaWYgKHZhbCAmJiB2YWwubGVuZ3RoID4gMCB8fCB0aGlzLiRyZWZzLmlucHV0ICYmIHRoaXMucXVlcnkgIT09ICcnKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50UGxhY2Vob2xkZXIgPSAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRQbGFjZWhvbGRlciA9IHRoaXMuY2FjaGVkUGxhY2VIb2xkZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyYWJsZSAmJiAhdGhpcy5yZXNlcnZlS2V5d29yZCkge1xuICAgICAgICAgIHRoaXMucXVlcnkgPSAnJztcbiAgICAgICAgICB0aGlzLmhhbmRsZVF1ZXJ5Q2hhbmdlKHRoaXMucXVlcnkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnNldFNlbGVjdGVkKCk7XG4gICAgICBpZiAodGhpcy5maWx0ZXJhYmxlICYmICF0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgIHRoaXMuaW5wdXRMZW5ndGggPSAyMDtcbiAgICAgIH1cbiAgICAgIGlmICghT2JqZWN0KHV0aWxfW1widmFsdWVFcXVhbHNcIl0pKHZhbCwgb2xkVmFsKSkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoKCdFbEZvcm1JdGVtJywgJ2VsLmZvcm0uY2hhbmdlJywgdmFsKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHZpc2libGU6IGZ1bmN0aW9uIHZpc2libGUodmFsKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgaWYgKCF2YWwpIHtcbiAgICAgICAgdGhpcy5icm9hZGNhc3QoJ0VsU2VsZWN0RHJvcGRvd24nLCAnZGVzdHJveVBvcHBlcicpO1xuICAgICAgICBpZiAodGhpcy4kcmVmcy5pbnB1dCkge1xuICAgICAgICAgIHRoaXMuJHJlZnMuaW5wdXQuYmx1cigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucXVlcnkgPSAnJztcbiAgICAgICAgdGhpcy5wcmV2aW91c1F1ZXJ5ID0gbnVsbDtcbiAgICAgICAgdGhpcy5zZWxlY3RlZExhYmVsID0gJyc7XG4gICAgICAgIHRoaXMuaW5wdXRMZW5ndGggPSAyMDtcbiAgICAgICAgdGhpcy5tZW51VmlzaWJsZU9uRm9jdXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXNldEhvdmVySW5kZXgoKTtcbiAgICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChfdGhpczMuJHJlZnMuaW5wdXQgJiYgX3RoaXMzLiRyZWZzLmlucHV0LnZhbHVlID09PSAnJyAmJiBfdGhpczMuc2VsZWN0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBfdGhpczMuY3VycmVudFBsYWNlaG9sZGVyID0gX3RoaXMzLmNhY2hlZFBsYWNlSG9sZGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJhYmxlICYmIHRoaXMuYWxsb3dDcmVhdGUgJiYgdGhpcy5jcmVhdGVkU2VsZWN0ZWQgJiYgdGhpcy5jcmVhdGVkTGFiZWwpIHtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZExhYmVsID0gdGhpcy5jcmVhdGVkTGFiZWw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTGFiZWwgPSB0aGlzLnNlbGVjdGVkLmN1cnJlbnRMYWJlbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcmFibGUpIHRoaXMucXVlcnkgPSB0aGlzLnNlbGVjdGVkTGFiZWw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMuZmlsdGVyYWJsZSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50UGxhY2Vob2xkZXIgPSB0aGlzLmNhY2hlZFBsYWNlSG9sZGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5icm9hZGNhc3QoJ0VsU2VsZWN0RHJvcGRvd24nLCAndXBkYXRlUG9wcGVyJyk7XG4gICAgICAgIGlmICh0aGlzLmZpbHRlcmFibGUpIHtcbiAgICAgICAgICB0aGlzLnF1ZXJ5ID0gdGhpcy5yZW1vdGUgPyAnJyA6IHRoaXMuc2VsZWN0ZWRMYWJlbDtcbiAgICAgICAgICB0aGlzLmhhbmRsZVF1ZXJ5Q2hhbmdlKHRoaXMucXVlcnkpO1xuICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICB0aGlzLiRyZWZzLmlucHV0LmZvY3VzKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5yZW1vdGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5icm9hZGNhc3QoJ0VsT3B0aW9uJywgJ3F1ZXJ5Q2hhbmdlJywgJycpO1xuICAgICAgICAgICAgICB0aGlzLmJyb2FkY2FzdCgnRWxPcHRpb25Hcm91cCcsICdxdWVyeUNoYW5nZScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZExhYmVsKSB7XG4gICAgICAgICAgICAgIHRoaXMuY3VycmVudFBsYWNlaG9sZGVyID0gdGhpcy5zZWxlY3RlZExhYmVsO1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTGFiZWwgPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuJGVtaXQoJ3Zpc2libGUtY2hhbmdlJywgdmFsKTtcbiAgICB9LFxuICAgIG9wdGlvbnM6IGZ1bmN0aW9uIG9wdGlvbnMoKSB7XG4gICAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuJGlzU2VydmVyKSByZXR1cm47XG4gICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzNC5icm9hZGNhc3QoJ0VsU2VsZWN0RHJvcGRvd24nLCAndXBkYXRlUG9wcGVyJyk7XG4gICAgICB9KTtcbiAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgIHRoaXMucmVzZXRJbnB1dEhlaWdodCgpO1xuICAgICAgfVxuICAgICAgdmFyIGlucHV0cyA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0Jyk7XG4gICAgICBpZiAoW10uaW5kZXhPZi5jYWxsKGlucHV0cywgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkgPT09IC0xKSB7XG4gICAgICAgIHRoaXMuc2V0U2VsZWN0ZWQoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmRlZmF1bHRGaXJzdE9wdGlvbiAmJiAodGhpcy5maWx0ZXJhYmxlIHx8IHRoaXMucmVtb3RlKSAmJiB0aGlzLmZpbHRlcmVkT3B0aW9uc0NvdW50KSB7XG4gICAgICAgIHRoaXMuY2hlY2tEZWZhdWx0Rmlyc3RPcHRpb24oKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGhhbmRsZU5hdmlnYXRlOiBmdW5jdGlvbiBoYW5kbGVOYXZpZ2F0ZShkaXJlY3Rpb24pIHtcbiAgICAgIGlmICh0aGlzLmlzT25Db21wb3NpdGlvbikgcmV0dXJuO1xuXG4gICAgICB0aGlzLm5hdmlnYXRlT3B0aW9ucyhkaXJlY3Rpb24pO1xuICAgIH0sXG4gICAgaGFuZGxlQ29tcG9zaXRpb246IGZ1bmN0aW9uIGhhbmRsZUNvbXBvc2l0aW9uKGV2ZW50KSB7XG4gICAgICB2YXIgX3RoaXM1ID0gdGhpcztcblxuICAgICAgdmFyIHRleHQgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2NvbXBvc2l0aW9uZW5kJykge1xuICAgICAgICB0aGlzLmlzT25Db21wb3NpdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoXykge1xuICAgICAgICAgIHJldHVybiBfdGhpczUuaGFuZGxlUXVlcnlDaGFuZ2UodGV4dCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGxhc3RDaGFyYWN0ZXIgPSB0ZXh0W3RleHQubGVuZ3RoIC0gMV0gfHwgJyc7XG4gICAgICAgIHRoaXMuaXNPbkNvbXBvc2l0aW9uID0gIU9iamVjdChzaGFyZWRfW1wiaXNLb3JlYW5cIl0pKGxhc3RDaGFyYWN0ZXIpO1xuICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlUXVlcnlDaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZVF1ZXJ5Q2hhbmdlKHZhbCkge1xuICAgICAgdmFyIF90aGlzNiA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLnByZXZpb3VzUXVlcnkgPT09IHZhbCB8fCB0aGlzLmlzT25Db21wb3NpdGlvbikgcmV0dXJuO1xuICAgICAgaWYgKHRoaXMucHJldmlvdXNRdWVyeSA9PT0gbnVsbCAmJiAodHlwZW9mIHRoaXMuZmlsdGVyTWV0aG9kID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiB0aGlzLnJlbW90ZU1ldGhvZCA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgdGhpcy5wcmV2aW91c1F1ZXJ5ID0gdmFsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnByZXZpb3VzUXVlcnkgPSB2YWw7XG4gICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChfdGhpczYudmlzaWJsZSkgX3RoaXM2LmJyb2FkY2FzdCgnRWxTZWxlY3REcm9wZG93bicsICd1cGRhdGVQb3BwZXInKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5ob3ZlckluZGV4ID0gLTE7XG4gICAgICBpZiAodGhpcy5tdWx0aXBsZSAmJiB0aGlzLmZpbHRlcmFibGUpIHtcbiAgICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBsZW5ndGggPSBfdGhpczYuJHJlZnMuaW5wdXQudmFsdWUubGVuZ3RoICogMTUgKyAyMDtcbiAgICAgICAgICBfdGhpczYuaW5wdXRMZW5ndGggPSBfdGhpczYuY29sbGFwc2VUYWdzID8gTWF0aC5taW4oNTAsIGxlbmd0aCkgOiBsZW5ndGg7XG4gICAgICAgICAgX3RoaXM2Lm1hbmFnZVBsYWNlaG9sZGVyKCk7XG4gICAgICAgICAgX3RoaXM2LnJlc2V0SW5wdXRIZWlnaHQoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5yZW1vdGUgJiYgdHlwZW9mIHRoaXMucmVtb3RlTWV0aG9kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMuaG92ZXJJbmRleCA9IC0xO1xuICAgICAgICB0aGlzLnJlbW90ZU1ldGhvZCh2YWwpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5maWx0ZXJNZXRob2QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJNZXRob2QodmFsKTtcbiAgICAgICAgdGhpcy5icm9hZGNhc3QoJ0VsT3B0aW9uR3JvdXAnLCAncXVlcnlDaGFuZ2UnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zQ291bnQgPSB0aGlzLm9wdGlvbnNDb3VudDtcbiAgICAgICAgdGhpcy5icm9hZGNhc3QoJ0VsT3B0aW9uJywgJ3F1ZXJ5Q2hhbmdlJywgdmFsKTtcbiAgICAgICAgdGhpcy5icm9hZGNhc3QoJ0VsT3B0aW9uR3JvdXAnLCAncXVlcnlDaGFuZ2UnKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmRlZmF1bHRGaXJzdE9wdGlvbiAmJiAodGhpcy5maWx0ZXJhYmxlIHx8IHRoaXMucmVtb3RlKSAmJiB0aGlzLmZpbHRlcmVkT3B0aW9uc0NvdW50KSB7XG4gICAgICAgIHRoaXMuY2hlY2tEZWZhdWx0Rmlyc3RPcHRpb24oKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHNjcm9sbFRvT3B0aW9uOiBmdW5jdGlvbiBzY3JvbGxUb09wdGlvbihvcHRpb24pIHtcbiAgICAgIHZhciB0YXJnZXQgPSBBcnJheS5pc0FycmF5KG9wdGlvbikgJiYgb3B0aW9uWzBdID8gb3B0aW9uWzBdLiRlbCA6IG9wdGlvbi4kZWw7XG4gICAgICBpZiAodGhpcy4kcmVmcy5wb3BwZXIgJiYgdGFyZ2V0KSB7XG4gICAgICAgIHZhciBtZW51ID0gdGhpcy4kcmVmcy5wb3BwZXIuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5lbC1zZWxlY3QtZHJvcGRvd25fX3dyYXAnKTtcbiAgICAgICAgc2Nyb2xsX2ludG9fdmlld19kZWZhdWx0KCkobWVudSwgdGFyZ2V0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuJHJlZnMuc2Nyb2xsYmFyICYmIHRoaXMuJHJlZnMuc2Nyb2xsYmFyLmhhbmRsZVNjcm9sbCgpO1xuICAgIH0sXG4gICAgaGFuZGxlTWVudUVudGVyOiBmdW5jdGlvbiBoYW5kbGVNZW51RW50ZXIoKSB7XG4gICAgICB2YXIgX3RoaXM3ID0gdGhpcztcblxuICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX3RoaXM3LnNjcm9sbFRvT3B0aW9uKF90aGlzNy5zZWxlY3RlZCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGVtaXRDaGFuZ2U6IGZ1bmN0aW9uIGVtaXRDaGFuZ2UodmFsKSB7XG4gICAgICBpZiAoIU9iamVjdCh1dGlsX1tcInZhbHVlRXF1YWxzXCJdKSh0aGlzLnZhbHVlLCB2YWwpKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIHZhbCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBnZXRPcHRpb246IGZ1bmN0aW9uIGdldE9wdGlvbih2YWx1ZSkge1xuICAgICAgdmFyIG9wdGlvbiA9IHZvaWQgMDtcbiAgICAgIHZhciBpc09iamVjdCA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkudG9Mb3dlckNhc2UoKSA9PT0gJ1tvYmplY3Qgb2JqZWN0XSc7XG4gICAgICB2YXIgaXNOdWxsID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKS50b0xvd2VyQ2FzZSgpID09PSAnW29iamVjdCBudWxsXSc7XG4gICAgICB2YXIgaXNVbmRlZmluZWQgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLnRvTG93ZXJDYXNlKCkgPT09ICdbb2JqZWN0IHVuZGVmaW5lZF0nO1xuXG4gICAgICBmb3IgKHZhciBpID0gdGhpcy5jYWNoZWRPcHRpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHZhciBjYWNoZWRPcHRpb24gPSB0aGlzLmNhY2hlZE9wdGlvbnNbaV07XG4gICAgICAgIHZhciBpc0VxdWFsID0gaXNPYmplY3QgPyBPYmplY3QodXRpbF9bXCJnZXRWYWx1ZUJ5UGF0aFwiXSkoY2FjaGVkT3B0aW9uLnZhbHVlLCB0aGlzLnZhbHVlS2V5KSA9PT0gT2JqZWN0KHV0aWxfW1wiZ2V0VmFsdWVCeVBhdGhcIl0pKHZhbHVlLCB0aGlzLnZhbHVlS2V5KSA6IGNhY2hlZE9wdGlvbi52YWx1ZSA9PT0gdmFsdWU7XG4gICAgICAgIGlmIChpc0VxdWFsKSB7XG4gICAgICAgICAgb3B0aW9uID0gY2FjaGVkT3B0aW9uO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9uKSByZXR1cm4gb3B0aW9uO1xuICAgICAgdmFyIGxhYmVsID0gIWlzT2JqZWN0ICYmICFpc051bGwgJiYgIWlzVW5kZWZpbmVkID8gU3RyaW5nKHZhbHVlKSA6ICcnO1xuICAgICAgdmFyIG5ld09wdGlvbiA9IHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBjdXJyZW50TGFiZWw6IGxhYmVsXG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgbmV3T3B0aW9uLmhpdFN0YXRlID0gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3T3B0aW9uO1xuICAgIH0sXG4gICAgc2V0U2VsZWN0ZWQ6IGZ1bmN0aW9uIHNldFNlbGVjdGVkKCkge1xuICAgICAgdmFyIF90aGlzOCA9IHRoaXM7XG5cbiAgICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgICB2YXIgb3B0aW9uID0gdGhpcy5nZXRPcHRpb24odGhpcy52YWx1ZSk7XG4gICAgICAgIGlmIChvcHRpb24uY3JlYXRlZCkge1xuICAgICAgICAgIHRoaXMuY3JlYXRlZExhYmVsID0gb3B0aW9uLmN1cnJlbnRMYWJlbDtcbiAgICAgICAgICB0aGlzLmNyZWF0ZWRTZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jcmVhdGVkU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGVkTGFiZWwgPSBvcHRpb24uY3VycmVudExhYmVsO1xuICAgICAgICB0aGlzLnNlbGVjdGVkID0gb3B0aW9uO1xuICAgICAgICBpZiAodGhpcy5maWx0ZXJhYmxlKSB0aGlzLnF1ZXJ5ID0gdGhpcy5zZWxlY3RlZExhYmVsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSkge1xuICAgICAgICB0aGlzLnZhbHVlLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goX3RoaXM4LmdldE9wdGlvbih2YWx1ZSkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSByZXN1bHQ7XG4gICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzOC5yZXNldElucHV0SGVpZ2h0KCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGhhbmRsZUZvY3VzOiBmdW5jdGlvbiBoYW5kbGVGb2N1cyhldmVudCkge1xuICAgICAgaWYgKCF0aGlzLnNvZnRGb2N1cykge1xuICAgICAgICBpZiAodGhpcy5hdXRvbWF0aWNEcm9wZG93biB8fCB0aGlzLmZpbHRlcmFibGUpIHtcbiAgICAgICAgICBpZiAodGhpcy5maWx0ZXJhYmxlICYmICF0aGlzLnZpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMubWVudVZpc2libGVPbkZvY3VzID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiRlbWl0KCdmb2N1cycsIGV2ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc29mdEZvY3VzID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSxcbiAgICBibHVyOiBmdW5jdGlvbiBibHVyKCkge1xuICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgICB0aGlzLiRyZWZzLnJlZmVyZW5jZS5ibHVyKCk7XG4gICAgfSxcbiAgICBoYW5kbGVCbHVyOiBmdW5jdGlvbiBoYW5kbGVCbHVyKGV2ZW50KSB7XG4gICAgICB2YXIgX3RoaXM5ID0gdGhpcztcblxuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChfdGhpczkuaXNTaWxlbnRCbHVyKSB7XG4gICAgICAgICAgX3RoaXM5LmlzU2lsZW50Qmx1ciA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF90aGlzOS4kZW1pdCgnYmx1cicsIGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSwgNTApO1xuICAgICAgdGhpcy5zb2Z0Rm9jdXMgPSBmYWxzZTtcbiAgICB9LFxuICAgIGhhbmRsZUNsZWFyQ2xpY2s6IGZ1bmN0aW9uIGhhbmRsZUNsZWFyQ2xpY2soZXZlbnQpIHtcbiAgICAgIHRoaXMuZGVsZXRlU2VsZWN0ZWQoZXZlbnQpO1xuICAgIH0sXG4gICAgZG9EZXN0cm95OiBmdW5jdGlvbiBkb0Rlc3Ryb3koKSB7XG4gICAgICB0aGlzLiRyZWZzLnBvcHBlciAmJiB0aGlzLiRyZWZzLnBvcHBlci5kb0Rlc3Ryb3koKTtcbiAgICB9LFxuICAgIGhhbmRsZUNsb3NlOiBmdW5jdGlvbiBoYW5kbGVDbG9zZSgpIHtcbiAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgIH0sXG4gICAgdG9nZ2xlTGFzdE9wdGlvbkhpdFN0YXRlOiBmdW5jdGlvbiB0b2dnbGVMYXN0T3B0aW9uSGl0U3RhdGUoaGl0KSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodGhpcy5zZWxlY3RlZCkpIHJldHVybjtcbiAgICAgIHZhciBvcHRpb24gPSB0aGlzLnNlbGVjdGVkW3RoaXMuc2VsZWN0ZWQubGVuZ3RoIC0gMV07XG4gICAgICBpZiAoIW9wdGlvbikgcmV0dXJuO1xuXG4gICAgICBpZiAoaGl0ID09PSB0cnVlIHx8IGhpdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgb3B0aW9uLmhpdFN0YXRlID0gaGl0O1xuICAgICAgICByZXR1cm4gaGl0O1xuICAgICAgfVxuXG4gICAgICBvcHRpb24uaGl0U3RhdGUgPSAhb3B0aW9uLmhpdFN0YXRlO1xuICAgICAgcmV0dXJuIG9wdGlvbi5oaXRTdGF0ZTtcbiAgICB9LFxuICAgIGRlbGV0ZVByZXZUYWc6IGZ1bmN0aW9uIGRlbGV0ZVByZXZUYWcoZSkge1xuICAgICAgaWYgKGUudGFyZ2V0LnZhbHVlLmxlbmd0aCA8PSAwICYmICF0aGlzLnRvZ2dsZUxhc3RPcHRpb25IaXRTdGF0ZSgpKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWUuc2xpY2UoKTtcbiAgICAgICAgdmFsdWUucG9wKCk7XG4gICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsdWUpO1xuICAgICAgICB0aGlzLmVtaXRDaGFuZ2UodmFsdWUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgbWFuYWdlUGxhY2Vob2xkZXI6IGZ1bmN0aW9uIG1hbmFnZVBsYWNlaG9sZGVyKCkge1xuICAgICAgaWYgKHRoaXMuY3VycmVudFBsYWNlaG9sZGVyICE9PSAnJykge1xuICAgICAgICB0aGlzLmN1cnJlbnRQbGFjZWhvbGRlciA9IHRoaXMuJHJlZnMuaW5wdXQudmFsdWUgPyAnJyA6IHRoaXMuY2FjaGVkUGxhY2VIb2xkZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICByZXNldElucHV0U3RhdGU6IGZ1bmN0aW9uIHJlc2V0SW5wdXRTdGF0ZShlKSB7XG4gICAgICBpZiAoZS5rZXlDb2RlICE9PSA4KSB0aGlzLnRvZ2dsZUxhc3RPcHRpb25IaXRTdGF0ZShmYWxzZSk7XG4gICAgICB0aGlzLmlucHV0TGVuZ3RoID0gdGhpcy4kcmVmcy5pbnB1dC52YWx1ZS5sZW5ndGggKiAxNSArIDIwO1xuICAgICAgdGhpcy5yZXNldElucHV0SGVpZ2h0KCk7XG4gICAgfSxcbiAgICByZXNldElucHV0SGVpZ2h0OiBmdW5jdGlvbiByZXNldElucHV0SGVpZ2h0KCkge1xuICAgICAgdmFyIF90aGlzMTAgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5jb2xsYXBzZVRhZ3MgJiYgIXRoaXMuZmlsdGVyYWJsZSkgcmV0dXJuO1xuICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIV90aGlzMTAuJHJlZnMucmVmZXJlbmNlKSByZXR1cm47XG4gICAgICAgIHZhciBpbnB1dENoaWxkTm9kZXMgPSBfdGhpczEwLiRyZWZzLnJlZmVyZW5jZS4kZWwuY2hpbGROb2RlcztcbiAgICAgICAgdmFyIGlucHV0ID0gW10uZmlsdGVyLmNhbGwoaW5wdXRDaGlsZE5vZGVzLCBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgIHJldHVybiBpdGVtLnRhZ05hbWUgPT09ICdJTlBVVCc7XG4gICAgICAgIH0pWzBdO1xuICAgICAgICB2YXIgdGFncyA9IF90aGlzMTAuJHJlZnMudGFncztcbiAgICAgICAgdmFyIHRhZ3NIZWlnaHQgPSB0YWdzID8gTWF0aC5yb3VuZCh0YWdzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCkgOiAwO1xuICAgICAgICB2YXIgc2l6ZUluTWFwID0gX3RoaXMxMC5pbml0aWFsSW5wdXRIZWlnaHQgfHwgNDA7XG4gICAgICAgIGlucHV0LnN0eWxlLmhlaWdodCA9IF90aGlzMTAuc2VsZWN0ZWQubGVuZ3RoID09PSAwID8gc2l6ZUluTWFwICsgJ3B4JyA6IE1hdGgubWF4KHRhZ3MgPyB0YWdzSGVpZ2h0ICsgKHRhZ3NIZWlnaHQgPiBzaXplSW5NYXAgPyA2IDogMCkgOiAwLCBzaXplSW5NYXApICsgJ3B4JztcbiAgICAgICAgaWYgKF90aGlzMTAudmlzaWJsZSAmJiBfdGhpczEwLmVtcHR5VGV4dCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBfdGhpczEwLmJyb2FkY2FzdCgnRWxTZWxlY3REcm9wZG93bicsICd1cGRhdGVQb3BwZXInKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICByZXNldEhvdmVySW5kZXg6IGZ1bmN0aW9uIHJlc2V0SG92ZXJJbmRleCgpIHtcbiAgICAgIHZhciBfdGhpczExID0gdGhpcztcblxuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghX3RoaXMxMS5tdWx0aXBsZSkge1xuICAgICAgICAgIF90aGlzMTEuaG92ZXJJbmRleCA9IF90aGlzMTEub3B0aW9ucy5pbmRleE9mKF90aGlzMTEuc2VsZWN0ZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChfdGhpczExLnNlbGVjdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF90aGlzMTEuaG92ZXJJbmRleCA9IE1hdGgubWluLmFwcGx5KG51bGwsIF90aGlzMTEuc2VsZWN0ZWQubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgIHJldHVybiBfdGhpczExLm9wdGlvbnMuaW5kZXhPZihpdGVtKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX3RoaXMxMS5ob3ZlckluZGV4ID0gLTE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCAzMDApO1xuICAgIH0sXG4gICAgaGFuZGxlT3B0aW9uU2VsZWN0OiBmdW5jdGlvbiBoYW5kbGVPcHRpb25TZWxlY3Qob3B0aW9uLCBieUNsaWNrKSB7XG4gICAgICB2YXIgX3RoaXMxMiA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9ICh0aGlzLnZhbHVlIHx8IFtdKS5zbGljZSgpO1xuICAgICAgICB2YXIgb3B0aW9uSW5kZXggPSB0aGlzLmdldFZhbHVlSW5kZXgodmFsdWUsIG9wdGlvbi52YWx1ZSk7XG4gICAgICAgIGlmIChvcHRpb25JbmRleCA+IC0xKSB7XG4gICAgICAgICAgdmFsdWUuc3BsaWNlKG9wdGlvbkluZGV4LCAxKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm11bHRpcGxlTGltaXQgPD0gMCB8fCB2YWx1ZS5sZW5ndGggPCB0aGlzLm11bHRpcGxlTGltaXQpIHtcbiAgICAgICAgICB2YWx1ZS5wdXNoKG9wdGlvbi52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWx1ZSk7XG4gICAgICAgIHRoaXMuZW1pdENoYW5nZSh2YWx1ZSk7XG4gICAgICAgIGlmIChvcHRpb24uY3JlYXRlZCkge1xuICAgICAgICAgIHRoaXMucXVlcnkgPSAnJztcbiAgICAgICAgICB0aGlzLmhhbmRsZVF1ZXJ5Q2hhbmdlKCcnKTtcbiAgICAgICAgICB0aGlzLmlucHV0TGVuZ3RoID0gMjA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyYWJsZSkgdGhpcy4kcmVmcy5pbnB1dC5mb2N1cygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBvcHRpb24udmFsdWUpO1xuICAgICAgICB0aGlzLmVtaXRDaGFuZ2Uob3B0aW9uLnZhbHVlKTtcbiAgICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aGlzLmlzU2lsZW50Qmx1ciA9IGJ5Q2xpY2s7XG4gICAgICB0aGlzLnNldFNvZnRGb2N1cygpO1xuICAgICAgaWYgKHRoaXMudmlzaWJsZSkgcmV0dXJuO1xuICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczEyLnNjcm9sbFRvT3B0aW9uKG9wdGlvbik7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHNldFNvZnRGb2N1czogZnVuY3Rpb24gc2V0U29mdEZvY3VzKCkge1xuICAgICAgdGhpcy5zb2Z0Rm9jdXMgPSB0cnVlO1xuICAgICAgdmFyIGlucHV0ID0gdGhpcy4kcmVmcy5pbnB1dCB8fCB0aGlzLiRyZWZzLnJlZmVyZW5jZTtcbiAgICAgIGlmIChpbnB1dCkge1xuICAgICAgICBpbnB1dC5mb2N1cygpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZ2V0VmFsdWVJbmRleDogZnVuY3Rpb24gZ2V0VmFsdWVJbmRleCgpIHtcbiAgICAgIHZhciBhcnIgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFtdO1xuICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzWzFdO1xuXG4gICAgICB2YXIgaXNPYmplY3QgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLnRvTG93ZXJDYXNlKCkgPT09ICdbb2JqZWN0IG9iamVjdF0nO1xuICAgICAgaWYgKCFpc09iamVjdCkge1xuICAgICAgICByZXR1cm4gYXJyLmluZGV4T2YodmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHZhbHVlS2V5ID0gdGhpcy52YWx1ZUtleTtcbiAgICAgICAgdmFyIGluZGV4ID0gLTE7XG4gICAgICAgIGFyci5zb21lKGZ1bmN0aW9uIChpdGVtLCBpKSB7XG4gICAgICAgICAgaWYgKE9iamVjdCh1dGlsX1tcImdldFZhbHVlQnlQYXRoXCJdKShpdGVtLCB2YWx1ZUtleSkgPT09IE9iamVjdCh1dGlsX1tcImdldFZhbHVlQnlQYXRoXCJdKSh2YWx1ZSwgdmFsdWVLZXkpKSB7XG4gICAgICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH0sXG4gICAgdG9nZ2xlTWVudTogZnVuY3Rpb24gdG9nZ2xlTWVudSgpIHtcbiAgICAgIGlmICghdGhpcy5zZWxlY3REaXNhYmxlZCkge1xuICAgICAgICBpZiAodGhpcy5tZW51VmlzaWJsZU9uRm9jdXMpIHtcbiAgICAgICAgICB0aGlzLm1lbnVWaXNpYmxlT25Gb2N1cyA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudmlzaWJsZSA9ICF0aGlzLnZpc2libGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudmlzaWJsZSkge1xuICAgICAgICAgICh0aGlzLiRyZWZzLmlucHV0IHx8IHRoaXMuJHJlZnMucmVmZXJlbmNlKS5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBzZWxlY3RPcHRpb246IGZ1bmN0aW9uIHNlbGVjdE9wdGlvbigpIHtcbiAgICAgIGlmICghdGhpcy52aXNpYmxlKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlTWVudSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9uc1t0aGlzLmhvdmVySW5kZXhdKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVPcHRpb25TZWxlY3QodGhpcy5vcHRpb25zW3RoaXMuaG92ZXJJbmRleF0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBkZWxldGVTZWxlY3RlZDogZnVuY3Rpb24gZGVsZXRlU2VsZWN0ZWQoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdmFyIHZhbHVlID0gdGhpcy5tdWx0aXBsZSA/IFtdIDogJyc7XG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbHVlKTtcbiAgICAgIHRoaXMuZW1pdENoYW5nZSh2YWx1ZSk7XG4gICAgICB0aGlzLnZpc2libGUgPSBmYWxzZTtcbiAgICAgIHRoaXMuJGVtaXQoJ2NsZWFyJyk7XG4gICAgfSxcbiAgICBkZWxldGVUYWc6IGZ1bmN0aW9uIGRlbGV0ZVRhZyhldmVudCwgdGFnKSB7XG4gICAgICB2YXIgaW5kZXggPSB0aGlzLnNlbGVjdGVkLmluZGV4T2YodGFnKTtcbiAgICAgIGlmIChpbmRleCA+IC0xICYmICF0aGlzLnNlbGVjdERpc2FibGVkKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWUuc2xpY2UoKTtcbiAgICAgICAgdmFsdWUuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWx1ZSk7XG4gICAgICAgIHRoaXMuZW1pdENoYW5nZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3JlbW92ZS10YWcnLCB0YWcudmFsdWUpO1xuICAgICAgfVxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSxcbiAgICBvbklucHV0Q2hhbmdlOiBmdW5jdGlvbiBvbklucHV0Q2hhbmdlKCkge1xuICAgICAgaWYgKHRoaXMuZmlsdGVyYWJsZSAmJiB0aGlzLnF1ZXJ5ICE9PSB0aGlzLnNlbGVjdGVkTGFiZWwpIHtcbiAgICAgICAgdGhpcy5xdWVyeSA9IHRoaXMuc2VsZWN0ZWRMYWJlbDtcbiAgICAgICAgdGhpcy5oYW5kbGVRdWVyeUNoYW5nZSh0aGlzLnF1ZXJ5KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uT3B0aW9uRGVzdHJveTogZnVuY3Rpb24gb25PcHRpb25EZXN0cm95KGluZGV4KSB7XG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICB0aGlzLm9wdGlvbnNDb3VudC0tO1xuICAgICAgICB0aGlzLmZpbHRlcmVkT3B0aW9uc0NvdW50LS07XG4gICAgICAgIHRoaXMub3B0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH0sXG4gICAgcmVzZXRJbnB1dFdpZHRoOiBmdW5jdGlvbiByZXNldElucHV0V2lkdGgoKSB7XG4gICAgICB0aGlzLmlucHV0V2lkdGggPSB0aGlzLiRyZWZzLnJlZmVyZW5jZS4kZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgfSxcbiAgICBoYW5kbGVSZXNpemU6IGZ1bmN0aW9uIGhhbmRsZVJlc2l6ZSgpIHtcbiAgICAgIHRoaXMucmVzZXRJbnB1dFdpZHRoKCk7XG4gICAgICBpZiAodGhpcy5tdWx0aXBsZSkgdGhpcy5yZXNldElucHV0SGVpZ2h0KCk7XG4gICAgfSxcbiAgICBjaGVja0RlZmF1bHRGaXJzdE9wdGlvbjogZnVuY3Rpb24gY2hlY2tEZWZhdWx0Rmlyc3RPcHRpb24oKSB7XG4gICAgICB0aGlzLmhvdmVySW5kZXggPSAtMTtcbiAgICAgIC8vIGhpZ2hsaWdodCB0aGUgY3JlYXRlZCBvcHRpb25cbiAgICAgIHZhciBoYXNDcmVhdGVkID0gZmFsc2U7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy5vcHRpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnNbaV0uY3JlYXRlZCkge1xuICAgICAgICAgIGhhc0NyZWF0ZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuaG92ZXJJbmRleCA9IGk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChoYXNDcmVhdGVkKSByZXR1cm47XG4gICAgICBmb3IgKHZhciBfaSA9IDA7IF9pICE9PSB0aGlzLm9wdGlvbnMubGVuZ3RoOyArK19pKSB7XG4gICAgICAgIHZhciBvcHRpb24gPSB0aGlzLm9wdGlvbnNbX2ldO1xuICAgICAgICBpZiAodGhpcy5xdWVyeSkge1xuICAgICAgICAgIC8vIGhpZ2hsaWdodCBmaXJzdCBvcHRpb25zIHRoYXQgcGFzc2VzIHRoZSBmaWx0ZXJcbiAgICAgICAgICBpZiAoIW9wdGlvbi5kaXNhYmxlZCAmJiAhb3B0aW9uLmdyb3VwRGlzYWJsZWQgJiYgb3B0aW9uLnZpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMuaG92ZXJJbmRleCA9IF9pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGhpZ2hsaWdodCBjdXJyZW50bHkgc2VsZWN0ZWQgb3B0aW9uXG4gICAgICAgICAgaWYgKG9wdGlvbi5pdGVtU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaG92ZXJJbmRleCA9IF9pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBnZXRWYWx1ZUtleTogZnVuY3Rpb24gZ2V0VmFsdWVLZXkoaXRlbSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpdGVtLnZhbHVlKS50b0xvd2VyQ2FzZSgpICE9PSAnW29iamVjdCBvYmplY3RdJykge1xuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBPYmplY3QodXRpbF9bXCJnZXRWYWx1ZUJ5UGF0aFwiXSkoaXRlbS52YWx1ZSwgdGhpcy52YWx1ZUtleSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG4gICAgdmFyIF90aGlzMTMgPSB0aGlzO1xuXG4gICAgdGhpcy5jYWNoZWRQbGFjZUhvbGRlciA9IHRoaXMuY3VycmVudFBsYWNlaG9sZGVyID0gdGhpcy5wcm9wUGxhY2Vob2xkZXI7XG4gICAgaWYgKHRoaXMubXVsdGlwbGUgJiYgIUFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkpIHtcbiAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgW10pO1xuICAgIH1cbiAgICBpZiAoIXRoaXMubXVsdGlwbGUgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSkge1xuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCAnJyk7XG4gICAgfVxuXG4gICAgdGhpcy5kZWJvdW5jZWRPbklucHV0Q2hhbmdlID0gZGVib3VuY2VfZGVmYXVsdCgpKHRoaXMuZGVib3VuY2UsIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzMTMub25JbnB1dENoYW5nZSgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5kZWJvdW5jZWRRdWVyeUNoYW5nZSA9IGRlYm91bmNlX2RlZmF1bHQoKSh0aGlzLmRlYm91bmNlLCBmdW5jdGlvbiAoZSkge1xuICAgICAgX3RoaXMxMy5oYW5kbGVRdWVyeUNoYW5nZShlLnRhcmdldC52YWx1ZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLiRvbignaGFuZGxlT3B0aW9uQ2xpY2snLCB0aGlzLmhhbmRsZU9wdGlvblNlbGVjdCk7XG4gICAgdGhpcy4kb24oJ3NldFNlbGVjdGVkJywgdGhpcy5zZXRTZWxlY3RlZCk7XG4gIH0sXG4gIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG4gICAgdmFyIF90aGlzMTQgPSB0aGlzO1xuXG4gICAgaWYgKHRoaXMubXVsdGlwbGUgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSAmJiB0aGlzLnZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuY3VycmVudFBsYWNlaG9sZGVyID0gJyc7XG4gICAgfVxuICAgIE9iamVjdChyZXNpemVfZXZlbnRfW1wiYWRkUmVzaXplTGlzdGVuZXJcIl0pKHRoaXMuJGVsLCB0aGlzLmhhbmRsZVJlc2l6ZSk7XG5cbiAgICB2YXIgcmVmZXJlbmNlID0gdGhpcy4kcmVmcy5yZWZlcmVuY2U7XG4gICAgaWYgKHJlZmVyZW5jZSAmJiByZWZlcmVuY2UuJGVsKSB7XG4gICAgICB2YXIgc2l6ZU1hcCA9IHtcbiAgICAgICAgbWVkaXVtOiAzNixcbiAgICAgICAgc21hbGw6IDMyLFxuICAgICAgICBtaW5pOiAyOFxuICAgICAgfTtcbiAgICAgIHZhciBpbnB1dCA9IHJlZmVyZW5jZS4kZWwucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcbiAgICAgIHRoaXMuaW5pdGlhbElucHV0SGVpZ2h0ID0gaW5wdXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0IHx8IHNpemVNYXBbdGhpcy5zZWxlY3RTaXplXTtcbiAgICB9XG4gICAgaWYgKHRoaXMucmVtb3RlICYmIHRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHRoaXMucmVzZXRJbnB1dEhlaWdodCgpO1xuICAgIH1cbiAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAocmVmZXJlbmNlICYmIHJlZmVyZW5jZS4kZWwpIHtcbiAgICAgICAgX3RoaXMxNC5pbnB1dFdpZHRoID0gcmVmZXJlbmNlLiRlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnNldFNlbGVjdGVkKCk7XG4gIH0sXG4gIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuJGVsICYmIHRoaXMuaGFuZGxlUmVzaXplKSBPYmplY3QocmVzaXplX2V2ZW50X1tcInJlbW92ZVJlc2l6ZUxpc3RlbmVyXCJdKSh0aGlzLiRlbCwgdGhpcy5oYW5kbGVSZXNpemUpO1xuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvc2VsZWN0L3NyYy9zZWxlY3QudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19zZWxlY3R2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoc2VsZWN0dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL3NlbGVjdC9zcmMvc2VsZWN0LnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIHNlbGVjdF9jb21wb25lbnQgPSBPYmplY3QoY29tcG9uZW50Tm9ybWFsaXplcltcImFcIiAvKiBkZWZhdWx0ICovXSkoXG4gIHNyY19zZWxlY3R2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sXG4gIHJlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgbnVsbCxcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKGZhbHNlKSB7IHZhciBzZWxlY3RfYXBpOyB9XG5zZWxlY3RfY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9zZWxlY3Qvc3JjL3NlbGVjdC52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX3NlbGVjdCA9IChzZWxlY3RfY29tcG9uZW50LmV4cG9ydHMpO1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9zZWxlY3QvaW5kZXguanNcblxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuc3JjX3NlbGVjdC5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KHNyY19zZWxlY3QubmFtZSwgc3JjX3NlbGVjdCk7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBwYWNrYWdlc19zZWxlY3QgPSBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IChzcmNfc2VsZWN0KTtcblxuLyoqKi8gfSlcblxuLyoqKioqKi8gfSk7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4e4b\n')},5128:function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\nexports.PopupManager = undefined;\n\nvar _vue = __webpack_require__(\"2b0e\");\n\nvar _vue2 = _interopRequireDefault(_vue);\n\nvar _merge = __webpack_require__(\"7f4d\");\n\nvar _merge2 = _interopRequireDefault(_merge);\n\nvar _popupManager = __webpack_require__(\"4b26\");\n\nvar _popupManager2 = _interopRequireDefault(_popupManager);\n\nvar _scrollbarWidth = __webpack_require__(\"e62d\");\n\nvar _scrollbarWidth2 = _interopRequireDefault(_scrollbarWidth);\n\nvar _dom = __webpack_require__(\"5924\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar idSeed = 1;\n\nvar scrollBarWidth = void 0;\n\nexports.default = {\n props: {\n visible: {\n type: Boolean,\n default: false\n },\n openDelay: {},\n closeDelay: {},\n zIndex: {},\n modal: {\n type: Boolean,\n default: false\n },\n modalFade: {\n type: Boolean,\n default: true\n },\n modalClass: {},\n modalAppendToBody: {\n type: Boolean,\n default: false\n },\n lockScroll: {\n type: Boolean,\n default: true\n },\n closeOnPressEscape: {\n type: Boolean,\n default: false\n },\n closeOnClickModal: {\n type: Boolean,\n default: false\n }\n },\n\n beforeMount: function beforeMount() {\n this._popupId = 'popup-' + idSeed++;\n _popupManager2.default.register(this._popupId, this);\n },\n beforeDestroy: function beforeDestroy() {\n _popupManager2.default.deregister(this._popupId);\n _popupManager2.default.closeModal(this._popupId);\n\n this.restoreBodyStyle();\n },\n data: function data() {\n return {\n opened: false,\n bodyPaddingRight: null,\n computedBodyPaddingRight: 0,\n withoutHiddenClass: true,\n rendered: false\n };\n },\n\n\n watch: {\n visible: function visible(val) {\n var _this = this;\n\n if (val) {\n if (this._opening) return;\n if (!this.rendered) {\n this.rendered = true;\n _vue2.default.nextTick(function () {\n _this.open();\n });\n } else {\n this.open();\n }\n } else {\n this.close();\n }\n }\n },\n\n methods: {\n open: function open(options) {\n var _this2 = this;\n\n if (!this.rendered) {\n this.rendered = true;\n }\n\n var props = (0, _merge2.default)({}, this.$props || this, options);\n\n if (this._closeTimer) {\n clearTimeout(this._closeTimer);\n this._closeTimer = null;\n }\n clearTimeout(this._openTimer);\n\n var openDelay = Number(props.openDelay);\n if (openDelay > 0) {\n this._openTimer = setTimeout(function () {\n _this2._openTimer = null;\n _this2.doOpen(props);\n }, openDelay);\n } else {\n this.doOpen(props);\n }\n },\n doOpen: function doOpen(props) {\n if (this.$isServer) return;\n if (this.willOpen && !this.willOpen()) return;\n if (this.opened) return;\n\n this._opening = true;\n\n var dom = this.$el;\n\n var modal = props.modal;\n\n var zIndex = props.zIndex;\n if (zIndex) {\n _popupManager2.default.zIndex = zIndex;\n }\n\n if (modal) {\n if (this._closing) {\n _popupManager2.default.closeModal(this._popupId);\n this._closing = false;\n }\n _popupManager2.default.openModal(this._popupId, _popupManager2.default.nextZIndex(), this.modalAppendToBody ? undefined : dom, props.modalClass, props.modalFade);\n if (props.lockScroll) {\n this.withoutHiddenClass = !(0, _dom.hasClass)(document.body, 'el-popup-parent--hidden');\n if (this.withoutHiddenClass) {\n this.bodyPaddingRight = document.body.style.paddingRight;\n this.computedBodyPaddingRight = parseInt((0, _dom.getStyle)(document.body, 'paddingRight'), 10);\n }\n scrollBarWidth = (0, _scrollbarWidth2.default)();\n var bodyHasOverflow = document.documentElement.clientHeight < document.body.scrollHeight;\n var bodyOverflowY = (0, _dom.getStyle)(document.body, 'overflowY');\n if (scrollBarWidth > 0 && (bodyHasOverflow || bodyOverflowY === 'scroll') && this.withoutHiddenClass) {\n document.body.style.paddingRight = this.computedBodyPaddingRight + scrollBarWidth + 'px';\n }\n (0, _dom.addClass)(document.body, 'el-popup-parent--hidden');\n }\n }\n\n if (getComputedStyle(dom).position === 'static') {\n dom.style.position = 'absolute';\n }\n\n dom.style.zIndex = _popupManager2.default.nextZIndex();\n this.opened = true;\n\n this.onOpen && this.onOpen();\n\n this.doAfterOpen();\n },\n doAfterOpen: function doAfterOpen() {\n this._opening = false;\n },\n close: function close() {\n var _this3 = this;\n\n if (this.willClose && !this.willClose()) return;\n\n if (this._openTimer !== null) {\n clearTimeout(this._openTimer);\n this._openTimer = null;\n }\n clearTimeout(this._closeTimer);\n\n var closeDelay = Number(this.closeDelay);\n\n if (closeDelay > 0) {\n this._closeTimer = setTimeout(function () {\n _this3._closeTimer = null;\n _this3.doClose();\n }, closeDelay);\n } else {\n this.doClose();\n }\n },\n doClose: function doClose() {\n this._closing = true;\n\n this.onClose && this.onClose();\n\n if (this.lockScroll) {\n setTimeout(this.restoreBodyStyle, 200);\n }\n\n this.opened = false;\n\n this.doAfterClose();\n },\n doAfterClose: function doAfterClose() {\n _popupManager2.default.closeModal(this._popupId);\n this._closing = false;\n },\n restoreBodyStyle: function restoreBodyStyle() {\n if (this.modal && this.withoutHiddenClass) {\n document.body.style.paddingRight = this.bodyPaddingRight;\n (0, _dom.removeClass)(document.body, 'el-popup-parent--hidden');\n }\n this.withoutHiddenClass = true;\n }\n }\n};\nexports.PopupManager = _popupManager2.default;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvdXRpbHMvcG9wdXAvaW5kZXguanM/NTEyOCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBOztBQUVBLFdBQVcsbUJBQU8sQ0FBQyxNQUFLOztBQUV4Qjs7QUFFQSxhQUFhLG1CQUFPLENBQUMsTUFBNEI7O0FBRWpEOztBQUVBLG9CQUFvQixtQkFBTyxDQUFDLE1BQTBDOztBQUV0RTs7QUFFQSxzQkFBc0IsbUJBQU8sQ0FBQyxNQUFvQjs7QUFFbEQ7O0FBRUEsV0FBVyxtQkFBTyxDQUFDLE1BQVE7O0FBRTNCLHNDQUFzQyx1Q0FBdUMsZ0JBQWdCOztBQUU3Rjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLGlCQUFpQjtBQUNqQixrQkFBa0I7QUFDbEIsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx5Q0FBeUM7O0FBRXpDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjUxMjguanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLlBvcHVwTWFuYWdlciA9IHVuZGVmaW5lZDtcblxudmFyIF92dWUgPSByZXF1aXJlKCd2dWUnKTtcblxudmFyIF92dWUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdnVlKTtcblxudmFyIF9tZXJnZSA9IHJlcXVpcmUoJ2VsZW1lbnQtdWkvbGliL3V0aWxzL21lcmdlJyk7XG5cbnZhciBfbWVyZ2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbWVyZ2UpO1xuXG52YXIgX3BvcHVwTWFuYWdlciA9IHJlcXVpcmUoJ2VsZW1lbnQtdWkvbGliL3V0aWxzL3BvcHVwL3BvcHVwLW1hbmFnZXInKTtcblxudmFyIF9wb3B1cE1hbmFnZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9wdXBNYW5hZ2VyKTtcblxudmFyIF9zY3JvbGxiYXJXaWR0aCA9IHJlcXVpcmUoJy4uL3Njcm9sbGJhci13aWR0aCcpO1xuXG52YXIgX3Njcm9sbGJhcldpZHRoMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Njcm9sbGJhcldpZHRoKTtcblxudmFyIF9kb20gPSByZXF1aXJlKCcuLi9kb20nKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIGlkU2VlZCA9IDE7XG5cbnZhciBzY3JvbGxCYXJXaWR0aCA9IHZvaWQgMDtcblxuZXhwb3J0cy5kZWZhdWx0ID0ge1xuICBwcm9wczoge1xuICAgIHZpc2libGU6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0sXG4gICAgb3BlbkRlbGF5OiB7fSxcbiAgICBjbG9zZURlbGF5OiB7fSxcbiAgICB6SW5kZXg6IHt9LFxuICAgIG1vZGFsOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9LFxuICAgIG1vZGFsRmFkZToge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIG1vZGFsQ2xhc3M6IHt9LFxuICAgIG1vZGFsQXBwZW5kVG9Cb2R5OiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9LFxuICAgIGxvY2tTY3JvbGw6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICBjbG9zZU9uUHJlc3NFc2NhcGU6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0sXG4gICAgY2xvc2VPbkNsaWNrTW9kYWw6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBiZWZvcmVNb3VudDogZnVuY3Rpb24gYmVmb3JlTW91bnQoKSB7XG4gICAgdGhpcy5fcG9wdXBJZCA9ICdwb3B1cC0nICsgaWRTZWVkKys7XG4gICAgX3BvcHVwTWFuYWdlcjIuZGVmYXVsdC5yZWdpc3Rlcih0aGlzLl9wb3B1cElkLCB0aGlzKTtcbiAgfSxcbiAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcbiAgICBfcG9wdXBNYW5hZ2VyMi5kZWZhdWx0LmRlcmVnaXN0ZXIodGhpcy5fcG9wdXBJZCk7XG4gICAgX3BvcHVwTWFuYWdlcjIuZGVmYXVsdC5jbG9zZU1vZGFsKHRoaXMuX3BvcHVwSWQpO1xuXG4gICAgdGhpcy5yZXN0b3JlQm9keVN0eWxlKCk7XG4gIH0sXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wZW5lZDogZmFsc2UsXG4gICAgICBib2R5UGFkZGluZ1JpZ2h0OiBudWxsLFxuICAgICAgY29tcHV0ZWRCb2R5UGFkZGluZ1JpZ2h0OiAwLFxuICAgICAgd2l0aG91dEhpZGRlbkNsYXNzOiB0cnVlLFxuICAgICAgcmVuZGVyZWQ6IGZhbHNlXG4gICAgfTtcbiAgfSxcblxuXG4gIHdhdGNoOiB7XG4gICAgdmlzaWJsZTogZnVuY3Rpb24gdmlzaWJsZSh2YWwpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmICh2YWwpIHtcbiAgICAgICAgaWYgKHRoaXMuX29wZW5pbmcpIHJldHVybjtcbiAgICAgICAgaWYgKCF0aGlzLnJlbmRlcmVkKSB7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlZCA9IHRydWU7XG4gICAgICAgICAgX3Z1ZTIuZGVmYXVsdC5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpcy5vcGVuKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIG9wZW46IGZ1bmN0aW9uIG9wZW4ob3B0aW9ucykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIGlmICghdGhpcy5yZW5kZXJlZCkge1xuICAgICAgICB0aGlzLnJlbmRlcmVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHByb3BzID0gKDAsIF9tZXJnZTIuZGVmYXVsdCkoe30sIHRoaXMuJHByb3BzIHx8IHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgICBpZiAodGhpcy5fY2xvc2VUaW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fY2xvc2VUaW1lcik7XG4gICAgICAgIHRoaXMuX2Nsb3NlVGltZXIgPSBudWxsO1xuICAgICAgfVxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX29wZW5UaW1lcik7XG5cbiAgICAgIHZhciBvcGVuRGVsYXkgPSBOdW1iZXIocHJvcHMub3BlbkRlbGF5KTtcbiAgICAgIGlmIChvcGVuRGVsYXkgPiAwKSB7XG4gICAgICAgIHRoaXMuX29wZW5UaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzMi5fb3BlblRpbWVyID0gbnVsbDtcbiAgICAgICAgICBfdGhpczIuZG9PcGVuKHByb3BzKTtcbiAgICAgICAgfSwgb3BlbkRlbGF5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZG9PcGVuKHByb3BzKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRvT3BlbjogZnVuY3Rpb24gZG9PcGVuKHByb3BzKSB7XG4gICAgICBpZiAodGhpcy4kaXNTZXJ2ZXIpIHJldHVybjtcbiAgICAgIGlmICh0aGlzLndpbGxPcGVuICYmICF0aGlzLndpbGxPcGVuKCkpIHJldHVybjtcbiAgICAgIGlmICh0aGlzLm9wZW5lZCkgcmV0dXJuO1xuXG4gICAgICB0aGlzLl9vcGVuaW5nID0gdHJ1ZTtcblxuICAgICAgdmFyIGRvbSA9IHRoaXMuJGVsO1xuXG4gICAgICB2YXIgbW9kYWwgPSBwcm9wcy5tb2RhbDtcblxuICAgICAgdmFyIHpJbmRleCA9IHByb3BzLnpJbmRleDtcbiAgICAgIGlmICh6SW5kZXgpIHtcbiAgICAgICAgX3BvcHVwTWFuYWdlcjIuZGVmYXVsdC56SW5kZXggPSB6SW5kZXg7XG4gICAgICB9XG5cbiAgICAgIGlmIChtb2RhbCkge1xuICAgICAgICBpZiAodGhpcy5fY2xvc2luZykge1xuICAgICAgICAgIF9wb3B1cE1hbmFnZXIyLmRlZmF1bHQuY2xvc2VNb2RhbCh0aGlzLl9wb3B1cElkKTtcbiAgICAgICAgICB0aGlzLl9jbG9zaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgX3BvcHVwTWFuYWdlcjIuZGVmYXVsdC5vcGVuTW9kYWwodGhpcy5fcG9wdXBJZCwgX3BvcHVwTWFuYWdlcjIuZGVmYXVsdC5uZXh0WkluZGV4KCksIHRoaXMubW9kYWxBcHBlbmRUb0JvZHkgPyB1bmRlZmluZWQgOiBkb20sIHByb3BzLm1vZGFsQ2xhc3MsIHByb3BzLm1vZGFsRmFkZSk7XG4gICAgICAgIGlmIChwcm9wcy5sb2NrU2Nyb2xsKSB7XG4gICAgICAgICAgdGhpcy53aXRob3V0SGlkZGVuQ2xhc3MgPSAhKDAsIF9kb20uaGFzQ2xhc3MpKGRvY3VtZW50LmJvZHksICdlbC1wb3B1cC1wYXJlbnQtLWhpZGRlbicpO1xuICAgICAgICAgIGlmICh0aGlzLndpdGhvdXRIaWRkZW5DbGFzcykge1xuICAgICAgICAgICAgdGhpcy5ib2R5UGFkZGluZ1JpZ2h0ID0gZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQ7XG4gICAgICAgICAgICB0aGlzLmNvbXB1dGVkQm9keVBhZGRpbmdSaWdodCA9IHBhcnNlSW50KCgwLCBfZG9tLmdldFN0eWxlKShkb2N1bWVudC5ib2R5LCAncGFkZGluZ1JpZ2h0JyksIDEwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2Nyb2xsQmFyV2lkdGggPSAoMCwgX3Njcm9sbGJhcldpZHRoMi5kZWZhdWx0KSgpO1xuICAgICAgICAgIHZhciBib2R5SGFzT3ZlcmZsb3cgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0IDwgZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQ7XG4gICAgICAgICAgdmFyIGJvZHlPdmVyZmxvd1kgPSAoMCwgX2RvbS5nZXRTdHlsZSkoZG9jdW1lbnQuYm9keSwgJ292ZXJmbG93WScpO1xuICAgICAgICAgIGlmIChzY3JvbGxCYXJXaWR0aCA+IDAgJiYgKGJvZHlIYXNPdmVyZmxvdyB8fCBib2R5T3ZlcmZsb3dZID09PSAnc2Nyb2xsJykgJiYgdGhpcy53aXRob3V0SGlkZGVuQ2xhc3MpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0ID0gdGhpcy5jb21wdXRlZEJvZHlQYWRkaW5nUmlnaHQgKyBzY3JvbGxCYXJXaWR0aCArICdweCc7XG4gICAgICAgICAgfVxuICAgICAgICAgICgwLCBfZG9tLmFkZENsYXNzKShkb2N1bWVudC5ib2R5LCAnZWwtcG9wdXAtcGFyZW50LS1oaWRkZW4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShkb20pLnBvc2l0aW9uID09PSAnc3RhdGljJykge1xuICAgICAgICBkb20uc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgfVxuXG4gICAgICBkb20uc3R5bGUuekluZGV4ID0gX3BvcHVwTWFuYWdlcjIuZGVmYXVsdC5uZXh0WkluZGV4KCk7XG4gICAgICB0aGlzLm9wZW5lZCA9IHRydWU7XG5cbiAgICAgIHRoaXMub25PcGVuICYmIHRoaXMub25PcGVuKCk7XG5cbiAgICAgIHRoaXMuZG9BZnRlck9wZW4oKTtcbiAgICB9LFxuICAgIGRvQWZ0ZXJPcGVuOiBmdW5jdGlvbiBkb0FmdGVyT3BlbigpIHtcbiAgICAgIHRoaXMuX29wZW5pbmcgPSBmYWxzZTtcbiAgICB9LFxuICAgIGNsb3NlOiBmdW5jdGlvbiBjbG9zZSgpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy53aWxsQ2xvc2UgJiYgIXRoaXMud2lsbENsb3NlKCkpIHJldHVybjtcblxuICAgICAgaWYgKHRoaXMuX29wZW5UaW1lciAhPT0gbnVsbCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fb3BlblRpbWVyKTtcbiAgICAgICAgdGhpcy5fb3BlblRpbWVyID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9jbG9zZVRpbWVyKTtcblxuICAgICAgdmFyIGNsb3NlRGVsYXkgPSBOdW1iZXIodGhpcy5jbG9zZURlbGF5KTtcblxuICAgICAgaWYgKGNsb3NlRGVsYXkgPiAwKSB7XG4gICAgICAgIHRoaXMuX2Nsb3NlVGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpczMuX2Nsb3NlVGltZXIgPSBudWxsO1xuICAgICAgICAgIF90aGlzMy5kb0Nsb3NlKCk7XG4gICAgICAgIH0sIGNsb3NlRGVsYXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kb0Nsb3NlKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBkb0Nsb3NlOiBmdW5jdGlvbiBkb0Nsb3NlKCkge1xuICAgICAgdGhpcy5fY2xvc2luZyA9IHRydWU7XG5cbiAgICAgIHRoaXMub25DbG9zZSAmJiB0aGlzLm9uQ2xvc2UoKTtcblxuICAgICAgaWYgKHRoaXMubG9ja1Njcm9sbCkge1xuICAgICAgICBzZXRUaW1lb3V0KHRoaXMucmVzdG9yZUJvZHlTdHlsZSwgMjAwKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5vcGVuZWQgPSBmYWxzZTtcblxuICAgICAgdGhpcy5kb0FmdGVyQ2xvc2UoKTtcbiAgICB9LFxuICAgIGRvQWZ0ZXJDbG9zZTogZnVuY3Rpb24gZG9BZnRlckNsb3NlKCkge1xuICAgICAgX3BvcHVwTWFuYWdlcjIuZGVmYXVsdC5jbG9zZU1vZGFsKHRoaXMuX3BvcHVwSWQpO1xuICAgICAgdGhpcy5fY2xvc2luZyA9IGZhbHNlO1xuICAgIH0sXG4gICAgcmVzdG9yZUJvZHlTdHlsZTogZnVuY3Rpb24gcmVzdG9yZUJvZHlTdHlsZSgpIHtcbiAgICAgIGlmICh0aGlzLm1vZGFsICYmIHRoaXMud2l0aG91dEhpZGRlbkNsYXNzKSB7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0ID0gdGhpcy5ib2R5UGFkZGluZ1JpZ2h0O1xuICAgICAgICAoMCwgX2RvbS5yZW1vdmVDbGFzcykoZG9jdW1lbnQuYm9keSwgJ2VsLXBvcHVwLXBhcmVudC0taGlkZGVuJyk7XG4gICAgICB9XG4gICAgICB0aGlzLndpdGhvdXRIaWRkZW5DbGFzcyA9IHRydWU7XG4gICAgfVxuICB9XG59O1xuZXhwb3J0cy5Qb3B1cE1hbmFnZXIgPSBfcG9wdXBNYW5hZ2VyMi5kZWZhdWx0OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5128\n")},5488:function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\n\nvar _dom = __webpack_require__(\"5924\");\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Transition = function () {\n function Transition() {\n _classCallCheck(this, Transition);\n }\n\n Transition.prototype.beforeEnter = function beforeEnter(el) {\n (0, _dom.addClass)(el, 'collapse-transition');\n if (!el.dataset) el.dataset = {};\n\n el.dataset.oldPaddingTop = el.style.paddingTop;\n el.dataset.oldPaddingBottom = el.style.paddingBottom;\n\n el.style.height = '0';\n el.style.paddingTop = 0;\n el.style.paddingBottom = 0;\n };\n\n Transition.prototype.enter = function enter(el) {\n el.dataset.oldOverflow = el.style.overflow;\n if (el.scrollHeight !== 0) {\n el.style.height = el.scrollHeight + 'px';\n el.style.paddingTop = el.dataset.oldPaddingTop;\n el.style.paddingBottom = el.dataset.oldPaddingBottom;\n } else {\n el.style.height = '';\n el.style.paddingTop = el.dataset.oldPaddingTop;\n el.style.paddingBottom = el.dataset.oldPaddingBottom;\n }\n\n el.style.overflow = 'hidden';\n };\n\n Transition.prototype.afterEnter = function afterEnter(el) {\n // for safari: remove class then reset height is necessary\n (0, _dom.removeClass)(el, 'collapse-transition');\n el.style.height = '';\n el.style.overflow = el.dataset.oldOverflow;\n };\n\n Transition.prototype.beforeLeave = function beforeLeave(el) {\n if (!el.dataset) el.dataset = {};\n el.dataset.oldPaddingTop = el.style.paddingTop;\n el.dataset.oldPaddingBottom = el.style.paddingBottom;\n el.dataset.oldOverflow = el.style.overflow;\n\n el.style.height = el.scrollHeight + 'px';\n el.style.overflow = 'hidden';\n };\n\n Transition.prototype.leave = function leave(el) {\n if (el.scrollHeight !== 0) {\n // for safari: add class after set height, or it will jump to zero height suddenly, weired\n (0, _dom.addClass)(el, 'collapse-transition');\n el.style.height = 0;\n el.style.paddingTop = 0;\n el.style.paddingBottom = 0;\n }\n };\n\n Transition.prototype.afterLeave = function afterLeave(el) {\n (0, _dom.removeClass)(el, 'collapse-transition');\n el.style.height = '';\n el.style.overflow = el.dataset.oldOverflow;\n el.style.paddingTop = el.dataset.oldPaddingTop;\n el.style.paddingBottom = el.dataset.oldPaddingBottom;\n };\n\n return Transition;\n}();\n\nexports.default = {\n name: 'ElCollapseTransition',\n functional: true,\n render: function render(h, _ref) {\n var children = _ref.children;\n\n var data = {\n on: new Transition()\n };\n\n return h('transition', data, children);\n }\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvdHJhbnNpdGlvbnMvY29sbGFwc2UtdHJhbnNpdGlvbi5qcz81NDg4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViOztBQUVBLFdBQVcsbUJBQU8sQ0FBQyxNQUEwQjs7QUFFN0MsaURBQWlELDBDQUEwQywwREFBMEQsRUFBRTs7QUFFdko7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBIiwiZmlsZSI6IjU0ODguanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZG9tID0gcmVxdWlyZSgnZWxlbWVudC11aS9saWIvdXRpbHMvZG9tJyk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBUcmFuc2l0aW9uID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBUcmFuc2l0aW9uKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUcmFuc2l0aW9uKTtcbiAgfVxuXG4gIFRyYW5zaXRpb24ucHJvdG90eXBlLmJlZm9yZUVudGVyID0gZnVuY3Rpb24gYmVmb3JlRW50ZXIoZWwpIHtcbiAgICAoMCwgX2RvbS5hZGRDbGFzcykoZWwsICdjb2xsYXBzZS10cmFuc2l0aW9uJyk7XG4gICAgaWYgKCFlbC5kYXRhc2V0KSBlbC5kYXRhc2V0ID0ge307XG5cbiAgICBlbC5kYXRhc2V0Lm9sZFBhZGRpbmdUb3AgPSBlbC5zdHlsZS5wYWRkaW5nVG9wO1xuICAgIGVsLmRhdGFzZXQub2xkUGFkZGluZ0JvdHRvbSA9IGVsLnN0eWxlLnBhZGRpbmdCb3R0b207XG5cbiAgICBlbC5zdHlsZS5oZWlnaHQgPSAnMCc7XG4gICAgZWwuc3R5bGUucGFkZGluZ1RvcCA9IDA7XG4gICAgZWwuc3R5bGUucGFkZGluZ0JvdHRvbSA9IDA7XG4gIH07XG5cbiAgVHJhbnNpdGlvbi5wcm90b3R5cGUuZW50ZXIgPSBmdW5jdGlvbiBlbnRlcihlbCkge1xuICAgIGVsLmRhdGFzZXQub2xkT3ZlcmZsb3cgPSBlbC5zdHlsZS5vdmVyZmxvdztcbiAgICBpZiAoZWwuc2Nyb2xsSGVpZ2h0ICE9PSAwKSB7XG4gICAgICBlbC5zdHlsZS5oZWlnaHQgPSBlbC5zY3JvbGxIZWlnaHQgKyAncHgnO1xuICAgICAgZWwuc3R5bGUucGFkZGluZ1RvcCA9IGVsLmRhdGFzZXQub2xkUGFkZGluZ1RvcDtcbiAgICAgIGVsLnN0eWxlLnBhZGRpbmdCb3R0b20gPSBlbC5kYXRhc2V0Lm9sZFBhZGRpbmdCb3R0b207XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsLnN0eWxlLmhlaWdodCA9ICcnO1xuICAgICAgZWwuc3R5bGUucGFkZGluZ1RvcCA9IGVsLmRhdGFzZXQub2xkUGFkZGluZ1RvcDtcbiAgICAgIGVsLnN0eWxlLnBhZGRpbmdCb3R0b20gPSBlbC5kYXRhc2V0Lm9sZFBhZGRpbmdCb3R0b207XG4gICAgfVxuXG4gICAgZWwuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgfTtcblxuICBUcmFuc2l0aW9uLnByb3RvdHlwZS5hZnRlckVudGVyID0gZnVuY3Rpb24gYWZ0ZXJFbnRlcihlbCkge1xuICAgIC8vIGZvciBzYWZhcmk6IHJlbW92ZSBjbGFzcyB0aGVuIHJlc2V0IGhlaWdodCBpcyBuZWNlc3NhcnlcbiAgICAoMCwgX2RvbS5yZW1vdmVDbGFzcykoZWwsICdjb2xsYXBzZS10cmFuc2l0aW9uJyk7XG4gICAgZWwuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgZWwuc3R5bGUub3ZlcmZsb3cgPSBlbC5kYXRhc2V0Lm9sZE92ZXJmbG93O1xuICB9O1xuXG4gIFRyYW5zaXRpb24ucHJvdG90eXBlLmJlZm9yZUxlYXZlID0gZnVuY3Rpb24gYmVmb3JlTGVhdmUoZWwpIHtcbiAgICBpZiAoIWVsLmRhdGFzZXQpIGVsLmRhdGFzZXQgPSB7fTtcbiAgICBlbC5kYXRhc2V0Lm9sZFBhZGRpbmdUb3AgPSBlbC5zdHlsZS5wYWRkaW5nVG9wO1xuICAgIGVsLmRhdGFzZXQub2xkUGFkZGluZ0JvdHRvbSA9IGVsLnN0eWxlLnBhZGRpbmdCb3R0b207XG4gICAgZWwuZGF0YXNldC5vbGRPdmVyZmxvdyA9IGVsLnN0eWxlLm92ZXJmbG93O1xuXG4gICAgZWwuc3R5bGUuaGVpZ2h0ID0gZWwuc2Nyb2xsSGVpZ2h0ICsgJ3B4JztcbiAgICBlbC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICB9O1xuXG4gIFRyYW5zaXRpb24ucHJvdG90eXBlLmxlYXZlID0gZnVuY3Rpb24gbGVhdmUoZWwpIHtcbiAgICBpZiAoZWwuc2Nyb2xsSGVpZ2h0ICE9PSAwKSB7XG4gICAgICAvLyBmb3Igc2FmYXJpOiBhZGQgY2xhc3MgYWZ0ZXIgc2V0IGhlaWdodCwgb3IgaXQgd2lsbCBqdW1wIHRvIHplcm8gaGVpZ2h0IHN1ZGRlbmx5LCB3ZWlyZWRcbiAgICAgICgwLCBfZG9tLmFkZENsYXNzKShlbCwgJ2NvbGxhcHNlLXRyYW5zaXRpb24nKTtcbiAgICAgIGVsLnN0eWxlLmhlaWdodCA9IDA7XG4gICAgICBlbC5zdHlsZS5wYWRkaW5nVG9wID0gMDtcbiAgICAgIGVsLnN0eWxlLnBhZGRpbmdCb3R0b20gPSAwO1xuICAgIH1cbiAgfTtcblxuICBUcmFuc2l0aW9uLnByb3RvdHlwZS5hZnRlckxlYXZlID0gZnVuY3Rpb24gYWZ0ZXJMZWF2ZShlbCkge1xuICAgICgwLCBfZG9tLnJlbW92ZUNsYXNzKShlbCwgJ2NvbGxhcHNlLXRyYW5zaXRpb24nKTtcbiAgICBlbC5zdHlsZS5oZWlnaHQgPSAnJztcbiAgICBlbC5zdHlsZS5vdmVyZmxvdyA9IGVsLmRhdGFzZXQub2xkT3ZlcmZsb3c7XG4gICAgZWwuc3R5bGUucGFkZGluZ1RvcCA9IGVsLmRhdGFzZXQub2xkUGFkZGluZ1RvcDtcbiAgICBlbC5zdHlsZS5wYWRkaW5nQm90dG9tID0gZWwuZGF0YXNldC5vbGRQYWRkaW5nQm90dG9tO1xuICB9O1xuXG4gIHJldHVybiBUcmFuc2l0aW9uO1xufSgpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSB7XG4gIG5hbWU6ICdFbENvbGxhcHNlVHJhbnNpdGlvbicsXG4gIGZ1bmN0aW9uYWw6IHRydWUsXG4gIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKGgsIF9yZWYpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuO1xuXG4gICAgdmFyIGRhdGEgPSB7XG4gICAgICBvbjogbmV3IFRyYW5zaXRpb24oKVxuICAgIH07XG5cbiAgICByZXR1cm4gaCgndHJhbnNpdGlvbicsIGRhdGEsIGNoaWxkcmVuKTtcbiAgfVxufTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5488\n")},5858:function(module,exports,__webpack_require__){"use strict";eval("/* WEBPACK VAR INJECTION */(function(global, module) {var __WEBPACK_AMD_DEFINE_RESULT__;var _typeof=typeof Symbol===\"function\"&&typeof Symbol.iterator===\"symbol\"?function(obj){return typeof obj;}:function(obj){return obj&&typeof Symbol===\"function\"&&obj.constructor===Symbol&&obj!==Symbol.prototype?\"symbol\":typeof obj;};/**\n * @license\n * Lodash \n * Copyright JS Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n *//*eslint-disable*/(function(){/** Used as a safe reference for `undefined` in pre-ES5 environments. */var undefined;/** Used as the semantic version number. */var VERSION='4.17.10';/** Used as the size to enable large array optimizations. */var LARGE_ARRAY_SIZE=200;/** Error message constants. */var CORE_ERROR_TEXT='Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',FUNC_ERROR_TEXT='Expected a function';/** Used to stand-in for `undefined` hash values. */var HASH_UNDEFINED='__lodash_hash_undefined__';/** Used as the maximum memoize cache size. */var MAX_MEMOIZE_SIZE=500;/** Used as the internal argument placeholder. */var PLACEHOLDER='__lodash_placeholder__';/** Used to compose bitmasks for cloning. */var CLONE_DEEP_FLAG=1,CLONE_FLAT_FLAG=2,CLONE_SYMBOLS_FLAG=4;/** Used to compose bitmasks for value comparisons. */var COMPARE_PARTIAL_FLAG=1,COMPARE_UNORDERED_FLAG=2;/** Used to compose bitmasks for function metadata. */var WRAP_BIND_FLAG=1,WRAP_BIND_KEY_FLAG=2,WRAP_CURRY_BOUND_FLAG=4,WRAP_CURRY_FLAG=8,WRAP_CURRY_RIGHT_FLAG=16,WRAP_PARTIAL_FLAG=32,WRAP_PARTIAL_RIGHT_FLAG=64,WRAP_ARY_FLAG=128,WRAP_REARG_FLAG=256,WRAP_FLIP_FLAG=512;/** Used as default options for `_.truncate`. */var DEFAULT_TRUNC_LENGTH=30,DEFAULT_TRUNC_OMISSION='...';/** Used to detect hot functions by number of calls within a span of milliseconds. */var HOT_COUNT=800,HOT_SPAN=16;/** Used to indicate the type of lazy iteratees. */var LAZY_FILTER_FLAG=1,LAZY_MAP_FLAG=2,LAZY_WHILE_FLAG=3;/** Used as references for various `Number` constants. */var INFINITY=1/0,MAX_SAFE_INTEGER=9007199254740991,MAX_INTEGER=1.7976931348623157e308,NAN=0/0;/** Used as references for the maximum length and index of an array. */var MAX_ARRAY_LENGTH=4294967295,MAX_ARRAY_INDEX=MAX_ARRAY_LENGTH-1,HALF_MAX_ARRAY_LENGTH=MAX_ARRAY_LENGTH>>>1;/** Used to associate wrap methods with their bit flags. */var wrapFlags=[['ary',WRAP_ARY_FLAG],['bind',WRAP_BIND_FLAG],['bindKey',WRAP_BIND_KEY_FLAG],['curry',WRAP_CURRY_FLAG],['curryRight',WRAP_CURRY_RIGHT_FLAG],['flip',WRAP_FLIP_FLAG],['partial',WRAP_PARTIAL_FLAG],['partialRight',WRAP_PARTIAL_RIGHT_FLAG],['rearg',WRAP_REARG_FLAG]];/** `Object#toString` result references. */var argsTag='[object Arguments]',arrayTag='[object Array]',asyncTag='[object AsyncFunction]',boolTag='[object Boolean]',dateTag='[object Date]',domExcTag='[object DOMException]',errorTag='[object Error]',funcTag='[object Function]',genTag='[object GeneratorFunction]',mapTag='[object Map]',numberTag='[object Number]',nullTag='[object Null]',objectTag='[object Object]',promiseTag='[object Promise]',proxyTag='[object Proxy]',regexpTag='[object RegExp]',setTag='[object Set]',stringTag='[object String]',symbolTag='[object Symbol]',undefinedTag='[object Undefined]',weakMapTag='[object WeakMap]',weakSetTag='[object WeakSet]';var arrayBufferTag='[object ArrayBuffer]',dataViewTag='[object DataView]',float32Tag='[object Float32Array]',float64Tag='[object Float64Array]',int8Tag='[object Int8Array]',int16Tag='[object Int16Array]',int32Tag='[object Int32Array]',uint8Tag='[object Uint8Array]',uint8ClampedTag='[object Uint8ClampedArray]',uint16Tag='[object Uint16Array]',uint32Tag='[object Uint32Array]';/** Used to match empty string literals in compiled template source. */var reEmptyStringLeading=/\\b__p \\+= '';/g,reEmptyStringMiddle=/\\b(__p \\+=) '' \\+/g,reEmptyStringTrailing=/(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;/** Used to match HTML entities and HTML characters. */var reEscapedHtml=/&(?:amp|lt|gt|quot|#39);/g,reUnescapedHtml=/[&<>\"']/g,reHasEscapedHtml=RegExp(reEscapedHtml.source),reHasUnescapedHtml=RegExp(reUnescapedHtml.source);/** Used to match template delimiters. */var reEscape=/<%-([\\s\\S]+?)%>/g,reEvaluate=/<%([\\s\\S]+?)%>/g,reInterpolate=/<%=([\\s\\S]+?)%>/g;/** Used to match property names within property paths. */var reIsDeepProp=/\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,reIsPlainProp=/^\\w*$/,rePropName=/[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */var reRegExpChar=/[\\\\^$.*+?()[\\]{}|]/g,reHasRegExpChar=RegExp(reRegExpChar.source);/** Used to match leading and trailing whitespace. */var reTrim=/^\\s+|\\s+$/g,reTrimStart=/^\\s+/,reTrimEnd=/\\s+$/;/** Used to match wrap detail comments. */var reWrapComment=/\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,reWrapDetails=/\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,reSplitDetails=/,? & /;/** Used to match words composed of alphanumeric characters. */var reAsciiWord=/[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;/** Used to match backslashes in property paths. */var reEscapeChar=/\\\\(\\\\)?/g;/**\n * Used to match\n * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\n */var reEsTemplate=/\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;/** Used to match `RegExp` flags from their coerced string values. */var reFlags=/\\w*$/;/** Used to detect bad signed hexadecimal string values. */var reIsBadHex=/^[-+]0x[0-9a-f]+$/i;/** Used to detect binary string values. */var reIsBinary=/^0b[01]+$/i;/** Used to detect host constructors (Safari). */var reIsHostCtor=/^\\[object .+?Constructor\\]$/;/** Used to detect octal string values. */var reIsOctal=/^0o[0-7]+$/i;/** Used to detect unsigned integer values. */var reIsUint=/^(?:0|[1-9]\\d*)$/;/** Used to match Latin Unicode letters (excluding mathematical operators). */var reLatin=/[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;/** Used to ensure capturing order of template delimiters. */var reNoMatch=/($^)/;/** Used to match unescaped characters in compiled string literals. */var reUnescapedString=/['\\n\\r\\u2028\\u2029\\\\]/g;/** Used to compose unicode character classes. */var rsAstralRange='\\\\ud800-\\\\udfff',rsComboMarksRange='\\\\u0300-\\\\u036f',reComboHalfMarksRange='\\\\ufe20-\\\\ufe2f',rsComboSymbolsRange='\\\\u20d0-\\\\u20ff',rsComboRange=rsComboMarksRange+reComboHalfMarksRange+rsComboSymbolsRange,rsDingbatRange='\\\\u2700-\\\\u27bf',rsLowerRange='a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',rsMathOpRange='\\\\xac\\\\xb1\\\\xd7\\\\xf7',rsNonCharRange='\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',rsPunctuationRange='\\\\u2000-\\\\u206f',rsSpaceRange=' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',rsUpperRange='A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',rsVarRange='\\\\ufe0e\\\\ufe0f',rsBreakRange=rsMathOpRange+rsNonCharRange+rsPunctuationRange+rsSpaceRange;/** Used to compose unicode capture groups. */var rsApos='[\\'\\u2019]',rsAstral='['+rsAstralRange+']',rsBreak='['+rsBreakRange+']',rsCombo='['+rsComboRange+']',rsDigits='\\\\d+',rsDingbat='['+rsDingbatRange+']',rsLower='['+rsLowerRange+']',rsMisc='[^'+rsAstralRange+rsBreakRange+rsDigits+rsDingbatRange+rsLowerRange+rsUpperRange+']',rsFitz='\\\\ud83c[\\\\udffb-\\\\udfff]',rsModifier='(?:'+rsCombo+'|'+rsFitz+')',rsNonAstral='[^'+rsAstralRange+']',rsRegional='(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',rsSurrPair='[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',rsUpper='['+rsUpperRange+']',rsZWJ='\\\\u200d';/** Used to compose unicode regexes. */var rsMiscLower='(?:'+rsLower+'|'+rsMisc+')',rsMiscUpper='(?:'+rsUpper+'|'+rsMisc+')',rsOptContrLower='(?:'+rsApos+'(?:d|ll|m|re|s|t|ve))?',rsOptContrUpper='(?:'+rsApos+'(?:D|LL|M|RE|S|T|VE))?',reOptMod=rsModifier+'?',rsOptVar='['+rsVarRange+']?',rsOptJoin='(?:'+rsZWJ+'(?:'+[rsNonAstral,rsRegional,rsSurrPair].join('|')+')'+rsOptVar+reOptMod+')*',rsOrdLower='\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])',rsOrdUpper='\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])',rsSeq=rsOptVar+reOptMod+rsOptJoin,rsEmoji='(?:'+[rsDingbat,rsRegional,rsSurrPair].join('|')+')'+rsSeq,rsSymbol='(?:'+[rsNonAstral+rsCombo+'?',rsCombo,rsRegional,rsSurrPair,rsAstral].join('|')+')';/** Used to match apostrophes. */var reApos=RegExp(rsApos,'g');/**\n * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n */var reComboMark=RegExp(rsCombo,'g');/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */var reUnicode=RegExp(rsFitz+'(?='+rsFitz+')|'+rsSymbol+rsSeq,'g');/** Used to match complex or compound words. */var reUnicodeWord=RegExp([rsUpper+'?'+rsLower+'+'+rsOptContrLower+'(?='+[rsBreak,rsUpper,'$'].join('|')+')',rsMiscUpper+'+'+rsOptContrUpper+'(?='+[rsBreak,rsUpper+rsMiscLower,'$'].join('|')+')',rsUpper+'?'+rsMiscLower+'+'+rsOptContrLower,rsUpper+'+'+rsOptContrUpper,rsOrdUpper,rsOrdLower,rsDigits,rsEmoji].join('|'),'g');/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */var reHasUnicode=RegExp('['+rsZWJ+rsAstralRange+rsComboRange+rsVarRange+']');/** Used to detect strings that need a more robust regexp to match words. */var reHasUnicodeWord=/[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;/** Used to assign default `context` object properties. */var contextProps=['Array','Buffer','DataView','Date','Error','Float32Array','Float64Array','Function','Int8Array','Int16Array','Int32Array','Map','Math','Object','Promise','RegExp','Set','String','Symbol','TypeError','Uint8Array','Uint8ClampedArray','Uint16Array','Uint32Array','WeakMap','_','clearTimeout','isFinite','parseInt','setTimeout'];/** Used to make template sourceURLs easier to identify. */var templateCounter=-1;/** Used to identify `toStringTag` values of typed arrays. */var typedArrayTags={};typedArrayTags[float32Tag]=typedArrayTags[float64Tag]=typedArrayTags[int8Tag]=typedArrayTags[int16Tag]=typedArrayTags[int32Tag]=typedArrayTags[uint8Tag]=typedArrayTags[uint8ClampedTag]=typedArrayTags[uint16Tag]=typedArrayTags[uint32Tag]=true;typedArrayTags[argsTag]=typedArrayTags[arrayTag]=typedArrayTags[arrayBufferTag]=typedArrayTags[boolTag]=typedArrayTags[dataViewTag]=typedArrayTags[dateTag]=typedArrayTags[errorTag]=typedArrayTags[funcTag]=typedArrayTags[mapTag]=typedArrayTags[numberTag]=typedArrayTags[objectTag]=typedArrayTags[regexpTag]=typedArrayTags[setTag]=typedArrayTags[stringTag]=typedArrayTags[weakMapTag]=false;/** Used to identify `toStringTag` values supported by `_.clone`. */var cloneableTags={};cloneableTags[argsTag]=cloneableTags[arrayTag]=cloneableTags[arrayBufferTag]=cloneableTags[dataViewTag]=cloneableTags[boolTag]=cloneableTags[dateTag]=cloneableTags[float32Tag]=cloneableTags[float64Tag]=cloneableTags[int8Tag]=cloneableTags[int16Tag]=cloneableTags[int32Tag]=cloneableTags[mapTag]=cloneableTags[numberTag]=cloneableTags[objectTag]=cloneableTags[regexpTag]=cloneableTags[setTag]=cloneableTags[stringTag]=cloneableTags[symbolTag]=cloneableTags[uint8Tag]=cloneableTags[uint8ClampedTag]=cloneableTags[uint16Tag]=cloneableTags[uint32Tag]=true;cloneableTags[errorTag]=cloneableTags[funcTag]=cloneableTags[weakMapTag]=false;/** Used to map Latin Unicode letters to basic Latin letters. */var deburredLetters={// Latin-1 Supplement block.\nÀ:'A',Á:'A',Â:'A',Ã:'A',Ä:'A',Å:'A',à:'a',á:'a',â:'a',ã:'a',ä:'a',å:'a',Ç:'C',ç:'c',Ð:'D',ð:'d',È:'E',É:'E',Ê:'E',Ë:'E',è:'e',é:'e',ê:'e',ë:'e',Ì:'I',Í:'I',Î:'I',Ï:'I',ì:'i',í:'i',î:'i',ï:'i',Ñ:'N',ñ:'n',Ò:'O',Ó:'O',Ô:'O',Õ:'O',Ö:'O',Ø:'O',ò:'o',ó:'o',ô:'o',õ:'o',ö:'o',ø:'o',Ù:'U',Ú:'U',Û:'U',Ü:'U',ù:'u',ú:'u',û:'u',ü:'u',Ý:'Y',ý:'y',ÿ:'y',Æ:'Ae',æ:'ae',Þ:'Th',þ:'th',ß:'ss',// Latin Extended-A block.\nĀ:'A',Ă:'A',Ą:'A',ā:'a',ă:'a',ą:'a',Ć:'C',Ĉ:'C',Ċ:'C',Č:'C',ć:'c',ĉ:'c',ċ:'c',č:'c',Ď:'D',Đ:'D',ď:'d',đ:'d',Ē:'E',Ĕ:'E',Ė:'E',Ę:'E',Ě:'E',ē:'e',ĕ:'e',ė:'e',ę:'e',ě:'e',Ĝ:'G',Ğ:'G',Ġ:'G',Ģ:'G',ĝ:'g',ğ:'g',ġ:'g',ģ:'g',Ĥ:'H',Ħ:'H',ĥ:'h',ħ:'h',Ĩ:'I',Ī:'I',Ĭ:'I',Į:'I',İ:'I',ĩ:'i',ī:'i',ĭ:'i',į:'i',ı:'i',Ĵ:'J',ĵ:'j',Ķ:'K',ķ:'k',ĸ:'k',Ĺ:'L',Ļ:'L',Ľ:'L',Ŀ:'L',Ł:'L',ĺ:'l',ļ:'l',ľ:'l',ŀ:'l',ł:'l',Ń:'N',Ņ:'N',Ň:'N',Ŋ:'N',ń:'n',ņ:'n',ň:'n',ŋ:'n',Ō:'O',Ŏ:'O',Ő:'O',ō:'o',ŏ:'o',ő:'o',Ŕ:'R',Ŗ:'R',Ř:'R',ŕ:'r',ŗ:'r',ř:'r',Ś:'S',Ŝ:'S',Ş:'S',Š:'S',ś:'s',ŝ:'s',ş:'s',š:'s',Ţ:'T',Ť:'T',Ŧ:'T',ţ:'t',ť:'t',ŧ:'t',Ũ:'U',Ū:'U',Ŭ:'U',Ů:'U',Ű:'U',Ų:'U',ũ:'u',ū:'u',ŭ:'u',ů:'u',ű:'u',ų:'u',Ŵ:'W',ŵ:'w',Ŷ:'Y',ŷ:'y',Ÿ:'Y',Ź:'Z',Ż:'Z',Ž:'Z',ź:'z',ż:'z',ž:'z',IJ:'IJ',ij:'ij',Œ:'Oe',œ:'oe',ʼn:\"'n\",ſ:'s'};/** Used to map characters to HTML entities. */var htmlEscapes={'&':'&','<':'<','>':'>','\"':'"',\"'\":'''};/** Used to map HTML entities to characters. */var htmlUnescapes={'&':'&','<':'<','>':'>','"':'\"',''':\"'\"};/** Used to escape characters for inclusion in compiled string literals. */var stringEscapes={'\\\\':'\\\\',\"'\":\"'\",'\\n':'n','\\r':'r','\\u2028':'u2028','\\u2029':'u2029'};/** Built-in method references without a dependency on `root`. */var freeParseFloat=parseFloat,freeParseInt=parseInt;/** Detect free variable `global` from Node.js. */var freeGlobal=(typeof global==='undefined'?'undefined':_typeof(global))==='object'&&global&&global.Object===Object&&global;/** Detect free variable `self`. */var freeSelf=(typeof self==='undefined'?'undefined':_typeof(self))==='object'&&self&&self.Object===Object&&self;/** Used as a reference to the global object. */var root=freeGlobal||freeSelf||Function('return this')();/** Detect free variable `exports`. */var freeExports=( false?undefined:_typeof(exports))==='object'&&exports&&!exports.nodeType&&exports;/** Detect free variable `module`. */var freeModule=freeExports&&( false?undefined:_typeof(module))==='object'&&module&&!module.nodeType&&module;/** Detect the popular CommonJS extension `module.exports`. */var moduleExports=freeModule&&freeModule.exports===freeExports;/** Detect free variable `process` from Node.js. */var freeProcess=moduleExports&&freeGlobal.process;/** Used to access faster Node.js helpers. */var nodeUtil=function(){try{// Use `util.types` for Node.js 10+.\nvar types=freeModule&&freeModule.require&&freeModule.require('util').types;if(types){return types;}// Legacy `process.binding('util')` for Node.js < 10.\nreturn freeProcess&&freeProcess.binding&&freeProcess.binding('util');}catch(e){}}();/* Node.js helper references. */var nodeIsArrayBuffer=nodeUtil&&nodeUtil.isArrayBuffer,nodeIsDate=nodeUtil&&nodeUtil.isDate,nodeIsMap=nodeUtil&&nodeUtil.isMap,nodeIsRegExp=nodeUtil&&nodeUtil.isRegExp,nodeIsSet=nodeUtil&&nodeUtil.isSet,nodeIsTypedArray=nodeUtil&&nodeUtil.isTypedArray;/* --------------------------------------------------------------------------*//**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */function apply(func,thisArg,args){switch(args.length){case 0:return func.call(thisArg);case 1:return func.call(thisArg,args[0]);case 2:return func.call(thisArg,args[0],args[1]);case 3:return func.call(thisArg,args[0],args[1],args[2]);}return func.apply(thisArg,args);}/**\n * A specialized version of `baseAggregator` for arrays.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */function arrayAggregator(array,setter,iteratee,accumulator){var index=-1,length=array==null?0:array.length;while(++index-1;}/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */function arrayIncludesWith(array,value,comparator){var index=-1,length=array==null?0:array.length;while(++index-1){}return index;}/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\n * that is not found in the character symbols.\n *\n * @private\n * @param {Array} strSymbols The string symbols to inspect.\n * @param {Array} chrSymbols The character symbols to find.\n * @returns {number} Returns the index of the last unmatched string symbol.\n */function charsEndIndex(strSymbols,chrSymbols){var index=strSymbols.length;while(index--&&baseIndexOf(chrSymbols,strSymbols[index],0)>-1){}return index;}/**\n * Gets the number of `placeholder` occurrences in `array`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} placeholder The placeholder to search for.\n * @returns {number} Returns the placeholder count.\n */function countHolders(array,placeholder){var length=array.length,result=0;while(length--){if(array[length]===placeholder){++result;}}return result;}/**\n * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n * letters to basic Latin letters.\n *\n * @private\n * @param {string} letter The matched letter to deburr.\n * @returns {string} Returns the deburred letter.\n */var deburrLetter=basePropertyOf(deburredLetters);/**\n * Used by `_.escape` to convert characters to HTML entities.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @returns {string} Returns the escaped character.\n */var escapeHtmlChar=basePropertyOf(htmlEscapes);/**\n * Used by `_.template` to escape characters for inclusion in compiled string literals.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @returns {string} Returns the escaped character.\n */function escapeStringChar(chr){return'\\\\'+stringEscapes[chr];}/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */function getValue(object,key){return object==null?undefined:object[key];}/**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */function hasUnicode(string){return reHasUnicode.test(string);}/**\n * Checks if `string` contains a word composed of Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a word is found, else `false`.\n */function hasUnicodeWord(string){return reHasUnicodeWord.test(string);}/**\n * Converts `iterator` to an array.\n *\n * @private\n * @param {Object} iterator The iterator to convert.\n * @returns {Array} Returns the converted array.\n */function iteratorToArray(iterator){var data,result=[];while(!(data=iterator.next()).done){result.push(data.value);}return result;}/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */function mapToArray(map){var index=-1,result=Array(map.size);map.forEach(function(value,key){result[++index]=[key,value];});return result;}/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */function overArg(func,transform){return function(arg){return func(transform(arg));};}/**\n * Replaces all `placeholder` elements in `array` with an internal placeholder\n * and returns an array of their indexes.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {*} placeholder The placeholder to replace.\n * @returns {Array} Returns the new array of placeholder indexes.\n */function replaceHolders(array,placeholder){var index=-1,length=array.length,resIndex=0,result=[];while(++index true\n * _.isFunction(_.bar);\n * // => false\n *\n * lodash.isFunction(lodash.foo);\n * // => false\n * lodash.isFunction(lodash.bar);\n * // => true\n *\n * // Create a suped-up `defer` in Node.js.\n * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\n */var runInContext=function runInContext(context){context=context==null?root:_.defaults(root.Object(),context,_.pick(root,contextProps));/** Built-in constructor references. */var Array=context.Array,Date=context.Date,Error=context.Error,Function=context.Function,Math=context.Math,Object=context.Object,RegExp=context.RegExp,String=context.String,TypeError=context.TypeError;/** Used for built-in method references. */var arrayProto=Array.prototype,funcProto=Function.prototype,objectProto=Object.prototype;/** Used to detect overreaching core-js shims. */var coreJsData=context['__core-js_shared__'];/** Used to resolve the decompiled source of functions. */var funcToString=funcProto.toString;/** Used to check objects for own properties. */var hasOwnProperty=objectProto.hasOwnProperty;/** Used to generate unique IDs. */var idCounter=0;/** Used to detect methods masquerading as native. */var maskSrcKey=function(){var uid=/[^.]+$/.exec(coreJsData&&coreJsData.keys&&coreJsData.keys.IE_PROTO||'');return uid?'Symbol(src)_1.'+uid:'';}();/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */var nativeObjectToString=objectProto.toString;/** Used to infer the `Object` constructor. */var objectCtorString=funcToString.call(Object);/** Used to restore the original `_` reference in `_.noConflict`. */var oldDash=root._;/** Used to detect if a method is native. */var reIsNative=RegExp('^'+funcToString.call(hasOwnProperty).replace(reRegExpChar,'\\\\$&').replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,'$1.*?')+'$');/** Built-in value references. */var Buffer=moduleExports?context.Buffer:undefined,_Symbol=context.Symbol,Uint8Array=context.Uint8Array,allocUnsafe=Buffer?Buffer.allocUnsafe:undefined,getPrototype=overArg(Object.getPrototypeOf,Object),objectCreate=Object.create,propertyIsEnumerable=objectProto.propertyIsEnumerable,splice=arrayProto.splice,spreadableSymbol=_Symbol?_Symbol.isConcatSpreadable:undefined,symIterator=_Symbol?_Symbol.iterator:undefined,symToStringTag=_Symbol?_Symbol.toStringTag:undefined;var defineProperty=function(){try{var func=getNative(Object,'defineProperty');func({},'',{});return func;}catch(e){}}();/** Mocked built-ins. */var ctxClearTimeout=context.clearTimeout!==root.clearTimeout&&context.clearTimeout,ctxNow=Date&&Date.now!==root.Date.now&&Date.now,ctxSetTimeout=context.setTimeout!==root.setTimeout&&context.setTimeout;/* Built-in method references for those with the same name as other `lodash` methods. */var nativeCeil=Math.ceil,nativeFloor=Math.floor,nativeGetSymbols=Object.getOwnPropertySymbols,nativeIsBuffer=Buffer?Buffer.isBuffer:undefined,nativeIsFinite=context.isFinite,nativeJoin=arrayProto.join,nativeKeys=overArg(Object.keys,Object),nativeMax=Math.max,nativeMin=Math.min,nativeNow=Date.now,nativeParseInt=context.parseInt,nativeRandom=Math.random,nativeReverse=arrayProto.reverse;/* Built-in method references that are verified to be native. */var DataView=getNative(context,'DataView'),Map=getNative(context,'Map'),Promise=getNative(context,'Promise'),Set=getNative(context,'Set'),WeakMap=getNative(context,'WeakMap'),nativeCreate=getNative(Object,'create');/** Used to store function metadata. */var metaMap=WeakMap&&new WeakMap();/** Used to lookup unminified function names. */var realNames={};/** Used to detect maps, sets, and weakmaps. */var dataViewCtorString=toSource(DataView),mapCtorString=toSource(Map),promiseCtorString=toSource(Promise),setCtorString=toSource(Set),weakMapCtorString=toSource(WeakMap);/** Used to convert symbols to primitives and strings. */var symbolProto=_Symbol?_Symbol.prototype:undefined,symbolValueOf=symbolProto?symbolProto.valueOf:undefined,symbolToString=symbolProto?symbolProto.toString:undefined;/* ------------------------------------------------------------------------*//**\n * Creates a `lodash` object which wraps `value` to enable implicit method\n * chain sequences. Methods that operate on and return arrays, collections,\n * and functions can be chained together. Methods that retrieve a single value\n * or may return a primitive value will automatically end the chain sequence\n * and return the unwrapped value. Otherwise, the value must be unwrapped\n * with `_#value`.\n *\n * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n * enabled using `_.chain`.\n *\n * The execution of chained methods is lazy, that is, it's deferred until\n * `_#value` is implicitly or explicitly called.\n *\n * Lazy evaluation allows several methods to support shortcut fusion.\n * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n * the creation of intermediate arrays and can greatly reduce the number of\n * iteratee executions. Sections of a chain sequence qualify for shortcut\n * fusion if the section is applied to an array and iteratees accept only\n * one argument. The heuristic for whether a section qualifies for shortcut\n * fusion is subject to change.\n *\n * Chaining is supported in custom builds as long as the `_#value` method is\n * directly or indirectly included in the build.\n *\n * In addition to lodash methods, wrappers have `Array` and `String` methods.\n *\n * The wrapper `Array` methods are:\n * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n *\n * The wrapper `String` methods are:\n * `replace` and `split`\n *\n * The wrapper methods that support shortcut fusion are:\n * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n *\n * The chainable wrapper methods are:\n * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n * `zipObject`, `zipObjectDeep`, and `zipWith`\n *\n * The wrapper methods that are **not** chainable by default are:\n * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n * `upperFirst`, `value`, and `words`\n *\n * @name _\n * @constructor\n * @category Seq\n * @param {*} value The value to wrap in a `lodash` instance.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var wrapped = _([1, 2, 3]);\n *\n * // Returns an unwrapped value.\n * wrapped.reduce(_.add);\n * // => 6\n *\n * // Returns a wrapped value.\n * var squares = wrapped.map(square);\n *\n * _.isArray(squares);\n * // => false\n *\n * _.isArray(squares.value());\n * // => true\n */function lodash(value){if(isObjectLike(value)&&!isArray(value)&&!(value instanceof LazyWrapper)){if(value instanceof LodashWrapper){return value;}if(hasOwnProperty.call(value,'__wrapped__')){return wrapperClone(value);}}return new LodashWrapper(value);}/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */var baseCreate=function(){function object(){}return function(proto){if(!isObject(proto)){return{};}if(objectCreate){return objectCreate(proto);}object.prototype=proto;var result=new object();object.prototype=undefined;return result;};}();/**\n * The function whose prototype chain sequence wrappers inherit from.\n *\n * @private\n */function baseLodash(){}// No operation performed.\n/**\n * The base constructor for creating `lodash` wrapper objects.\n *\n * @private\n * @param {*} value The value to wrap.\n * @param {boolean} [chainAll] Enable explicit method chain sequences.\n */function LodashWrapper(value,chainAll){this.__wrapped__=value;this.__actions__=[];this.__chain__=!!chainAll;this.__index__=0;this.__values__=undefined;}/**\n * By default, the template delimiters used by lodash are like those in\n * embedded Ruby (ERB) as well as ES2015 template strings. Change the\n * following template settings to use alternative delimiters.\n *\n * @static\n * @memberOf _\n * @type {Object}\n */lodash.templateSettings={/**\n * Used to detect `data` property values to be HTML-escaped.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */escape:reEscape,/**\n * Used to detect code to be evaluated.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */evaluate:reEvaluate,/**\n * Used to detect `data` property values to inject.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */interpolate:reInterpolate,/**\n * Used to reference the data object in the template text.\n *\n * @memberOf _.templateSettings\n * @type {string}\n */variable:'',/**\n * Used to import variables into the compiled template.\n *\n * @memberOf _.templateSettings\n * @type {Object}\n */imports:{/**\n * A reference to the `lodash` function.\n *\n * @memberOf _.templateSettings.imports\n * @type {Function}\n */_:lodash}};// Ensure wrappers are instances of `baseLodash`.\nlodash.prototype=baseLodash.prototype;lodash.prototype.constructor=lodash;LodashWrapper.prototype=baseCreate(baseLodash.prototype);LodashWrapper.prototype.constructor=LodashWrapper;/* ------------------------------------------------------------------------*//**\n * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n *\n * @private\n * @constructor\n * @param {*} value The value to wrap.\n */function LazyWrapper(value){this.__wrapped__=value;this.__actions__=[];this.__dir__=1;this.__filtered__=false;this.__iteratees__=[];this.__takeCount__=MAX_ARRAY_LENGTH;this.__views__=[];}/**\n * Creates a clone of the lazy wrapper object.\n *\n * @private\n * @name clone\n * @memberOf LazyWrapper\n * @returns {Object} Returns the cloned `LazyWrapper` object.\n */function lazyClone(){var result=new LazyWrapper(this.__wrapped__);result.__actions__=copyArray(this.__actions__);result.__dir__=this.__dir__;result.__filtered__=this.__filtered__;result.__iteratees__=copyArray(this.__iteratees__);result.__takeCount__=this.__takeCount__;result.__views__=copyArray(this.__views__);return result;}/**\n * Reverses the direction of lazy iteration.\n *\n * @private\n * @name reverse\n * @memberOf LazyWrapper\n * @returns {Object} Returns the new reversed `LazyWrapper` object.\n */function lazyReverse(){if(this.__filtered__){var result=new LazyWrapper(this);result.__dir__=-1;result.__filtered__=true;}else{result=this.clone();result.__dir__*=-1;}return result;}/**\n * Extracts the unwrapped value from its lazy wrapper.\n *\n * @private\n * @name value\n * @memberOf LazyWrapper\n * @returns {*} Returns the unwrapped value.\n */function lazyValue(){var array=this.__wrapped__.value(),dir=this.__dir__,isArr=isArray(array),isRight=dir<0,arrLength=isArr?array.length:0,view=getView(0,arrLength,this.__views__),start=view.start,end=view.end,length=end-start,index=isRight?end:start-1,iteratees=this.__iteratees__,iterLength=iteratees.length,resIndex=0,takeCount=nativeMin(length,this.__takeCount__);if(!isArr||!isRight&&arrLength==length&&takeCount==length){return baseWrapperValue(array,this.__actions__);}var result=[];outer:while(length--&&resIndex-1;}/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */function listCacheSet(key,value){var data=this.__data__,index=assocIndexOf(data,key);if(index<0){++this.size;data.push([key,value]);}else{data[index][1]=value;}return this;}// Add methods to `ListCache`.\nListCache.prototype.clear=listCacheClear;ListCache.prototype['delete']=listCacheDelete;ListCache.prototype.get=listCacheGet;ListCache.prototype.has=listCacheHas;ListCache.prototype.set=listCacheSet;/* ------------------------------------------------------------------------*//**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */function MapCache(entries){var index=-1,length=entries==null?0:entries.length;this.clear();while(++index=lower?number:lower;}}return number;}/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Deep clone\n * 2 - Flatten inherited properties\n * 4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */function baseClone(value,bitmask,customizer,key,object,stack){var result,isDeep=bitmask&CLONE_DEEP_FLAG,isFlat=bitmask&CLONE_FLAT_FLAG,isFull=bitmask&CLONE_SYMBOLS_FLAG;if(customizer){result=object?customizer(value,key,object,stack):customizer(value);}if(result!==undefined){return result;}if(!isObject(value)){return value;}var isArr=isArray(value);if(isArr){result=initCloneArray(value);if(!isDeep){return copyArray(value,result);}}else{var tag=getTag(value),isFunc=tag==funcTag||tag==genTag;if(isBuffer(value)){return cloneBuffer(value,isDeep);}if(tag==objectTag||tag==argsTag||isFunc&&!object){result=isFlat||isFunc?{}:initCloneObject(value);if(!isDeep){return isFlat?copySymbolsIn(value,baseAssignIn(result,value)):copySymbols(value,baseAssign(result,value));}}else{if(!cloneableTags[tag]){return object?value:{};}result=initCloneByTag(value,tag,isDeep);}}// Check for circular references and return its corresponding clone.\nstack||(stack=new Stack());var stacked=stack.get(value);if(stacked){return stacked;}stack.set(value,result);if(isSet(value)){value.forEach(function(subValue){result.add(baseClone(subValue,bitmask,customizer,subValue,value,stack));});return result;}if(isMap(value)){value.forEach(function(subValue,key){result.set(key,baseClone(subValue,bitmask,customizer,key,value,stack));});return result;}var keysFunc=isFull?isFlat?getAllKeysIn:getAllKeys:isFlat?keysIn:keys;var props=isArr?undefined:keysFunc(value);arrayEach(props||value,function(subValue,key){if(props){key=subValue;subValue=value[key];}// Recursively populate clone (susceptible to call stack limits).\nassignValue(result,key,baseClone(subValue,bitmask,customizer,key,value,stack));});return result;}/**\n * The base implementation of `_.conforms` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property predicates to conform to.\n * @returns {Function} Returns the new spec function.\n */function baseConforms(source){var props=keys(source);return function(object){return baseConformsTo(object,source,props);};}/**\n * The base implementation of `_.conformsTo` which accepts `props` to check.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property predicates to conform to.\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n */function baseConformsTo(object,source,props){var length=props.length;if(object==null){return!length;}object=Object(object);while(length--){var key=props[length],predicate=source[key],value=object[key];if(value===undefined&&!(key in object)||!predicate(value)){return false;}}return true;}/**\n * The base implementation of `_.delay` and `_.defer` which accepts `args`\n * to provide to `func`.\n *\n * @private\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @param {Array} args The arguments to provide to `func`.\n * @returns {number|Object} Returns the timer id or timeout object.\n */function baseDelay(func,wait,args){if(typeof func!=='function'){throw new TypeError(FUNC_ERROR_TEXT);}return setTimeout(function(){func.apply(undefined,args);},wait);}/**\n * The base implementation of methods like `_.difference` without support\n * for excluding multiple arrays or iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Array} values The values to exclude.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n */function baseDifference(array,values,iteratee,comparator){var index=-1,includes=arrayIncludes,isCommon=true,length=array.length,result=[],valuesLength=values.length;if(!length){return result;}if(iteratee){values=arrayMap(values,baseUnary(iteratee));}if(comparator){includes=arrayIncludesWith;isCommon=false;}else if(values.length>=LARGE_ARRAY_SIZE){includes=cacheHas;isCommon=false;values=new SetCache(values);}outer:while(++indexlength?0:length+start;}end=end===undefined||end>length?length:toInteger(end);if(end<0){end+=length;}end=start>end?0:toLength(end);while(start0&&predicate(value)){if(depth>1){// Recursively flatten arrays (susceptible to call stack limits).\nbaseFlatten(value,depth-1,predicate,isStrict,result);}else{arrayPush(result,value);}}else if(!isStrict){result[result.length]=value;}}return result;}/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */var baseFor=createBaseFor();/**\n * This function is like `baseFor` except that it iterates over properties\n * in the opposite order.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */var baseForRight=createBaseFor(true);/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */function baseForOwn(object,iteratee){return object&&baseFor(object,iteratee,keys);}/**\n * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */function baseForOwnRight(object,iteratee){return object&&baseForRight(object,iteratee,keys);}/**\n * The base implementation of `_.functions` which creates an array of\n * `object` function property names filtered from `props`.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Array} props The property names to filter.\n * @returns {Array} Returns the function names.\n */function baseFunctions(object,props){return arrayFilter(props,function(key){return isFunction(object[key]);});}/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */function baseGet(object,path){path=castPath(path,object);var index=0,length=path.length;while(object!=null&&indexother;}/**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */function baseHas(object,key){return object!=null&&hasOwnProperty.call(object,key);}/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */function baseHasIn(object,key){return object!=null&&key in Object(object);}/**\n * The base implementation of `_.inRange` which doesn't coerce arguments.\n *\n * @private\n * @param {number} number The number to check.\n * @param {number} start The start of the range.\n * @param {number} end The end of the range.\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n */function baseInRange(number,start,end){return number>=nativeMin(start,end)&&number=120&&array.length>=120)?new SetCache(othIndex&&array):undefined;}array=arrays[0];var index=-1,seen=caches[0];outer:while(++index-1){if(seen!==array){splice.call(seen,fromIndex,1);}splice.call(array,fromIndex,1);}}return array;}/**\n * The base implementation of `_.pullAt` without support for individual\n * indexes or capturing the removed elements.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {number[]} indexes The indexes of elements to remove.\n * @returns {Array} Returns `array`.\n */function basePullAt(array,indexes){var length=array?indexes.length:0,lastIndex=length-1;while(length--){var index=indexes[length];if(length==lastIndex||index!==previous){var previous=index;if(isIndex(index)){splice.call(array,index,1);}else{baseUnset(array,index);}}}return array;}/**\n * The base implementation of `_.random` without support for returning\n * floating-point numbers.\n *\n * @private\n * @param {number} lower The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the random number.\n */function baseRandom(lower,upper){return lower+nativeFloor(nativeRandom()*(upper-lower+1));}/**\n * The base implementation of `_.range` and `_.rangeRight` which doesn't\n * coerce arguments.\n *\n * @private\n * @param {number} start The start of the range.\n * @param {number} end The end of the range.\n * @param {number} step The value to increment or decrement by.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the range of numbers.\n */function baseRange(start,end,step,fromRight){var index=-1,length=nativeMax(nativeCeil((end-start)/(step||1)),0),result=Array(length);while(length--){result[fromRight?length:++index]=start;start+=step;}return result;}/**\n * The base implementation of `_.repeat` which doesn't coerce arguments.\n *\n * @private\n * @param {string} string The string to repeat.\n * @param {number} n The number of times to repeat the string.\n * @returns {string} Returns the repeated string.\n */function baseRepeat(string,n){var result='';if(!string||n<1||n>MAX_SAFE_INTEGER){return result;}// Leverage the exponentiation by squaring algorithm for a faster repeat.\n// See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\ndo{if(n%2){result+=string;}n=nativeFloor(n/2);if(n){string+=string;}}while(n);return result;}/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */function baseRest(func,start){return setToString(overRest(func,start,identity),func+'');}/**\n * The base implementation of `_.sample`.\n *\n * @private\n * @param {Array|Object} collection The collection to sample.\n * @returns {*} Returns the random element.\n */function baseSample(collection){return arraySample(values(collection));}/**\n * The base implementation of `_.sampleSize` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to sample.\n * @param {number} n The number of elements to sample.\n * @returns {Array} Returns the random elements.\n */function baseSampleSize(collection,n){var array=values(collection);return shuffleSelf(array,baseClamp(n,0,array.length));}/**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */function baseSet(object,path,value,customizer){if(!isObject(object)){return object;}path=castPath(path,object);var index=-1,length=path.length,lastIndex=length-1,nested=object;while(nested!=null&&++indexlength?0:length+start;}end=end>length?length:end;if(end<0){end+=length;}length=start>end?0:end-start>>>0;start>>>=0;var result=Array(length);while(++index>>1,computed=array[mid];if(computed!==null&&!isSymbol(computed)&&(retHighest?computed<=value:computed=LARGE_ARRAY_SIZE){var set=iteratee?null:createSet(array);if(set){return setToArray(set);}isCommon=false;includes=cacheHas;seen=new SetCache();}else{seen=iteratee?[]:result;}outer:while(++index=length?array:baseSlice(array,start,end);}/**\n * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\n *\n * @private\n * @param {number|Object} id The timer id or timeout object of the timer to clear.\n */var clearTimeout=ctxClearTimeout||function(id){return root.clearTimeout(id);};/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */function cloneBuffer(buffer,isDeep){if(isDeep){return buffer.slice();}var length=buffer.length,result=allocUnsafe?allocUnsafe(length):new buffer.constructor(length);buffer.copy(result);return result;}/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */function cloneArrayBuffer(arrayBuffer){var result=new arrayBuffer.constructor(arrayBuffer.byteLength);new Uint8Array(result).set(new Uint8Array(arrayBuffer));return result;}/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */function cloneDataView(dataView,isDeep){var buffer=isDeep?cloneArrayBuffer(dataView.buffer):dataView.buffer;return new dataView.constructor(buffer,dataView.byteOffset,dataView.byteLength);}/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */function cloneRegExp(regexp){var result=new regexp.constructor(regexp.source,reFlags.exec(regexp));result.lastIndex=regexp.lastIndex;return result;}/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */function cloneSymbol(symbol){return symbolValueOf?Object(symbolValueOf.call(symbol)):{};}/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */function cloneTypedArray(typedArray,isDeep){var buffer=isDeep?cloneArrayBuffer(typedArray.buffer):typedArray.buffer;return new typedArray.constructor(buffer,typedArray.byteOffset,typedArray.length);}/**\n * Compares values to sort them in ascending order.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {number} Returns the sort order indicator for `value`.\n */function compareAscending(value,other){if(value!==other){var valIsDefined=value!==undefined,valIsNull=value===null,valIsReflexive=value===value,valIsSymbol=isSymbol(value);var othIsDefined=other!==undefined,othIsNull=other===null,othIsReflexive=other===other,othIsSymbol=isSymbol(other);if(!othIsNull&&!othIsSymbol&&!valIsSymbol&&value>other||valIsSymbol&&othIsDefined&&othIsReflexive&&!othIsNull&&!othIsSymbol||valIsNull&&othIsDefined&&othIsReflexive||!valIsDefined&&othIsReflexive||!valIsReflexive){return 1;}if(!valIsNull&&!valIsSymbol&&!othIsSymbol&&value=ordersLength){return result;}var order=orders[index];return result*(order=='desc'?-1:1);}}// Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n// that causes it, under certain circumstances, to provide the same value for\n// `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n// for more details.\n//\n// This also ensures a stable sort in V8 and other engines.\n// See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\nreturn object.index-other.index;}/**\n * Creates an array that is the composition of partially applied arguments,\n * placeholders, and provided arguments into a single array of arguments.\n *\n * @private\n * @param {Array} args The provided arguments.\n * @param {Array} partials The arguments to prepend to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @params {boolean} [isCurried] Specify composing for a curried function.\n * @returns {Array} Returns the new array of composed arguments.\n */function composeArgs(args,partials,holders,isCurried){var argsIndex=-1,argsLength=args.length,holdersLength=holders.length,leftIndex=-1,leftLength=partials.length,rangeLength=nativeMax(argsLength-holdersLength,0),result=Array(leftLength+rangeLength),isUncurried=!isCurried;while(++leftIndex1?sources[length-1]:undefined,guard=length>2?sources[2]:undefined;customizer=assigner.length>3&&typeof customizer==='function'?(length--,customizer):undefined;if(guard&&isIterateeCall(sources[0],sources[1],guard)){customizer=length<3?undefined:customizer;length=1;}object=Object(object);while(++index-1?iterable[iteratee?collection[index]:index]:undefined;};}/**\n * Creates a `_.flow` or `_.flowRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new flow function.\n */function createFlow(fromRight){return flatRest(function(funcs){var length=funcs.length,index=length,prereq=LodashWrapper.prototype.thru;if(fromRight){funcs.reverse();}while(index--){var func=funcs[index];if(typeof func!=='function'){throw new TypeError(FUNC_ERROR_TEXT);}if(prereq&&!wrapper&&getFuncName(func)=='wrapper'){var wrapper=new LodashWrapper([],true);}}index=wrapper?index:length;while(++index1){args.reverse();}if(isAry&&aryarrLength)){return false;}// Assume cyclic values are equal.\nvar stacked=stack.get(array);if(stacked&&stack.get(other)){return stacked==other;}var index=-1,result=true,seen=bitmask&COMPARE_UNORDERED_FLAG?new SetCache():undefined;stack.set(array,other);stack.set(other,array);// Ignore non-index properties.\nwhile(++index1?'& ':'')+details[lastIndex];details=details.join(length>2?', ':' ');return source.replace(reWrapComment,'{\\n/* [wrapped with '+details+'] */\\n');}/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */function isFlattenable(value){return isArray(value)||isArguments(value)||!!(spreadableSymbol&&value&&value[spreadableSymbol]);}/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */function isIndex(value,length){var type=typeof value==='undefined'?'undefined':_typeof(value);length=length==null?MAX_SAFE_INTEGER:length;return!!length&&(type=='number'||type!='symbol'&&reIsUint.test(value))&&value>-1&&value%1==0&&value0){if(++count>=HOT_COUNT){return arguments[0];}}else{count=0;}return func.apply(undefined,arguments);};}/**\n * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\n *\n * @private\n * @param {Array} array The array to shuffle.\n * @param {number} [size=array.length] The size of `array`.\n * @returns {Array} Returns `array`.\n */function shuffleSelf(array,size){var index=-1,length=array.length,lastIndex=length-1;size=size===undefined?length:size;while(++index [['a', 'b'], ['c', 'd']]\n *\n * _.chunk(['a', 'b', 'c', 'd'], 3);\n * // => [['a', 'b', 'c'], ['d']]\n */function chunk(array,size,guard){if(guard?isIterateeCall(array,size,guard):size===undefined){size=1;}else{size=nativeMax(toInteger(size),0);}var length=array==null?0:array.length;if(!length||size<1){return[];}var index=0,resIndex=0,result=Array(nativeCeil(length/size));while(index [1, 2, 3]\n */function compact(array){var index=-1,length=array==null?0:array.length,resIndex=0,result=[];while(++index [1, 2, 3, [4]]\n *\n * console.log(array);\n * // => [1]\n */function concat(){var length=arguments.length;if(!length){return[];}var args=Array(length-1),array=arguments[0],index=length;while(index--){args[index-1]=arguments[index];}return arrayPush(isArray(array)?copyArray(array):[array],baseFlatten(args,1));}/**\n * Creates an array of `array` values not included in the other given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * **Note:** Unlike `_.pullAll`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.without, _.xor\n * @example\n *\n * _.difference([2, 1], [2, 3]);\n * // => [1]\n */var difference=baseRest(function(array,values){return isArrayLikeObject(array)?baseDifference(array,baseFlatten(values,1,isArrayLikeObject,true)):[];});/**\n * This method is like `_.difference` except that it accepts `iteratee` which\n * is invoked for each element of `array` and `values` to generate the criterion\n * by which they're compared. The order and references of result values are\n * determined by the first array. The iteratee is invoked with one argument:\n * (value).\n *\n * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\n * // => [{ 'x': 2 }]\n */var differenceBy=baseRest(function(array,values){var iteratee=last(values);if(isArrayLikeObject(iteratee)){iteratee=undefined;}return isArrayLikeObject(array)?baseDifference(array,baseFlatten(values,1,isArrayLikeObject,true),getIteratee(iteratee,2)):[];});/**\n * This method is like `_.difference` except that it accepts `comparator`\n * which is invoked to compare elements of `array` to `values`. The order and\n * references of result values are determined by the first array. The comparator\n * is invoked with two arguments: (arrVal, othVal).\n *\n * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n *\n * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\n * // => [{ 'x': 2, 'y': 1 }]\n */var differenceWith=baseRest(function(array,values){var comparator=last(values);if(isArrayLikeObject(comparator)){comparator=undefined;}return isArrayLikeObject(array)?baseDifference(array,baseFlatten(values,1,isArrayLikeObject,true),undefined,comparator):[];});/**\n * Creates a slice of `array` with `n` elements dropped from the beginning.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.drop([1, 2, 3]);\n * // => [2, 3]\n *\n * _.drop([1, 2, 3], 2);\n * // => [3]\n *\n * _.drop([1, 2, 3], 5);\n * // => []\n *\n * _.drop([1, 2, 3], 0);\n * // => [1, 2, 3]\n */function drop(array,n,guard){var length=array==null?0:array.length;if(!length){return[];}n=guard||n===undefined?1:toInteger(n);return baseSlice(array,n<0?0:n,length);}/**\n * Creates a slice of `array` with `n` elements dropped from the end.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.dropRight([1, 2, 3]);\n * // => [1, 2]\n *\n * _.dropRight([1, 2, 3], 2);\n * // => [1]\n *\n * _.dropRight([1, 2, 3], 5);\n * // => []\n *\n * _.dropRight([1, 2, 3], 0);\n * // => [1, 2, 3]\n */function dropRight(array,n,guard){var length=array==null?0:array.length;if(!length){return[];}n=guard||n===undefined?1:toInteger(n);n=length-n;return baseSlice(array,0,n<0?0:n);}/**\n * Creates a slice of `array` excluding elements dropped from the end.\n * Elements are dropped until `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.dropRightWhile(users, function(o) { return !o.active; });\n * // => objects for ['barney']\n *\n * // The `_.matches` iteratee shorthand.\n * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\n * // => objects for ['barney', 'fred']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.dropRightWhile(users, ['active', false]);\n * // => objects for ['barney']\n *\n * // The `_.property` iteratee shorthand.\n * _.dropRightWhile(users, 'active');\n * // => objects for ['barney', 'fred', 'pebbles']\n */function dropRightWhile(array,predicate){return array&&array.length?baseWhile(array,getIteratee(predicate,3),true,true):[];}/**\n * Creates a slice of `array` excluding elements dropped from the beginning.\n * Elements are dropped until `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.dropWhile(users, function(o) { return !o.active; });\n * // => objects for ['pebbles']\n *\n * // The `_.matches` iteratee shorthand.\n * _.dropWhile(users, { 'user': 'barney', 'active': false });\n * // => objects for ['fred', 'pebbles']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.dropWhile(users, ['active', false]);\n * // => objects for ['pebbles']\n *\n * // The `_.property` iteratee shorthand.\n * _.dropWhile(users, 'active');\n * // => objects for ['barney', 'fred', 'pebbles']\n */function dropWhile(array,predicate){return array&&array.length?baseWhile(array,getIteratee(predicate,3),true):[];}/**\n * Fills elements of `array` with `value` from `start` up to, but not\n * including, `end`.\n *\n * **Note:** This method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 3.2.0\n * @category Array\n * @param {Array} array The array to fill.\n * @param {*} value The value to fill `array` with.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _.fill(array, 'a');\n * console.log(array);\n * // => ['a', 'a', 'a']\n *\n * _.fill(Array(3), 2);\n * // => [2, 2, 2]\n *\n * _.fill([4, 6, 8, 10], '*', 1, 3);\n * // => [4, '*', '*', 10]\n */function fill(array,value,start,end){var length=array==null?0:array.length;if(!length){return[];}if(start&&typeof start!=='number'&&isIterateeCall(array,value,start)){start=0;end=length;}return baseFill(array,value,start,end);}/**\n * This method is like `_.find` except that it returns the index of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.findIndex(users, function(o) { return o.user == 'barney'; });\n * // => 0\n *\n * // The `_.matches` iteratee shorthand.\n * _.findIndex(users, { 'user': 'fred', 'active': false });\n * // => 1\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findIndex(users, ['active', false]);\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.findIndex(users, 'active');\n * // => 2\n */function findIndex(array,predicate,fromIndex){var length=array==null?0:array.length;if(!length){return-1;}var index=fromIndex==null?0:toInteger(fromIndex);if(index<0){index=nativeMax(length+index,0);}return baseFindIndex(array,getIteratee(predicate,3),index);}/**\n * This method is like `_.findIndex` except that it iterates over elements\n * of `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=array.length-1] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\n * // => 2\n *\n * // The `_.matches` iteratee shorthand.\n * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n * // => 0\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findLastIndex(users, ['active', false]);\n * // => 2\n *\n * // The `_.property` iteratee shorthand.\n * _.findLastIndex(users, 'active');\n * // => 0\n */function findLastIndex(array,predicate,fromIndex){var length=array==null?0:array.length;if(!length){return-1;}var index=length-1;if(fromIndex!==undefined){index=toInteger(fromIndex);index=fromIndex<0?nativeMax(length+index,0):nativeMin(index,length-1);}return baseFindIndex(array,getIteratee(predicate,3),index,true);}/**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */function flatten(array){var length=array==null?0:array.length;return length?baseFlatten(array,1):[];}/**\n * Recursively flattens `array`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flattenDeep([1, [2, [3, [4]], 5]]);\n * // => [1, 2, 3, 4, 5]\n */function flattenDeep(array){var length=array==null?0:array.length;return length?baseFlatten(array,INFINITY):[];}/**\n * Recursively flatten `array` up to `depth` times.\n *\n * @static\n * @memberOf _\n * @since 4.4.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @param {number} [depth=1] The maximum recursion depth.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * var array = [1, [2, [3, [4]], 5]];\n *\n * _.flattenDepth(array, 1);\n * // => [1, 2, [3, [4]], 5]\n *\n * _.flattenDepth(array, 2);\n * // => [1, 2, 3, [4], 5]\n */function flattenDepth(array,depth){var length=array==null?0:array.length;if(!length){return[];}depth=depth===undefined?1:toInteger(depth);return baseFlatten(array,depth);}/**\n * The inverse of `_.toPairs`; this method returns an object composed\n * from key-value `pairs`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} pairs The key-value pairs.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.fromPairs([['a', 1], ['b', 2]]);\n * // => { 'a': 1, 'b': 2 }\n */function fromPairs(pairs){var index=-1,length=pairs==null?0:pairs.length,result={};while(++index 1\n *\n * _.head([]);\n * // => undefined\n */function head(array){return array&&array.length?array[0]:undefined;}/**\n * Gets the index at which the first occurrence of `value` is found in `array`\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. If `fromIndex` is negative, it's used as the\n * offset from the end of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.indexOf([1, 2, 1, 2], 2);\n * // => 1\n *\n * // Search from the `fromIndex`.\n * _.indexOf([1, 2, 1, 2], 2, 2);\n * // => 3\n */function indexOf(array,value,fromIndex){var length=array==null?0:array.length;if(!length){return-1;}var index=fromIndex==null?0:toInteger(fromIndex);if(index<0){index=nativeMax(length+index,0);}return baseIndexOf(array,value,index);}/**\n * Gets all but the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.initial([1, 2, 3]);\n * // => [1, 2]\n */function initial(array){var length=array==null?0:array.length;return length?baseSlice(array,0,-1):[];}/**\n * Creates an array of unique values that are included in all given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * _.intersection([2, 1], [2, 3]);\n * // => [2]\n */var intersection=baseRest(function(arrays){var mapped=arrayMap(arrays,castArrayLikeObject);return mapped.length&&mapped[0]===arrays[0]?baseIntersection(mapped):[];});/**\n * This method is like `_.intersection` except that it accepts `iteratee`\n * which is invoked for each element of each `arrays` to generate the criterion\n * by which they're compared. The order and references of result values are\n * determined by the first array. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [2.1]\n *\n * // The `_.property` iteratee shorthand.\n * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }]\n */var intersectionBy=baseRest(function(arrays){var iteratee=last(arrays),mapped=arrayMap(arrays,castArrayLikeObject);if(iteratee===last(mapped)){iteratee=undefined;}else{mapped.pop();}return mapped.length&&mapped[0]===arrays[0]?baseIntersection(mapped,getIteratee(iteratee,2)):[];});/**\n * This method is like `_.intersection` except that it accepts `comparator`\n * which is invoked to compare elements of `arrays`. The order and references\n * of result values are determined by the first array. The comparator is\n * invoked with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.intersectionWith(objects, others, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }]\n */var intersectionWith=baseRest(function(arrays){var comparator=last(arrays),mapped=arrayMap(arrays,castArrayLikeObject);comparator=typeof comparator==='function'?comparator:undefined;if(comparator){mapped.pop();}return mapped.length&&mapped[0]===arrays[0]?baseIntersection(mapped,undefined,comparator):[];});/**\n * Converts all elements in `array` into a string separated by `separator`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to convert.\n * @param {string} [separator=','] The element separator.\n * @returns {string} Returns the joined string.\n * @example\n *\n * _.join(['a', 'b', 'c'], '~');\n * // => 'a~b~c'\n */function join(array,separator){return array==null?'':nativeJoin.call(array,separator);}/**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */function last(array){var length=array==null?0:array.length;return length?array[length-1]:undefined;}/**\n * This method is like `_.indexOf` except that it iterates over elements of\n * `array` from right to left.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=array.length-1] The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.lastIndexOf([1, 2, 1, 2], 2);\n * // => 3\n *\n * // Search from the `fromIndex`.\n * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n * // => 1\n */function lastIndexOf(array,value,fromIndex){var length=array==null?0:array.length;if(!length){return-1;}var index=length;if(fromIndex!==undefined){index=toInteger(fromIndex);index=index<0?nativeMax(length+index,0):nativeMin(index,length-1);}return value===value?strictLastIndexOf(array,value,index):baseFindIndex(array,baseIsNaN,index,true);}/**\n * Gets the element at index `n` of `array`. If `n` is negative, the nth\n * element from the end is returned.\n *\n * @static\n * @memberOf _\n * @since 4.11.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=0] The index of the element to return.\n * @returns {*} Returns the nth element of `array`.\n * @example\n *\n * var array = ['a', 'b', 'c', 'd'];\n *\n * _.nth(array, 1);\n * // => 'b'\n *\n * _.nth(array, -2);\n * // => 'c';\n */function nth(array,n){return array&&array.length?baseNth(array,toInteger(n)):undefined;}/**\n * Removes all given values from `array` using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\n * to remove elements from an array by predicate.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {...*} [values] The values to remove.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n *\n * _.pull(array, 'a', 'c');\n * console.log(array);\n * // => ['b', 'b']\n */var pull=baseRest(pullAll);/**\n * This method is like `_.pull` except that it accepts an array of values to remove.\n *\n * **Note:** Unlike `_.difference`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n *\n * _.pullAll(array, ['a', 'c']);\n * console.log(array);\n * // => ['b', 'b']\n */function pullAll(array,values){return array&&array.length&&values&&values.length?basePullAll(array,values):array;}/**\n * This method is like `_.pullAll` except that it accepts `iteratee` which is\n * invoked for each element of `array` and `values` to generate the criterion\n * by which they're compared. The iteratee is invoked with one argument: (value).\n *\n * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\n *\n * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\n * console.log(array);\n * // => [{ 'x': 2 }]\n */function pullAllBy(array,values,iteratee){return array&&array.length&&values&&values.length?basePullAll(array,values,getIteratee(iteratee,2)):array;}/**\n * This method is like `_.pullAll` except that it accepts `comparator` which\n * is invoked to compare elements of `array` to `values`. The comparator is\n * invoked with two arguments: (arrVal, othVal).\n *\n * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\n *\n * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\n * console.log(array);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\n */function pullAllWith(array,values,comparator){return array&&array.length&&values&&values.length?basePullAll(array,values,undefined,comparator):array;}/**\n * Removes elements from `array` corresponding to `indexes` and returns an\n * array of removed elements.\n *\n * **Note:** Unlike `_.at`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {...(number|number[])} [indexes] The indexes of elements to remove.\n * @returns {Array} Returns the new array of removed elements.\n * @example\n *\n * var array = ['a', 'b', 'c', 'd'];\n * var pulled = _.pullAt(array, [1, 3]);\n *\n * console.log(array);\n * // => ['a', 'c']\n *\n * console.log(pulled);\n * // => ['b', 'd']\n */var pullAt=flatRest(function(array,indexes){var length=array==null?0:array.length,result=baseAt(array,indexes);basePullAt(array,arrayMap(indexes,function(index){return isIndex(index,length)?+index:index;}).sort(compareAscending));return result;});/**\n * Removes all elements from `array` that `predicate` returns truthy for\n * and returns an array of the removed elements. The predicate is invoked\n * with three arguments: (value, index, array).\n *\n * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\n * to pull elements from an array by value.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new array of removed elements.\n * @example\n *\n * var array = [1, 2, 3, 4];\n * var evens = _.remove(array, function(n) {\n * return n % 2 == 0;\n * });\n *\n * console.log(array);\n * // => [1, 3]\n *\n * console.log(evens);\n * // => [2, 4]\n */function remove(array,predicate){var result=[];if(!(array&&array.length)){return result;}var index=-1,indexes=[],length=array.length;predicate=getIteratee(predicate,3);while(++index [3, 2, 1]\n *\n * console.log(array);\n * // => [3, 2, 1]\n */function reverse(array){return array==null?array:nativeReverse.call(array);}/**\n * Creates a slice of `array` from `start` up to, but not including, `end`.\n *\n * **Note:** This method is used instead of\n * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\n * returned.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */function slice(array,start,end){var length=array==null?0:array.length;if(!length){return[];}if(end&&typeof end!=='number'&&isIterateeCall(array,start,end)){start=0;end=length;}else{start=start==null?0:toInteger(start);end=end===undefined?length:toInteger(end);}return baseSlice(array,start,end);}/**\n * Uses a binary search to determine the lowest index at which `value`\n * should be inserted into `array` in order to maintain its sort order.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * _.sortedIndex([30, 50], 40);\n * // => 1\n */function sortedIndex(array,value){return baseSortedIndex(array,value);}/**\n * This method is like `_.sortedIndex` except that it accepts `iteratee`\n * which is invoked for `value` and each element of `array` to compute their\n * sort ranking. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\n *\n * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\n * // => 0\n */function sortedIndexBy(array,value,iteratee){return baseSortedIndexBy(array,value,getIteratee(iteratee,2));}/**\n * This method is like `_.indexOf` except that it performs a binary\n * search on a sorted `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\n * // => 1\n */function sortedIndexOf(array,value){var length=array==null?0:array.length;if(length){var index=baseSortedIndex(array,value);if(index 4\n */function sortedLastIndex(array,value){return baseSortedIndex(array,value,true);}/**\n * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\n * which is invoked for `value` and each element of `array` to compute their\n * sort ranking. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\n *\n * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n * // => 1\n *\n * // The `_.property` iteratee shorthand.\n * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\n * // => 1\n */function sortedLastIndexBy(array,value,iteratee){return baseSortedIndexBy(array,value,getIteratee(iteratee,2),true);}/**\n * This method is like `_.lastIndexOf` except that it performs a binary\n * search on a sorted `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\n * // => 3\n */function sortedLastIndexOf(array,value){var length=array==null?0:array.length;if(length){var index=baseSortedIndex(array,value,true)-1;if(eq(array[index],value)){return index;}}return-1;}/**\n * This method is like `_.uniq` except that it's designed and optimized\n * for sorted arrays.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.sortedUniq([1, 1, 2]);\n * // => [1, 2]\n */function sortedUniq(array){return array&&array.length?baseSortedUniq(array):[];}/**\n * This method is like `_.uniqBy` except that it's designed and optimized\n * for sorted arrays.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\n * // => [1.1, 2.3]\n */function sortedUniqBy(array,iteratee){return array&&array.length?baseSortedUniq(array,getIteratee(iteratee,2)):[];}/**\n * Gets all but the first element of `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.tail([1, 2, 3]);\n * // => [2, 3]\n */function tail(array){var length=array==null?0:array.length;return length?baseSlice(array,1,length):[];}/**\n * Creates a slice of `array` with `n` elements taken from the beginning.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to take.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.take([1, 2, 3]);\n * // => [1]\n *\n * _.take([1, 2, 3], 2);\n * // => [1, 2]\n *\n * _.take([1, 2, 3], 5);\n * // => [1, 2, 3]\n *\n * _.take([1, 2, 3], 0);\n * // => []\n */function take(array,n,guard){if(!(array&&array.length)){return[];}n=guard||n===undefined?1:toInteger(n);return baseSlice(array,0,n<0?0:n);}/**\n * Creates a slice of `array` with `n` elements taken from the end.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to take.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.takeRight([1, 2, 3]);\n * // => [3]\n *\n * _.takeRight([1, 2, 3], 2);\n * // => [2, 3]\n *\n * _.takeRight([1, 2, 3], 5);\n * // => [1, 2, 3]\n *\n * _.takeRight([1, 2, 3], 0);\n * // => []\n */function takeRight(array,n,guard){var length=array==null?0:array.length;if(!length){return[];}n=guard||n===undefined?1:toInteger(n);n=length-n;return baseSlice(array,n<0?0:n,length);}/**\n * Creates a slice of `array` with elements taken from the end. Elements are\n * taken until `predicate` returns falsey. The predicate is invoked with\n * three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.takeRightWhile(users, function(o) { return !o.active; });\n * // => objects for ['fred', 'pebbles']\n *\n * // The `_.matches` iteratee shorthand.\n * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\n * // => objects for ['pebbles']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.takeRightWhile(users, ['active', false]);\n * // => objects for ['fred', 'pebbles']\n *\n * // The `_.property` iteratee shorthand.\n * _.takeRightWhile(users, 'active');\n * // => []\n */function takeRightWhile(array,predicate){return array&&array.length?baseWhile(array,getIteratee(predicate,3),false,true):[];}/**\n * Creates a slice of `array` with elements taken from the beginning. Elements\n * are taken until `predicate` returns falsey. The predicate is invoked with\n * three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.takeWhile(users, function(o) { return !o.active; });\n * // => objects for ['barney', 'fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.takeWhile(users, { 'user': 'barney', 'active': false });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.takeWhile(users, ['active', false]);\n * // => objects for ['barney', 'fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.takeWhile(users, 'active');\n * // => []\n */function takeWhile(array,predicate){return array&&array.length?baseWhile(array,getIteratee(predicate,3)):[];}/**\n * Creates an array of unique values, in order, from all given arrays using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.union([2], [1, 2]);\n * // => [2, 1]\n */var union=baseRest(function(arrays){return baseUniq(baseFlatten(arrays,1,isArrayLikeObject,true));});/**\n * This method is like `_.union` except that it accepts `iteratee` which is\n * invoked for each element of each `arrays` to generate the criterion by\n * which uniqueness is computed. Result values are chosen from the first\n * array in which the value occurs. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.unionBy([2.1], [1.2, 2.3], Math.floor);\n * // => [2.1, 1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */var unionBy=baseRest(function(arrays){var iteratee=last(arrays);if(isArrayLikeObject(iteratee)){iteratee=undefined;}return baseUniq(baseFlatten(arrays,1,isArrayLikeObject,true),getIteratee(iteratee,2));});/**\n * This method is like `_.union` except that it accepts `comparator` which\n * is invoked to compare elements of `arrays`. Result values are chosen from\n * the first array in which the value occurs. The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.unionWith(objects, others, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n */var unionWith=baseRest(function(arrays){var comparator=last(arrays);comparator=typeof comparator==='function'?comparator:undefined;return baseUniq(baseFlatten(arrays,1,isArrayLikeObject,true),undefined,comparator);});/**\n * Creates a duplicate-free version of an array, using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons, in which only the first occurrence of each element\n * is kept. The order of result values is determined by the order they occur\n * in the array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniq([2, 1, 2]);\n * // => [2, 1]\n */function uniq(array){return array&&array.length?baseUniq(array):[];}/**\n * This method is like `_.uniq` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * uniqueness is computed. The order of result values is determined by the\n * order they occur in the array. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n * // => [2.1, 1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */function uniqBy(array,iteratee){return array&&array.length?baseUniq(array,getIteratee(iteratee,2)):[];}/**\n * This method is like `_.uniq` except that it accepts `comparator` which\n * is invoked to compare elements of `array`. The order of result values is\n * determined by the order they occur in the array.The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.uniqWith(objects, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n */function uniqWith(array,comparator){comparator=typeof comparator==='function'?comparator:undefined;return array&&array.length?baseUniq(array,undefined,comparator):[];}/**\n * This method is like `_.zip` except that it accepts an array of grouped\n * elements and creates an array regrouping the elements to their pre-zip\n * configuration.\n *\n * @static\n * @memberOf _\n * @since 1.2.0\n * @category Array\n * @param {Array} array The array of grouped elements to process.\n * @returns {Array} Returns the new array of regrouped elements.\n * @example\n *\n * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\n * // => [['a', 1, true], ['b', 2, false]]\n *\n * _.unzip(zipped);\n * // => [['a', 'b'], [1, 2], [true, false]]\n */function unzip(array){if(!(array&&array.length)){return[];}var length=0;array=arrayFilter(array,function(group){if(isArrayLikeObject(group)){length=nativeMax(group.length,length);return true;}});return baseTimes(length,function(index){return arrayMap(array,baseProperty(index));});}/**\n * This method is like `_.unzip` except that it accepts `iteratee` to specify\n * how regrouped values should be combined. The iteratee is invoked with the\n * elements of each group: (...group).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Array\n * @param {Array} array The array of grouped elements to process.\n * @param {Function} [iteratee=_.identity] The function to combine\n * regrouped values.\n * @returns {Array} Returns the new array of regrouped elements.\n * @example\n *\n * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\n * // => [[1, 10, 100], [2, 20, 200]]\n *\n * _.unzipWith(zipped, _.add);\n * // => [3, 30, 300]\n */function unzipWith(array,iteratee){if(!(array&&array.length)){return[];}var result=unzip(array);if(iteratee==null){return result;}return arrayMap(result,function(group){return apply(iteratee,undefined,group);});}/**\n * Creates an array excluding all given values using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * **Note:** Unlike `_.pull`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...*} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.difference, _.xor\n * @example\n *\n * _.without([2, 1, 2, 3], 1, 2);\n * // => [3]\n */var without=baseRest(function(array,values){return isArrayLikeObject(array)?baseDifference(array,values):[];});/**\n * Creates an array of unique values that is the\n * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n * of the given arrays. The order of result values is determined by the order\n * they occur in the arrays.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.difference, _.without\n * @example\n *\n * _.xor([2, 1], [2, 3]);\n * // => [1, 3]\n */var xor=baseRest(function(arrays){return baseXor(arrayFilter(arrays,isArrayLikeObject));});/**\n * This method is like `_.xor` except that it accepts `iteratee` which is\n * invoked for each element of each `arrays` to generate the criterion by\n * which by which they're compared. The order of result values is determined\n * by the order they occur in the arrays. The iteratee is invoked with one\n * argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [1.2, 3.4]\n *\n * // The `_.property` iteratee shorthand.\n * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 2 }]\n */var xorBy=baseRest(function(arrays){var iteratee=last(arrays);if(isArrayLikeObject(iteratee)){iteratee=undefined;}return baseXor(arrayFilter(arrays,isArrayLikeObject),getIteratee(iteratee,2));});/**\n * This method is like `_.xor` except that it accepts `comparator` which is\n * invoked to compare elements of `arrays`. The order of result values is\n * determined by the order they occur in the arrays. The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.xorWith(objects, others, _.isEqual);\n * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n */var xorWith=baseRest(function(arrays){var comparator=last(arrays);comparator=typeof comparator==='function'?comparator:undefined;return baseXor(arrayFilter(arrays,isArrayLikeObject),undefined,comparator);});/**\n * Creates an array of grouped elements, the first of which contains the\n * first elements of the given arrays, the second of which contains the\n * second elements of the given arrays, and so on.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to process.\n * @returns {Array} Returns the new array of grouped elements.\n * @example\n *\n * _.zip(['a', 'b'], [1, 2], [true, false]);\n * // => [['a', 1, true], ['b', 2, false]]\n */var zip=baseRest(unzip);/**\n * This method is like `_.fromPairs` except that it accepts two arrays,\n * one of property identifiers and one of corresponding values.\n *\n * @static\n * @memberOf _\n * @since 0.4.0\n * @category Array\n * @param {Array} [props=[]] The property identifiers.\n * @param {Array} [values=[]] The property values.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.zipObject(['a', 'b'], [1, 2]);\n * // => { 'a': 1, 'b': 2 }\n */function zipObject(props,values){return baseZipObject(props||[],values||[],assignValue);}/**\n * This method is like `_.zipObject` except that it supports property paths.\n *\n * @static\n * @memberOf _\n * @since 4.1.0\n * @category Array\n * @param {Array} [props=[]] The property identifiers.\n * @param {Array} [values=[]] The property values.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\n * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\n */function zipObjectDeep(props,values){return baseZipObject(props||[],values||[],baseSet);}/**\n * This method is like `_.zip` except that it accepts `iteratee` to specify\n * how grouped values should be combined. The iteratee is invoked with the\n * elements of each group: (...group).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Array\n * @param {...Array} [arrays] The arrays to process.\n * @param {Function} [iteratee=_.identity] The function to combine\n * grouped values.\n * @returns {Array} Returns the new array of grouped elements.\n * @example\n *\n * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\n * return a + b + c;\n * });\n * // => [111, 222]\n */var zipWith=baseRest(function(arrays){var length=arrays.length,iteratee=length>1?arrays[length-1]:undefined;iteratee=typeof iteratee==='function'?(arrays.pop(),iteratee):undefined;return unzipWith(arrays,iteratee);});/* ------------------------------------------------------------------------*//**\n * Creates a `lodash` wrapper instance that wraps `value` with explicit method\n * chain sequences enabled. The result of such sequences must be unwrapped\n * with `_#value`.\n *\n * @static\n * @memberOf _\n * @since 1.3.0\n * @category Seq\n * @param {*} value The value to wrap.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'pebbles', 'age': 1 }\n * ];\n *\n * var youngest = _\n * .chain(users)\n * .sortBy('age')\n * .map(function(o) {\n * return o.user + ' is ' + o.age;\n * })\n * .head()\n * .value();\n * // => 'pebbles is 1'\n */function chain(value){var result=lodash(value);result.__chain__=true;return result;}/**\n * This method invokes `interceptor` and returns `value`. The interceptor\n * is invoked with one argument; (value). The purpose of this method is to\n * \"tap into\" a method chain sequence in order to modify intermediate results.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @param {*} value The value to provide to `interceptor`.\n * @param {Function} interceptor The function to invoke.\n * @returns {*} Returns `value`.\n * @example\n *\n * _([1, 2, 3])\n * .tap(function(array) {\n * // Mutate input array.\n * array.pop();\n * })\n * .reverse()\n * .value();\n * // => [2, 1]\n */function tap(value,interceptor){interceptor(value);return value;}/**\n * This method is like `_.tap` except that it returns the result of `interceptor`.\n * The purpose of this method is to \"pass thru\" values replacing intermediate\n * results in a method chain sequence.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Seq\n * @param {*} value The value to provide to `interceptor`.\n * @param {Function} interceptor The function to invoke.\n * @returns {*} Returns the result of `interceptor`.\n * @example\n *\n * _(' abc ')\n * .chain()\n * .trim()\n * .thru(function(value) {\n * return [value];\n * })\n * .value();\n * // => ['abc']\n */function thru(value,interceptor){return interceptor(value);}/**\n * This method is the wrapper version of `_.at`.\n *\n * @name at\n * @memberOf _\n * @since 1.0.0\n * @category Seq\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n *\n * _(object).at(['a[0].b.c', 'a[1]']).value();\n * // => [3, 4]\n */var wrapperAt=flatRest(function(paths){var length=paths.length,start=length?paths[0]:0,value=this.__wrapped__,interceptor=function interceptor(object){return baseAt(object,paths);};if(length>1||this.__actions__.length||!(value instanceof LazyWrapper)||!isIndex(start)){return this.thru(interceptor);}value=value.slice(start,+start+(length?1:0));value.__actions__.push({func:thru,args:[interceptor],thisArg:undefined});return new LodashWrapper(value,this.__chain__).thru(function(array){if(length&&!array.length){array.push(undefined);}return array;});});/**\n * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\n *\n * @name chain\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 }\n * ];\n *\n * // A sequence without explicit chaining.\n * _(users).head();\n * // => { 'user': 'barney', 'age': 36 }\n *\n * // A sequence with explicit chaining.\n * _(users)\n * .chain()\n * .head()\n * .pick('user')\n * .value();\n * // => { 'user': 'barney' }\n */function wrapperChain(){return chain(this);}/**\n * Executes the chain sequence and returns the wrapped result.\n *\n * @name commit\n * @memberOf _\n * @since 3.2.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var array = [1, 2];\n * var wrapped = _(array).push(3);\n *\n * console.log(array);\n * // => [1, 2]\n *\n * wrapped = wrapped.commit();\n * console.log(array);\n * // => [1, 2, 3]\n *\n * wrapped.last();\n * // => 3\n *\n * console.log(array);\n * // => [1, 2, 3]\n */function wrapperCommit(){return new LodashWrapper(this.value(),this.__chain__);}/**\n * Gets the next value on a wrapped object following the\n * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\n *\n * @name next\n * @memberOf _\n * @since 4.0.0\n * @category Seq\n * @returns {Object} Returns the next iterator value.\n * @example\n *\n * var wrapped = _([1, 2]);\n *\n * wrapped.next();\n * // => { 'done': false, 'value': 1 }\n *\n * wrapped.next();\n * // => { 'done': false, 'value': 2 }\n *\n * wrapped.next();\n * // => { 'done': true, 'value': undefined }\n */function wrapperNext(){if(this.__values__===undefined){this.__values__=toArray(this.value());}var done=this.__index__>=this.__values__.length,value=done?undefined:this.__values__[this.__index__++];return{done:done,value:value};}/**\n * Enables the wrapper to be iterable.\n *\n * @name Symbol.iterator\n * @memberOf _\n * @since 4.0.0\n * @category Seq\n * @returns {Object} Returns the wrapper object.\n * @example\n *\n * var wrapped = _([1, 2]);\n *\n * wrapped[Symbol.iterator]() === wrapped;\n * // => true\n *\n * Array.from(wrapped);\n * // => [1, 2]\n */function wrapperToIterator(){return this;}/**\n * Creates a clone of the chain sequence planting `value` as the wrapped value.\n *\n * @name plant\n * @memberOf _\n * @since 3.2.0\n * @category Seq\n * @param {*} value The value to plant.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var wrapped = _([1, 2]).map(square);\n * var other = wrapped.plant([3, 4]);\n *\n * other.value();\n * // => [9, 16]\n *\n * wrapped.value();\n * // => [1, 4]\n */function wrapperPlant(value){var result,parent=this;while(parent instanceof baseLodash){var clone=wrapperClone(parent);clone.__index__=0;clone.__values__=undefined;if(result){previous.__wrapped__=clone;}else{result=clone;}var previous=clone;parent=parent.__wrapped__;}previous.__wrapped__=value;return result;}/**\n * This method is the wrapper version of `_.reverse`.\n *\n * **Note:** This method mutates the wrapped array.\n *\n * @name reverse\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _(array).reverse().value()\n * // => [3, 2, 1]\n *\n * console.log(array);\n * // => [3, 2, 1]\n */function wrapperReverse(){var value=this.__wrapped__;if(value instanceof LazyWrapper){var wrapped=value;if(this.__actions__.length){wrapped=new LazyWrapper(this);}wrapped=wrapped.reverse();wrapped.__actions__.push({func:thru,args:[reverse],thisArg:undefined});return new LodashWrapper(wrapped,this.__chain__);}return this.thru(reverse);}/**\n * Executes the chain sequence to resolve the unwrapped value.\n *\n * @name value\n * @memberOf _\n * @since 0.1.0\n * @alias toJSON, valueOf\n * @category Seq\n * @returns {*} Returns the resolved unwrapped value.\n * @example\n *\n * _([1, 2, 3]).value();\n * // => [1, 2, 3]\n */function wrapperValue(){return baseWrapperValue(this.__wrapped__,this.__actions__);}/* ------------------------------------------------------------------------*//**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The corresponding value of\n * each key is the number of times the key was returned by `iteratee`. The\n * iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.countBy([6.1, 4.2, 6.3], Math.floor);\n * // => { '4': 1, '6': 2 }\n *\n * // The `_.property` iteratee shorthand.\n * _.countBy(['one', 'two', 'three'], 'length');\n * // => { '3': 2, '5': 1 }\n */var countBy=createAggregator(function(result,value,key){if(hasOwnProperty.call(result,key)){++result[key];}else{baseAssignValue(result,key,1);}});/**\n * Checks if `predicate` returns truthy for **all** elements of `collection`.\n * Iteration is stopped once `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * **Note:** This method returns `true` for\n * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n * elements of empty collections.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n * @example\n *\n * _.every([true, 1, null, 'yes'], Boolean);\n * // => false\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.every(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.every(users, ['active', false]);\n * // => true\n *\n * // The `_.property` iteratee shorthand.\n * _.every(users, 'active');\n * // => false\n */function every(collection,predicate,guard){var func=isArray(collection)?arrayEvery:baseEvery;if(guard&&isIterateeCall(collection,predicate,guard)){predicate=undefined;}return func(collection,getIteratee(predicate,3));}/**\n * Iterates over elements of `collection`, returning an array of all elements\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * **Note:** Unlike `_.remove`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.reject\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * _.filter(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.filter(users, { 'age': 36, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.filter(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.filter(users, 'active');\n * // => objects for ['barney']\n */function filter(collection,predicate){var func=isArray(collection)?arrayFilter:baseFilter;return func(collection,getIteratee(predicate,3));}/**\n * Iterates over elements of `collection`, returning the first element\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false },\n * { 'user': 'pebbles', 'age': 1, 'active': true }\n * ];\n *\n * _.find(users, function(o) { return o.age < 40; });\n * // => object for 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.find(users, { 'age': 1, 'active': true });\n * // => object for 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.find(users, ['active', false]);\n * // => object for 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.find(users, 'active');\n * // => object for 'barney'\n */var find=createFind(findIndex);/**\n * This method is like `_.find` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=collection.length-1] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * _.findLast([1, 2, 3, 4], function(n) {\n * return n % 2 == 1;\n * });\n * // => 3\n */var findLast=createFind(findLastIndex);/**\n * Creates a flattened array of values by running each element in `collection`\n * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n * with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [n, n];\n * }\n *\n * _.flatMap([1, 2], duplicate);\n * // => [1, 1, 2, 2]\n */function flatMap(collection,iteratee){return baseFlatten(map(collection,iteratee),1);}/**\n * This method is like `_.flatMap` except that it recursively flattens the\n * mapped results.\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [[[n, n]]];\n * }\n *\n * _.flatMapDeep([1, 2], duplicate);\n * // => [1, 1, 2, 2]\n */function flatMapDeep(collection,iteratee){return baseFlatten(map(collection,iteratee),INFINITY);}/**\n * This method is like `_.flatMap` except that it recursively flattens the\n * mapped results up to `depth` times.\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {number} [depth=1] The maximum recursion depth.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [[[n, n]]];\n * }\n *\n * _.flatMapDepth([1, 2], duplicate, 2);\n * // => [[1, 1], [2, 2]]\n */function flatMapDepth(collection,iteratee,depth){depth=depth===undefined?1:toInteger(depth);return baseFlatten(map(collection,iteratee),depth);}/**\n * Iterates over elements of `collection` and invokes `iteratee` for each element.\n * The iteratee is invoked with three arguments: (value, index|key, collection).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n * property are iterated like arrays. To avoid this behavior use `_.forIn`\n * or `_.forOwn` for object iteration.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias each\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEachRight\n * @example\n *\n * _.forEach([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `1` then `2`.\n *\n * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */function forEach(collection,iteratee){var func=isArray(collection)?arrayEach:baseEach;return func(collection,getIteratee(iteratee,3));}/**\n * This method is like `_.forEach` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @alias eachRight\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEach\n * @example\n *\n * _.forEachRight([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `2` then `1`.\n */function forEachRight(collection,iteratee){var func=isArray(collection)?arrayEachRight:baseEachRight;return func(collection,getIteratee(iteratee,3));}/**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The order of grouped values\n * is determined by the order they occur in `collection`. The corresponding\n * value of each key is an array of elements responsible for generating the\n * key. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n * // => { '4': [4.2], '6': [6.1, 6.3] }\n *\n * // The `_.property` iteratee shorthand.\n * _.groupBy(['one', 'two', 'three'], 'length');\n * // => { '3': ['one', 'two'], '5': ['three'] }\n */var groupBy=createAggregator(function(result,value,key){if(hasOwnProperty.call(result,key)){result[key].push(value);}else{baseAssignValue(result,key,[value]);}});/**\n * Checks if `value` is in `collection`. If `collection` is a string, it's\n * checked for a substring of `value`, otherwise\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * is used for equality comparisons. If `fromIndex` is negative, it's used as\n * the offset from the end of `collection`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {boolean} Returns `true` if `value` is found, else `false`.\n * @example\n *\n * _.includes([1, 2, 3], 1);\n * // => true\n *\n * _.includes([1, 2, 3], 1, 2);\n * // => false\n *\n * _.includes({ 'a': 1, 'b': 2 }, 1);\n * // => true\n *\n * _.includes('abcd', 'bc');\n * // => true\n */function includes(collection,value,fromIndex,guard){collection=isArrayLike(collection)?collection:values(collection);fromIndex=fromIndex&&!guard?toInteger(fromIndex):0;var length=collection.length;if(fromIndex<0){fromIndex=nativeMax(length+fromIndex,0);}return isString(collection)?fromIndex<=length&&collection.indexOf(value,fromIndex)>-1:!!length&&baseIndexOf(collection,value,fromIndex)>-1;}/**\n * Invokes the method at `path` of each element in `collection`, returning\n * an array of the results of each invoked method. Any additional arguments\n * are provided to each invoked method. If `path` is a function, it's invoked\n * for, and `this` bound to, each element in `collection`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Array|Function|string} path The path of the method to invoke or\n * the function invoked per iteration.\n * @param {...*} [args] The arguments to invoke each method with.\n * @returns {Array} Returns the array of results.\n * @example\n *\n * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\n * // => [[1, 5, 7], [1, 2, 3]]\n *\n * _.invokeMap([123, 456], String.prototype.split, '');\n * // => [['1', '2', '3'], ['4', '5', '6']]\n */var invokeMap=baseRest(function(collection,path,args){var index=-1,isFunc=typeof path==='function',result=isArrayLike(collection)?Array(collection.length):[];baseEach(collection,function(value){result[++index]=isFunc?apply(path,value,args):baseInvoke(value,path,args);});return result;});/**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The corresponding value of\n * each key is the last element responsible for generating the key. The\n * iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * var array = [\n * { 'dir': 'left', 'code': 97 },\n * { 'dir': 'right', 'code': 100 }\n * ];\n *\n * _.keyBy(array, function(o) {\n * return String.fromCharCode(o.code);\n * });\n * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n *\n * _.keyBy(array, 'dir');\n * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n */var keyBy=createAggregator(function(result,value,key){baseAssignValue(result,key,value);});/**\n * Creates an array of values by running each element in `collection` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * _.map([4, 8], square);\n * // => [16, 64]\n *\n * _.map({ 'a': 4, 'b': 8 }, square);\n * // => [16, 64] (iteration order is not guaranteed)\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */function map(collection,iteratee){var func=isArray(collection)?arrayMap:baseMap;return func(collection,getIteratee(iteratee,3));}/**\n * This method is like `_.sortBy` except that it allows specifying the sort\n * orders of the iteratees to sort by. If `orders` is unspecified, all values\n * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\n * descending or \"asc\" for ascending sort order of corresponding values.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @param {string[]} [orders] The sort orders of `iteratees`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 34 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'barney', 'age': 36 }\n * ];\n *\n * // Sort by `user` in ascending order and by `age` in descending order.\n * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n */function orderBy(collection,iteratees,orders,guard){if(collection==null){return[];}if(!isArray(iteratees)){iteratees=iteratees==null?[]:[iteratees];}orders=guard?undefined:orders;if(!isArray(orders)){orders=orders==null?[]:[orders];}return baseOrderBy(collection,iteratees,orders);}/**\n * Creates an array of elements split into two groups, the first of which\n * contains elements `predicate` returns truthy for, the second of which\n * contains elements `predicate` returns falsey for. The predicate is\n * invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the array of grouped elements.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true },\n * { 'user': 'pebbles', 'age': 1, 'active': false }\n * ];\n *\n * _.partition(users, function(o) { return o.active; });\n * // => objects for [['fred'], ['barney', 'pebbles']]\n *\n * // The `_.matches` iteratee shorthand.\n * _.partition(users, { 'age': 1, 'active': false });\n * // => objects for [['pebbles'], ['barney', 'fred']]\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.partition(users, ['active', false]);\n * // => objects for [['barney', 'pebbles'], ['fred']]\n *\n * // The `_.property` iteratee shorthand.\n * _.partition(users, 'active');\n * // => objects for [['fred'], ['barney', 'pebbles']]\n */var partition=createAggregator(function(result,value,key){result[key?0:1].push(value);},function(){return[[],[]];});/**\n * Reduces `collection` to a value which is the accumulated result of running\n * each element in `collection` thru `iteratee`, where each successive\n * invocation is supplied the return value of the previous. If `accumulator`\n * is not given, the first element of `collection` is used as the initial\n * value. The iteratee is invoked with four arguments:\n * (accumulator, value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\n *\n * The guarded methods are:\n * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n * and `sortBy`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduceRight\n * @example\n *\n * _.reduce([1, 2], function(sum, n) {\n * return sum + n;\n * }, 0);\n * // => 3\n *\n * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * return result;\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n */function reduce(collection,iteratee,accumulator){var func=isArray(collection)?arrayReduce:baseReduce,initAccum=arguments.length<3;return func(collection,getIteratee(iteratee,4),accumulator,initAccum,baseEach);}/**\n * This method is like `_.reduce` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduce\n * @example\n *\n * var array = [[0, 1], [2, 3], [4, 5]];\n *\n * _.reduceRight(array, function(flattened, other) {\n * return flattened.concat(other);\n * }, []);\n * // => [4, 5, 2, 3, 0, 1]\n */function reduceRight(collection,iteratee,accumulator){var func=isArray(collection)?arrayReduceRight:baseReduce,initAccum=arguments.length<3;return func(collection,getIteratee(iteratee,4),accumulator,initAccum,baseEachRight);}/**\n * The opposite of `_.filter`; this method returns the elements of `collection`\n * that `predicate` does **not** return truthy for.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.filter\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true }\n * ];\n *\n * _.reject(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.reject(users, { 'age': 40, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.reject(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.reject(users, 'active');\n * // => objects for ['barney']\n */function reject(collection,predicate){var func=isArray(collection)?arrayFilter:baseFilter;return func(collection,negate(getIteratee(predicate,3)));}/**\n * Gets a random element from `collection`.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to sample.\n * @returns {*} Returns the random element.\n * @example\n *\n * _.sample([1, 2, 3, 4]);\n * // => 2\n */function sample(collection){var func=isArray(collection)?arraySample:baseSample;return func(collection);}/**\n * Gets `n` random elements at unique keys from `collection` up to the\n * size of `collection`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to sample.\n * @param {number} [n=1] The number of elements to sample.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the random elements.\n * @example\n *\n * _.sampleSize([1, 2, 3], 2);\n * // => [3, 1]\n *\n * _.sampleSize([1, 2, 3], 4);\n * // => [2, 3, 1]\n */function sampleSize(collection,n,guard){if(guard?isIterateeCall(collection,n,guard):n===undefined){n=1;}else{n=toInteger(n);}var func=isArray(collection)?arraySampleSize:baseSampleSize;return func(collection,n);}/**\n * Creates an array of shuffled values, using a version of the\n * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to shuffle.\n * @returns {Array} Returns the new shuffled array.\n * @example\n *\n * _.shuffle([1, 2, 3, 4]);\n * // => [4, 1, 3, 2]\n */function shuffle(collection){var func=isArray(collection)?arrayShuffle:baseShuffle;return func(collection);}/**\n * Gets the size of `collection` by returning its length for array-like\n * values or the number of own enumerable string keyed properties for objects.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @returns {number} Returns the collection size.\n * @example\n *\n * _.size([1, 2, 3]);\n * // => 3\n *\n * _.size({ 'a': 1, 'b': 2 });\n * // => 2\n *\n * _.size('pebbles');\n * // => 7\n */function size(collection){if(collection==null){return 0;}if(isArrayLike(collection)){return isString(collection)?stringSize(collection):collection.length;}var tag=getTag(collection);if(tag==mapTag||tag==setTag){return collection.size;}return baseKeys(collection).length;}/**\n * Checks if `predicate` returns truthy for **any** element of `collection`.\n * Iteration is stopped once `predicate` returns truthy. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n * @example\n *\n * _.some([null, 0, 'yes', false], Boolean);\n * // => true\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.some(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.some(users, ['active', false]);\n * // => true\n *\n * // The `_.property` iteratee shorthand.\n * _.some(users, 'active');\n * // => true\n */function some(collection,predicate,guard){var func=isArray(collection)?arraySome:baseSome;if(guard&&isIterateeCall(collection,predicate,guard)){predicate=undefined;}return func(collection,getIteratee(predicate,3));}/**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection thru each iteratee. This method\n * performs a stable sort, that is, it preserves the original sort order of\n * equal elements. The iteratees are invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'barney', 'age': 34 }\n * ];\n *\n * _.sortBy(users, [function(o) { return o.user; }]);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n *\n * _.sortBy(users, ['user', 'age']);\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]\n */var sortBy=baseRest(function(collection,iteratees){if(collection==null){return[];}var length=iteratees.length;if(length>1&&isIterateeCall(collection,iteratees[0],iteratees[1])){iteratees=[];}else if(length>2&&isIterateeCall(iteratees[0],iteratees[1],iteratees[2])){iteratees=[iteratees[0]];}return baseOrderBy(collection,baseFlatten(iteratees,1),[]);});/* ------------------------------------------------------------------------*//**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */var now=ctxNow||function(){return root.Date.now();};/* ------------------------------------------------------------------------*//**\n * The opposite of `_.before`; this method creates a function that invokes\n * `func` once it's called `n` or more times.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {number} n The number of calls before `func` is invoked.\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * var saves = ['profile', 'settings'];\n *\n * var done = _.after(saves.length, function() {\n * console.log('done saving!');\n * });\n *\n * _.forEach(saves, function(type) {\n * asyncSave({ 'type': type, 'complete': done });\n * });\n * // => Logs 'done saving!' after the two async saves have completed.\n */function after(n,func){if(typeof func!=='function'){throw new TypeError(FUNC_ERROR_TEXT);}n=toInteger(n);return function(){if(--n<1){return func.apply(this,arguments);}};}/**\n * Creates a function that invokes `func`, with up to `n` arguments,\n * ignoring any additional arguments.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to cap arguments for.\n * @param {number} [n=func.length] The arity cap.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new capped function.\n * @example\n *\n * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n * // => [6, 8, 10]\n */function ary(func,n,guard){n=guard?undefined:n;n=func&&n==null?func.length:n;return createWrap(func,WRAP_ARY_FLAG,undefined,undefined,undefined,undefined,n);}/**\n * Creates a function that invokes `func`, with the `this` binding and arguments\n * of the created function, while it's called less than `n` times. Subsequent\n * calls to the created function return the result of the last `func` invocation.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {number} n The number of calls at which `func` is no longer invoked.\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * jQuery(element).on('click', _.before(5, addContactToList));\n * // => Allows adding up to 4 contacts to the list.\n */function before(n,func){var result;if(typeof func!=='function'){throw new TypeError(FUNC_ERROR_TEXT);}n=toInteger(n);return function(){if(--n>0){result=func.apply(this,arguments);}if(n<=1){func=undefined;}return result;};}/**\n * Creates a function that invokes `func` with the `this` binding of `thisArg`\n * and `partials` prepended to the arguments it receives.\n *\n * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n * may be used as a placeholder for partially applied arguments.\n *\n * **Note:** Unlike native `Function#bind`, this method doesn't set the \"length\"\n * property of bound functions.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to bind.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new bound function.\n * @example\n *\n * function greet(greeting, punctuation) {\n * return greeting + ' ' + this.user + punctuation;\n * }\n *\n * var object = { 'user': 'fred' };\n *\n * var bound = _.bind(greet, object, 'hi');\n * bound('!');\n * // => 'hi fred!'\n *\n * // Bound with placeholders.\n * var bound = _.bind(greet, object, _, '!');\n * bound('hi');\n * // => 'hi fred!'\n */var bind=baseRest(function(func,thisArg,partials){var bitmask=WRAP_BIND_FLAG;if(partials.length){var holders=replaceHolders(partials,getHolder(bind));bitmask|=WRAP_PARTIAL_FLAG;}return createWrap(func,bitmask,thisArg,partials,holders);});/**\n * Creates a function that invokes the method at `object[key]` with `partials`\n * prepended to the arguments it receives.\n *\n * This method differs from `_.bind` by allowing bound functions to reference\n * methods that may be redefined or don't yet exist. See\n * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\n * for more details.\n *\n * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * @static\n * @memberOf _\n * @since 0.10.0\n * @category Function\n * @param {Object} object The object to invoke the method on.\n * @param {string} key The key of the method.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new bound function.\n * @example\n *\n * var object = {\n * 'user': 'fred',\n * 'greet': function(greeting, punctuation) {\n * return greeting + ' ' + this.user + punctuation;\n * }\n * };\n *\n * var bound = _.bindKey(object, 'greet', 'hi');\n * bound('!');\n * // => 'hi fred!'\n *\n * object.greet = function(greeting, punctuation) {\n * return greeting + 'ya ' + this.user + punctuation;\n * };\n *\n * bound('!');\n * // => 'hiya fred!'\n *\n * // Bound with placeholders.\n * var bound = _.bindKey(object, 'greet', _, '!');\n * bound('hi');\n * // => 'hiya fred!'\n */var bindKey=baseRest(function(object,key,partials){var bitmask=WRAP_BIND_FLAG|WRAP_BIND_KEY_FLAG;if(partials.length){var holders=replaceHolders(partials,getHolder(bindKey));bitmask|=WRAP_PARTIAL_FLAG;}return createWrap(key,bitmask,object,partials,holders);});/**\n * Creates a function that accepts arguments of `func` and either invokes\n * `func` returning its result, if at least `arity` number of arguments have\n * been provided, or returns a function that accepts the remaining `func`\n * arguments, and so on. The arity of `func` may be specified if `func.length`\n * is not sufficient.\n *\n * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n * may be used as a placeholder for provided arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of curried functions.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Function\n * @param {Function} func The function to curry.\n * @param {number} [arity=func.length] The arity of `func`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new curried function.\n * @example\n *\n * var abc = function(a, b, c) {\n * return [a, b, c];\n * };\n *\n * var curried = _.curry(abc);\n *\n * curried(1)(2)(3);\n * // => [1, 2, 3]\n *\n * curried(1, 2)(3);\n * // => [1, 2, 3]\n *\n * curried(1, 2, 3);\n * // => [1, 2, 3]\n *\n * // Curried with placeholders.\n * curried(1)(_, 3)(2);\n * // => [1, 2, 3]\n */function curry(func,arity,guard){arity=guard?undefined:arity;var result=createWrap(func,WRAP_CURRY_FLAG,undefined,undefined,undefined,undefined,undefined,arity);result.placeholder=curry.placeholder;return result;}/**\n * This method is like `_.curry` except that arguments are applied to `func`\n * in the manner of `_.partialRight` instead of `_.partial`.\n *\n * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for provided arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of curried functions.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to curry.\n * @param {number} [arity=func.length] The arity of `func`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new curried function.\n * @example\n *\n * var abc = function(a, b, c) {\n * return [a, b, c];\n * };\n *\n * var curried = _.curryRight(abc);\n *\n * curried(3)(2)(1);\n * // => [1, 2, 3]\n *\n * curried(2, 3)(1);\n * // => [1, 2, 3]\n *\n * curried(1, 2, 3);\n * // => [1, 2, 3]\n *\n * // Curried with placeholders.\n * curried(3)(1, _)(2);\n * // => [1, 2, 3]\n */function curryRight(func,arity,guard){arity=guard?undefined:arity;var result=createWrap(func,WRAP_CURRY_RIGHT_FLAG,undefined,undefined,undefined,undefined,undefined,arity);result.placeholder=curryRight.placeholder;return result;}/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */function debounce(func,wait,options){var lastArgs,lastThis,maxWait,result,timerId,lastCallTime,lastInvokeTime=0,leading=false,maxing=false,trailing=true;if(typeof func!=='function'){throw new TypeError(FUNC_ERROR_TEXT);}wait=toNumber(wait)||0;if(isObject(options)){leading=!!options.leading;maxing='maxWait'in options;maxWait=maxing?nativeMax(toNumber(options.maxWait)||0,wait):maxWait;trailing='trailing'in options?!!options.trailing:trailing;}function invokeFunc(time){var args=lastArgs,thisArg=lastThis;lastArgs=lastThis=undefined;lastInvokeTime=time;result=func.apply(thisArg,args);return result;}function leadingEdge(time){// Reset any `maxWait` timer.\nlastInvokeTime=time;// Start the timer for the trailing edge.\ntimerId=setTimeout(timerExpired,wait);// Invoke the leading edge.\nreturn leading?invokeFunc(time):result;}function remainingWait(time){var timeSinceLastCall=time-lastCallTime,timeSinceLastInvoke=time-lastInvokeTime,timeWaiting=wait-timeSinceLastCall;return maxing?nativeMin(timeWaiting,maxWait-timeSinceLastInvoke):timeWaiting;}function shouldInvoke(time){var timeSinceLastCall=time-lastCallTime,timeSinceLastInvoke=time-lastInvokeTime;// Either this is the first call, activity has stopped and we're at the\n// trailing edge, the system time has gone backwards and we're treating\n// it as the trailing edge, or we've hit the `maxWait` limit.\nreturn lastCallTime===undefined||timeSinceLastCall>=wait||timeSinceLastCall<0||maxing&&timeSinceLastInvoke>=maxWait;}function timerExpired(){var time=now();if(shouldInvoke(time)){return trailingEdge(time);}// Restart the timer.\ntimerId=setTimeout(timerExpired,remainingWait(time));}function trailingEdge(time){timerId=undefined;// Only invoke if we have `lastArgs` which means `func` has been\n// debounced at least once.\nif(trailing&&lastArgs){return invokeFunc(time);}lastArgs=lastThis=undefined;return result;}function cancel(){if(timerId!==undefined){clearTimeout(timerId);}lastInvokeTime=0;lastArgs=lastCallTime=lastThis=timerId=undefined;}function flush(){return timerId===undefined?result:trailingEdge(now());}function debounced(){var time=now(),isInvoking=shouldInvoke(time);lastArgs=arguments;lastThis=this;lastCallTime=time;if(isInvoking){if(timerId===undefined){return leadingEdge(lastCallTime);}if(maxing){// Handle invocations in a tight loop.\ntimerId=setTimeout(timerExpired,wait);return invokeFunc(lastCallTime);}}if(timerId===undefined){timerId=setTimeout(timerExpired,wait);}return result;}debounced.cancel=cancel;debounced.flush=flush;return debounced;}/**\n * Defers invoking the `func` until the current call stack has cleared. Any\n * additional arguments are provided to `func` when it's invoked.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to defer.\n * @param {...*} [args] The arguments to invoke `func` with.\n * @returns {number} Returns the timer id.\n * @example\n *\n * _.defer(function(text) {\n * console.log(text);\n * }, 'deferred');\n * // => Logs 'deferred' after one millisecond.\n */var defer=baseRest(function(func,args){return baseDelay(func,1,args);});/**\n * Invokes `func` after `wait` milliseconds. Any additional arguments are\n * provided to `func` when it's invoked.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @param {...*} [args] The arguments to invoke `func` with.\n * @returns {number} Returns the timer id.\n * @example\n *\n * _.delay(function(text) {\n * console.log(text);\n * }, 1000, 'later');\n * // => Logs 'later' after one second.\n */var delay=baseRest(function(func,wait,args){return baseDelay(func,toNumber(wait)||0,args);});/**\n * Creates a function that invokes `func` with arguments reversed.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to flip arguments for.\n * @returns {Function} Returns the new flipped function.\n * @example\n *\n * var flipped = _.flip(function() {\n * return _.toArray(arguments);\n * });\n *\n * flipped('a', 'b', 'c', 'd');\n * // => ['d', 'c', 'b', 'a']\n */function flip(func){return createWrap(func,WRAP_FLIP_FLAG);}/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */function memoize(func,resolver){if(typeof func!=='function'||resolver!=null&&typeof resolver!=='function'){throw new TypeError(FUNC_ERROR_TEXT);}var memoized=function memoized(){var args=arguments,key=resolver?resolver.apply(this,args):args[0],cache=memoized.cache;if(cache.has(key)){return cache.get(key);}var result=func.apply(this,args);memoized.cache=cache.set(key,result)||cache;return result;};memoized.cache=new(memoize.Cache||MapCache)();return memoized;}// Expose `MapCache`.\nmemoize.Cache=MapCache;/**\n * Creates a function that negates the result of the predicate `func`. The\n * `func` predicate is invoked with the `this` binding and arguments of the\n * created function.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} predicate The predicate to negate.\n * @returns {Function} Returns the new negated function.\n * @example\n *\n * function isEven(n) {\n * return n % 2 == 0;\n * }\n *\n * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n * // => [1, 3, 5]\n */function negate(predicate){if(typeof predicate!=='function'){throw new TypeError(FUNC_ERROR_TEXT);}return function(){var args=arguments;switch(args.length){case 0:return!predicate.call(this);case 1:return!predicate.call(this,args[0]);case 2:return!predicate.call(this,args[0],args[1]);case 3:return!predicate.call(this,args[0],args[1],args[2]);}return!predicate.apply(this,args);};}/**\n * Creates a function that is restricted to invoking `func` once. Repeat calls\n * to the function return the value of the first invocation. The `func` is\n * invoked with the `this` binding and arguments of the created function.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * var initialize = _.once(createApplication);\n * initialize();\n * initialize();\n * // => `createApplication` is invoked once\n */function once(func){return before(2,func);}/**\n * Creates a function that invokes `func` with its arguments transformed.\n *\n * @static\n * @since 4.0.0\n * @memberOf _\n * @category Function\n * @param {Function} func The function to wrap.\n * @param {...(Function|Function[])} [transforms=[_.identity]]\n * The argument transforms.\n * @returns {Function} Returns the new function.\n * @example\n *\n * function doubled(n) {\n * return n * 2;\n * }\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var func = _.overArgs(function(x, y) {\n * return [x, y];\n * }, [square, doubled]);\n *\n * func(9, 3);\n * // => [81, 6]\n *\n * func(10, 5);\n * // => [100, 10]\n */var overArgs=castRest(function(func,transforms){transforms=transforms.length==1&&isArray(transforms[0])?arrayMap(transforms[0],baseUnary(getIteratee())):arrayMap(baseFlatten(transforms,1),baseUnary(getIteratee()));var funcsLength=transforms.length;return baseRest(function(args){var index=-1,length=nativeMin(args.length,funcsLength);while(++index 'hello fred'\n *\n * // Partially applied with placeholders.\n * var greetFred = _.partial(greet, _, 'fred');\n * greetFred('hi');\n * // => 'hi fred'\n */var partial=baseRest(function(func,partials){var holders=replaceHolders(partials,getHolder(partial));return createWrap(func,WRAP_PARTIAL_FLAG,undefined,partials,holders);});/**\n * This method is like `_.partial` except that partially applied arguments\n * are appended to the arguments it receives.\n *\n * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of partially\n * applied functions.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Function\n * @param {Function} func The function to partially apply arguments to.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new partially applied function.\n * @example\n *\n * function greet(greeting, name) {\n * return greeting + ' ' + name;\n * }\n *\n * var greetFred = _.partialRight(greet, 'fred');\n * greetFred('hi');\n * // => 'hi fred'\n *\n * // Partially applied with placeholders.\n * var sayHelloTo = _.partialRight(greet, 'hello', _);\n * sayHelloTo('fred');\n * // => 'hello fred'\n */var partialRight=baseRest(function(func,partials){var holders=replaceHolders(partials,getHolder(partialRight));return createWrap(func,WRAP_PARTIAL_RIGHT_FLAG,undefined,partials,holders);});/**\n * Creates a function that invokes `func` with arguments arranged according\n * to the specified `indexes` where the argument value at the first index is\n * provided as the first argument, the argument value at the second index is\n * provided as the second argument, and so on.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to rearrange arguments for.\n * @param {...(number|number[])} indexes The arranged argument indexes.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var rearged = _.rearg(function(a, b, c) {\n * return [a, b, c];\n * }, [2, 0, 1]);\n *\n * rearged('b', 'c', 'a')\n * // => ['a', 'b', 'c']\n */var rearg=flatRest(function(func,indexes){return createWrap(func,WRAP_REARG_FLAG,undefined,undefined,undefined,indexes);});/**\n * Creates a function that invokes `func` with the `this` binding of the\n * created function and arguments from `start` and beyond provided as\n * an array.\n *\n * **Note:** This method is based on the\n * [rest parameter](https://mdn.io/rest_parameters).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.rest(function(what, names) {\n * return what + ' ' + _.initial(names).join(', ') +\n * (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n * });\n *\n * say('hello', 'fred', 'barney', 'pebbles');\n * // => 'hello fred, barney, & pebbles'\n */function rest(func,start){if(typeof func!=='function'){throw new TypeError(FUNC_ERROR_TEXT);}start=start===undefined?start:toInteger(start);return baseRest(func,start);}/**\n * Creates a function that invokes `func` with the `this` binding of the\n * create function and an array of arguments much like\n * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\n *\n * **Note:** This method is based on the\n * [spread operator](https://mdn.io/spread_operator).\n *\n * @static\n * @memberOf _\n * @since 3.2.0\n * @category Function\n * @param {Function} func The function to spread arguments over.\n * @param {number} [start=0] The start position of the spread.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.spread(function(who, what) {\n * return who + ' says ' + what;\n * });\n *\n * say(['fred', 'hello']);\n * // => 'fred says hello'\n *\n * var numbers = Promise.all([\n * Promise.resolve(40),\n * Promise.resolve(36)\n * ]);\n *\n * numbers.then(_.spread(function(x, y) {\n * return x + y;\n * }));\n * // => a Promise of 76\n */function spread(func,start){if(typeof func!=='function'){throw new TypeError(FUNC_ERROR_TEXT);}start=start==null?0:nativeMax(toInteger(start),0);return baseRest(function(args){var array=args[start],otherArgs=castSlice(args,0,start);if(array){arrayPush(otherArgs,array);}return apply(func,this,otherArgs);});}/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */function throttle(func,wait,options){var leading=true,trailing=true;if(typeof func!=='function'){throw new TypeError(FUNC_ERROR_TEXT);}if(isObject(options)){leading='leading'in options?!!options.leading:leading;trailing='trailing'in options?!!options.trailing:trailing;}return debounce(func,wait,{leading:leading,maxWait:wait,trailing:trailing});}/**\n * Creates a function that accepts up to one argument, ignoring any\n * additional arguments.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n * @example\n *\n * _.map(['6', '8', '10'], _.unary(parseInt));\n * // => [6, 8, 10]\n */function unary(func){return ary(func,1);}/**\n * Creates a function that provides `value` to `wrapper` as its first\n * argument. Any additional arguments provided to the function are appended\n * to those provided to the `wrapper`. The wrapper is invoked with the `this`\n * binding of the created function.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {*} value The value to wrap.\n * @param {Function} [wrapper=identity] The wrapper function.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var p = _.wrap(_.escape, function(func, text) {\n * return '

' + func(text) + '

';\n * });\n *\n * p('fred, barney, & pebbles');\n * // => '

fred, barney, & pebbles

'\n */function wrap(value,wrapper){return partial(castFunction(wrapper),value);}/* ------------------------------------------------------------------------*//**\n * Casts `value` as an array if it's not one.\n *\n * @static\n * @memberOf _\n * @since 4.4.0\n * @category Lang\n * @param {*} value The value to inspect.\n * @returns {Array} Returns the cast array.\n * @example\n *\n * _.castArray(1);\n * // => [1]\n *\n * _.castArray({ 'a': 1 });\n * // => [{ 'a': 1 }]\n *\n * _.castArray('abc');\n * // => ['abc']\n *\n * _.castArray(null);\n * // => [null]\n *\n * _.castArray(undefined);\n * // => [undefined]\n *\n * _.castArray();\n * // => []\n *\n * var array = [1, 2, 3];\n * console.log(_.castArray(array) === array);\n * // => true\n */function castArray(){if(!arguments.length){return[];}var value=arguments[0];return isArray(value)?value:[value];}/**\n * Creates a shallow clone of `value`.\n *\n * **Note:** This method is loosely based on the\n * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n * and supports cloning arrays, array buffers, booleans, date objects, maps,\n * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n * arrays. The own enumerable properties of `arguments` objects are cloned\n * as plain objects. An empty object is returned for uncloneable values such\n * as error objects, functions, DOM nodes, and WeakMaps.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to clone.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeep\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var shallow = _.clone(objects);\n * console.log(shallow[0] === objects[0]);\n * // => true\n */function clone(value){return baseClone(value,CLONE_SYMBOLS_FLAG);}/**\n * This method is like `_.clone` except that it accepts `customizer` which\n * is invoked to produce the cloned value. If `customizer` returns `undefined`,\n * cloning is handled by the method instead. The `customizer` is invoked with\n * up to four arguments; (value [, index|key, object, stack]).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to clone.\n * @param {Function} [customizer] The function to customize cloning.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeepWith\n * @example\n *\n * function customizer(value) {\n * if (_.isElement(value)) {\n * return value.cloneNode(false);\n * }\n * }\n *\n * var el = _.cloneWith(document.body, customizer);\n *\n * console.log(el === document.body);\n * // => false\n * console.log(el.nodeName);\n * // => 'BODY'\n * console.log(el.childNodes.length);\n * // => 0\n */function cloneWith(value,customizer){customizer=typeof customizer==='function'?customizer:undefined;return baseClone(value,CLONE_SYMBOLS_FLAG,customizer);}/**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */function cloneDeep(value){return baseClone(value,CLONE_DEEP_FLAG|CLONE_SYMBOLS_FLAG);}/**\n * This method is like `_.cloneWith` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @param {Function} [customizer] The function to customize cloning.\n * @returns {*} Returns the deep cloned value.\n * @see _.cloneWith\n * @example\n *\n * function customizer(value) {\n * if (_.isElement(value)) {\n * return value.cloneNode(true);\n * }\n * }\n *\n * var el = _.cloneDeepWith(document.body, customizer);\n *\n * console.log(el === document.body);\n * // => false\n * console.log(el.nodeName);\n * // => 'BODY'\n * console.log(el.childNodes.length);\n * // => 20\n */function cloneDeepWith(value,customizer){customizer=typeof customizer==='function'?customizer:undefined;return baseClone(value,CLONE_DEEP_FLAG|CLONE_SYMBOLS_FLAG,customizer);}/**\n * Checks if `object` conforms to `source` by invoking the predicate\n * properties of `source` with the corresponding property values of `object`.\n *\n * **Note:** This method is equivalent to `_.conforms` when `source` is\n * partially applied.\n *\n * @static\n * @memberOf _\n * @since 4.14.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property predicates to conform to.\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n *\n * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\n * // => true\n *\n * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\n * // => false\n */function conformsTo(object,source){return source==null||baseConformsTo(object,source,keys(source));}/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */function eq(value,other){return value===other||value!==value&&other!==other;}/**\n * Checks if `value` is greater than `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\n * else `false`.\n * @see _.lt\n * @example\n *\n * _.gt(3, 1);\n * // => true\n *\n * _.gt(3, 3);\n * // => false\n *\n * _.gt(1, 3);\n * // => false\n */var gt=createRelationalOperation(baseGt);/**\n * Checks if `value` is greater than or equal to `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than or equal to\n * `other`, else `false`.\n * @see _.lte\n * @example\n *\n * _.gte(3, 1);\n * // => true\n *\n * _.gte(3, 3);\n * // => true\n *\n * _.gte(1, 3);\n * // => false\n */var gte=createRelationalOperation(function(value,other){return value>=other;});/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */var isArguments=baseIsArguments(function(){return arguments;}())?baseIsArguments:function(value){return isObjectLike(value)&&hasOwnProperty.call(value,'callee')&&!propertyIsEnumerable.call(value,'callee');};/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */var isArray=Array.isArray;/**\n * Checks if `value` is classified as an `ArrayBuffer` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n * @example\n *\n * _.isArrayBuffer(new ArrayBuffer(2));\n * // => true\n *\n * _.isArrayBuffer(new Array(2));\n * // => false\n */var isArrayBuffer=nodeIsArrayBuffer?baseUnary(nodeIsArrayBuffer):baseIsArrayBuffer;/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */function isArrayLike(value){return value!=null&&isLength(value.length)&&!isFunction(value);}/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */function isArrayLikeObject(value){return isObjectLike(value)&&isArrayLike(value);}/**\n * Checks if `value` is classified as a boolean primitive or object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n * @example\n *\n * _.isBoolean(false);\n * // => true\n *\n * _.isBoolean(null);\n * // => false\n */function isBoolean(value){return value===true||value===false||isObjectLike(value)&&baseGetTag(value)==boolTag;}/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */var isBuffer=nativeIsBuffer||stubFalse;/**\n * Checks if `value` is classified as a `Date` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n * @example\n *\n * _.isDate(new Date);\n * // => true\n *\n * _.isDate('Mon April 23 2012');\n * // => false\n */var isDate=nodeIsDate?baseUnary(nodeIsDate):baseIsDate;/**\n * Checks if `value` is likely a DOM element.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n * @example\n *\n * _.isElement(document.body);\n * // => true\n *\n * _.isElement('');\n * // => false\n */function isElement(value){return isObjectLike(value)&&value.nodeType===1&&!isPlainObject(value);}/**\n * Checks if `value` is an empty object, collection, map, or set.\n *\n * Objects are considered empty if they have no own enumerable string keyed\n * properties.\n *\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n * jQuery-like collections are considered empty if they have a `length` of `0`.\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n * @example\n *\n * _.isEmpty(null);\n * // => true\n *\n * _.isEmpty(true);\n * // => true\n *\n * _.isEmpty(1);\n * // => true\n *\n * _.isEmpty([1, 2, 3]);\n * // => false\n *\n * _.isEmpty({ 'a': 1 });\n * // => false\n */function isEmpty(value){if(value==null){return true;}if(isArrayLike(value)&&(isArray(value)||typeof value==='string'||typeof value.splice==='function'||isBuffer(value)||isTypedArray(value)||isArguments(value))){return!value.length;}var tag=getTag(value);if(tag==mapTag||tag==setTag){return!value.size;}if(isPrototype(value)){return!baseKeys(value).length;}for(var key in value){if(hasOwnProperty.call(value,key)){return false;}}return true;}/**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */function isEqual(value,other){return baseIsEqual(value,other);}/**\n * This method is like `_.isEqual` except that it accepts `customizer` which\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n * are handled by the method instead. The `customizer` is invoked with up to\n * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * function isGreeting(value) {\n * return /^h(?:i|ello)$/.test(value);\n * }\n *\n * function customizer(objValue, othValue) {\n * if (isGreeting(objValue) && isGreeting(othValue)) {\n * return true;\n * }\n * }\n *\n * var array = ['hello', 'goodbye'];\n * var other = ['hi', 'goodbye'];\n *\n * _.isEqualWith(array, other, customizer);\n * // => true\n */function isEqualWith(value,other,customizer){customizer=typeof customizer==='function'?customizer:undefined;var result=customizer?customizer(value,other):undefined;return result===undefined?baseIsEqual(value,other,undefined,customizer):!!result;}/**\n * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n * `SyntaxError`, `TypeError`, or `URIError` object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n * @example\n *\n * _.isError(new Error);\n * // => true\n *\n * _.isError(Error);\n * // => false\n */function isError(value){if(!isObjectLike(value)){return false;}var tag=baseGetTag(value);return tag==errorTag||tag==domExcTag||typeof value.message==='string'&&typeof value.name==='string'&&!isPlainObject(value);}/**\n * Checks if `value` is a finite primitive number.\n *\n * **Note:** This method is based on\n * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n * @example\n *\n * _.isFinite(3);\n * // => true\n *\n * _.isFinite(Number.MIN_VALUE);\n * // => true\n *\n * _.isFinite(Infinity);\n * // => false\n *\n * _.isFinite('3');\n * // => false\n */function isFinite(value){return typeof value==='number'&&nativeIsFinite(value);}/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */function isFunction(value){if(!isObject(value)){return false;}// The use of `Object#toString` avoids issues with the `typeof` operator\n// in Safari 9 which returns 'object' for typed arrays and other constructors.\nvar tag=baseGetTag(value);return tag==funcTag||tag==genTag||tag==asyncTag||tag==proxyTag;}/**\n * Checks if `value` is an integer.\n *\n * **Note:** This method is based on\n * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n * @example\n *\n * _.isInteger(3);\n * // => true\n *\n * _.isInteger(Number.MIN_VALUE);\n * // => false\n *\n * _.isInteger(Infinity);\n * // => false\n *\n * _.isInteger('3');\n * // => false\n */function isInteger(value){return typeof value==='number'&&value==toInteger(value);}/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */function isLength(value){return typeof value==='number'&&value>-1&&value%1==0&&value<=MAX_SAFE_INTEGER;}/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */function isObject(value){var type=typeof value==='undefined'?'undefined':_typeof(value);return value!=null&&(type=='object'||type=='function');}/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */function isObjectLike(value){return value!=null&&(typeof value==='undefined'?'undefined':_typeof(value))==='object';}/**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */var isMap=nodeIsMap?baseUnary(nodeIsMap):baseIsMap;/**\n * Performs a partial deep comparison between `object` and `source` to\n * determine if `object` contains equivalent property values.\n *\n * **Note:** This method is equivalent to `_.matches` when `source` is\n * partially applied.\n *\n * Partial comparisons will match empty array and empty object `source`\n * values against any array or object value, respectively. See `_.isEqual`\n * for a list of supported value comparisons.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n *\n * _.isMatch(object, { 'b': 2 });\n * // => true\n *\n * _.isMatch(object, { 'b': 1 });\n * // => false\n */function isMatch(object,source){return object===source||baseIsMatch(object,source,getMatchData(source));}/**\n * This method is like `_.isMatch` except that it accepts `customizer` which\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n * are handled by the method instead. The `customizer` is invoked with five\n * arguments: (objValue, srcValue, index|key, object, source).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n * @example\n *\n * function isGreeting(value) {\n * return /^h(?:i|ello)$/.test(value);\n * }\n *\n * function customizer(objValue, srcValue) {\n * if (isGreeting(objValue) && isGreeting(srcValue)) {\n * return true;\n * }\n * }\n *\n * var object = { 'greeting': 'hello' };\n * var source = { 'greeting': 'hi' };\n *\n * _.isMatchWith(object, source, customizer);\n * // => true\n */function isMatchWith(object,source,customizer){customizer=typeof customizer==='function'?customizer:undefined;return baseIsMatch(object,source,getMatchData(source),customizer);}/**\n * Checks if `value` is `NaN`.\n *\n * **Note:** This method is based on\n * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\n * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\n * `undefined` and other non-number values.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n * @example\n *\n * _.isNaN(NaN);\n * // => true\n *\n * _.isNaN(new Number(NaN));\n * // => true\n *\n * isNaN(undefined);\n * // => true\n *\n * _.isNaN(undefined);\n * // => false\n */function isNaN(value){// An `NaN` primitive is the only value that is not equal to itself.\n// Perform the `toStringTag` check first to avoid errors with some\n// ActiveX objects in IE.\nreturn isNumber(value)&&value!=+value;}/**\n * Checks if `value` is a pristine native function.\n *\n * **Note:** This method can't reliably detect native functions in the presence\n * of the core-js package because core-js circumvents this kind of detection.\n * Despite multiple requests, the core-js maintainer has made it clear: any\n * attempt to fix the detection will be obstructed. As a result, we're left\n * with little choice but to throw an error. Unfortunately, this also affects\n * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\n * which rely on core-js.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n * @example\n *\n * _.isNative(Array.prototype.push);\n * // => true\n *\n * _.isNative(_);\n * // => false\n */function isNative(value){if(isMaskable(value)){throw new Error(CORE_ERROR_TEXT);}return baseIsNative(value);}/**\n * Checks if `value` is `null`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n * @example\n *\n * _.isNull(null);\n * // => true\n *\n * _.isNull(void 0);\n * // => false\n */function isNull(value){return value===null;}/**\n * Checks if `value` is `null` or `undefined`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n * @example\n *\n * _.isNil(null);\n * // => true\n *\n * _.isNil(void 0);\n * // => true\n *\n * _.isNil(NaN);\n * // => false\n */function isNil(value){return value==null;}/**\n * Checks if `value` is classified as a `Number` primitive or object.\n *\n * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n * classified as numbers, use the `_.isFinite` method.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n * @example\n *\n * _.isNumber(3);\n * // => true\n *\n * _.isNumber(Number.MIN_VALUE);\n * // => true\n *\n * _.isNumber(Infinity);\n * // => true\n *\n * _.isNumber('3');\n * // => false\n */function isNumber(value){return typeof value==='number'||isObjectLike(value)&&baseGetTag(value)==numberTag;}/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */function isPlainObject(value){if(!isObjectLike(value)||baseGetTag(value)!=objectTag){return false;}var proto=getPrototype(value);if(proto===null){return true;}var Ctor=hasOwnProperty.call(proto,'constructor')&&proto.constructor;return typeof Ctor==='function'&&Ctor instanceof Ctor&&funcToString.call(Ctor)==objectCtorString;}/**\n * Checks if `value` is classified as a `RegExp` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n * @example\n *\n * _.isRegExp(/abc/);\n * // => true\n *\n * _.isRegExp('/abc/');\n * // => false\n */var isRegExp=nodeIsRegExp?baseUnary(nodeIsRegExp):baseIsRegExp;/**\n * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\n * double precision number which isn't the result of a rounded unsafe integer.\n *\n * **Note:** This method is based on\n * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\n * @example\n *\n * _.isSafeInteger(3);\n * // => true\n *\n * _.isSafeInteger(Number.MIN_VALUE);\n * // => false\n *\n * _.isSafeInteger(Infinity);\n * // => false\n *\n * _.isSafeInteger('3');\n * // => false\n */function isSafeInteger(value){return isInteger(value)&&value>=-MAX_SAFE_INTEGER&&value<=MAX_SAFE_INTEGER;}/**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */var isSet=nodeIsSet?baseUnary(nodeIsSet):baseIsSet;/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */function isString(value){return typeof value==='string'||!isArray(value)&&isObjectLike(value)&&baseGetTag(value)==stringTag;}/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */function isSymbol(value){return(typeof value==='undefined'?'undefined':_typeof(value))==='symbol'||isObjectLike(value)&&baseGetTag(value)==symbolTag;}/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */var isTypedArray=nodeIsTypedArray?baseUnary(nodeIsTypedArray):baseIsTypedArray;/**\n * Checks if `value` is `undefined`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n * @example\n *\n * _.isUndefined(void 0);\n * // => true\n *\n * _.isUndefined(null);\n * // => false\n */function isUndefined(value){return value===undefined;}/**\n * Checks if `value` is classified as a `WeakMap` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\n * @example\n *\n * _.isWeakMap(new WeakMap);\n * // => true\n *\n * _.isWeakMap(new Map);\n * // => false\n */function isWeakMap(value){return isObjectLike(value)&&getTag(value)==weakMapTag;}/**\n * Checks if `value` is classified as a `WeakSet` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\n * @example\n *\n * _.isWeakSet(new WeakSet);\n * // => true\n *\n * _.isWeakSet(new Set);\n * // => false\n */function isWeakSet(value){return isObjectLike(value)&&baseGetTag(value)==weakSetTag;}/**\n * Checks if `value` is less than `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n * else `false`.\n * @see _.gt\n * @example\n *\n * _.lt(1, 3);\n * // => true\n *\n * _.lt(3, 3);\n * // => false\n *\n * _.lt(3, 1);\n * // => false\n */var lt=createRelationalOperation(baseLt);/**\n * Checks if `value` is less than or equal to `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than or equal to\n * `other`, else `false`.\n * @see _.gte\n * @example\n *\n * _.lte(1, 3);\n * // => true\n *\n * _.lte(3, 3);\n * // => true\n *\n * _.lte(3, 1);\n * // => false\n */var lte=createRelationalOperation(function(value,other){return value<=other;});/**\n * Converts `value` to an array.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Array} Returns the converted array.\n * @example\n *\n * _.toArray({ 'a': 1, 'b': 2 });\n * // => [1, 2]\n *\n * _.toArray('abc');\n * // => ['a', 'b', 'c']\n *\n * _.toArray(1);\n * // => []\n *\n * _.toArray(null);\n * // => []\n */function toArray(value){if(!value){return[];}if(isArrayLike(value)){return isString(value)?stringToArray(value):copyArray(value);}if(symIterator&&value[symIterator]){return iteratorToArray(value[symIterator]());}var tag=getTag(value),func=tag==mapTag?mapToArray:tag==setTag?setToArray:values;return func(value);}/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */function toFinite(value){if(!value){return value===0?value:0;}value=toNumber(value);if(value===INFINITY||value===-INFINITY){var sign=value<0?-1:1;return sign*MAX_INTEGER;}return value===value?value:0;}/**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */function toInteger(value){var result=toFinite(value),remainder=result%1;return result===result?remainder?result-remainder:result:0;}/**\n * Converts `value` to an integer suitable for use as the length of an\n * array-like object.\n *\n * **Note:** This method is based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toLength(3.2);\n * // => 3\n *\n * _.toLength(Number.MIN_VALUE);\n * // => 0\n *\n * _.toLength(Infinity);\n * // => 4294967295\n *\n * _.toLength('3.2');\n * // => 3\n */function toLength(value){return value?baseClamp(toInteger(value),0,MAX_ARRAY_LENGTH):0;}/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */function toNumber(value){if(typeof value==='number'){return value;}if(isSymbol(value)){return NAN;}if(isObject(value)){var other=typeof value.valueOf==='function'?value.valueOf():value;value=isObject(other)?other+'':other;}if(typeof value!=='string'){return value===0?value:+value;}value=value.replace(reTrim,'');var isBinary=reIsBinary.test(value);return isBinary||reIsOctal.test(value)?freeParseInt(value.slice(2),isBinary?2:8):reIsBadHex.test(value)?NAN:+value;}/**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */function toPlainObject(value){return copyObject(value,keysIn(value));}/**\n * Converts `value` to a safe integer. A safe integer can be compared and\n * represented correctly.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toSafeInteger(3.2);\n * // => 3\n *\n * _.toSafeInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toSafeInteger(Infinity);\n * // => 9007199254740991\n *\n * _.toSafeInteger('3.2');\n * // => 3\n */function toSafeInteger(value){return value?baseClamp(toInteger(value),-MAX_SAFE_INTEGER,MAX_SAFE_INTEGER):value===0?value:0;}/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */function toString(value){return value==null?'':baseToString(value);}/* ------------------------------------------------------------------------*//**\n * Assigns own enumerable string keyed properties of source objects to the\n * destination object. Source objects are applied from left to right.\n * Subsequent sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object` and is loosely based on\n * [`Object.assign`](https://mdn.io/Object/assign).\n *\n * @static\n * @memberOf _\n * @since 0.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assignIn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * function Bar() {\n * this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assign({ 'a': 0 }, new Foo, new Bar);\n * // => { 'a': 1, 'c': 3 }\n */var assign=createAssigner(function(object,source){if(isPrototype(source)||isArrayLike(source)){copyObject(source,keys(source),object);return;}for(var key in source){if(hasOwnProperty.call(source,key)){assignValue(object,key,source[key]);}}});/**\n * This method is like `_.assign` except that it iterates over own and\n * inherited source properties.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extend\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assign\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * function Bar() {\n * this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assignIn({ 'a': 0 }, new Foo, new Bar);\n * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\n */var assignIn=createAssigner(function(object,source){copyObject(source,keysIn(source),object);});/**\n * This method is like `_.assignIn` except that it accepts `customizer`\n * which is invoked to produce the assigned values. If `customizer` returns\n * `undefined`, assignment is handled by the method instead. The `customizer`\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extendWith\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @see _.assignWith\n * @example\n *\n * function customizer(objValue, srcValue) {\n * return _.isUndefined(objValue) ? srcValue : objValue;\n * }\n *\n * var defaults = _.partialRight(_.assignInWith, customizer);\n *\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */var assignInWith=createAssigner(function(object,source,srcIndex,customizer){copyObject(source,keysIn(source),object,customizer);});/**\n * This method is like `_.assign` except that it accepts `customizer`\n * which is invoked to produce the assigned values. If `customizer` returns\n * `undefined`, assignment is handled by the method instead. The `customizer`\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @see _.assignInWith\n * @example\n *\n * function customizer(objValue, srcValue) {\n * return _.isUndefined(objValue) ? srcValue : objValue;\n * }\n *\n * var defaults = _.partialRight(_.assignWith, customizer);\n *\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */var assignWith=createAssigner(function(object,source,srcIndex,customizer){copyObject(source,keys(source),object,customizer);});/**\n * Creates an array of values corresponding to `paths` of `object`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Array} Returns the picked values.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n *\n * _.at(object, ['a[0].b.c', 'a[1]']);\n * // => [3, 4]\n */var at=flatRest(baseAt);/**\n * Creates an object that inherits from the `prototype` object. If a\n * `properties` object is given, its own enumerable string keyed properties\n * are assigned to the created object.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Object\n * @param {Object} prototype The object to inherit from.\n * @param {Object} [properties] The properties to assign to the object.\n * @returns {Object} Returns the new object.\n * @example\n *\n * function Shape() {\n * this.x = 0;\n * this.y = 0;\n * }\n *\n * function Circle() {\n * Shape.call(this);\n * }\n *\n * Circle.prototype = _.create(Shape.prototype, {\n * 'constructor': Circle\n * });\n *\n * var circle = new Circle;\n * circle instanceof Circle;\n * // => true\n *\n * circle instanceof Shape;\n * // => true\n */function create(prototype,properties){var result=baseCreate(prototype);return properties==null?result:baseAssign(result,properties);}/**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */var defaults=baseRest(function(object,sources){object=Object(object);var index=-1;var length=sources.length;var guard=length>2?sources[2]:undefined;if(guard&&isIterateeCall(sources[0],sources[1],guard)){length=1;}while(++index { 'a': { 'b': 2, 'c': 3 } }\n */var defaultsDeep=baseRest(function(args){args.push(undefined,customDefaultsMerge);return apply(mergeWith,undefined,args);});/**\n * This method is like `_.find` except that it returns the key of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {string|undefined} Returns the key of the matched element,\n * else `undefined`.\n * @example\n *\n * var users = {\n * 'barney': { 'age': 36, 'active': true },\n * 'fred': { 'age': 40, 'active': false },\n * 'pebbles': { 'age': 1, 'active': true }\n * };\n *\n * _.findKey(users, function(o) { return o.age < 40; });\n * // => 'barney' (iteration order is not guaranteed)\n *\n * // The `_.matches` iteratee shorthand.\n * _.findKey(users, { 'age': 1, 'active': true });\n * // => 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findKey(users, ['active', false]);\n * // => 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.findKey(users, 'active');\n * // => 'barney'\n */function findKey(object,predicate){return baseFindKey(object,getIteratee(predicate,3),baseForOwn);}/**\n * This method is like `_.findKey` except that it iterates over elements of\n * a collection in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {string|undefined} Returns the key of the matched element,\n * else `undefined`.\n * @example\n *\n * var users = {\n * 'barney': { 'age': 36, 'active': true },\n * 'fred': { 'age': 40, 'active': false },\n * 'pebbles': { 'age': 1, 'active': true }\n * };\n *\n * _.findLastKey(users, function(o) { return o.age < 40; });\n * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.findLastKey(users, { 'age': 36, 'active': true });\n * // => 'barney'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findLastKey(users, ['active', false]);\n * // => 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.findLastKey(users, 'active');\n * // => 'pebbles'\n */function findLastKey(object,predicate){return baseFindKey(object,getIteratee(predicate,3),baseForOwnRight);}/**\n * Iterates over own and inherited enumerable string keyed properties of an\n * object and invokes `iteratee` for each property. The iteratee is invoked\n * with three arguments: (value, key, object). Iteratee functions may exit\n * iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 0.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forInRight\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forIn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n */function forIn(object,iteratee){return object==null?object:baseFor(object,getIteratee(iteratee,3),keysIn);}/**\n * This method is like `_.forIn` except that it iterates over properties of\n * `object` in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forIn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forInRight(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\n */function forInRight(object,iteratee){return object==null?object:baseForRight(object,getIteratee(iteratee,3),keysIn);}/**\n * Iterates over own enumerable string keyed properties of an object and\n * invokes `iteratee` for each property. The iteratee is invoked with three\n * arguments: (value, key, object). Iteratee functions may exit iteration\n * early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 0.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forOwnRight\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forOwn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */function forOwn(object,iteratee){return object&&baseForOwn(object,getIteratee(iteratee,3));}/**\n * This method is like `_.forOwn` except that it iterates over properties of\n * `object` in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forOwn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forOwnRight(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\n */function forOwnRight(object,iteratee){return object&&baseForOwnRight(object,getIteratee(iteratee,3));}/**\n * Creates an array of function property names from own enumerable properties\n * of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to inspect.\n * @returns {Array} Returns the function names.\n * @see _.functionsIn\n * @example\n *\n * function Foo() {\n * this.a = _.constant('a');\n * this.b = _.constant('b');\n * }\n *\n * Foo.prototype.c = _.constant('c');\n *\n * _.functions(new Foo);\n * // => ['a', 'b']\n */function functions(object){return object==null?[]:baseFunctions(object,keys(object));}/**\n * Creates an array of function property names from own and inherited\n * enumerable properties of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @returns {Array} Returns the function names.\n * @see _.functions\n * @example\n *\n * function Foo() {\n * this.a = _.constant('a');\n * this.b = _.constant('b');\n * }\n *\n * Foo.prototype.c = _.constant('c');\n *\n * _.functionsIn(new Foo);\n * // => ['a', 'b', 'c']\n */function functionsIn(object){return object==null?[]:baseFunctions(object,keysIn(object));}/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */function get(object,path,defaultValue){var result=object==null?undefined:baseGet(object,path);return result===undefined?defaultValue:result;}/**\n * Checks if `path` is a direct property of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = { 'a': { 'b': 2 } };\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.has(object, 'a');\n * // => true\n *\n * _.has(object, 'a.b');\n * // => true\n *\n * _.has(object, ['a', 'b']);\n * // => true\n *\n * _.has(other, 'a');\n * // => false\n */function has(object,path){return object!=null&&hasPath(object,path,baseHas);}/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */function hasIn(object,path){return object!=null&&hasPath(object,path,baseHasIn);}/**\n * Creates an object composed of the inverted keys and values of `object`.\n * If `object` contains duplicate values, subsequent values overwrite\n * property assignments of previous values.\n *\n * @static\n * @memberOf _\n * @since 0.7.0\n * @category Object\n * @param {Object} object The object to invert.\n * @returns {Object} Returns the new inverted object.\n * @example\n *\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\n *\n * _.invert(object);\n * // => { '1': 'c', '2': 'b' }\n */var invert=createInverter(function(result,value,key){if(value!=null&&typeof value.toString!=='function'){value=nativeObjectToString.call(value);}result[value]=key;},constant(identity));/**\n * This method is like `_.invert` except that the inverted object is generated\n * from the results of running each element of `object` thru `iteratee`. The\n * corresponding inverted value of each inverted key is an array of keys\n * responsible for generating the inverted value. The iteratee is invoked\n * with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.1.0\n * @category Object\n * @param {Object} object The object to invert.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Object} Returns the new inverted object.\n * @example\n *\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\n *\n * _.invertBy(object);\n * // => { '1': ['a', 'c'], '2': ['b'] }\n *\n * _.invertBy(object, function(value) {\n * return 'group' + value;\n * });\n * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\n */var invertBy=createInverter(function(result,value,key){if(value!=null&&typeof value.toString!=='function'){value=nativeObjectToString.call(value);}if(hasOwnProperty.call(result,value)){result[value].push(key);}else{result[value]=[key];}},getIteratee);/**\n * Invokes the method at `path` of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the method to invoke.\n * @param {...*} [args] The arguments to invoke the method with.\n * @returns {*} Returns the result of the invoked method.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\n *\n * _.invoke(object, 'a[0].b.c.slice', 1, 3);\n * // => [2, 3]\n */var invoke=baseRest(baseInvoke);/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */function keys(object){return isArrayLike(object)?arrayLikeKeys(object):baseKeys(object);}/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */function keysIn(object){return isArrayLike(object)?arrayLikeKeys(object,true):baseKeysIn(object);}/**\n * The opposite of `_.mapValues`; this method creates an object with the\n * same values as `object` and keys generated by running each own enumerable\n * string keyed property of `object` thru `iteratee`. The iteratee is invoked\n * with three arguments: (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapValues\n * @example\n *\n * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n * return key + value;\n * });\n * // => { 'a1': 1, 'b2': 2 }\n */function mapKeys(object,iteratee){var result={};iteratee=getIteratee(iteratee,3);baseForOwn(object,function(value,key,object){baseAssignValue(result,iteratee(value,key,object),value);});return result;}/**\n * Creates an object with the same keys as `object` and values generated\n * by running each own enumerable string keyed property of `object` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapKeys\n * @example\n *\n * var users = {\n * 'fred': { 'user': 'fred', 'age': 40 },\n * 'pebbles': { 'user': 'pebbles', 'age': 1 }\n * };\n *\n * _.mapValues(users, function(o) { return o.age; });\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n *\n * // The `_.property` iteratee shorthand.\n * _.mapValues(users, 'age');\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n */function mapValues(object,iteratee){var result={};iteratee=getIteratee(iteratee,3);baseForOwn(object,function(value,key,object){baseAssignValue(result,key,iteratee(value,key,object));});return result;}/**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\n * };\n *\n * var other = {\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n */var merge=createAssigner(function(object,source,srcIndex){baseMerge(object,source,srcIndex);});/**\n * This method is like `_.merge` except that it accepts `customizer` which\n * is invoked to produce the merged values of the destination and source\n * properties. If `customizer` returns `undefined`, merging is handled by the\n * method instead. The `customizer` is invoked with six arguments:\n * (objValue, srcValue, key, object, source, stack).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} customizer The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * function customizer(objValue, srcValue) {\n * if (_.isArray(objValue)) {\n * return objValue.concat(srcValue);\n * }\n * }\n *\n * var object = { 'a': [1], 'b': [2] };\n * var other = { 'a': [3], 'b': [4] };\n *\n * _.mergeWith(object, other, customizer);\n * // => { 'a': [1, 3], 'b': [2, 4] }\n */var mergeWith=createAssigner(function(object,source,srcIndex,customizer){baseMerge(object,source,srcIndex,customizer);});/**\n * The opposite of `_.pick`; this method creates an object composed of the\n * own and inherited enumerable property paths of `object` that are not omitted.\n *\n * **Note:** This method is considerably slower than `_.pick`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to omit.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.omit(object, ['a', 'c']);\n * // => { 'b': '2' }\n */var omit=flatRest(function(object,paths){var result={};if(object==null){return result;}var isDeep=false;paths=arrayMap(paths,function(path){path=castPath(path,object);isDeep||(isDeep=path.length>1);return path;});copyObject(object,getAllKeysIn(object),result);if(isDeep){result=baseClone(result,CLONE_DEEP_FLAG|CLONE_FLAT_FLAG|CLONE_SYMBOLS_FLAG,customOmitClone);}var length=paths.length;while(length--){baseUnset(result,paths[length]);}return result;});/**\n * The opposite of `_.pickBy`; this method creates an object composed of\n * the own and inherited enumerable string keyed properties of `object` that\n * `predicate` doesn't return truthy for. The predicate is invoked with two\n * arguments: (value, key).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The source object.\n * @param {Function} [predicate=_.identity] The function invoked per property.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.omitBy(object, _.isNumber);\n * // => { 'b': '2' }\n */function omitBy(object,predicate){return pickBy(object,negate(getIteratee(predicate)));}/**\n * Creates an object composed of the picked `object` properties.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pick(object, ['a', 'c']);\n * // => { 'a': 1, 'c': 3 }\n */var pick=flatRest(function(object,paths){return object==null?{}:basePick(object,paths);});/**\n * Creates an object composed of the `object` properties `predicate` returns\n * truthy for. The predicate is invoked with two arguments: (value, key).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The source object.\n * @param {Function} [predicate=_.identity] The function invoked per property.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pickBy(object, _.isNumber);\n * // => { 'a': 1, 'c': 3 }\n */function pickBy(object,predicate){if(object==null){return{};}var props=arrayMap(getAllKeysIn(object),function(prop){return[prop];});predicate=getIteratee(predicate);return basePickBy(object,props,function(value,path){return predicate(value,path[0]);});}/**\n * This method is like `_.get` except that if the resolved value is a\n * function it's invoked with the `this` binding of its parent object and\n * its result is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to resolve.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n *\n * _.result(object, 'a[0].b.c1');\n * // => 3\n *\n * _.result(object, 'a[0].b.c2');\n * // => 4\n *\n * _.result(object, 'a[0].b.c3', 'default');\n * // => 'default'\n *\n * _.result(object, 'a[0].b.c3', _.constant('default'));\n * // => 'default'\n */function result(object,path,defaultValue){path=castPath(path,object);var index=-1,length=path.length;// Ensure the loop is entered when path is empty.\nif(!length){length=1;object=undefined;}while(++index 4\n *\n * _.set(object, ['x', '0', 'y', 'z'], 5);\n * console.log(object.x[0].y.z);\n * // => 5\n */function set(object,path,value){return object==null?object:baseSet(object,path,value);}/**\n * This method is like `_.set` except that it accepts `customizer` which is\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\n * path creation is handled by the method instead. The `customizer` is invoked\n * with three arguments: (nsValue, key, nsObject).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {};\n *\n * _.setWith(object, '[0][1]', 'a', Object);\n * // => { '0': { '1': 'a' } }\n */function setWith(object,path,value,customizer){customizer=typeof customizer==='function'?customizer:undefined;return object==null?object:baseSet(object,path,value,customizer);}/**\n * Creates an array of own enumerable string keyed-value pairs for `object`\n * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\n * entries are returned.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias entries\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the key-value pairs.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.toPairs(new Foo);\n * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\n */var toPairs=createToPairs(keys);/**\n * Creates an array of own and inherited enumerable string keyed-value pairs\n * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\n * or set, its entries are returned.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias entriesIn\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the key-value pairs.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.toPairsIn(new Foo);\n * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\n */var toPairsIn=createToPairs(keysIn);/**\n * An alternative to `_.reduce`; this method transforms `object` to a new\n * `accumulator` object which is the result of running each of its own\n * enumerable string keyed properties thru `iteratee`, with each invocation\n * potentially mutating the `accumulator` object. If `accumulator` is not\n * provided, a new object with the same `[[Prototype]]` will be used. The\n * iteratee is invoked with four arguments: (accumulator, value, key, object).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 1.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The custom accumulator value.\n * @returns {*} Returns the accumulated value.\n * @example\n *\n * _.transform([2, 3, 4], function(result, n) {\n * result.push(n *= n);\n * return n % 2 == 0;\n * }, []);\n * // => [4, 9]\n *\n * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] }\n */function transform(object,iteratee,accumulator){var isArr=isArray(object),isArrLike=isArr||isBuffer(object)||isTypedArray(object);iteratee=getIteratee(iteratee,4);if(accumulator==null){var Ctor=object&&object.constructor;if(isArrLike){accumulator=isArr?new Ctor():[];}else if(isObject(object)){accumulator=isFunction(Ctor)?baseCreate(getPrototype(object)):{};}else{accumulator={};}}(isArrLike?arrayEach:baseForOwn)(object,function(value,index,object){return iteratee(accumulator,value,index,object);});return accumulator;}/**\n * Removes the property at `path` of `object`.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to unset.\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 7 } }] };\n * _.unset(object, 'a[0].b.c');\n * // => true\n *\n * console.log(object);\n * // => { 'a': [{ 'b': {} }] };\n *\n * _.unset(object, ['a', '0', 'b', 'c']);\n * // => true\n *\n * console.log(object);\n * // => { 'a': [{ 'b': {} }] };\n */function unset(object,path){return object==null?true:baseUnset(object,path);}/**\n * This method is like `_.set` except that accepts `updater` to produce the\n * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\n * is invoked with one argument: (value).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {Function} updater The function to produce the updated value.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.update(object, 'a[0].b.c', function(n) { return n * n; });\n * console.log(object.a[0].b.c);\n * // => 9\n *\n * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\n * console.log(object.x[0].y.z);\n * // => 0\n */function update(object,path,updater){return object==null?object:baseUpdate(object,path,castFunction(updater));}/**\n * This method is like `_.update` except that it accepts `customizer` which is\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\n * path creation is handled by the method instead. The `customizer` is invoked\n * with three arguments: (nsValue, key, nsObject).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {Function} updater The function to produce the updated value.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {};\n *\n * _.updateWith(object, '[0][1]', _.constant('a'), Object);\n * // => { '0': { '1': 'a' } }\n */function updateWith(object,path,updater,customizer){customizer=typeof customizer==='function'?customizer:undefined;return object==null?object:baseUpdate(object,path,castFunction(updater),customizer);}/**\n * Creates an array of the own enumerable string keyed property values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.values(new Foo);\n * // => [1, 2] (iteration order is not guaranteed)\n *\n * _.values('hi');\n * // => ['h', 'i']\n */function values(object){return object==null?[]:baseValues(object,keys(object));}/**\n * Creates an array of the own and inherited enumerable string keyed property\n * values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.valuesIn(new Foo);\n * // => [1, 2, 3] (iteration order is not guaranteed)\n */function valuesIn(object){return object==null?[]:baseValues(object,keysIn(object));}/* ------------------------------------------------------------------------*//**\n * Clamps `number` within the inclusive `lower` and `upper` bounds.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Number\n * @param {number} number The number to clamp.\n * @param {number} [lower] The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the clamped number.\n * @example\n *\n * _.clamp(-10, -5, 5);\n * // => -5\n *\n * _.clamp(10, -5, 5);\n * // => 5\n */function clamp(number,lower,upper){if(upper===undefined){upper=lower;lower=undefined;}if(upper!==undefined){upper=toNumber(upper);upper=upper===upper?upper:0;}if(lower!==undefined){lower=toNumber(lower);lower=lower===lower?lower:0;}return baseClamp(toNumber(number),lower,upper);}/**\n * Checks if `n` is between `start` and up to, but not including, `end`. If\n * `end` is not specified, it's set to `start` with `start` then set to `0`.\n * If `start` is greater than `end` the params are swapped to support\n * negative ranges.\n *\n * @static\n * @memberOf _\n * @since 3.3.0\n * @category Number\n * @param {number} number The number to check.\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n * @see _.range, _.rangeRight\n * @example\n *\n * _.inRange(3, 2, 4);\n * // => true\n *\n * _.inRange(4, 8);\n * // => true\n *\n * _.inRange(4, 2);\n * // => false\n *\n * _.inRange(2, 2);\n * // => false\n *\n * _.inRange(1.2, 2);\n * // => true\n *\n * _.inRange(5.2, 4);\n * // => false\n *\n * _.inRange(-3, -2, -6);\n * // => true\n */function inRange(number,start,end){start=toFinite(start);if(end===undefined){end=start;start=0;}else{end=toFinite(end);}number=toNumber(number);return baseInRange(number,start,end);}/**\n * Produces a random number between the inclusive `lower` and `upper` bounds.\n * If only one argument is provided a number between `0` and the given number\n * is returned. If `floating` is `true`, or either `lower` or `upper` are\n * floats, a floating-point number is returned instead of an integer.\n *\n * **Note:** JavaScript follows the IEEE-754 standard for resolving\n * floating-point values which can produce unexpected results.\n *\n * @static\n * @memberOf _\n * @since 0.7.0\n * @category Number\n * @param {number} [lower=0] The lower bound.\n * @param {number} [upper=1] The upper bound.\n * @param {boolean} [floating] Specify returning a floating-point number.\n * @returns {number} Returns the random number.\n * @example\n *\n * _.random(0, 5);\n * // => an integer between 0 and 5\n *\n * _.random(5);\n * // => also an integer between 0 and 5\n *\n * _.random(5, true);\n * // => a floating-point number between 0 and 5\n *\n * _.random(1.2, 5.2);\n * // => a floating-point number between 1.2 and 5.2\n */function random(lower,upper,floating){if(floating&&typeof floating!=='boolean'&&isIterateeCall(lower,upper,floating)){upper=floating=undefined;}if(floating===undefined){if(typeof upper==='boolean'){floating=upper;upper=undefined;}else if(typeof lower==='boolean'){floating=lower;lower=undefined;}}if(lower===undefined&&upper===undefined){lower=0;upper=1;}else{lower=toFinite(lower);if(upper===undefined){upper=lower;lower=0;}else{upper=toFinite(upper);}}if(lower>upper){var temp=lower;lower=upper;upper=temp;}if(floating||lower%1||upper%1){var rand=nativeRandom();return nativeMin(lower+rand*(upper-lower+freeParseFloat('1e-'+((rand+'').length-1))),upper);}return baseRandom(lower,upper);}/* ------------------------------------------------------------------------*//**\n * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the camel cased string.\n * @example\n *\n * _.camelCase('Foo Bar');\n * // => 'fooBar'\n *\n * _.camelCase('--foo-bar--');\n * // => 'fooBar'\n *\n * _.camelCase('__FOO_BAR__');\n * // => 'fooBar'\n */var camelCase=createCompounder(function(result,word,index){word=word.toLowerCase();return result+(index?capitalize(word):word);});/**\n * Converts the first character of `string` to upper case and the remaining\n * to lower case.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to capitalize.\n * @returns {string} Returns the capitalized string.\n * @example\n *\n * _.capitalize('FRED');\n * // => 'Fred'\n */function capitalize(string){return upperFirst(toString(string).toLowerCase());}/**\n * Deburrs `string` by converting\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n * letters to basic Latin letters and removing\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to deburr.\n * @returns {string} Returns the deburred string.\n * @example\n *\n * _.deburr('déjà vu');\n * // => 'deja vu'\n */function deburr(string){string=toString(string);return string&&string.replace(reLatin,deburrLetter).replace(reComboMark,'');}/**\n * Checks if `string` ends with the given target string.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {string} [target] The string to search for.\n * @param {number} [position=string.length] The position to search up to.\n * @returns {boolean} Returns `true` if `string` ends with `target`,\n * else `false`.\n * @example\n *\n * _.endsWith('abc', 'c');\n * // => true\n *\n * _.endsWith('abc', 'b');\n * // => false\n *\n * _.endsWith('abc', 'b', 2);\n * // => true\n */function endsWith(string,target,position){string=toString(string);target=baseToString(target);var length=string.length;position=position===undefined?length:baseClamp(toInteger(position),0,length);var end=position;position-=target.length;return position>=0&&string.slice(position,end)==target;}/**\n * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n * corresponding HTML entities.\n *\n * **Note:** No other characters are escaped. To escape additional\n * characters use a third-party library like [_he_](https://mths.be/he).\n *\n * Though the \">\" character is escaped for symmetry, characters like\n * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n * unless they're part of a tag or unquoted attribute value. See\n * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n * (under \"semi-related fun fact\") for more details.\n *\n * When working with HTML you should always\n * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n * XSS vectors.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escape('fred, barney, & pebbles');\n * // => 'fred, barney, & pebbles'\n */function escape(string){string=toString(string);return string&&reHasUnescapedHtml.test(string)?string.replace(reUnescapedHtml,escapeHtmlChar):string;}/**\n * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escapeRegExp('[lodash](https://lodash.com/)');\n * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n */function escapeRegExp(string){string=toString(string);return string&&reHasRegExpChar.test(string)?string.replace(reRegExpChar,'\\\\$&'):string;}/**\n * Converts `string` to\n * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the kebab cased string.\n * @example\n *\n * _.kebabCase('Foo Bar');\n * // => 'foo-bar'\n *\n * _.kebabCase('fooBar');\n * // => 'foo-bar'\n *\n * _.kebabCase('__FOO_BAR__');\n * // => 'foo-bar'\n */var kebabCase=createCompounder(function(result,word,index){return result+(index?'-':'')+word.toLowerCase();});/**\n * Converts `string`, as space separated words, to lower case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the lower cased string.\n * @example\n *\n * _.lowerCase('--Foo-Bar--');\n * // => 'foo bar'\n *\n * _.lowerCase('fooBar');\n * // => 'foo bar'\n *\n * _.lowerCase('__FOO_BAR__');\n * // => 'foo bar'\n */var lowerCase=createCompounder(function(result,word,index){return result+(index?' ':'')+word.toLowerCase();});/**\n * Converts the first character of `string` to lower case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.lowerFirst('Fred');\n * // => 'fred'\n *\n * _.lowerFirst('FRED');\n * // => 'fRED'\n */var lowerFirst=createCaseFirst('toLowerCase');/**\n * Pads `string` on the left and right sides if it's shorter than `length`.\n * Padding characters are truncated if they can't be evenly divided by `length`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.pad('abc', 8);\n * // => ' abc '\n *\n * _.pad('abc', 8, '_-');\n * // => '_-abc_-_'\n *\n * _.pad('abc', 3);\n * // => 'abc'\n */function pad(string,length,chars){string=toString(string);length=toInteger(length);var strLength=length?stringSize(string):0;if(!length||strLength>=length){return string;}var mid=(length-strLength)/2;return createPadding(nativeFloor(mid),chars)+string+createPadding(nativeCeil(mid),chars);}/**\n * Pads `string` on the right side if it's shorter than `length`. Padding\n * characters are truncated if they exceed `length`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.padEnd('abc', 6);\n * // => 'abc '\n *\n * _.padEnd('abc', 6, '_-');\n * // => 'abc_-_'\n *\n * _.padEnd('abc', 3);\n * // => 'abc'\n */function padEnd(string,length,chars){string=toString(string);length=toInteger(length);var strLength=length?stringSize(string):0;return length&&strLength ' abc'\n *\n * _.padStart('abc', 6, '_-');\n * // => '_-_abc'\n *\n * _.padStart('abc', 3);\n * // => 'abc'\n */function padStart(string,length,chars){string=toString(string);length=toInteger(length);var strLength=length?stringSize(string):0;return length&&strLength 8\n *\n * _.map(['6', '08', '10'], _.parseInt);\n * // => [6, 8, 10]\n */function parseInt(string,radix,guard){if(guard||radix==null){radix=0;}else if(radix){radix=+radix;}return nativeParseInt(toString(string).replace(reTrimStart,''),radix||0);}/**\n * Repeats the given string `n` times.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to repeat.\n * @param {number} [n=1] The number of times to repeat the string.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the repeated string.\n * @example\n *\n * _.repeat('*', 3);\n * // => '***'\n *\n * _.repeat('abc', 2);\n * // => 'abcabc'\n *\n * _.repeat('abc', 0);\n * // => ''\n */function repeat(string,n,guard){if(guard?isIterateeCall(string,n,guard):n===undefined){n=1;}else{n=toInteger(n);}return baseRepeat(toString(string),n);}/**\n * Replaces matches for `pattern` in `string` with `replacement`.\n *\n * **Note:** This method is based on\n * [`String#replace`](https://mdn.io/String/replace).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to modify.\n * @param {RegExp|string} pattern The pattern to replace.\n * @param {Function|string} replacement The match replacement.\n * @returns {string} Returns the modified string.\n * @example\n *\n * _.replace('Hi Fred', 'Fred', 'Barney');\n * // => 'Hi Barney'\n */function replace(){var args=arguments,string=toString(args[0]);return args.length<3?string:string.replace(args[1],args[2]);}/**\n * Converts `string` to\n * [snake case](https://en.wikipedia.org/wiki/Snake_case).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the snake cased string.\n * @example\n *\n * _.snakeCase('Foo Bar');\n * // => 'foo_bar'\n *\n * _.snakeCase('fooBar');\n * // => 'foo_bar'\n *\n * _.snakeCase('--FOO-BAR--');\n * // => 'foo_bar'\n */var snakeCase=createCompounder(function(result,word,index){return result+(index?'_':'')+word.toLowerCase();});/**\n * Splits `string` by `separator`.\n *\n * **Note:** This method is based on\n * [`String#split`](https://mdn.io/String/split).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to split.\n * @param {RegExp|string} separator The separator pattern to split by.\n * @param {number} [limit] The length to truncate results to.\n * @returns {Array} Returns the string segments.\n * @example\n *\n * _.split('a-b-c', '-', 2);\n * // => ['a', 'b']\n */function split(string,separator,limit){if(limit&&typeof limit!=='number'&&isIterateeCall(string,separator,limit)){separator=limit=undefined;}limit=limit===undefined?MAX_ARRAY_LENGTH:limit>>>0;if(!limit){return[];}string=toString(string);if(string&&(typeof separator==='string'||separator!=null&&!isRegExp(separator))){separator=baseToString(separator);if(!separator&&hasUnicode(string)){return castSlice(stringToArray(string),0,limit);}}return string.split(separator,limit);}/**\n * Converts `string` to\n * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n *\n * @static\n * @memberOf _\n * @since 3.1.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the start cased string.\n * @example\n *\n * _.startCase('--foo-bar--');\n * // => 'Foo Bar'\n *\n * _.startCase('fooBar');\n * // => 'Foo Bar'\n *\n * _.startCase('__FOO_BAR__');\n * // => 'FOO BAR'\n */var startCase=createCompounder(function(result,word,index){return result+(index?' ':'')+upperFirst(word);});/**\n * Checks if `string` starts with the given target string.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {string} [target] The string to search for.\n * @param {number} [position=0] The position to search from.\n * @returns {boolean} Returns `true` if `string` starts with `target`,\n * else `false`.\n * @example\n *\n * _.startsWith('abc', 'a');\n * // => true\n *\n * _.startsWith('abc', 'b');\n * // => false\n *\n * _.startsWith('abc', 'b', 1);\n * // => true\n */function startsWith(string,target,position){string=toString(string);position=position==null?0:baseClamp(toInteger(position),0,string.length);target=baseToString(target);return string.slice(position,position+target.length)==target;}/**\n * Creates a compiled template function that can interpolate data properties\n * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n * properties may be accessed as free variables in the template. If a setting\n * object is given, it takes precedence over `_.templateSettings` values.\n *\n * **Note:** In the development build `_.template` utilizes\n * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n * for easier debugging.\n *\n * For more information on precompiling templates see\n * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n *\n * For more information on Chrome extension sandboxes see\n * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category String\n * @param {string} [string=''] The template string.\n * @param {Object} [options={}] The options object.\n * @param {RegExp} [options.escape=_.templateSettings.escape]\n * The HTML \"escape\" delimiter.\n * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\n * The \"evaluate\" delimiter.\n * @param {Object} [options.imports=_.templateSettings.imports]\n * An object to import into the template as free variables.\n * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\n * The \"interpolate\" delimiter.\n * @param {string} [options.sourceURL='lodash.templateSources[n]']\n * The sourceURL of the compiled template.\n * @param {string} [options.variable='obj']\n * The data object variable name.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the compiled template function.\n * @example\n *\n * // Use the \"interpolate\" delimiter to create a compiled template.\n * var compiled = _.template('hello <%= user %>!');\n * compiled({ 'user': 'fred' });\n * // => 'hello fred!'\n *\n * // Use the HTML \"escape\" delimiter to escape data property values.\n * var compiled = _.template('<%- value %>');\n * compiled({ 'value': '