/* * ATTENTION: An "eval-source-map" devtool has been used. * This devtool is neither made for production nor for readable output files. * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) * or disable the default devtool with "devtool: false". * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). */ (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); else { var a = factory(); for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; } })(self, function() { return /******/ (function() { // webpackBootstrap /******/ "use strict"; /******/ var __webpack_modules__ = ({ /***/ "./js/helpers.js": /*!***********************!*\ !*** ./js/helpers.js ***! \***********************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Helpers\": function() { return /* binding */ Helpers; }\n/* harmony export */ });\nfunction _toArray(arr) { return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest(); }\nfunction _iterableToArray(iter) { if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter); }\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : \"undefined\" != typeof Symbol && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n// Constants\nvar TRANS_EVENTS = ['transitionend', 'webkitTransitionEnd', 'oTransitionEnd'];\nvar TRANS_PROPERTIES = ['transition', 'MozTransition', 'webkitTransition', 'WebkitTransition', 'OTransition'];\nvar INLINE_STYLES = \"\\n.layout-menu-fixed .layout-navbar-full .layout-menu,\\n.layout-menu-fixed-offcanvas .layout-navbar-full .layout-menu {\\n top: {navbarHeight}px !important;\\n}\\n.layout-page {\\n padding-top: {navbarHeight}px !important;\\n}\\n.content-wrapper {\\n padding-bottom: {footerHeight}px !important;\\n}\";\n\n// Guard\nfunction requiredParam(name) {\n throw new Error(\"Parameter required\".concat(name ? \": `\".concat(name, \"`\") : ''));\n}\nvar Helpers = {\n // Root Element\n ROOT_EL: typeof window !== 'undefined' ? document.documentElement : null,\n // Large screens breakpoint\n LAYOUT_BREAKPOINT: 1200,\n // Resize delay in milliseconds\n RESIZE_DELAY: 200,\n menuPsScroll: null,\n mainMenu: null,\n // Internal variables\n _curStyle: null,\n _styleEl: null,\n _resizeTimeout: null,\n _resizeCallback: null,\n _transitionCallback: null,\n _transitionCallbackTimeout: null,\n _listeners: [],\n _initialized: false,\n _autoUpdate: false,\n _lastWindowHeight: 0,\n // *******************************************************************************\n // * Utilities\n // ---\n // Scroll To Active Menu Item\n _scrollToActive: function _scrollToActive() {\n var animate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var duration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 500;\n var layoutMenu = this.getLayoutMenu();\n if (!layoutMenu) return;\n var activeEl = layoutMenu.querySelector('li.menu-item.active:not(.open)');\n if (activeEl) {\n // t = current time\n // b = start value\n // c = change in value\n // d = duration\n var easeInOutQuad = function easeInOutQuad(t, b, c, d) {\n t /= d / 2;\n if (t < 1) return c / 2 * t * t + b;\n t -= 1;\n return -c / 2 * (t * (t - 2) - 1) + b;\n };\n var element = this.getLayoutMenu().querySelector('.menu-inner');\n if (typeof activeEl === 'string') {\n activeEl = document.querySelector(activeEl);\n }\n if (typeof activeEl !== 'number') {\n activeEl = activeEl.getBoundingClientRect().top + element.scrollTop;\n }\n\n // If active element's top position is less than 2/3 (66%) of menu height than do not scroll\n if (activeEl < parseInt(element.clientHeight * 2 / 3, 10)) return;\n var start = element.scrollTop;\n var change = activeEl - start - parseInt(element.clientHeight / 2, 10);\n var startDate = +new Date();\n if (animate === true) {\n var animateScroll = function animateScroll() {\n var currentDate = +new Date();\n var currentTime = currentDate - startDate;\n var val = easeInOutQuad(currentTime, start, change, duration);\n element.scrollTop = val;\n if (currentTime < duration) {\n requestAnimationFrame(animateScroll);\n } else {\n element.scrollTop = change;\n }\n };\n animateScroll();\n } else {\n element.scrollTop = change;\n }\n }\n },\n // ---\n // Swipe In Gesture\n _swipeIn: function _swipeIn(targetEl, callback) {\n var _window = window,\n Hammer = _window.Hammer;\n if (typeof Hammer !== 'undefined' && typeof targetEl === 'string') {\n // Swipe menu gesture\n var swipeInElement = document.querySelector(targetEl);\n if (swipeInElement) {\n var hammerInstance = new Hammer(swipeInElement);\n hammerInstance.on('panright', callback);\n }\n }\n },\n // ---\n // Swipe Out Gesture\n _swipeOut: function _swipeOut(targetEl, callback) {\n var _window2 = window,\n Hammer = _window2.Hammer;\n if (typeof Hammer !== 'undefined' && typeof targetEl === 'string') {\n setTimeout(function () {\n // Swipe menu gesture\n var swipeOutElement = document.querySelector(targetEl);\n if (swipeOutElement) {\n var hammerInstance = new Hammer(swipeOutElement);\n hammerInstance.get('pan').set({\n direction: Hammer.DIRECTION_ALL,\n threshold: 250\n });\n hammerInstance.on('panleft', callback);\n }\n }, 500);\n }\n },\n // ---\n // Swipe Out On Overlay Tap\n _overlayTap: function _overlayTap(targetEl, callback) {\n var _window3 = window,\n Hammer = _window3.Hammer;\n if (typeof Hammer !== 'undefined' && typeof targetEl === 'string') {\n // Swipe out overlay element\n var swipeOutOverlayElement = document.querySelector(targetEl);\n if (swipeOutOverlayElement) {\n var hammerInstance = new Hammer(swipeOutOverlayElement);\n hammerInstance.on('tap', callback);\n }\n }\n },\n // ---\n // Add classes\n _addClass: function _addClass(cls) {\n var el = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.ROOT_EL;\n if (el.length !== undefined) {\n // Add classes to multiple elements\n el.forEach(function (e) {\n cls.split(' ').forEach(function (c) {\n return e.classList.add(c);\n });\n });\n } else {\n // Add classes to single element\n cls.split(' ').forEach(function (c) {\n return el.classList.add(c);\n });\n }\n },\n // ---\n // Remove classes\n _removeClass: function _removeClass(cls) {\n var el = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.ROOT_EL;\n if (el.length !== undefined) {\n // Remove classes to multiple elements\n el.forEach(function (e) {\n cls.split(' ').forEach(function (c) {\n return e.classList.remove(c);\n });\n });\n } else {\n // Remove classes to single element\n cls.split(' ').forEach(function (c) {\n return el.classList.remove(c);\n });\n }\n },\n // Toggle classes\n _toggleClass: function _toggleClass() {\n var el = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.ROOT_EL;\n var cls1 = arguments.length > 1 ? arguments[1] : undefined;\n var cls2 = arguments.length > 2 ? arguments[2] : undefined;\n if (el.classList.contains(cls1)) {\n el.classList.replace(cls1, cls2);\n } else {\n el.classList.replace(cls2, cls1);\n }\n },\n // ---\n // Has class\n _hasClass: function _hasClass(cls) {\n var el = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.ROOT_EL;\n var result = false;\n cls.split(' ').forEach(function (c) {\n if (el.classList.contains(c)) result = true;\n });\n return result;\n },\n _findParent: function _findParent(el, cls) {\n if (el && el.tagName.toUpperCase() === 'BODY' || el.tagName.toUpperCase() === 'HTML') return null;\n el = el.parentNode;\n while (el && el.tagName.toUpperCase() !== 'BODY' && !el.classList.contains(cls)) {\n el = el.parentNode;\n }\n el = el && el.tagName.toUpperCase() !== 'BODY' ? el : null;\n return el;\n },\n // ---\n // Trigger window event\n _triggerWindowEvent: function _triggerWindowEvent(name) {\n if (typeof window === 'undefined') return;\n if (document.createEvent) {\n var event;\n if (typeof Event === 'function') {\n event = new Event(name);\n } else {\n event = document.createEvent('Event');\n event.initEvent(name, false, true);\n }\n window.dispatchEvent(event);\n } else {\n window.fireEvent(\"on\".concat(name), document.createEventObject());\n }\n },\n // ---\n // Trigger event\n _triggerEvent: function _triggerEvent(name) {\n this._triggerWindowEvent(\"layout\".concat(name));\n this._listeners.filter(function (listener) {\n return listener.event === name;\n }).forEach(function (listener) {\n return listener.callback.call(null);\n });\n },\n // ---\n // Update style\n _updateInlineStyle: function _updateInlineStyle() {\n var navbarHeight = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var footerHeight = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n if (!this._styleEl) {\n this._styleEl = document.createElement('style');\n this._styleEl.type = 'text/css';\n document.head.appendChild(this._styleEl);\n }\n var newStyle = INLINE_STYLES.replace(/\\{navbarHeight\\}/gi, navbarHeight).replace(/\\{footerHeight\\}/gi, footerHeight);\n if (this._curStyle !== newStyle) {\n this._curStyle = newStyle;\n this._styleEl.textContent = newStyle;\n }\n },\n // ---\n // Remove style\n _removeInlineStyle: function _removeInlineStyle() {\n if (this._styleEl) document.head.removeChild(this._styleEl);\n this._styleEl = null;\n this._curStyle = null;\n },\n // ---\n // Redraw layout menu (Safari bugfix)\n _redrawLayoutMenu: function _redrawLayoutMenu() {\n var layoutMenu = this.getLayoutMenu();\n if (layoutMenu && layoutMenu.querySelector('.menu')) {\n var inner = layoutMenu.querySelector('.menu-inner');\n var scrollTop = inner.scrollTop;\n var pageScrollTop = document.documentElement.scrollTop;\n layoutMenu.style.display = 'none';\n // layoutMenu.offsetHeight\n layoutMenu.style.display = '';\n inner.scrollTop = scrollTop;\n document.documentElement.scrollTop = pageScrollTop;\n return true;\n }\n return false;\n },\n // ---\n // Check for transition support\n _supportsTransitionEnd: function _supportsTransitionEnd() {\n if (window.QUnit) return false;\n var el = document.body || document.documentElement;\n if (!el) return false;\n var result = false;\n TRANS_PROPERTIES.forEach(function (evnt) {\n if (typeof el.style[evnt] !== 'undefined') result = true;\n });\n return result;\n },\n // ---\n // Calculate current navbar height\n _getNavbarHeight: function _getNavbarHeight() {\n var _this2 = this;\n var layoutNavbar = this.getLayoutNavbar();\n if (!layoutNavbar) return 0;\n if (!this.isSmallScreen()) return layoutNavbar.getBoundingClientRect().height;\n\n // Needs some logic to get navbar height on small screens\n\n var clonedEl = layoutNavbar.cloneNode(true);\n clonedEl.id = null;\n clonedEl.style.visibility = 'hidden';\n clonedEl.style.position = 'absolute';\n Array.prototype.slice.call(clonedEl.querySelectorAll('.collapse.show')).forEach(function (el) {\n return _this2._removeClass('show', el);\n });\n layoutNavbar.parentNode.insertBefore(clonedEl, layoutNavbar);\n var navbarHeight = clonedEl.getBoundingClientRect().height;\n clonedEl.parentNode.removeChild(clonedEl);\n return navbarHeight;\n },\n // ---\n // Get current footer height\n _getFooterHeight: function _getFooterHeight() {\n var layoutFooter = this.getLayoutFooter();\n if (!layoutFooter) return 0;\n return layoutFooter.getBoundingClientRect().height;\n },\n // ---\n // Get animation duration of element\n _getAnimationDuration: function _getAnimationDuration(el) {\n var duration = window.getComputedStyle(el).transitionDuration;\n return parseFloat(duration) * (duration.indexOf('ms') !== -1 ? 1 : 1000);\n },\n // ---\n // Set menu hover state\n _setMenuHoverState: function _setMenuHoverState(hovered) {\n this[hovered ? '_addClass' : '_removeClass']('layout-menu-hover');\n },\n // ---\n // Toggle collapsed\n _setCollapsed: function _setCollapsed(collapsed) {\n var _this3 = this;\n if (this.isSmallScreen()) {\n if (collapsed) {\n this._removeClass('layout-menu-expanded');\n } else {\n setTimeout(function () {\n _this3._addClass('layout-menu-expanded');\n }, this._redrawLayoutMenu() ? 5 : 0);\n }\n } else {\n this[collapsed ? '_addClass' : '_removeClass']('layout-menu-collapsed');\n }\n },\n // ---\n // Add layout sivenav toggle animationEnd event\n _bindLayoutAnimationEndEvent: function _bindLayoutAnimationEndEvent(modifier, cb) {\n var _this4 = this;\n var menu = this.getMenu();\n var duration = menu ? this._getAnimationDuration(menu) + 50 : 0;\n if (!duration) {\n modifier.call(this);\n cb.call(this);\n return;\n }\n this._transitionCallback = function (e) {\n if (e.target !== menu) return;\n _this4._unbindLayoutAnimationEndEvent();\n cb.call(_this4);\n };\n TRANS_EVENTS.forEach(function (e) {\n menu.addEventListener(e, _this4._transitionCallback, false);\n });\n modifier.call(this);\n this._transitionCallbackTimeout = setTimeout(function () {\n _this4._transitionCallback.call(_this4, {\n target: menu\n });\n }, duration);\n },\n // ---\n // Remove layout sivenav toggle animationEnd event\n _unbindLayoutAnimationEndEvent: function _unbindLayoutAnimationEndEvent() {\n var _this5 = this;\n var menu = this.getMenu();\n if (this._transitionCallbackTimeout) {\n clearTimeout(this._transitionCallbackTimeout);\n this._transitionCallbackTimeout = null;\n }\n if (menu && this._transitionCallback) {\n TRANS_EVENTS.forEach(function (e) {\n menu.removeEventListener(e, _this5._transitionCallback, false);\n });\n }\n if (this._transitionCallback) {\n this._transitionCallback = null;\n }\n },\n // ---\n // Bind delayed window resize event\n _bindWindowResizeEvent: function _bindWindowResizeEvent() {\n var _this6 = this;\n this._unbindWindowResizeEvent();\n var cb = function cb() {\n if (_this6._resizeTimeout) {\n clearTimeout(_this6._resizeTimeout);\n _this6._resizeTimeout = null;\n }\n _this6._triggerEvent('resize');\n };\n this._resizeCallback = function () {\n if (_this6._resizeTimeout) clearTimeout(_this6._resizeTimeout);\n _this6._resizeTimeout = setTimeout(cb, _this6.RESIZE_DELAY);\n };\n window.addEventListener('resize', this._resizeCallback, false);\n },\n // ---\n // Unbind delayed window resize event\n _unbindWindowResizeEvent: function _unbindWindowResizeEvent() {\n if (this._resizeTimeout) {\n clearTimeout(this._resizeTimeout);\n this._resizeTimeout = null;\n }\n if (this._resizeCallback) {\n window.removeEventListener('resize', this._resizeCallback, false);\n this._resizeCallback = null;\n }\n },\n _bindMenuMouseEvents: function _bindMenuMouseEvents() {\n var _this7 = this;\n if (this._menuMouseEnter && this._menuMouseLeave && this._windowTouchStart) return;\n var layoutMenu = this.getLayoutMenu();\n if (!layoutMenu) return this._unbindMenuMouseEvents();\n if (!this._menuMouseEnter) {\n this._menuMouseEnter = function () {\n if (_this7.isSmallScreen() || !_this7._hasClass('layout-menu-collapsed') || _this7.isOffcanvas() || _this7._hasClass('layout-transitioning')) {\n return _this7._setMenuHoverState(false);\n }\n return _this7._setMenuHoverState(true);\n };\n layoutMenu.addEventListener('mouseenter', this._menuMouseEnter, false);\n layoutMenu.addEventListener('touchstart', this._menuMouseEnter, false);\n }\n if (!this._menuMouseLeave) {\n this._menuMouseLeave = function () {\n _this7._setMenuHoverState(false);\n };\n layoutMenu.addEventListener('mouseleave', this._menuMouseLeave, false);\n }\n if (!this._windowTouchStart) {\n this._windowTouchStart = function (e) {\n if (!e || !e.target || !_this7._findParent(e.target, '.layout-menu')) {\n _this7._setMenuHoverState(false);\n }\n };\n window.addEventListener('touchstart', this._windowTouchStart, true);\n }\n },\n _unbindMenuMouseEvents: function _unbindMenuMouseEvents() {\n if (!this._menuMouseEnter && !this._menuMouseLeave && !this._windowTouchStart) return;\n var layoutMenu = this.getLayoutMenu();\n if (this._menuMouseEnter) {\n if (layoutMenu) {\n layoutMenu.removeEventListener('mouseenter', this._menuMouseEnter, false);\n layoutMenu.removeEventListener('touchstart', this._menuMouseEnter, false);\n }\n this._menuMouseEnter = null;\n }\n if (this._menuMouseLeave) {\n if (layoutMenu) {\n layoutMenu.removeEventListener('mouseleave', this._menuMouseLeave, false);\n }\n this._menuMouseLeave = null;\n }\n if (this._windowTouchStart) {\n if (layoutMenu) {\n window.addEventListener('touchstart', this._windowTouchStart, true);\n }\n this._windowTouchStart = null;\n }\n this._setMenuHoverState(false);\n },\n // *******************************************************************************\n // * Methods\n scrollToActive: function scrollToActive() {\n var animate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n this._scrollToActive(animate);\n },\n swipeIn: function swipeIn(el, callback) {\n this._swipeIn(el, callback);\n },\n swipeOut: function swipeOut(el, callback) {\n this._swipeOut(el, callback);\n },\n overlayTap: function overlayTap(el, callback) {\n this._overlayTap(el, callback);\n },\n scrollPageTo: function scrollPageTo(to) {\n var duration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 500;\n // t = current time\n // b = start value\n // c = change in value\n // d = duration\n var easeInOutQuad = function easeInOutQuad(t, b, c, d) {\n t /= d / 2;\n if (t < 1) return c / 2 * t * t + b;\n t -= 1;\n return -c / 2 * (t * (t - 2) - 1) + b;\n };\n var element = document.scrollingElement;\n if (typeof to === 'string') {\n to = document.querySelector(to);\n }\n if (typeof to !== 'number') {\n to = to.getBoundingClientRect().top + element.scrollTop;\n }\n var start = element.scrollTop;\n var change = to - start;\n var startDate = +new Date();\n // const increment = 20\n\n var animateScroll = function animateScroll() {\n var currentDate = +new Date();\n var currentTime = currentDate - startDate;\n var val = easeInOutQuad(currentTime, start, change, duration);\n element.scrollTop = val;\n if (currentTime < duration) {\n requestAnimationFrame(animateScroll);\n } else {\n element.scrollTop = to;\n }\n };\n animateScroll();\n },\n // ---\n // Collapse / expand layout\n setCollapsed: function setCollapsed() {\n var _this8 = this;\n var collapsed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : requiredParam('collapsed');\n var animate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var layoutMenu = this.getLayoutMenu();\n if (!layoutMenu) return;\n this._unbindLayoutAnimationEndEvent();\n if (animate && this._supportsTransitionEnd()) {\n this._addClass('layout-transitioning');\n if (collapsed) this._setMenuHoverState(false);\n this._bindLayoutAnimationEndEvent(function () {\n // Collapse / Expand\n _this8._setCollapsed(collapsed);\n }, function () {\n _this8._removeClass('layout-transitioning');\n _this8._triggerWindowEvent('resize');\n _this8._triggerEvent('toggle');\n _this8._setMenuHoverState(false);\n });\n } else {\n this._addClass('layout-no-transition');\n if (collapsed) this._setMenuHoverState(false);\n\n // Collapse / Expand\n this._setCollapsed(collapsed);\n setTimeout(function () {\n _this8._removeClass('layout-no-transition');\n _this8._triggerWindowEvent('resize');\n _this8._triggerEvent('toggle');\n _this8._setMenuHoverState(false);\n }, 1);\n }\n },\n // ---\n // Toggle layout\n toggleCollapsed: function toggleCollapsed() {\n var animate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n this.setCollapsed(!this.isCollapsed(), animate);\n },\n // ---\n // Set layout positioning\n setPosition: function setPosition() {\n var fixed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : requiredParam('fixed');\n var offcanvas = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : requiredParam('offcanvas');\n this._removeClass('layout-menu-offcanvas layout-menu-fixed layout-menu-fixed-offcanvas');\n if (!fixed && offcanvas) {\n this._addClass('layout-menu-offcanvas');\n } else if (fixed && !offcanvas) {\n this._addClass('layout-menu-fixed');\n this._redrawLayoutMenu();\n } else if (fixed && offcanvas) {\n this._addClass('layout-menu-fixed-offcanvas');\n this._redrawLayoutMenu();\n }\n this.update();\n },\n // *******************************************************************************\n // * Getters\n getLayoutMenu: function getLayoutMenu() {\n return document.querySelector('.layout-menu');\n },\n getMenu: function getMenu() {\n var layoutMenu = this.getLayoutMenu();\n if (!layoutMenu) return null;\n return !this._hasClass('menu', layoutMenu) ? layoutMenu.querySelector('.menu') : layoutMenu;\n },\n getLayoutNavbar: function getLayoutNavbar() {\n return document.querySelector('.layout-navbar');\n },\n getLayoutFooter: function getLayoutFooter() {\n return document.querySelector('.content-footer');\n },\n getLayoutContainer: function getLayoutContainer() {\n return document.querySelector('.layout-page');\n },\n // *******************************************************************************\n // * Setters\n setNavbarFixed: function setNavbarFixed() {\n var fixed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : requiredParam('fixed');\n this[fixed ? '_addClass' : '_removeClass']('layout-navbar-fixed');\n this.update();\n },\n setFooterFixed: function setFooterFixed() {\n var fixed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : requiredParam('fixed');\n this[fixed ? '_addClass' : '_removeClass']('layout-footer-fixed');\n this.update();\n },\n setFlipped: function setFlipped() {\n var reversed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : requiredParam('reversed');\n this[reversed ? '_addClass' : '_removeClass']('layout-menu-flipped');\n },\n // *******************************************************************************\n // * Update\n update: function update() {\n if (this.getLayoutNavbar() && (!this.isSmallScreen() && this.isLayoutNavbarFull() && this.isFixed() || this.isNavbarFixed()) || this.getLayoutFooter() && this.isFooterFixed()) {\n this._updateInlineStyle(this._getNavbarHeight(), this._getFooterHeight());\n }\n this._bindMenuMouseEvents();\n },\n setAutoUpdate: function setAutoUpdate() {\n var _this9 = this;\n var enable = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : requiredParam('enable');\n if (enable && !this._autoUpdate) {\n this.on('resize.Helpers:autoUpdate', function () {\n return _this9.update();\n });\n this._autoUpdate = true;\n } else if (!enable && this._autoUpdate) {\n this.off('resize.Helpers:autoUpdate');\n this._autoUpdate = false;\n }\n },\n // Update custom option based on element\n updateCustomOptionCheck: function updateCustomOptionCheck(el) {\n if (el.checked) {\n // If custom option element is radio, remove checked from the siblings (closest `.row`)\n if (el.type === 'radio') {\n var customRadioOptionList = [].slice.call(el.closest('.row').querySelectorAll('.custom-option'));\n customRadioOptionList.map(function (customRadioOptionEL) {\n customRadioOptionEL.closest('.custom-option').classList.remove('checked');\n });\n }\n el.closest('.custom-option').classList.add('checked');\n } else {\n el.closest('.custom-option').classList.remove('checked');\n }\n },\n // *******************************************************************************\n // * Tests\n isRtl: function isRtl() {\n return document.querySelector('body').getAttribute('dir') === 'rtl' || document.querySelector('html').getAttribute('dir') === 'rtl';\n },\n isMobileDevice: function isMobileDevice() {\n return typeof window.orientation !== 'undefined' || navigator.userAgent.indexOf('IEMobile') !== -1;\n },\n isSmallScreen: function isSmallScreen() {\n return (window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth) < this.LAYOUT_BREAKPOINT;\n },\n isLayoutNavbarFull: function isLayoutNavbarFull() {\n return !!document.querySelector('.layout-wrapper.layout-navbar-full');\n },\n isCollapsed: function isCollapsed() {\n if (this.isSmallScreen()) {\n return !this._hasClass('layout-menu-expanded');\n }\n return this._hasClass('layout-menu-collapsed');\n },\n isFixed: function isFixed() {\n return this._hasClass('layout-menu-fixed layout-menu-fixed-offcanvas');\n },\n isOffcanvas: function isOffcanvas() {\n return this._hasClass('layout-menu-offcanvas layout-menu-fixed-offcanvas');\n },\n isNavbarFixed: function isNavbarFixed() {\n return this._hasClass('layout-navbar-fixed') || !this.isSmallScreen() && this.isFixed() && this.isLayoutNavbarFull();\n },\n isFooterFixed: function isFooterFixed() {\n return this._hasClass('layout-footer-fixed');\n },\n isFlipped: function isFlipped() {\n return this._hasClass('layout-menu-flipped');\n },\n isLightStyle: function isLightStyle() {\n return document.documentElement.classList.contains('light-style');\n },\n isDarkStyle: function isDarkStyle() {\n return document.documentElement.classList.contains('dark-style');\n },\n // *******************************************************************************\n // * Events\n on: function on() {\n var event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : requiredParam('event');\n var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : requiredParam('callback');\n var _event$split = event.split('.'),\n _event$split2 = _slicedToArray(_event$split, 1),\n _event = _event$split2[0];\n var _event$split3 = event.split('.'),\n _event$split4 = _toArray(_event$split3),\n namespace = _event$split4.slice(1);\n // let [_event, ...namespace] = event.split('.')\n namespace = namespace.join('.') || null;\n this._listeners.push({\n event: _event,\n namespace: namespace,\n callback: callback\n });\n },\n off: function off() {\n var _this10 = this;\n var event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : requiredParam('event');\n var _event$split5 = event.split('.'),\n _event$split6 = _slicedToArray(_event$split5, 1),\n _event = _event$split6[0];\n var _event$split7 = event.split('.'),\n _event$split8 = _toArray(_event$split7),\n namespace = _event$split8.slice(1);\n namespace = namespace.join('.') || null;\n this._listeners.filter(function (listener) {\n return listener.event === _event && listener.namespace === namespace;\n }).forEach(function (listener) {\n return _this10._listeners.splice(_this10._listeners.indexOf(listener), 1);\n });\n },\n // *******************************************************************************\n // * Life cycle\n init: function init() {\n var _this11 = this;\n if (this._initialized) return;\n this._initialized = true;\n\n // Initialize `style` element\n this._updateInlineStyle(0);\n\n // Bind window resize event\n this._bindWindowResizeEvent();\n\n // Bind init event\n this.off('init._Helpers');\n this.on('init._Helpers', function () {\n _this11.off('resize._Helpers:redrawMenu');\n _this11.on('resize._Helpers:redrawMenu', function () {\n // eslint-disable-next-line no-unused-expressions\n _this11.isSmallScreen() && !_this11.isCollapsed() && _this11._redrawLayoutMenu();\n });\n\n // Force repaint in IE 10\n if (typeof document.documentMode === 'number' && document.documentMode < 11) {\n _this11.off('resize._Helpers:ie10RepaintBody');\n _this11.on('resize._Helpers:ie10RepaintBody', function () {\n if (_this11.isFixed()) return;\n var scrollTop = document.documentElement.scrollTop;\n document.body.style.display = 'none';\n // document.body.offsetHeight\n document.body.style.display = 'block';\n document.documentElement.scrollTop = scrollTop;\n });\n }\n });\n this._triggerEvent('init');\n },\n destroy: function destroy() {\n var _this12 = this;\n if (!this._initialized) return;\n this._initialized = false;\n this._removeClass('layout-transitioning');\n this._removeInlineStyle();\n this._unbindLayoutAnimationEndEvent();\n this._unbindWindowResizeEvent();\n this._unbindMenuMouseEvents();\n this.setAutoUpdate(false);\n this.off('init._Helpers');\n\n // Remove all listeners except `init`\n this._listeners.filter(function (listener) {\n return listener.event !== 'init';\n }).forEach(function (listener) {\n return _this12._listeners.splice(_this12._listeners.indexOf(listener), 1);\n });\n },\n // ---\n // Init Password Toggle\n initPasswordToggle: function initPasswordToggle() {\n var toggler = document.querySelectorAll('.form-password-toggle i');\n if (typeof toggler !== 'undefined' && toggler !== null) {\n toggler.forEach(function (el) {\n el.addEventListener('click', function (e) {\n e.preventDefault();\n var formPasswordToggle = el.closest('.form-password-toggle');\n var formPasswordToggleIcon = formPasswordToggle.querySelector('i');\n var formPasswordToggleInput = formPasswordToggle.querySelector('input');\n if (formPasswordToggleInput.getAttribute('type') === 'text') {\n formPasswordToggleInput.setAttribute('type', 'password');\n formPasswordToggleIcon.classList.replace('ti-eye', 'ti-eye-off');\n } else if (formPasswordToggleInput.getAttribute('type') === 'password') {\n formPasswordToggleInput.setAttribute('type', 'text');\n formPasswordToggleIcon.classList.replace('ti-eye-off', 'ti-eye');\n }\n });\n });\n }\n },\n //--\n // Init custom option check\n initCustomOptionCheck: function initCustomOptionCheck() {\n var _this = this;\n var custopOptionList = [].slice.call(document.querySelectorAll('.custom-option .form-check-input'));\n custopOptionList.map(function (customOptionEL) {\n // Update custom options check on page load\n _this.updateCustomOptionCheck(customOptionEL);\n\n // Update custom options check on click\n customOptionEL.addEventListener('click', function (e) {\n _this.updateCustomOptionCheck(customOptionEL);\n });\n });\n },\n // ---\n // Init Speech To Text\n initSpeechToText: function initSpeechToText() {\n var SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;\n var speechToText = document.querySelectorAll('.speech-to-text');\n if (SpeechRecognition !== undefined && SpeechRecognition !== null) {\n if (typeof speechToText !== 'undefined' && speechToText !== null) {\n var recognition = new SpeechRecognition();\n var toggler = document.querySelectorAll('.speech-to-text i');\n toggler.forEach(function (el) {\n var listening = false;\n el.addEventListener('click', function () {\n el.closest('.input-group').querySelector('.form-control').focus();\n recognition.onspeechstart = function () {\n listening = true;\n };\n if (listening === false) {\n recognition.start();\n }\n recognition.onerror = function () {\n listening = false;\n };\n recognition.onresult = function (event) {\n el.closest('.input-group').querySelector('.form-control').value = event.results[0][0].transcript;\n };\n recognition.onspeechend = function () {\n listening = false;\n recognition.stop();\n };\n });\n });\n }\n }\n },\n // ---\n // Init Navbar Dropdown (i.e notification) PerfectScrollbar\n initNavbarDropdownScrollbar: function initNavbarDropdownScrollbar() {\n var scrollbarContainer = document.querySelectorAll('.navbar-dropdown .scrollable-container');\n var _window4 = window,\n PerfectScrollbar = _window4.PerfectScrollbar;\n if (PerfectScrollbar !== undefined) {\n if (typeof scrollbarContainer !== 'undefined' && scrollbarContainer !== null) {\n scrollbarContainer.forEach(function (el) {\n // eslint-disable-next-line no-new\n new PerfectScrollbar(el, {\n wheelPropagation: false,\n suppressScrollX: true\n });\n });\n }\n }\n },\n // Ajax Call Promise\n ajaxCall: function ajaxCall(url) {\n return new Promise(function (resolve, reject) {\n var req = new XMLHttpRequest();\n req.open('GET', url);\n req.onload = function () {\n return req.status === 200 ? resolve(req.response) : reject(Error(req.statusText));\n };\n req.onerror = function (e) {\n return reject(Error(\"Network Error: \".concat(e)));\n };\n req.send();\n });\n },\n // ---\n // SidebarToggle (Used in Apps)\n initSidebarToggle: function initSidebarToggle() {\n var sidebarToggler = document.querySelectorAll('[data-bs-toggle=\"sidebar\"]');\n sidebarToggler.forEach(function (el) {\n el.addEventListener('click', function () {\n var target = el.getAttribute('data-target');\n var overlay = el.getAttribute('data-overlay');\n var appOverlay = document.querySelectorAll('.app-overlay');\n var targetEl = document.querySelectorAll(target);\n targetEl.forEach(function (tel) {\n tel.classList.toggle('show');\n if (typeof overlay !== 'undefined' && overlay !== null && overlay !== false && typeof appOverlay !== 'undefined') {\n if (tel.classList.contains('show')) {\n appOverlay[0].classList.add('show');\n } else {\n appOverlay[0].classList.remove('show');\n }\n appOverlay[0].addEventListener('click', function (e) {\n e.currentTarget.classList.remove('show');\n tel.classList.remove('show');\n });\n }\n });\n });\n });\n }\n};\n\n// *******************************************************************************\n// * Initialization\n\nif (typeof window !== 'undefined') {\n Helpers.init();\n if (Helpers.isMobileDevice() && window.chrome) {\n document.documentElement.classList.add('layout-menu-100vh');\n }\n\n // Update layout after page load\n if (document.readyState === 'complete') Helpers.update();else document.addEventListener('DOMContentLoaded', function onContentLoaded() {\n Helpers.update();\n document.removeEventListener('DOMContentLoaded', onContentLoaded);\n });\n}\n\n// ---\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUN2TixTQUFTLENBQUNHLE1BQU0sQ0FBQyxNQUFNLENBQUM7Y0FDeENrTixHQUFHLENBQUNyTixTQUFTLENBQUNHLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDOUIsQ0FBQyxDQUFDO1VBQ0o7UUFDRixDQUFDLENBQUM7TUFDSixDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7RUFDSjtBQUNGLENBQUM7O0FBRUQ7QUFDQTs7QUFFQSxJQUFJLE9BQU81RSxNQUFNLEtBQUssV0FBVyxFQUFFO0VBQ2pDRixPQUFPLENBQUMwTyxJQUFJLENBQUMsQ0FBQztFQUVkLElBQUkxTyxPQUFPLENBQUNpTixjQUFjLENBQUMsQ0FBQyxJQUFJL00sTUFBTSxDQUFDaVMsTUFBTSxFQUFFO0lBQzdDaFMsUUFBUSxDQUFDQyxlQUFlLENBQUN1RSxTQUFTLENBQUNDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQztFQUM3RDs7RUFFQTtFQUNBLElBQUl6RSxRQUFRLENBQUNpUyxVQUFVLEtBQUssVUFBVSxFQUFFcFMsT0FBTyxDQUFDMkwsTUFBTSxDQUFDLENBQUMsTUFFdER4TCxRQUFRLENBQUM0SixnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxTQUFTc0ksZUFBZUEsQ0FBQSxFQUFHO0lBQ3ZFclMsT0FBTyxDQUFDMkwsTUFBTSxDQUFDLENBQUM7SUFDaEJ4TCxRQUFRLENBQUMrSixtQkFBbUIsQ0FBQyxrQkFBa0IsRUFBRW1JLGVBQWUsQ0FBQztFQUNuRSxDQUFDLENBQUM7QUFDTjs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL1Z1ZXh5Ly4vanMvaGVscGVycy5qcz8wYjIxIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIENvbnN0YW50c1xuY29uc3QgVFJBTlNfRVZFTlRTID0gWyd0cmFuc2l0aW9uZW5kJywgJ3dlYmtpdFRyYW5zaXRpb25FbmQnLCAnb1RyYW5zaXRpb25FbmQnXVxuY29uc3QgVFJBTlNfUFJPUEVSVElFUyA9IFsndHJhbnNpdGlvbicsICdNb3pUcmFuc2l0aW9uJywgJ3dlYmtpdFRyYW5zaXRpb24nLCAnV2Via2l0VHJhbnNpdGlvbicsICdPVHJhbnNpdGlvbiddXG5jb25zdCBJTkxJTkVfU1RZTEVTID0gYFxuLmxheW91dC1tZW51LWZpeGVkIC5sYXlvdXQtbmF2YmFyLWZ1bGwgLmxheW91dC1tZW51LFxuLmxheW91dC1tZW51LWZpeGVkLW9mZmNhbnZhcyAubGF5b3V0LW5hdmJhci1mdWxsIC5sYXlvdXQtbWVudSB7XG4gIHRvcDoge25hdmJhckhlaWdodH1weCAhaW1wb3J0YW50O1xufVxuLmxheW91dC1wYWdlIHtcbiAgcGFkZGluZy10b3A6IHtuYXZiYXJIZWlnaHR9cHggIWltcG9ydGFudDtcbn1cbi5jb250ZW50LXdyYXBwZXIge1xuICBwYWRkaW5nLWJvdHRvbToge2Zvb3RlckhlaWdodH1weCAhaW1wb3J0YW50O1xufWBcblxuLy8gR3VhcmRcbmZ1bmN0aW9uIHJlcXVpcmVkUGFyYW0obmFtZSkge1xuICB0aHJvdyBuZXcgRXJyb3IoYFBhcmFtZXRlciByZXF1aXJlZCR7bmFtZSA/IGA6IFxcYCR7bmFtZX1cXGBgIDogJyd9YClcbn1cblxuY29uc3QgSGVscGVycyA9IHtcbiAgLy8gUm9vdCBFbGVtZW50XG4gIFJPT1RfRUw6IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IDogbnVsbCxcblxuICAvLyBMYXJnZSBzY3JlZW5zIGJyZWFrcG9pbnRcbiAgTEFZT1VUX0JSRUFLUE9JTlQ6IDEyMDAsXG5cbiAgLy8gUmVzaXplIGRlbGF5IGluIG1pbGxpc2Vjb25kc1xuICBSRVNJWkVfREVMQVk6IDIwMCxcblxuICBtZW51UHNTY3JvbGw6IG51bGwsXG5cbiAgbWFpbk1lbnU6IG51bGwsXG5cbiAgLy8gSW50ZXJuYWwgdmFyaWFibGVzXG4gIF9jdXJTdHlsZTogbnVsbCxcbiAgX3N0eWxlRWw6IG51bGwsXG4gIF9yZXNpemVUaW1lb3V0OiBudWxsLFxuICBfcmVzaXplQ2FsbGJhY2s6IG51bGwsXG4gIF90cmFuc2l0aW9uQ2FsbGJhY2s6IG51bGwsXG4gIF90cmFuc2l0aW9uQ2FsbGJhY2tUaW1lb3V0OiBudWxsLFxuICBfbGlzdGVuZXJzOiBbXSxcbiAgX2luaXRpYWxpemVkOiBmYWxzZSxcbiAgX2F1dG9VcGRhdGU6IGZhbHNlLFxuICBfbGFzdFdpbmRvd0hlaWdodDogMCxcblxuICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIC8vICogVXRpbGl0aWVzXG5cbiAgLy8gLS0tXG4gIC8vIFNjcm9sbCBUbyBBY3RpdmUgTWVudSBJdGVtXG4gIF9zY3JvbGxUb0FjdGl2ZShhbmltYXRlID0gZmFsc2UsIGR1cmF0aW9uID0gNTAwKSB7XG4gICAgY29uc3QgbGF5b3V0TWVudSA9IHRoaXMuZ2V0TGF5b3V0TWVudSgpXG5cbiAgICBpZiAoIWxheW91dE1lbnUpIHJldHVyblxuXG4gICAgbGV0IGFjdGl2ZUVsID0gbGF5b3V0TWVudS5xdWVyeVNlbGVjdG9yKCdsaS5tZW51LWl0ZW0uYWN0aXZlOm5vdCgub3BlbiknKVxuXG4gICAgaWYgKGFjdGl2ZUVsKSB7XG4gICAgICAvLyB0ID0gY3VycmVudCB0aW1lXG4gICAgICAvLyBiID0gc3RhcnQgdmFsdWVcbiAgICAgIC8vIGMgPSBjaGFuZ2UgaW4gdmFsdWVcbiAgICAgIC8vIGQgPSBkdXJhdGlvblxuICAgICAgY29uc3QgZWFzZUluT3V0UXVhZCA9ICh0LCBiLCBjLCBkKSA9PiB7XG4gICAgICAgIHQgLz0gZCAvIDJcbiAgICAgICAgaWYgKHQgPCAxKSByZXR1cm4gKGMgLyAyKSAqIHQgKiB0ICsgYlxuICAgICAgICB0IC09IDFcbiAgICAgICAgcmV0dXJuICgtYyAvIDIpICogKHQgKiAodCAtIDIpIC0gMSkgKyBiXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmdldExheW91dE1lbnUoKS5xdWVyeVNlbGVjdG9yKCcubWVudS1pbm5lcicpXG5cbiAgICAgIGlmICh0eXBlb2YgYWN0aXZlRWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGFjdGl2ZUVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihhY3RpdmVFbClcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgYWN0aXZlRWwgIT09ICdudW1iZXInKSB7XG4gICAgICAgIGFjdGl2ZUVsID0gYWN0aXZlRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgZWxlbWVudC5zY3JvbGxUb3BcbiAgICAgIH1cblxuICAgICAgLy8gSWYgYWN0aXZlIGVsZW1lbnQncyB0b3AgcG9zaXRpb24gaXMgbGVzcyB0aGFuIDIvMyAoNjYlKSBvZiBtZW51IGhlaWdodCB0aGFuIGRvIG5vdCBzY3JvbGxcbiAgICAgIGlmIChhY3RpdmVFbCA8IHBhcnNlSW50KChlbGVtZW50LmNsaWVudEhlaWdodCAqIDIpIC8gMywgMTApKSByZXR1cm5cblxuICAgICAgY29uc3Qgc3RhcnQgPSBlbGVtZW50LnNjcm9sbFRvcFxuICAgICAgY29uc3QgY2hhbmdlID0gYWN0aXZlRWwgLSBzdGFydCAtIHBhcnNlSW50KGVsZW1lbnQuY2xpZW50SGVpZ2h0IC8gMiwgMTApXG4gICAgICBjb25zdCBzdGFydERhdGUgPSArbmV3IERhdGUoKVxuXG4gICAgICBpZiAoYW5pbWF0ZSA9PT0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBhbmltYXRlU2Nyb2xsID0gKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gK25ldyBEYXRlKClcbiAgICAgICAgICBjb25zdCBjdXJyZW50VGltZSA9IGN1cnJlbnREYXRlIC0gc3RhcnREYXRlXG4gICAgICAgICAgY29uc3QgdmFsID0gZWFzZUluT3V0UXVhZChjdXJyZW50VGltZSwgc3RhcnQsIGNoYW5nZSwgZHVyYXRpb24pXG4gICAgICAgICAgZWxlbWVudC5zY3JvbGxUb3AgPSB2YWxcbiAgICAgICAgICBpZiAoY3VycmVudFRpbWUgPCBkdXJhdGlvbikge1xuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGVTY3JvbGwpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc2Nyb2xsVG9wID0gY2hhbmdlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFuaW1hdGVTY3JvbGwoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5zY3JvbGxUb3AgPSBjaGFuZ2VcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLy8gLS0tXG4gIC8vIFN3aXBlIEluIEdlc3R1cmVcbiAgX3N3aXBlSW4odGFyZ2V0RWwsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgeyBIYW1tZXIgfSA9IHdpbmRvd1xuICAgIGlmICh0eXBlb2YgSGFtbWVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgdGFyZ2V0RWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBTd2lwZSBtZW51IGdlc3R1cmVcbiAgICAgIGNvbnN0IHN3aXBlSW5FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXRFbClcblxuICAgICAgaWYgKHN3aXBlSW5FbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGhhbW1lckluc3RhbmNlID0gbmV3IEhhbW1lcihzd2lwZUluRWxlbWVudClcblxuICAgICAgICBoYW1tZXJJbnN0YW5jZS5vbigncGFucmlnaHQnLCBjYWxsYmFjaylcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLy8gLS0tXG4gIC8vIFN3aXBlIE91dCBHZXN0dXJlXG4gIF9zd2lwZU91dCh0YXJnZXRFbCwgY2FsbGJhY2spIHtcbiAgICBjb25zdCB7IEhhbW1lciB9ID0gd2luZG93XG4gICAgaWYgKHR5cGVvZiBIYW1tZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB0YXJnZXRFbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAvLyBTd2lwZSBtZW51IGdlc3R1cmVcbiAgICAgICAgY29uc3Qgc3dpcGVPdXRFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXRFbClcblxuICAgICAgICBpZiAoc3dpcGVPdXRFbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgaGFtbWVySW5zdGFuY2UgPSBuZXcgSGFtbWVyKHN3aXBlT3V0RWxlbWVudClcblxuICAgICAgICAgIGhhbW1lckluc3RhbmNlLmdldCgncGFuJykuc2V0KHsgZGlyZWN0aW9uOiBIYW1tZXIuRElSRUNUSU9OX0FMTCwgdGhyZXNob2xkOiAyNTAgfSlcbiAgICAgICAgICBoYW1tZXJJbnN0YW5jZS5vbigncGFubGVmdCcsIGNhbGxiYWNrKVxuICAgICAgICB9XG4gICAgICB9LCA1MDApXG4gICAgfVxuICB9LFxuXG4gIC8vIC0tLVxuICAvLyBTd2lwZSBPdXQgT24gT3ZlcmxheSBUYXBcbiAgX292ZXJsYXlUYXAodGFyZ2V0RWwsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgeyBIYW1tZXIgfSA9IHdpbmRvd1xuXG4gICAgaWYgKHR5cGVvZiBIYW1tZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB0YXJnZXRFbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFN3aXBlIG91dCBvdmVybGF5IGVsZW1lbnRcbiAgICAgIGNvbnN0IHN3aXBlT3V0T3ZlcmxheUVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRhcmdldEVsKVxuXG4gICAgICBpZiAoc3dpcGVPdXRPdmVybGF5RWxlbWVudCkge1xuICAgICAgICBjb25zdCBoYW1tZXJJbnN0YW5jZSA9IG5ldyBIYW1tZXIoc3dpcGVPdXRPdmVybGF5RWxlbWVudClcblxuICAgICAgICBoYW1tZXJJbnN0YW5jZS5vbigndGFwJywgY2FsbGJhY2spXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8vIC0tLVxuICAvLyBBZGQgY2xhc3Nlc1xuICBfYWRkQ2xhc3MoY2xzLCBlbCA9IHRoaXMuUk9PVF9FTCkge1xuICAgIGlmIChlbC5sZW5ndGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQWRkIGNsYXNzZXMgdG8gbXVsdGlwbGUgZWxlbWVudHNcbiAgICAgIGVsLmZvckVhY2goZSA9PiB7XG4gICAgICAgIGNscy5zcGxpdCgnICcpLmZvckVhY2goYyA9PiBlLmNsYXNzTGlzdC5hZGQoYykpXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBZGQgY2xhc3NlcyB0byBzaW5nbGUgZWxlbWVudFxuICAgICAgY2xzLnNwbGl0KCcgJykuZm9yRWFjaChjID0+IGVsLmNsYXNzTGlzdC5hZGQoYykpXG4gICAgfVxuICB9LFxuXG4gIC8vIC0tLVxuICAvLyBSZW1vdmUgY2xhc3Nlc1xuICBfcmVtb3ZlQ2xhc3MoY2xzLCBlbCA9IHRoaXMuUk9PVF9FTCkge1xuICAgIGlmIChlbC5sZW5ndGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gUmVtb3ZlIGNsYXNzZXMgdG8gbXVsdGlwbGUgZWxlbWVudHNcbiAgICAgIGVsLmZvckVhY2goZSA9PiB7XG4gICAgICAgIGNscy5zcGxpdCgnICcpLmZvckVhY2goYyA9PiBlLmNsYXNzTGlzdC5yZW1vdmUoYykpXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZW1vdmUgY2xhc3NlcyB0byBzaW5nbGUgZWxlbWVudFxuICAgICAgY2xzLnNwbGl0KCcgJykuZm9yRWFjaChjID0+IGVsLmNsYXNzTGlzdC5yZW1vdmUoYykpXG4gICAgfVxuICB9LFxuXG4gIC8vIFRvZ2dsZSBjbGFzc2VzXG4gIF90b2dnbGVDbGFzcyhlbCA9IHRoaXMuUk9PVF9FTCwgY2xzMSwgY2xzMikge1xuICAgIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoY2xzMSkpIHtcbiAgICAgIGVsLmNsYXNzTGlzdC5yZXBsYWNlKGNsczEsIGNsczIpXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsLmNsYXNzTGlzdC5yZXBsYWNlKGNsczIsIGNsczEpXG4gICAgfVxuICB9LFxuXG4gIC8vIC0tLVxuICAvLyBIYXMgY2xhc3NcbiAgX2hhc0NsYXNzKGNscywgZWwgPSB0aGlzLlJPT1RfRUwpIHtcbiAgICBsZXQgcmVzdWx0ID0gZmFsc2VcblxuICAgIGNscy5zcGxpdCgnICcpLmZvckVhY2goYyA9PiB7XG4gICAgICBpZiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKGMpKSByZXN1bHQgPSB0cnVlXG4gICAgfSlcblxuICAgIHJldHVybiByZXN1bHRcbiAgfSxcblxuICBfZmluZFBhcmVudChlbCwgY2xzKSB7XG4gICAgaWYgKChlbCAmJiBlbC50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdCT0RZJykgfHwgZWwudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnSFRNTCcpIHJldHVybiBudWxsXG4gICAgZWwgPSBlbC5wYXJlbnROb2RlXG4gICAgd2hpbGUgKGVsICYmIGVsLnRhZ05hbWUudG9VcHBlckNhc2UoKSAhPT0gJ0JPRFknICYmICFlbC5jbGFzc0xpc3QuY29udGFpbnMoY2xzKSkge1xuICAgICAgZWwgPSBlbC5wYXJlbnROb2RlXG4gICAgfVxuICAgIGVsID0gZWwgJiYgZWwudGFnTmFtZS50b1VwcGVyQ2FzZSgpICE9PSAnQk9EWScgPyBlbCA6IG51bGxcbiAgICByZXR1cm4gZWxcbiAgfSxcblxuICAvLyAtLS1cbiAgLy8gVHJpZ2dlciB3aW5kb3cgZXZlbnRcbiAgX3RyaWdnZXJXaW5kb3dFdmVudChuYW1lKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm5cblxuICAgIGlmIChkb2N1bWVudC5jcmVhdGVFdmVudCkge1xuICAgICAgbGV0IGV2ZW50XG5cbiAgICAgIGlmICh0eXBlb2YgRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZXZlbnQgPSBuZXcgRXZlbnQobmFtZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50JylcbiAgICAgICAgZXZlbnQuaW5pdEV2ZW50KG5hbWUsIGZhbHNlLCB0cnVlKVxuICAgICAgfVxuXG4gICAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChldmVudClcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93LmZpcmVFdmVudChgb24ke25hbWV9YCwgZG9jdW1lbnQuY3JlYXRlRXZlbnRPYmplY3QoKSlcbiAgICB9XG4gIH0sXG5cbiAgLy8gLS0tXG4gIC8vIFRyaWdnZXIgZXZlbnRcbiAgX3RyaWdnZXJFdmVudChuYW1lKSB7XG4gICAgdGhpcy5fdHJpZ2dlcldpbmRvd0V2ZW50KGBsYXlvdXQke25hbWV9YClcblxuICAgIHRoaXMuX2xpc3RlbmVycy5maWx0ZXIobGlzdGVuZXIgPT4gbGlzdGVuZXIuZXZlbnQgPT09IG5hbWUpLmZvckVhY2gobGlzdGVuZXIgPT4gbGlzdGVuZXIuY2FsbGJhY2suY2FsbChudWxsKSlcbiAgfSxcblxuICAvLyAtLS1cbiAgLy8gVXBkYXRlIHN0eWxlXG4gIF91cGRhdGVJbmxpbmVTdHlsZShuYXZiYXJIZWlnaHQgPSAwLCBmb290ZXJIZWlnaHQgPSAwKSB7XG4gICAgaWYgKCF0aGlzLl9zdHlsZUVsKSB7XG4gICAgICB0aGlzLl9zdHlsZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKVxuICAgICAgdGhpcy5fc3R5bGVFbC50eXBlID0gJ3RleHQvY3NzJ1xuICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0aGlzLl9zdHlsZUVsKVxuICAgIH1cblxuICAgIGNvbnN0IG5ld1N0eWxlID0gSU5MSU5FX1NUWUxFUy5yZXBsYWNlKC9cXHtuYXZiYXJIZWlnaHRcXH0vZ2ksIG5hdmJhckhlaWdodCkucmVwbGFjZShcbiAgICAgIC9cXHtmb290ZXJIZWlnaHRcXH0vZ2ksXG4gICAgICBmb290ZXJIZWlnaHRcbiAgICApXG5cbiAgICBpZiAodGhpcy5fY3VyU3R5bGUgIT09IG5ld1N0eWxlKSB7XG4gICAgICB0aGlzLl9jdXJTdHlsZSA9IG5ld1N0eWxlXG4gICAgICB0aGlzLl9zdHlsZUVsLnRleHRDb250ZW50ID0gbmV3U3R5bGVcbiAgICB9XG4gIH0sXG5cbiAgLy8gLS0tXG4gIC8vIFJlbW92ZSBzdHlsZVxuICBfcmVtb3ZlSW5saW5lU3R5bGUoKSB7XG4gICAgaWYgKHRoaXMuX3N0eWxlRWwpIGRvY3VtZW50LmhlYWQucmVtb3ZlQ2hpbGQodGhpcy5fc3R5bGVFbClcbiAgICB0aGlzLl9zdHlsZUVsID0gbnVsbFxuICAgIHRoaXMuX2N1clN0eWxlID0gbnVsbFxuICB9LFxuXG4gIC8vIC0tLVxuICAvLyBSZWRyYXcgbGF5b3V0IG1lbnUgKFNhZmFyaSBidWdmaXgpXG4gIF9yZWRyYXdMYXlvdXRNZW51KCkge1xuICAgIGNvbnN0IGxheW91dE1lbnUgPSB0aGlzLmdldExheW91dE1lbnUoKVxuXG4gICAgaWYgKGxheW91dE1lbnUgJiYgbGF5b3V0TWVudS5xdWVyeVNlbGVjdG9yKCcubWVudScpKSB7XG4gICAgICBjb25zdCBpbm5lciA9IGxheW91dE1lbnUucXVlcnlTZWxlY3RvcignLm1lbnUtaW5uZXInKVxuICAgICAgY29uc3QgeyBzY3JvbGxUb3AgfSA9IGlubmVyXG4gICAgICBjb25zdCBwYWdlU2Nyb2xsVG9wID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcFxuXG4gICAgICBsYXlvdXRNZW51LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcbiAgICAgIC8vIGxheW91dE1lbnUub2Zmc2V0SGVpZ2h0XG4gICAgICBsYXlvdXRNZW51LnN0eWxlLmRpc3BsYXkgPSAnJ1xuICAgICAgaW5uZXIuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wXG4gICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wID0gcGFnZVNjcm9sbFRvcFxuXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9LFxuXG4gIC8vIC0tLVxuICAvLyBDaGVjayBmb3IgdHJhbnNpdGlvbiBzdXBwb3J0XG4gIF9zdXBwb3J0c1RyYW5zaXRpb25FbmQoKSB7XG4gICAgaWYgKHdpbmRvdy5RVW5pdCkgcmV0dXJuIGZhbHNlXG5cbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmJvZHkgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XG5cbiAgICBpZiAoIWVsKSByZXR1cm4gZmFsc2VcblxuICAgIGxldCByZXN1bHQgPSBmYWxzZVxuICAgIFRSQU5TX1BST1BFUlRJRVMuZm9yRWFjaChldm50ID0+IHtcbiAgICAgIGlmICh0eXBlb2YgZWwuc3R5bGVbZXZudF0gIT09ICd1bmRlZmluZWQnKSByZXN1bHQgPSB0cnVlXG4gICAgfSlcblxuICAgIHJldHVybiByZXN1bHRcbiAgfSxcblxuICAvLyAtLS1cbiAgLy8gQ2FsY3VsYXRlIGN1cnJlbnQgbmF2YmFyIGhlaWdodFxuICBfZ2V0TmF2YmFySGVpZ2h0KCkge1xuICAgIGNvbnN0IGxheW91dE5hdmJhciA9IHRoaXMuZ2V0TGF5b3V0TmF2YmFyKClcblxuICAgIGlmICghbGF5b3V0TmF2YmFyKSByZXR1cm4gMFxuICAgIGlmICghdGhpcy5pc1NtYWxsU2NyZWVuKCkpIHJldHVybiBsYXlvdXROYXZiYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0XG5cbiAgICAvLyBOZWVkcyBzb21lIGxvZ2ljIHRvIGdldCBuYXZiYXIgaGVpZ2h0IG9uIHNtYWxsIHNjcmVlbnNcblxuICAgIGNvbnN0IGNsb25lZEVsID0gbGF5b3V0TmF2YmFyLmNsb25lTm9kZSh0cnVlKVxuICAgIGNsb25lZEVsLmlkID0gbnVsbFxuICAgIGNsb25lZEVsLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJ1xuICAgIGNsb25lZEVsLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuXG4gICAgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoY2xvbmVkRWwucXVlcnlTZWxlY3RvckFsbCgnLmNvbGxhcHNlLnNob3cnKSkuZm9yRWFjaChlbCA9PiB0aGlzLl9yZW1vdmVDbGFzcygnc2hvdycsIGVsKSlcblxuICAgIGxheW91dE5hdmJhci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjbG9uZWRFbCwgbGF5b3V0TmF2YmFyKVxuXG4gICAgY29uc3QgbmF2YmFySGVpZ2h0ID0gY2xvbmVkRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0XG5cbiAgICBjbG9uZWRFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNsb25lZEVsKVxuXG4gICAgcmV0dXJuIG5hdmJhckhlaWdodFxuICB9LFxuXG4gIC8vIC0tLVxuICAvLyBHZXQgY3VycmVudCBmb290ZXIgaGVpZ2h0XG4gIF9nZXRGb290ZXJIZWlnaHQoKSB7XG4gICAgY29uc3QgbGF5b3V0Rm9vdGVyID0gdGhpcy5nZXRMYXlvdXRGb290ZXIoKVxuXG4gICAgaWYgKCFsYXlvdXRGb290ZXIpIHJldHVybiAwXG5cbiAgICByZXR1cm4gbGF5b3V0Rm9vdGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxuICB9LFxuXG4gIC8vIC0tLVxuICAvLyBHZXQgYW5pbWF0aW9uIGR1cmF0aW9uIG9mIGVsZW1lbnRcbiAgX2dldEFuaW1hdGlvbkR1cmF0aW9uKGVsKSB7XG4gICAgY29uc3QgZHVyYXRpb24gPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCkudHJhbnNpdGlvbkR1cmF0aW9uXG5cbiAgICByZXR1cm4gcGFyc2VGbG9hdChkdXJhdGlvbikgKiAoZHVyYXRpb24uaW5kZXhPZignbXMnKSAhPT0gLTEgPyAxIDogMTAwMClcbiAgfSxcblxuICAvLyAtLS1cbiAgLy8gU2V0IG1lbnUgaG92ZXIgc3RhdGVcbiAgX3NldE1lbnVIb3ZlclN0YXRlKGhvdmVyZWQpIHtcbiAgICB0aGlzW2hvdmVyZWQgPyAnX2FkZENsYXNzJyA6ICdfcmVtb3ZlQ2xhc3MnXSgnbGF5b3V0LW1lbnUtaG92ZXInKVxuICB9LFxuXG4gIC8vIC0tLVxuICAvLyBUb2dnbGUgY29sbGFwc2VkXG4gIF9zZXRDb2xsYXBzZWQoY29sbGFwc2VkKSB7XG4gICAgaWYgKHRoaXMuaXNTbWFsbFNjcmVlbigpKSB7XG4gICAgICBpZiAoY29sbGFwc2VkKSB7XG4gICAgICAgIHRoaXMuX3JlbW92ZUNsYXNzKCdsYXlvdXQtbWVudS1leHBhbmRlZCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2FkZENsYXNzKCdsYXlvdXQtbWVudS1leHBhbmRlZCcpXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aGlzLl9yZWRyYXdMYXlvdXRNZW51KCkgPyA1IDogMFxuICAgICAgICApXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXNbY29sbGFwc2VkID8gJ19hZGRDbGFzcycgOiAnX3JlbW92ZUNsYXNzJ10oJ2xheW91dC1tZW51LWNvbGxhcHNlZCcpXG4gICAgfVxuICB9LFxuXG4gIC8vIC0tLVxuICAvLyBBZGQgbGF5b3V0IHNpdmVuYXYgdG9nZ2xlIGFuaW1hdGlvbkVuZCBldmVudFxuICBfYmluZExheW91dEFuaW1hdGlvbkVuZEV2ZW50KG1vZGlmaWVyLCBjYikge1xuICAgIGNvbnN0IG1lbnUgPSB0aGlzLmdldE1lbnUoKVxuICAgIGNvbnN0IGR1cmF0aW9uID0gbWVudSA/IHRoaXMuX2dldEFuaW1hdGlvbkR1cmF0aW9uKG1lbnUpICsgNTAgOiAwXG5cbiAgICBpZiAoIWR1cmF0aW9uKSB7XG4gICAgICBtb2RpZmllci5jYWxsKHRoaXMpXG4gICAgICBjYi5jYWxsKHRoaXMpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl90cmFuc2l0aW9uQ2FsbGJhY2sgPSBlID0+IHtcbiAgICAgIGlmIChlLnRhcmdldCAhPT0gbWVudSkgcmV0dXJuXG4gICAgICB0aGlzLl91bmJpbmRMYXlvdXRBbmltYXRpb25FbmRFdmVudCgpXG4gICAgICBjYi5jYWxsKHRoaXMpXG4gICAgfVxuXG4gICAgVFJBTlNfRVZFTlRTLmZvckVhY2goZSA9PiB7XG4gICAgICBtZW51LmFkZEV2ZW50TGlzdGVuZXIoZSwgdGhpcy5fdHJhbnNpdGlvbkNhbGxiYWNrLCBmYWxzZSlcbiAgICB9KVxuXG4gICAgbW9kaWZpZXIuY2FsbCh0aGlzKVxuXG4gICAgdGhpcy5fdHJhbnNpdGlvbkNhbGxiYWNrVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fdHJhbnNpdGlvbkNhbGxiYWNrLmNhbGwodGhpcywgeyB0YXJnZXQ6IG1lbnUgfSlcbiAgICB9LCBkdXJhdGlvbilcbiAgfSxcblxuICAvLyAtLS1cbiAgLy8gUmVtb3ZlIGxheW91dCBzaXZlbmF2IHRvZ2dsZSBhbmltYXRpb25FbmQgZXZlbnRcbiAgX3VuYmluZExheW91dEFuaW1hdGlvbkVuZEV2ZW50KCkge1xuICAgIGNvbnN0IG1lbnUgPSB0aGlzLmdldE1lbnUoKVxuXG4gICAgaWYgKHRoaXMuX3RyYW5zaXRpb25DYWxsYmFja1RpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90cmFuc2l0aW9uQ2FsbGJhY2tUaW1lb3V0KVxuICAgICAgdGhpcy5fdHJhbnNpdGlvbkNhbGxiYWNrVGltZW91dCA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAobWVudSAmJiB0aGlzLl90cmFuc2l0aW9uQ2FsbGJhY2spIHtcbiAgICAgIFRSQU5TX0VWRU5UUy5mb3JFYWNoKGUgPT4ge1xuICAgICAgICBtZW51LnJlbW92ZUV2ZW50TGlzdGVuZXIoZSwgdGhpcy5fdHJhbnNpdGlvbkNhbGxiYWNrLCBmYWxzZSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3RyYW5zaXRpb25DYWxsYmFjaykge1xuICAgICAgdGhpcy5fdHJhbnNpdGlvbkNhbGxiYWNrID0gbnVsbFxuICAgIH1cbiAgfSxcblxuICAvLyAtLS1cbiAgLy8gQmluZCBkZWxheWVkIHdpbmRvdyByZXNpemUgZXZlbnRcbiAgX2JpbmRXaW5kb3dSZXNpemVFdmVudCgpIHtcbiAgICB0aGlzLl91bmJpbmRXaW5kb3dSZXNpemVFdmVudCgpXG5cbiAgICBjb25zdCBjYiA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9yZXNpemVUaW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9yZXNpemVUaW1lb3V0KVxuICAgICAgICB0aGlzLl9yZXNpemVUaW1lb3V0ID0gbnVsbFxuICAgICAgfVxuICAgICAgdGhpcy5fdHJpZ2dlckV2ZW50KCdyZXNpemUnKVxuICAgIH1cblxuICAgIHRoaXMuX3Jlc2l6ZUNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX3Jlc2l6ZVRpbWVvdXQpIGNsZWFyVGltZW91dCh0aGlzLl9yZXNpemVUaW1lb3V0KVxuICAgICAgdGhpcy5fcmVzaXplVGltZW91dCA9IHNldFRpbWVvdXQoY2IsIHRoaXMuUkVTSVpFX0RFTEFZKVxuICAgIH1cblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLl9yZXNpemVDYWxsYmFjaywgZmFsc2UpXG4gIH0sXG5cbiAgLy8gLS0tXG4gIC8vIFVuYmluZCBkZWxheWVkIHdpbmRvdyByZXNpemUgZXZlbnRcbiAgX3VuYmluZFdpbmRvd1Jlc2l6ZUV2ZW50KCkge1xuICAgIGlmICh0aGlzLl9yZXNpemVUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fcmVzaXplVGltZW91dClcbiAgICAgIHRoaXMuX3Jlc2l6ZVRpbWVvdXQgPSBudWxsXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3Jlc2l6ZUNhbGxiYWNrKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5fcmVzaXplQ2FsbGJhY2ssIGZhbHNlKVxuICAgICAgdGhpcy5fcmVzaXplQ2FsbGJhY2sgPSBudWxsXG4gICAgfVxuICB9LFxuXG4gIF9iaW5kTWVudU1vdXNlRXZlbnRzKCkge1xuICAgIGlmICh0aGlzLl9tZW51TW91c2VFbnRlciAmJiB0aGlzLl9tZW51TW91c2VMZWF2ZSAmJiB0aGlzLl93aW5kb3dUb3VjaFN0YXJ0KSByZXR1cm5cblxuICAgIGNvbnN0IGxheW91dE1lbnUgPSB0aGlzLmdldExheW91dE1lbnUoKVxuICAgIGlmICghbGF5b3V0TWVudSkgcmV0dXJuIHRoaXMuX3VuYmluZE1lbnVNb3VzZUV2ZW50cygpXG5cbiAgICBpZiAoIXRoaXMuX21lbnVNb3VzZUVudGVyKSB7XG4gICAgICB0aGlzLl9tZW51TW91c2VFbnRlciA9ICgpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuaXNTbWFsbFNjcmVlbigpIHx8XG4gICAgICAgICAgIXRoaXMuX2hhc0NsYXNzKCdsYXlvdXQtbWVudS1jb2xsYXBzZWQnKSB8fFxuICAgICAgICAgIHRoaXMuaXNPZmZjYW52YXMoKSB8fFxuICAgICAgICAgIHRoaXMuX2hhc0NsYXNzKCdsYXlvdXQtdHJhbnNpdGlvbmluZycpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9zZXRNZW51SG92ZXJTdGF0ZShmYWxzZSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9zZXRNZW51SG92ZXJTdGF0ZSh0cnVlKVxuICAgICAgfVxuICAgICAgbGF5b3V0TWVudS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgdGhpcy5fbWVudU1vdXNlRW50ZXIsIGZhbHNlKVxuICAgICAgbGF5b3V0TWVudS5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5fbWVudU1vdXNlRW50ZXIsIGZhbHNlKVxuICAgIH1cblxuICAgIGlmICghdGhpcy5fbWVudU1vdXNlTGVhdmUpIHtcbiAgICAgIHRoaXMuX21lbnVNb3VzZUxlYXZlID0gKCkgPT4ge1xuICAgICAgICB0aGlzLl9zZXRNZW51SG92ZXJTdGF0ZShmYWxzZSlcbiAgICAgIH1cbiAgICAgIGxheW91dE1lbnUuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMuX21lbnVNb3VzZUxlYXZlLCBmYWxzZSlcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX3dpbmRvd1RvdWNoU3RhcnQpIHtcbiAgICAgIHRoaXMuX3dpbmRvd1RvdWNoU3RhcnQgPSBlID0+IHtcbiAgICAgICAgaWYgKCFlIHx8ICFlLnRhcmdldCB8fCAhdGhpcy5fZmluZFBhcmVudChlLnRhcmdldCwgJy5sYXlvdXQtbWVudScpKSB7XG4gICAgICAgICAgdGhpcy5fc2V0TWVudUhvdmVyU3RhdGUoZmFsc2UpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5fd2luZG93VG91Y2hTdGFydCwgdHJ1ZSlcbiAgICB9XG4gIH0sXG5cbiAgX3VuYmluZE1lbnVNb3VzZUV2ZW50cygpIHtcbiAgICBpZiAoIXRoaXMuX21lbnVNb3VzZUVudGVyICYmICF0aGlzLl9tZW51TW91c2VMZWF2ZSAmJiAhdGhpcy5fd2luZG93VG91Y2hTdGFydCkgcmV0dXJuXG5cbiAgICBjb25zdCBsYXlvdXRNZW51ID0gdGhpcy5nZXRMYXlvdXRNZW51KClcblxuICAgIGlmICh0aGlzLl9tZW51TW91c2VFbnRlcikge1xuICAgICAgaWYgKGxheW91dE1lbnUpIHtcbiAgICAgICAgbGF5b3V0TWVudS5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgdGhpcy5fbWVudU1vdXNlRW50ZXIsIGZhbHNlKVxuICAgICAgICBsYXlvdXRNZW51LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl9tZW51TW91c2VFbnRlciwgZmFsc2UpXG4gICAgICB9XG4gICAgICB0aGlzLl9tZW51TW91c2VFbnRlciA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbWVudU1vdXNlTGVhdmUpIHtcbiAgICAgIGlmIChsYXlvdXRNZW51KSB7XG4gICAgICAgIGxheW91dE1lbnUucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMuX21lbnVNb3VzZUxlYXZlLCBmYWxzZSlcbiAgICAgIH1cbiAgICAgIHRoaXMuX21lbnVNb3VzZUxlYXZlID0gbnVsbFxuICAgIH1cblxuICAgIGlmICh0aGlzLl93aW5kb3dUb3VjaFN0YXJ0KSB7XG4gICAgICBpZiAobGF5b3V0TWVudSkge1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX3dpbmRvd1RvdWNoU3RhcnQsIHRydWUpXG4gICAgICB9XG4gICAgICB0aGlzLl93aW5kb3dUb3VjaFN0YXJ0ID0gbnVsbFxuICAgIH1cblxuICAgIHRoaXMuX3NldE1lbnVIb3ZlclN0YXRlKGZhbHNlKVxuICB9LFxuXG4gIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgLy8gKiBNZXRob2RzXG5cbiAgc2Nyb2xsVG9BY3RpdmUoYW5pbWF0ZSA9IGZhbHNlKSB7XG4gICAgdGhpcy5fc2Nyb2xsVG9BY3RpdmUoYW5pbWF0ZSlcbiAgfSxcblxuICBzd2lwZUluKGVsLCBjYWxsYmFjaykge1xuICAgIHRoaXMuX3N3aXBlSW4oZWwsIGNhbGxiYWNrKVxuICB9LFxuXG4gIHN3aXBlT3V0KGVsLCBjYWxsYmFjaykge1xuICAgIHRoaXMuX3N3aXBlT3V0KGVsLCBjYWxsYmFjaylcbiAgfSxcblxuICBvdmVybGF5VGFwKGVsLCBjYWxsYmFjaykge1xuICAgIHRoaXMuX292ZXJsYXlUYXAoZWwsIGNhbGxiYWNrKVxuICB9LFxuXG4gIHNjcm9sbFBhZ2VUbyh0bywgZHVyYXRpb24gPSA1MDApIHtcbiAgICAvLyB0ID0gY3VycmVudCB0aW1lXG4gICAgLy8gYiA9IHN0YXJ0IHZhbHVlXG4gICAgLy8gYyA9IGNoYW5nZSBpbiB2YWx1ZVxuICAgIC8vIGQgPSBkdXJhdGlvblxuICAgIGNvbnN0IGVhc2VJbk91dFF1YWQgPSAodCwgYiwgYywgZCkgPT4ge1xuICAgICAgdCAvPSBkIC8gMlxuICAgICAgaWYgKHQgPCAxKSByZXR1cm4gKGMgLyAyKSAqIHQgKiB0ICsgYlxuICAgICAgdCAtPSAxXG4gICAgICByZXR1cm4gKC1jIC8gMikgKiAodCAqICh0IC0gMikgLSAxKSArIGJcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudFxuXG4gICAgaWYgKHR5cGVvZiB0byA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRvID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0bylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB0byAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRvID0gdG8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgZWxlbWVudC5zY3JvbGxUb3BcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydCA9IGVsZW1lbnQuc2Nyb2xsVG9wXG4gICAgY29uc3QgY2hhbmdlID0gdG8gLSBzdGFydFxuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9ICtuZXcgRGF0ZSgpXG4gICAgLy8gY29uc3QgaW5jcmVtZW50ID0gMjBcblxuICAgIGNvbnN0IGFuaW1hdGVTY3JvbGwgPSAoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50RGF0ZSA9ICtuZXcgRGF0ZSgpXG4gICAgICBjb25zdCBjdXJyZW50VGltZSA9IGN1cnJlbnREYXRlIC0gc3RhcnREYXRlXG4gICAgICBjb25zdCB2YWwgPSBlYXNlSW5PdXRRdWFkKGN1cnJlbnRUaW1lLCBzdGFydCwgY2hhbmdlLCBkdXJhdGlvbilcbiAgICAgIGVsZW1lbnQuc2Nyb2xsVG9wID0gdmFsXG4gICAgICBpZiAoY3VycmVudFRpbWUgPCBkdXJhdGlvbikge1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYW5pbWF0ZVNjcm9sbClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQuc2Nyb2xsVG9wID0gdG9cbiAgICAgIH1cbiAgICB9XG4gICAgYW5pbWF0ZVNjcm9sbCgpXG4gIH0sXG5cbiAgLy8gLS0tXG4gIC8vIENvbGxhcHNlIC8gZXhwYW5kIGxheW91dFxuICBzZXRDb2xsYXBzZWQoY29sbGFwc2VkID0gcmVxdWlyZWRQYXJhbSgnY29sbGFwc2VkJyksIGFuaW1hdGUgPSB0cnVlKSB7XG4gICAgY29uc3QgbGF5b3V0TWVudSA9IHRoaXMuZ2V0TGF5b3V0TWVudSgpXG5cbiAgICBpZiAoIWxheW91dE1lbnUpIHJldHVyblxuXG4gICAgdGhpcy5fdW5iaW5kTGF5b3V0QW5pbWF0aW9uRW5kRXZlbnQoKVxuXG4gICAgaWYgKGFuaW1hdGUgJiYgdGhpcy5fc3VwcG9ydHNUcmFuc2l0aW9uRW5kKCkpIHtcbiAgICAgIHRoaXMuX2FkZENsYXNzKCdsYXlvdXQtdHJhbnNpdGlvbmluZycpXG4gICAgICBpZiAoY29sbGFwc2VkKSB0aGlzLl9zZXRNZW51SG92ZXJTdGF0ZShmYWxzZSlcblxuICAgICAgdGhpcy5fYmluZExheW91dEFuaW1hdGlvbkVuZEV2ZW50KFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgLy8gQ29sbGFwc2UgLyBFeHBhbmRcbiAgICAgICAgICB0aGlzLl9zZXRDb2xsYXBzZWQoY29sbGFwc2VkKVxuICAgICAgICB9LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fcmVtb3ZlQ2xhc3MoJ2xheW91dC10cmFuc2l0aW9uaW5nJylcbiAgICAgICAgICB0aGlzLl90cmlnZ2VyV2luZG93RXZlbnQoJ3Jlc2l6ZScpXG4gICAgICAgICAgdGhpcy5fdHJpZ2dlckV2ZW50KCd0b2dnbGUnKVxuICAgICAgICAgIHRoaXMuX3NldE1lbnVIb3ZlclN0YXRlKGZhbHNlKVxuICAgICAgICB9XG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2FkZENsYXNzKCdsYXlvdXQtbm8tdHJhbnNpdGlvbicpXG4gICAgICBpZiAoY29sbGFwc2VkKSB0aGlzLl9zZXRNZW51SG92ZXJTdGF0ZShmYWxzZSlcblxuICAgICAgLy8gQ29sbGFwc2UgLyBFeHBhbmRcbiAgICAgIHRoaXMuX3NldENvbGxhcHNlZChjb2xsYXBzZWQpXG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLl9yZW1vdmVDbGFzcygnbGF5b3V0LW5vLXRyYW5zaXRpb24nKVxuICAgICAgICB0aGlzLl90cmlnZ2VyV2luZG93RXZlbnQoJ3Jlc2l6ZScpXG4gICAgICAgIHRoaXMuX3RyaWdnZXJFdmVudCgndG9nZ2xlJylcbiAgICAgICAgdGhpcy5fc2V0TWVudUhvdmVyU3RhdGUoZmFsc2UpXG4gICAgICB9LCAxKVxuICAgIH1cbiAgfSxcblxuICAvLyAtLS1cbiAgLy8gVG9nZ2xlIGxheW91dFxuICB0b2dnbGVDb2xsYXBzZWQoYW5pbWF0ZSA9IHRydWUpIHtcbiAgICB0aGlzLnNldENvbGxhcHNlZCghdGhpcy5pc0NvbGxhcHNlZCgpLCBhbmltYXRlKVxuICB9LFxuXG4gIC8vIC0tLVxuICAvLyBTZXQgbGF5b3V0IHBvc2l0aW9uaW5nXG4gIHNldFBvc2l0aW9uKGZpeGVkID0gcmVxdWlyZWRQYXJhbSgnZml4ZWQnKSwgb2ZmY2FudmFzID0gcmVxdWlyZWRQYXJhbSgnb2ZmY2FudmFzJykpIHtcbiAgICB0aGlzLl9yZW1vdmVDbGFzcygnbGF5b3V0LW1lbnUtb2ZmY2FudmFzIGxheW91dC1tZW51LWZpeGVkIGxheW91dC1tZW51LWZpeGVkLW9mZmNhbnZhcycpXG5cbiAgICBpZiAoIWZpeGVkICYmIG9mZmNhbnZhcykge1xuICAgICAgdGhpcy5fYWRkQ2xhc3MoJ2xheW91dC1tZW51LW9mZmNhbnZhcycpXG4gICAgfSBlbHNlIGlmIChmaXhlZCAmJiAhb2ZmY2FudmFzKSB7XG4gICAgICB0aGlzLl9hZGRDbGFzcygnbGF5b3V0LW1lbnUtZml4ZWQnKVxuICAgICAgdGhpcy5fcmVkcmF3TGF5b3V0TWVudSgpXG4gICAgfSBlbHNlIGlmIChmaXhlZCAmJiBvZmZjYW52YXMpIHtcbiAgICAgIHRoaXMuX2FkZENsYXNzKCdsYXlvdXQtbWVudS1maXhlZC1vZmZjYW52YXMnKVxuICAgICAgdGhpcy5fcmVkcmF3TGF5b3V0TWVudSgpXG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGUoKVxuICB9LFxuXG4gIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgLy8gKiBHZXR0ZXJzXG5cbiAgZ2V0TGF5b3V0TWVudSgpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmxheW91dC1tZW51JylcbiAgfSxcblxuICBnZXRNZW51KCkge1xuICAgIGNvbnN0IGxheW91dE1lbnUgPSB0aGlzLmdldExheW91dE1lbnUoKVxuXG4gICAgaWYgKCFsYXlvdXRNZW51KSByZXR1cm4gbnVsbFxuXG4gICAgcmV0dXJuICF0aGlzLl9oYXNDbGFzcygnbWVudScsIGxheW91dE1lbnUpID8gbGF5b3V0TWVudS5xdWVyeVNlbGVjdG9yKCcubWVudScpIDogbGF5b3V0TWVudVxuICB9LFxuXG4gIGdldExheW91dE5hdmJhcigpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmxheW91dC1uYXZiYXInKVxuICB9LFxuXG4gIGdldExheW91dEZvb3RlcigpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvbnRlbnQtZm9vdGVyJylcbiAgfSxcblxuICBnZXRMYXlvdXRDb250YWluZXIoKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5sYXlvdXQtcGFnZScpXG4gIH0sXG5cbiAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAvLyAqIFNldHRlcnNcblxuICBzZXROYXZiYXJGaXhlZChmaXhlZCA9IHJlcXVpcmVkUGFyYW0oJ2ZpeGVkJykpIHtcbiAgICB0aGlzW2ZpeGVkID8gJ19hZGRDbGFzcycgOiAnX3JlbW92ZUNsYXNzJ10oJ2xheW91dC1uYXZiYXItZml4ZWQnKVxuICAgIHRoaXMudXBkYXRlKClcbiAgfSxcblxuICBzZXRGb290ZXJGaXhlZChmaXhlZCA9IHJlcXVpcmVkUGFyYW0oJ2ZpeGVkJykpIHtcbiAgICB0aGlzW2ZpeGVkID8gJ19hZGRDbGFzcycgOiAnX3JlbW92ZUNsYXNzJ10oJ2xheW91dC1mb290ZXItZml4ZWQnKVxuICAgIHRoaXMudXBkYXRlKClcbiAgfSxcblxuICBzZXRGbGlwcGVkKHJldmVyc2VkID0gcmVxdWlyZWRQYXJhbSgncmV2ZXJzZWQnKSkge1xuICAgIHRoaXNbcmV2ZXJzZWQgPyAnX2FkZENsYXNzJyA6ICdfcmVtb3ZlQ2xhc3MnXSgnbGF5b3V0LW1lbnUtZmxpcHBlZCcpXG4gIH0sXG5cbiAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAvLyAqIFVwZGF0ZVxuXG4gIHVwZGF0ZSgpIHtcbiAgICBpZiAoXG4gICAgICAodGhpcy5nZXRMYXlvdXROYXZiYXIoKSAmJlxuICAgICAgICAoKCF0aGlzLmlzU21hbGxTY3JlZW4oKSAmJiB0aGlzLmlzTGF5b3V0TmF2YmFyRnVsbCgpICYmIHRoaXMuaXNGaXhlZCgpKSB8fCB0aGlzLmlzTmF2YmFyRml4ZWQoKSkpIHx8XG4gICAgICAodGhpcy5nZXRMYXlvdXRGb290ZXIoKSAmJiB0aGlzLmlzRm9vdGVyRml4ZWQoKSlcbiAgICApIHtcbiAgICAgIHRoaXMuX3VwZGF0ZUlubGluZVN0eWxlKHRoaXMuX2dldE5hdmJhckhlaWdodCgpLCB0aGlzLl9nZXRGb290ZXJIZWlnaHQoKSlcbiAgICB9XG5cbiAgICB0aGlzLl9iaW5kTWVudU1vdXNlRXZlbnRzKClcbiAgfSxcblxuICBzZXRBdXRvVXBkYXRlKGVuYWJsZSA9IHJlcXVpcmVkUGFyYW0oJ2VuYWJsZScpKSB7XG4gICAgaWYgKGVuYWJsZSAmJiAhdGhpcy5fYXV0b1VwZGF0ZSkge1xuICAgICAgdGhpcy5vbigncmVzaXplLkhlbHBlcnM6YXV0b1VwZGF0ZScsICgpID0+IHRoaXMudXBkYXRlKCkpXG4gICAgICB0aGlzLl9hdXRvVXBkYXRlID0gdHJ1ZVxuICAgIH0gZWxzZSBpZiAoIWVuYWJsZSAmJiB0aGlzLl9hdXRvVXBkYXRlKSB7XG4gICAgICB0aGlzLm9mZigncmVzaXplLkhlbHBlcnM6YXV0b1VwZGF0ZScpXG4gICAgICB0aGlzLl9hdXRvVXBkYXRlID0gZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgLy8gVXBkYXRlIGN1c3RvbSBvcHRpb24gYmFzZWQgb24gZWxlbWVudFxuICB1cGRhdGVDdXN0b21PcHRpb25DaGVjayhlbCkge1xuICAgIGlmIChlbC5jaGVja2VkKSB7XG4gICAgICAvLyBJZiBjdXN0b20gb3B0aW9uIGVsZW1lbnQgaXMgcmFkaW8sIHJlbW92ZSBjaGVja2VkIGZyb20gdGhlIHNpYmxpbmdzIChjbG9zZXN0IGAucm93YClcbiAgICAgIGlmIChlbC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICAgIGNvbnN0IGN1c3RvbVJhZGlvT3B0aW9uTGlzdCA9IFtdLnNsaWNlLmNhbGwoZWwuY2xvc2VzdCgnLnJvdycpLnF1ZXJ5U2VsZWN0b3JBbGwoJy5jdXN0b20tb3B0aW9uJykpXG4gICAgICAgIGN1c3RvbVJhZGlvT3B0aW9uTGlzdC5tYXAoZnVuY3Rpb24gKGN1c3RvbVJhZGlvT3B0aW9uRUwpIHtcbiAgICAgICAgICBjdXN0b21SYWRpb09wdGlvbkVMLmNsb3Nlc3QoJy5jdXN0b20tb3B0aW9uJykuY2xhc3NMaXN0LnJlbW92ZSgnY2hlY2tlZCcpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBlbC5jbG9zZXN0KCcuY3VzdG9tLW9wdGlvbicpLmNsYXNzTGlzdC5hZGQoJ2NoZWNrZWQnKVxuICAgIH0gZWxzZSB7XG4gICAgICBlbC5jbG9zZXN0KCcuY3VzdG9tLW9wdGlvbicpLmNsYXNzTGlzdC5yZW1vdmUoJ2NoZWNrZWQnKVxuICAgIH1cbiAgfSxcblxuICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIC8vICogVGVzdHNcblxuICBpc1J0bCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYm9keScpLmdldEF0dHJpYnV0ZSgnZGlyJykgPT09ICdydGwnIHx8XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdodG1sJykuZ2V0QXR0cmlidXRlKCdkaXInKSA9PT0gJ3J0bCdcbiAgICApXG4gIH0sXG5cbiAgaXNNb2JpbGVEZXZpY2UoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB3aW5kb3cub3JpZW50YXRpb24gIT09ICd1bmRlZmluZWQnIHx8IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignSUVNb2JpbGUnKSAhPT0gLTFcbiAgfSxcblxuICBpc1NtYWxsU2NyZWVuKCkge1xuICAgIHJldHVybiAoXG4gICAgICAod2luZG93LmlubmVyV2lkdGggfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoIHx8IGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgpIDwgdGhpcy5MQVlPVVRfQlJFQUtQT0lOVFxuICAgIClcbiAgfSxcblxuICBpc0xheW91dE5hdmJhckZ1bGwoKSB7XG4gICAgcmV0dXJuICEhZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmxheW91dC13cmFwcGVyLmxheW91dC1uYXZiYXItZnVsbCcpXG4gIH0sXG5cbiAgaXNDb2xsYXBzZWQoKSB7XG4gICAgaWYgKHRoaXMuaXNTbWFsbFNjcmVlbigpKSB7XG4gICAgICByZXR1cm4gIXRoaXMuX2hhc0NsYXNzKCdsYXlvdXQtbWVudS1leHBhbmRlZCcpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9oYXNDbGFzcygnbGF5b3V0LW1lbnUtY29sbGFwc2VkJylcbiAgfSxcblxuICBpc0ZpeGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9oYXNDbGFzcygnbGF5b3V0LW1lbnUtZml4ZWQgbGF5b3V0LW1lbnUtZml4ZWQtb2ZmY2FudmFzJylcbiAgfSxcblxuICBpc09mZmNhbnZhcygpIHtcbiAgICByZXR1cm4gdGhpcy5faGFzQ2xhc3MoJ2xheW91dC1tZW51LW9mZmNhbnZhcyBsYXlvdXQtbWVudS1maXhlZC1vZmZjYW52YXMnKVxuICB9LFxuXG4gIGlzTmF2YmFyRml4ZWQoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuX2hhc0NsYXNzKCdsYXlvdXQtbmF2YmFyLWZpeGVkJykgfHwgKCF0aGlzLmlzU21hbGxTY3JlZW4oKSAmJiB0aGlzLmlzRml4ZWQoKSAmJiB0aGlzLmlzTGF5b3V0TmF2YmFyRnVsbCgpKVxuICAgIClcbiAgfSxcblxuICBpc0Zvb3RlckZpeGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9oYXNDbGFzcygnbGF5b3V0LWZvb3Rlci1maXhlZCcpXG4gIH0sXG5cbiAgaXNGbGlwcGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9oYXNDbGFzcygnbGF5b3V0LW1lbnUtZmxpcHBlZCcpXG4gIH0sXG5cbiAgaXNMaWdodFN0eWxlKCkge1xuICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdsaWdodC1zdHlsZScpXG4gIH0sXG5cbiAgaXNEYXJrU3R5bGUoKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2Rhcmstc3R5bGUnKVxuICB9LFxuXG4gIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgLy8gKiBFdmVudHNcblxuICBvbihldmVudCA9IHJlcXVpcmVkUGFyYW0oJ2V2ZW50JyksIGNhbGxiYWNrID0gcmVxdWlyZWRQYXJhbSgnY2FsbGJhY2snKSkge1xuICAgIGNvbnN0IFtfZXZlbnRdID0gZXZlbnQuc3BsaXQoJy4nKVxuICAgIGxldCBbLCAuLi5uYW1lc3BhY2VdID0gZXZlbnQuc3BsaXQoJy4nKVxuICAgIC8vIGxldCBbX2V2ZW50LCAuLi5uYW1lc3BhY2VdID0gZXZlbnQuc3BsaXQoJy4nKVxuICAgIG5hbWVzcGFjZSA9IG5hbWVzcGFjZS5qb2luKCcuJykgfHwgbnVsbFxuXG4gICAgdGhpcy5fbGlzdGVuZXJzLnB1c2goeyBldmVudDogX2V2ZW50LCBuYW1lc3BhY2UsIGNhbGxiYWNrIH0pXG4gIH0sXG5cbiAgb2ZmKGV2ZW50ID0gcmVxdWlyZWRQYXJhbSgnZXZlbnQnKSkge1xuICAgIGNvbnN0IFtfZXZlbnRdID0gZXZlbnQuc3BsaXQoJy4nKVxuICAgIGxldCBbLCAuLi5uYW1lc3BhY2VdID0gZXZlbnQuc3BsaXQoJy4nKVxuICAgIG5hbWVzcGFjZSA9IG5hbWVzcGFjZS5qb2luKCcuJykgfHwgbnVsbFxuXG4gICAgdGhpcy5fbGlzdGVuZXJzXG4gICAgICAuZmlsdGVyKGxpc3RlbmVyID0+IGxpc3RlbmVyLmV2ZW50ID09PSBfZXZlbnQgJiYgbGlzdGVuZXIubmFtZXNwYWNlID09PSBuYW1lc3BhY2UpXG4gICAgICAuZm9yRWFjaChsaXN0ZW5lciA9PiB0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKHRoaXMuX2xpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKSwgMSkpXG4gIH0sXG5cbiAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAvLyAqIExpZmUgY3ljbGVcblxuICBpbml0KCkge1xuICAgIGlmICh0aGlzLl9pbml0aWFsaXplZCkgcmV0dXJuXG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlXG5cbiAgICAvLyBJbml0aWFsaXplIGBzdHlsZWAgZWxlbWVudFxuICAgIHRoaXMuX3VwZGF0ZUlubGluZVN0eWxlKDApXG5cbiAgICAvLyBCaW5kIHdpbmRvdyByZXNpemUgZXZlbnRcbiAgICB0aGlzLl9iaW5kV2luZG93UmVzaXplRXZlbnQoKVxuXG4gICAgLy8gQmluZCBpbml0IGV2ZW50XG4gICAgdGhpcy5vZmYoJ2luaXQuX0hlbHBlcnMnKVxuICAgIHRoaXMub24oJ2luaXQuX0hlbHBlcnMnLCAoKSA9PiB7XG4gICAgICB0aGlzLm9mZigncmVzaXplLl9IZWxwZXJzOnJlZHJhd01lbnUnKVxuICAgICAgdGhpcy5vbigncmVzaXplLl9IZWxwZXJzOnJlZHJhd01lbnUnLCAoKSA9PiB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcbiAgICAgICAgdGhpcy5pc1NtYWxsU2NyZWVuKCkgJiYgIXRoaXMuaXNDb2xsYXBzZWQoKSAmJiB0aGlzLl9yZWRyYXdMYXlvdXRNZW51KClcbiAgICAgIH0pXG5cbiAgICAgIC8vIEZvcmNlIHJlcGFpbnQgaW4gSUUgMTBcbiAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQuZG9jdW1lbnRNb2RlID09PSAnbnVtYmVyJyAmJiBkb2N1bWVudC5kb2N1bWVudE1vZGUgPCAxMSkge1xuICAgICAgICB0aGlzLm9mZigncmVzaXplLl9IZWxwZXJzOmllMTBSZXBhaW50Qm9keScpXG4gICAgICAgIHRoaXMub24oJ3Jlc2l6ZS5fSGVscGVyczppZTEwUmVwYWludEJvZHknLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNGaXhlZCgpKSByZXR1cm5cbiAgICAgICAgICBjb25zdCB7IHNjcm9sbFRvcCB9ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XG4gICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXG4gICAgICAgICAgLy8gZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHRcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snXG4gICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA9IHNjcm9sbFRvcFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB0aGlzLl90cmlnZ2VyRXZlbnQoJ2luaXQnKVxuICB9LFxuXG4gIGRlc3Ryb3koKSB7XG4gICAgaWYgKCF0aGlzLl9pbml0aWFsaXplZCkgcmV0dXJuXG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSBmYWxzZVxuXG4gICAgdGhpcy5fcmVtb3ZlQ2xhc3MoJ2xheW91dC10cmFuc2l0aW9uaW5nJylcbiAgICB0aGlzLl9yZW1vdmVJbmxpbmVTdHlsZSgpXG4gICAgdGhpcy5fdW5iaW5kTGF5b3V0QW5pbWF0aW9uRW5kRXZlbnQoKVxuICAgIHRoaXMuX3VuYmluZFdpbmRvd1Jlc2l6ZUV2ZW50KClcbiAgICB0aGlzLl91bmJpbmRNZW51TW91c2VFdmVudHMoKVxuICAgIHRoaXMuc2V0QXV0b1VwZGF0ZShmYWxzZSlcblxuICAgIHRoaXMub2ZmKCdpbml0Ll9IZWxwZXJzJylcblxuICAgIC8vIFJlbW92ZSBhbGwgbGlzdGVuZXJzIGV4Y2VwdCBgaW5pdGBcbiAgICB0aGlzLl9saXN0ZW5lcnNcbiAgICAgIC5maWx0ZXIobGlzdGVuZXIgPT4gbGlzdGVuZXIuZXZlbnQgIT09ICdpbml0JylcbiAgICAgIC5mb3JFYWNoKGxpc3RlbmVyID0+IHRoaXMuX2xpc3RlbmVycy5zcGxpY2UodGhpcy5fbGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpLCAxKSlcbiAgfSxcblxuICAvLyAtLS1cbiAgLy8gSW5pdCBQYXNzd29yZCBUb2dnbGVcbiAgaW5pdFBhc3N3b3JkVG9nZ2xlKCkge1xuICAgIGNvbnN0IHRvZ2dsZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZm9ybS1wYXNzd29yZC10b2dnbGUgaScpXG4gICAgaWYgKHR5cGVvZiB0b2dnbGVyICE9PSAndW5kZWZpbmVkJyAmJiB0b2dnbGVyICE9PSBudWxsKSB7XG4gICAgICB0b2dnbGVyLmZvckVhY2goZWwgPT4ge1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgIGNvbnN0IGZvcm1QYXNzd29yZFRvZ2dsZSA9IGVsLmNsb3Nlc3QoJy5mb3JtLXBhc3N3b3JkLXRvZ2dsZScpXG4gICAgICAgICAgY29uc3QgZm9ybVBhc3N3b3JkVG9nZ2xlSWNvbiA9IGZvcm1QYXNzd29yZFRvZ2dsZS5xdWVyeVNlbGVjdG9yKCdpJylcbiAgICAgICAgICBjb25zdCBmb3JtUGFzc3dvcmRUb2dnbGVJbnB1dCA9IGZvcm1QYXNzd29yZFRvZ2dsZS5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpXG5cbiAgICAgICAgICBpZiAoZm9ybVBhc3N3b3JkVG9nZ2xlSW5wdXQuZ2V0QXR0cmlidXRlKCd0eXBlJykgPT09ICd0ZXh0Jykge1xuICAgICAgICAgICAgZm9ybVBhc3N3b3JkVG9nZ2xlSW5wdXQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3Bhc3N3b3JkJylcbiAgICAgICAgICAgIGZvcm1QYXNzd29yZFRvZ2dsZUljb24uY2xhc3NMaXN0LnJlcGxhY2UoJ3RpLWV5ZScsICd0aS1leWUtb2ZmJylcbiAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1QYXNzd29yZFRvZ2dsZUlucHV0LmdldEF0dHJpYnV0ZSgndHlwZScpID09PSAncGFzc3dvcmQnKSB7XG4gICAgICAgICAgICBmb3JtUGFzc3dvcmRUb2dnbGVJbnB1dC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAndGV4dCcpXG4gICAgICAgICAgICBmb3JtUGFzc3dvcmRUb2dnbGVJY29uLmNsYXNzTGlzdC5yZXBsYWNlKCd0aS1leWUtb2ZmJywgJ3RpLWV5ZScpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG4gIH0sXG5cbiAgLy8tLVxuICAvLyBJbml0IGN1c3RvbSBvcHRpb24gY2hlY2tcbiAgaW5pdEN1c3RvbU9wdGlvbkNoZWNrKCkge1xuICAgIGNvbnN0IF90aGlzID0gdGhpc1xuXG4gICAgY29uc3QgY3VzdG9wT3B0aW9uTGlzdCA9IFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmN1c3RvbS1vcHRpb24gLmZvcm0tY2hlY2staW5wdXQnKSlcbiAgICBjdXN0b3BPcHRpb25MaXN0Lm1hcChmdW5jdGlvbiAoY3VzdG9tT3B0aW9uRUwpIHtcbiAgICAgIC8vIFVwZGF0ZSBjdXN0b20gb3B0aW9ucyBjaGVjayBvbiBwYWdlIGxvYWRcbiAgICAgIF90aGlzLnVwZGF0ZUN1c3RvbU9wdGlvbkNoZWNrKGN1c3RvbU9wdGlvbkVMKVxuXG4gICAgICAvLyBVcGRhdGUgY3VzdG9tIG9wdGlvbnMgY2hlY2sgb24gY2xpY2tcbiAgICAgIGN1c3RvbU9wdGlvbkVMLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XG4gICAgICAgIF90aGlzLnVwZGF0ZUN1c3RvbU9wdGlvbkNoZWNrKGN1c3RvbU9wdGlvbkVMKVxuICAgICAgfSlcbiAgICB9KVxuICB9LFxuXG4gIC8vIC0tLVxuICAvLyBJbml0IFNwZWVjaCBUbyBUZXh0XG4gIGluaXRTcGVlY2hUb1RleHQoKSB7XG4gICAgY29uc3QgU3BlZWNoUmVjb2duaXRpb24gPSB3aW5kb3cuU3BlZWNoUmVjb2duaXRpb24gfHwgd2luZG93LndlYmtpdFNwZWVjaFJlY29nbml0aW9uXG4gICAgY29uc3Qgc3BlZWNoVG9UZXh0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNwZWVjaC10by10ZXh0JylcbiAgICBpZiAoU3BlZWNoUmVjb2duaXRpb24gIT09IHVuZGVmaW5lZCAmJiBTcGVlY2hSZWNvZ25pdGlvbiAhPT0gbnVsbCkge1xuICAgICAgaWYgKHR5cGVvZiBzcGVlY2hUb1RleHQgIT09ICd1bmRlZmluZWQnICYmIHNwZWVjaFRvVGV4dCAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCByZWNvZ25pdGlvbiA9IG5ldyBTcGVlY2hSZWNvZ25pdGlvbigpXG4gICAgICAgIGNvbnN0IHRvZ2dsZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3BlZWNoLXRvLXRleHQgaScpXG4gICAgICAgIHRvZ2dsZXIuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgICAgbGV0IGxpc3RlbmluZyA9IGZhbHNlXG4gICAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICBlbC5jbG9zZXN0KCcuaW5wdXQtZ3JvdXAnKS5xdWVyeVNlbGVjdG9yKCcuZm9ybS1jb250cm9sJykuZm9jdXMoKVxuICAgICAgICAgICAgcmVjb2duaXRpb24ub25zcGVlY2hzdGFydCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgbGlzdGVuaW5nID0gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxpc3RlbmluZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgcmVjb2duaXRpb24uc3RhcnQoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVjb2duaXRpb24ub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgbGlzdGVuaW5nID0gZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlY29nbml0aW9uLm9ucmVzdWx0ID0gZXZlbnQgPT4ge1xuICAgICAgICAgICAgICBlbC5jbG9zZXN0KCcuaW5wdXQtZ3JvdXAnKS5xdWVyeVNlbGVjdG9yKCcuZm9ybS1jb250cm9sJykudmFsdWUgPSBldmVudC5yZXN1bHRzWzBdWzBdLnRyYW5zY3JpcHRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlY29nbml0aW9uLm9uc3BlZWNoZW5kID0gKCkgPT4ge1xuICAgICAgICAgICAgICBsaXN0ZW5pbmcgPSBmYWxzZVxuICAgICAgICAgICAgICByZWNvZ25pdGlvbi5zdG9wKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvLyAtLS1cbiAgLy8gSW5pdCBOYXZiYXIgRHJvcGRvd24gKGkuZSBub3RpZmljYXRpb24pIFBlcmZlY3RTY3JvbGxiYXJcbiAgaW5pdE5hdmJhckRyb3Bkb3duU2Nyb2xsYmFyKCkge1xuICAgIGNvbnN0IHNjcm9sbGJhckNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5uYXZiYXItZHJvcGRvd24gLnNjcm9sbGFibGUtY29udGFpbmVyJylcbiAgICBjb25zdCB7IFBlcmZlY3RTY3JvbGxiYXIgfSA9IHdpbmRvd1xuXG4gICAgaWYgKFBlcmZlY3RTY3JvbGxiYXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBzY3JvbGxiYXJDb250YWluZXIgIT09ICd1bmRlZmluZWQnICYmIHNjcm9sbGJhckNvbnRhaW5lciAhPT0gbnVsbCkge1xuICAgICAgICBzY3JvbGxiYXJDb250YWluZXIuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ld1xuICAgICAgICAgIG5ldyBQZXJmZWN0U2Nyb2xsYmFyKGVsLCB7XG4gICAgICAgICAgICB3aGVlbFByb3BhZ2F0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgIHN1cHByZXNzU2Nyb2xsWDogdHJ1ZVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8vIEFqYXggQ2FsbCBQcm9taXNlXG4gIGFqYXhDYWxsKHVybCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCByZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgICAgcmVxLm9wZW4oJ0dFVCcsIHVybClcbiAgICAgIHJlcS5vbmxvYWQgPSAoKSA9PiAocmVxLnN0YXR1cyA9PT0gMjAwID8gcmVzb2x2ZShyZXEucmVzcG9uc2UpIDogcmVqZWN0KEVycm9yKHJlcS5zdGF0dXNUZXh0KSkpXG4gICAgICByZXEub25lcnJvciA9IGUgPT4gcmVqZWN0KEVycm9yKGBOZXR3b3JrIEVycm9yOiAke2V9YCkpXG4gICAgICByZXEuc2VuZCgpXG4gICAgfSlcbiAgfSxcblxuICAvLyAtLS1cbiAgLy8gU2lkZWJhclRvZ2dsZSAoVXNlZCBpbiBBcHBzKVxuICBpbml0U2lkZWJhclRvZ2dsZSgpIHtcbiAgICBjb25zdCBzaWRlYmFyVG9nZ2xlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWJzLXRvZ2dsZT1cInNpZGViYXJcIl0nKVxuXG4gICAgc2lkZWJhclRvZ2dsZXIuZm9yRWFjaChlbCA9PiB7XG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZWwuZ2V0QXR0cmlidXRlKCdkYXRhLXRhcmdldCcpXG4gICAgICAgIGNvbnN0IG92ZXJsYXkgPSBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtb3ZlcmxheScpXG4gICAgICAgIGNvbnN0IGFwcE92ZXJsYXkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYXBwLW92ZXJsYXknKVxuICAgICAgICBjb25zdCB0YXJnZXRFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGFyZ2V0KVxuXG4gICAgICAgIHRhcmdldEVsLmZvckVhY2godGVsID0+IHtcbiAgICAgICAgICB0ZWwuY2xhc3NMaXN0LnRvZ2dsZSgnc2hvdycpXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIG92ZXJsYXkgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICBvdmVybGF5ICE9PSBudWxsICYmXG4gICAgICAgICAgICBvdmVybGF5ICE9PSBmYWxzZSAmJlxuICAgICAgICAgICAgdHlwZW9mIGFwcE92ZXJsYXkgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAodGVsLmNsYXNzTGlzdC5jb250YWlucygnc2hvdycpKSB7XG4gICAgICAgICAgICAgIGFwcE92ZXJsYXlbMF0uY2xhc3NMaXN0LmFkZCgnc2hvdycpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhcHBPdmVybGF5WzBdLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXBwT3ZlcmxheVswXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xuICAgICAgICAgICAgICBlLmN1cnJlbnRUYXJnZXQuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpXG4gICAgICAgICAgICAgIHRlbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JylcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuICB9XG59XG5cbi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbi8vICogSW5pdGlhbGl6YXRpb25cblxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIEhlbHBlcnMuaW5pdCgpXG5cbiAgaWYgKEhlbHBlcnMuaXNNb2JpbGVEZXZpY2UoKSAmJiB3aW5kb3cuY2hyb21lKSB7XG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2xheW91dC1tZW51LTEwMHZoJylcbiAgfVxuXG4gIC8vIFVwZGF0ZSBsYXlvdXQgYWZ0ZXIgcGFnZSBsb2FkXG4gIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSBIZWxwZXJzLnVwZGF0ZSgpXG4gIGVsc2VcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24gb25Db250ZW50TG9hZGVkKCkge1xuICAgICAgSGVscGVycy51cGRhdGUoKVxuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIG9uQ29udGVudExvYWRlZClcbiAgICB9KVxufVxuXG4vLyAtLS1cbmV4cG9ydCB7IEhlbHBlcnMgfVxuIl0sIm5hbWVzIjpbIlRSQU5TX0VWRU5UUyIsIlRSQU5TX1BST1BFUlRJRVMiLCJJTkxJTkVfU1RZTEVTIiwicmVxdWlyZWRQYXJhbSIsIm5hbWUiLCJFcnJvciIsImNvbmNhdCIsIkhlbHBlcnMiLCJST09UX0VMIiwid2luZG93IiwiZG9jdW1lbnQiLCJkb2N1bWVudEVsZW1lbnQiLCJMQVlPVVRfQlJFQUtQT0lOVCIsIlJFU0laRV9ERUxBWSIsIm1lbnVQc1Njcm9sbCIsIm1haW5NZW51IiwiX2N1clN0eWxlIiwiX3N0eWxlRWwiLCJfcmVzaXplVGltZW91dCIsIl9yZXNpemVDYWxsYmFjayIsIl90cmFuc2l0aW9uQ2FsbGJhY2siLCJfdHJhbnNpdGlvbkNhbGxiYWNrVGltZW91dCIsIl9saXN0ZW5lcnMiLCJfaW5pdGlhbGl6ZWQiLCJfYXV0b1VwZGF0ZSIsIl9sYXN0V2luZG93SGVpZ2h0IiwiX3Njcm9sbFRvQWN0aXZlIiwiYW5pbWF0ZSIsImFyZ3VtZW50cyIsImxlbmd0aCIsInVuZGVmaW5lZCIsImR1cmF0aW9uIiwibGF5b3V0TWVudSIsImdldExheW91dE1lbnUiLCJhY3RpdmVFbCIsInF1ZXJ5U2VsZWN0b3IiLCJlYXNlSW5PdXRRdWFkIiwidCIsImIiLCJjIiwiZCIsImVsZW1lbnQiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJ0b3AiLCJzY3JvbGxUb3AiLCJwYXJzZUludCIsImNsaWVudEhlaWdodCIsInN0YXJ0IiwiY2hhbmdlIiwic3RhcnREYXRlIiwiRGF0ZSIsImFuaW1hdGVTY3JvbGwiLCJjdXJyZW50RGF0ZSIsImN1cnJlbnRUaW1lIiwidmFsIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiX3N3aXBlSW4iLCJ0YXJnZXRFbCIsImNhbGxiYWNrIiwiX3dpbmRvdyIsIkhhbW1lciIsInN3aXBlSW5FbGVtZW50IiwiaGFtbWVySW5zdGFuY2UiLCJvbiIsIl9zd2lwZU91dCIsIl93aW5kb3cyIiwic2V0VGltZW91dCIsInN3aXBlT3V0RWxlbWVudCIsImdldCIsInNldCIsImRpcmVjdGlvbiIsIkRJUkVDVElPTl9BTEwiLCJ0aHJlc2hvbGQiLCJfb3ZlcmxheVRhcCIsIl93aW5kb3czIiwic3dpcGVPdXRPdmVybGF5RWxlbWVudCIsIl9hZGRDbGFzcyIsImNscyIsImVsIiwiZm9yRWFjaCIsImUiLCJzcGxpdCIsImNsYXNzTGlzdCIsImFkZCIsIl9yZW1vdmVDbGFzcyIsInJlbW92ZSIsIl90b2dnbGVDbGFzcyIsImNsczEiLCJjbHMyIiwiY29udGFpbnMiLCJyZXBsYWNlIiwiX2hhc0NsYXNzIiwicmVzdWx0IiwiX2ZpbmRQYXJlbnQiLCJ0YWdOYW1lIiwidG9VcHBlckNhc2UiLCJwYXJlbnROb2RlIiwiX3RyaWdnZXJXaW5kb3dFdmVudCIsImNyZWF0ZUV2ZW50IiwiZXZlbnQiLCJFdmVudCIsImluaXRFdmVudCIsImRpc3BhdGNoRXZlbnQiLCJmaXJlRXZlbnQiLCJjcmVhdGVFdmVudE9iamVjdCIsIl90cmlnZ2VyRXZlbnQiLCJmaWx0ZXIiLCJsaXN0ZW5lciIsImNhbGwiLCJfdXBkYXRlSW5saW5lU3R5bGUiLCJuYXZiYXJIZWlnaHQiLCJmb290ZXJIZWlnaHQiLCJjcmVhdGVFbGVtZW50IiwidHlwZSIsImhlYWQiLCJhcHBlbmRDaGlsZCIsIm5ld1N0eWxlIiwidGV4dENvbnRlbnQiLCJfcmVtb3ZlSW5saW5lU3R5bGUiLCJyZW1vdmVDaGlsZCIsIl9yZWRyYXdMYXlvdXRNZW51IiwiaW5uZXIiLCJwYWdlU2Nyb2xsVG9wIiwic3R5bGUiLCJkaXNwbGF5IiwiX3N1cHBvcnRzVHJhbnNpdGlvbkVuZCIsIlFVbml0IiwiYm9keSIsImV2bnQiLCJfZ2V0TmF2YmFySGVpZ2h0IiwiX3RoaXMyIiwibGF5b3V0TmF2YmFyIiwiZ2V0TGF5b3V0TmF2YmFyIiwiaXNTbWFsbFNjcmVlbiIsImhlaWdodCIsImNsb25lZEVsIiwiY2xvbmVOb2RlIiwiaWQiLCJ2aXNpYmlsaXR5IiwicG9zaXRpb24iLCJBcnJheSIsInByb3RvdHlwZSIsInNsaWNlIiwicXVlcnlTZWxlY3RvckFsbCIsImluc2VydEJlZm9yZSIsIl9nZXRGb290ZXJIZWlnaHQiLCJsYXlvdXRGb290ZXIiLCJnZXRMYXlvdXRGb290ZXIiLCJfZ2V0QW5pbWF0aW9uRHVyYXRpb24iLCJnZXRDb21wdXRlZFN0eWxlIiwidHJhbnNpdGlvbkR1cmF0aW9uIiwicGFyc2VGbG9hdCIsImluZGV4T2YiLCJfc2V0TWVudUhvdmVyU3RhdGUiLCJob3ZlcmVkIiwiX3NldENvbGxhcHNlZCIsImNvbGxhcHNlZCIsIl90aGlzMyIsIl9iaW5kTGF5b3V0QW5pbWF0aW9uRW5kRXZlbnQiLCJtb2RpZmllciIsImNiIiwiX3RoaXM0IiwibWVudSIsImdldE1lbnUiLCJ0YXJnZXQiLCJfdW5iaW5kTGF5b3V0QW5pbWF0aW9uRW5kRXZlbnQiLCJhZGRFdmVudExpc3RlbmVyIiwiX3RoaXM1IiwiY2xlYXJUaW1lb3V0IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIl9iaW5kV2luZG93UmVzaXplRXZlbnQiLCJfdGhpczYiLCJfdW5iaW5kV2luZG93UmVzaXplRXZlbnQiLCJfYmluZE1lbnVNb3VzZUV2ZW50cyIsIl90aGlzNyIsIl9tZW51TW91c2VFbnRlciIsIl9tZW51TW91c2VMZWF2ZSIsIl93aW5kb3dUb3VjaFN0YXJ0IiwiX3VuYmluZE1lbnVNb3VzZUV2ZW50cyIsImlzT2ZmY2FudmFzIiwic2Nyb2xsVG9BY3RpdmUiLCJzd2lwZUluIiwic3dpcGVPdXQiLCJvdmVybGF5VGFwIiwic2Nyb2xsUGFnZVRvIiwidG8iLCJzY3JvbGxpbmdFbGVtZW50Iiwic2V0Q29sbGFwc2VkIiwiX3RoaXM4IiwidG9nZ2xlQ29sbGFwc2VkIiwiaXNDb2xsYXBzZWQiLCJzZXRQb3NpdGlvbiIsImZpeGVkIiwib2ZmY2FudmFzIiwidXBkYXRlIiwiZ2V0TGF5b3V0Q29udGFpbmVyIiwic2V0TmF2YmFyRml4ZWQiLCJzZXRGb290ZXJGaXhlZCIsInNldEZsaXBwZWQiLCJyZXZlcnNlZCIsImlzTGF5b3V0TmF2YmFyRnVsbCIsImlzRml4ZWQiLCJpc05hdmJhckZpeGVkIiwiaXNGb290ZXJGaXhlZCIsInNldEF1dG9VcGRhdGUiLCJfdGhpczkiLCJlbmFibGUiLCJvZmYiLCJ1cGRhdGVDdXN0b21PcHRpb25DaGVjayIsImNoZWNrZWQiLCJjdXN0b21SYWRpb09wdGlvbkxpc3QiLCJjbG9zZXN0IiwibWFwIiwiY3VzdG9tUmFkaW9PcHRpb25FTCIsImlzUnRsIiwiZ2V0QXR0cmlidXRlIiwiaXNNb2JpbGVEZXZpY2UiLCJvcmllbnRhdGlvbiIsIm5hdmlnYXRvciIsInVzZXJBZ2VudCIsImlubmVyV2lkdGgiLCJjbGllbnRXaWR0aCIsImlzRmxpcHBlZCIsImlzTGlnaHRTdHlsZSIsImlzRGFya1N0eWxlIiwiX2V2ZW50JHNwbGl0IiwiX2V2ZW50JHNwbGl0MiIsIl9zbGljZWRUb0FycmF5IiwiX2V2ZW50IiwiX2V2ZW50JHNwbGl0MyIsIl9ldmVudCRzcGxpdDQiLCJfdG9BcnJheSIsIm5hbWVzcGFjZSIsImpvaW4iLCJwdXNoIiwiX3RoaXMxMCIsIl9ldmVudCRzcGxpdDUiLCJfZXZlbnQkc3BsaXQ2IiwiX2V2ZW50JHNwbGl0NyIsIl9ldmVudCRzcGxpdDgiLCJzcGxpY2UiLCJpbml0IiwiX3RoaXMxMSIsImRvY3VtZW50TW9kZSIsImRlc3Ryb3kiLCJfdGhpczEyIiwiaW5pdFBhc3N3b3JkVG9nZ2xlIiwidG9nZ2xlciIsInByZXZlbnREZWZhdWx0IiwiZm9ybVBhc3N3b3JkVG9nZ2xlIiwiZm9ybVBhc3N3b3JkVG9nZ2xlSWNvbiIsImZvcm1QYXNzd29yZFRvZ2dsZUlucHV0Iiwic2V0QXR0cmlidXRlIiwiaW5pdEN1c3RvbU9wdGlvbkNoZWNrIiwiX3RoaXMiLCJjdXN0b3BPcHRpb25MaXN0IiwiY3VzdG9tT3B0aW9uRUwiLCJpbml0U3BlZWNoVG9UZXh0IiwiU3BlZWNoUmVjb2duaXRpb24iLCJ3ZWJraXRTcGVlY2hSZWNvZ25pdGlvbiIsInNwZWVjaFRvVGV4dCIsInJlY29nbml0aW9uIiwibGlzdGVuaW5nIiwiZm9jdXMiLCJvbnNwZWVjaHN0YXJ0Iiwib25lcnJvciIsIm9ucmVzdWx0IiwidmFsdWUiLCJyZXN1bHRzIiwidHJhbnNjcmlwdCIsIm9uc3BlZWNoZW5kIiwic3RvcCIsImluaXROYXZiYXJEcm9wZG93blNjcm9sbGJhciIsInNjcm9sbGJhckNvbnRhaW5lciIsIl93aW5kb3c0IiwiUGVyZmVjdFNjcm9sbGJhciIsIndoZWVsUHJvcGFnYXRpb24iLCJzdXBwcmVzc1Njcm9sbFgiLCJhamF4Q2FsbCIsInVybCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwicmVxIiwiWE1MSHR0cFJlcXVlc3QiLCJvcGVuIiwib25sb2FkIiwic3RhdHVzIiwicmVzcG9uc2UiLCJzdGF0dXNUZXh0Iiwic2VuZCIsImluaXRTaWRlYmFyVG9nZ2xlIiwic2lkZWJhclRvZ2dsZXIiLCJvdmVybGF5IiwiYXBwT3ZlcmxheSIsInRlbCIsInRvZ2dsZSIsImN1cnJlbnRUYXJnZXQiLCJjaHJvbWUiLCJyZWFkeVN0YXRlIiwib25Db250ZW50TG9hZGVkIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./js/helpers.js\n"); /***/ }) /******/ }); /************************************************************************/ /******/ // The require scope /******/ var __webpack_require__ = {}; /******/ /************************************************************************/ /******/ /* webpack/runtime/define property getters */ /******/ !function() { /******/ // define getter functions for harmony exports /******/ __webpack_require__.d = function(exports, definition) { /******/ for(var key in definition) { /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); /******/ } /******/ } /******/ }; /******/ }(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ /******/ !function() { /******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } /******/ }(); /******/ /******/ /* webpack/runtime/make namespace object */ /******/ !function() { /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ }(); /******/ /************************************************************************/ /******/ /******/ // startup /******/ // Load entry module and return exports /******/ // This entry module can't be inlined because the eval-source-map devtool is used. /******/ var __webpack_exports__ = {}; /******/ __webpack_modules__["./js/helpers.js"](0, __webpack_exports__, __webpack_require__); /******/ /******/ return __webpack_exports__; /******/ })() ; });