78 lines
125 KiB
JavaScript
78 lines
125 KiB
JavaScript
/*
|
|
* 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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T0FBT3hFLE1BQU0sS0FBSyxXQUFXLEVBQUU7RUFDakNGLE9BQU8sQ0FBQ21OLElBQUksRUFBRTtFQUVkLElBQUluTixPQUFPLENBQUNxTSxjQUFjLEVBQUUsSUFBSW5NLE1BQU0sQ0FBQ3VRLE1BQU0sRUFBRTtJQUM3Q3RRLFFBQVEsQ0FBQ0MsZUFBZSxDQUFDbUUsU0FBUyxDQUFDQyxHQUFHLENBQUMsbUJBQW1CLENBQUM7RUFDN0Q7O0VBRUE7RUFDQSxJQUFJckUsUUFBUSxDQUFDdVEsVUFBVSxLQUFLLFVBQVUsRUFBRTFRLE9BQU8sQ0FBQ2dMLE1BQU0sRUFBRSxNQUV0RDdLLFFBQVEsQ0FBQ3FKLGdCQUFnQixDQUFDLGtCQUFrQixFQUFFLFNBQVNtSCxlQUFlLEdBQUc7SUFDdkUzUSxPQUFPLENBQUNnTCxNQUFNLEVBQUU7SUFDaEI3SyxRQUFRLENBQUN1SixtQkFBbUIsQ0FBQyxrQkFBa0IsRUFBRWlILGVBQWUsQ0FBQztFQUNuRSxDQUFDLENBQUM7QUFDTjs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL1Z1ZXh5Ly4vanMvaGVscGVycy5qcz8wYjIxIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIENvbnN0YW50c1xyXG5jb25zdCBUUkFOU19FVkVOVFMgPSBbJ3RyYW5zaXRpb25lbmQnLCAnd2Via2l0VHJhbnNpdGlvbkVuZCcsICdvVHJhbnNpdGlvbkVuZCddXHJcbmNvbnN0IFRSQU5TX1BST1BFUlRJRVMgPSBbJ3RyYW5zaXRpb24nLCAnTW96VHJhbnNpdGlvbicsICd3ZWJraXRUcmFuc2l0aW9uJywgJ1dlYmtpdFRyYW5zaXRpb24nLCAnT1RyYW5zaXRpb24nXVxyXG5jb25zdCBJTkxJTkVfU1RZTEVTID0gYFxyXG4ubGF5b3V0LW1lbnUtZml4ZWQgLmxheW91dC1uYXZiYXItZnVsbCAubGF5b3V0LW1lbnUsXHJcbi5sYXlvdXQtbWVudS1maXhlZC1vZmZjYW52YXMgLmxheW91dC1uYXZiYXItZnVsbCAubGF5b3V0LW1lbnUge1xyXG4gIHRvcDoge25hdmJhckhlaWdodH1weCAhaW1wb3J0YW50O1xyXG59XHJcbi5sYXlvdXQtcGFnZSB7XHJcbiAgcGFkZGluZy10b3A6IHtuYXZiYXJIZWlnaHR9cHggIWltcG9ydGFudDtcclxufVxyXG4uY29udGVudC13cmFwcGVyIHtcclxuICBwYWRkaW5nLWJvdHRvbToge2Zvb3RlckhlaWdodH1weCAhaW1wb3J0YW50O1xyXG59YFxyXG5cclxuLy8gR3VhcmRcclxuZnVuY3Rpb24gcmVxdWlyZWRQYXJhbShuYW1lKSB7XHJcbiAgdGhyb3cgbmV3IEVycm9yKGBQYXJhbWV0ZXIgcmVxdWlyZWQke25hbWUgPyBgOiBcXGAke25hbWV9XFxgYCA6ICcnfWApXHJcbn1cclxuXHJcbmNvbnN0IEhlbHBlcnMgPSB7XHJcbiAgLy8gUm9vdCBFbGVtZW50XHJcbiAgUk9PVF9FTDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgOiBudWxsLFxyXG5cclxuICAvLyBMYXJnZSBzY3JlZW5zIGJyZWFrcG9pbnRcclxuICBMQVlPVVRfQlJFQUtQT0lOVDogMTIwMCxcclxuXHJcbiAgLy8gUmVzaXplIGRlbGF5IGluIG1pbGxpc2Vjb25kc1xyXG4gIFJFU0laRV9ERUxBWTogMjAwLFxyXG5cclxuICBtZW51UHNTY3JvbGw6IG51bGwsXHJcblxyXG4gIG1haW5NZW51OiBudWxsLFxyXG5cclxuICAvLyBJbnRlcm5hbCB2YXJpYWJsZXNcclxuICBfY3VyU3R5bGU6IG51bGwsXHJcbiAgX3N0eWxlRWw6IG51bGwsXHJcbiAgX3Jlc2l6ZVRpbWVvdXQ6IG51bGwsXHJcbiAgX3Jlc2l6ZUNhbGxiYWNrOiBudWxsLFxyXG4gIF90cmFuc2l0aW9uQ2FsbGJhY2s6IG51bGwsXHJcbiAgX3RyYW5zaXRpb25DYWxsYmFja1RpbWVvdXQ6IG51bGwsXHJcbiAgX2xpc3RlbmVyczogW10sXHJcbiAgX2luaXRpYWxpemVkOiBmYWxzZSxcclxuICBfYXV0b1VwZGF0ZTogZmFsc2UsXHJcbiAgX2xhc3RXaW5kb3dIZWlnaHQ6IDAsXHJcblxyXG4gIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAvLyAqIFV0aWxpdGllc1xyXG5cclxuICAvLyAtLS1cclxuICAvLyBTY3JvbGwgVG8gQWN0aXZlIE1lbnUgSXRlbVxyXG4gIF9zY3JvbGxUb0FjdGl2ZShhbmltYXRlID0gZmFsc2UsIGR1cmF0aW9uID0gNTAwKSB7XHJcbiAgICBjb25zdCBsYXlvdXRNZW51ID0gdGhpcy5nZXRMYXlvdXRNZW51KClcclxuXHJcbiAgICBpZiAoIWxheW91dE1lbnUpIHJldHVyblxyXG5cclxuICAgIGxldCBhY3RpdmVFbCA9IGxheW91dE1lbnUucXVlcnlTZWxlY3RvcignbGkubWVudS1pdGVtLmFjdGl2ZTpub3QoLm9wZW4pJylcclxuXHJcbiAgICBpZiAoYWN0aXZlRWwpIHtcclxuICAgICAgLy8gdCA9IGN1cnJlbnQgdGltZVxyXG4gICAgICAvLyBiID0gc3RhcnQgdmFsdWVcclxuICAgICAgLy8gYyA9IGNoYW5nZSBpbiB2YWx1ZVxyXG4gICAgICAvLyBkID0gZHVyYXRpb25cclxuICAgICAgY29uc3QgZWFzZUluT3V0UXVhZCA9ICh0LCBiLCBjLCBkKSA9PiB7XHJcbiAgICAgICAgdCAvPSBkIC8gMlxyXG4gICAgICAgIGlmICh0IDwgMSkgcmV0dXJuIChjIC8gMikgKiB0ICogdCArIGJcclxuICAgICAgICB0IC09IDFcclxuICAgICAgICByZXR1cm4gKC1jIC8gMikgKiAodCAqICh0IC0gMikgLSAxKSArIGJcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZ2V0TGF5b3V0TWVudSgpLnF1ZXJ5U2VsZWN0b3IoJy5tZW51LWlubmVyJylcclxuXHJcbiAgICAgIGlmICh0eXBlb2YgYWN0aXZlRWwgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgYWN0aXZlRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGFjdGl2ZUVsKVxyXG4gICAgICB9XHJcbiAgICAgIGlmICh0eXBlb2YgYWN0aXZlRWwgIT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgYWN0aXZlRWwgPSBhY3RpdmVFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyBlbGVtZW50LnNjcm9sbFRvcFxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBJZiBhY3RpdmUgZWxlbWVudCdzIHRvcCBwb3NpdGlvbiBpcyBsZXNzIHRoYW4gMi8zICg2NiUpIG9mIG1lbnUgaGVpZ2h0IHRoYW4gZG8gbm90IHNjcm9sbFxyXG4gICAgICBpZiAoYWN0aXZlRWwgPCBwYXJzZUludCgoZWxlbWVudC5jbGllbnRIZWlnaHQgKiAyKSAvIDMsIDEwKSkgcmV0dXJuXHJcblxyXG4gICAgICBjb25zdCBzdGFydCA9IGVsZW1lbnQuc2Nyb2xsVG9wXHJcbiAgICAgIGNvbnN0IGNoYW5nZSA9IGFjdGl2ZUVsIC0gc3RhcnQgLSBwYXJzZUludChlbGVtZW50LmNsaWVudEhlaWdodCAvIDIsIDEwKVxyXG4gICAgICBjb25zdCBzdGFydERhdGUgPSArbmV3IERhdGUoKVxyXG5cclxuICAgICAgaWYgKGFuaW1hdGUgPT09IHRydWUpIHtcclxuICAgICAgICBjb25zdCBhbmltYXRlU2Nyb2xsID0gKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgY3VycmVudERhdGUgPSArbmV3IERhdGUoKVxyXG4gICAgICAgICAgY29uc3QgY3VycmVudFRpbWUgPSBjdXJyZW50RGF0ZSAtIHN0YXJ0RGF0ZVxyXG4gICAgICAgICAgY29uc3QgdmFsID0gZWFzZUluT3V0UXVhZChjdXJyZW50VGltZSwgc3RhcnQsIGNoYW5nZSwgZHVyYXRpb24pXHJcbiAgICAgICAgICBlbGVtZW50LnNjcm9sbFRvcCA9IHZhbFxyXG4gICAgICAgICAgaWYgKGN1cnJlbnRUaW1lIDwgZHVyYXRpb24pIHtcclxuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGVTY3JvbGwpXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBlbGVtZW50LnNjcm9sbFRvcCA9IGNoYW5nZVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBhbmltYXRlU2Nyb2xsKClcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBlbGVtZW50LnNjcm9sbFRvcCA9IGNoYW5nZVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSxcclxuXHJcbiAgLy8gLS0tXHJcbiAgLy8gU3dpcGUgSW4gR2VzdHVyZVxyXG4gIF9zd2lwZUluKHRhcmdldEVsLCBjYWxsYmFjaykge1xyXG4gICAgY29uc3QgeyBIYW1tZXIgfSA9IHdpbmRvd1xyXG4gICAgaWYgKHR5cGVvZiBIYW1tZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB0YXJnZXRFbCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgLy8gU3dpcGUgbWVudSBnZXN0dXJlXHJcbiAgICAgIGNvbnN0IHN3aXBlSW5FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXRFbClcclxuXHJcbiAgICAgIGlmIChzd2lwZUluRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IGhhbW1lckluc3RhbmNlID0gbmV3IEhhbW1lcihzd2lwZUluRWxlbWVudClcclxuXHJcbiAgICAgICAgaGFtbWVySW5zdGFuY2Uub24oJ3BhbnJpZ2h0JywgY2FsbGJhY2spXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9LFxyXG5cclxuICAvLyAtLS1cclxuICAvLyBTd2lwZSBPdXQgR2VzdHVyZVxyXG4gIF9zd2lwZU91dCh0YXJnZXRFbCwgY2FsbGJhY2spIHtcclxuICAgIGNvbnN0IHsgSGFtbWVyIH0gPSB3aW5kb3dcclxuICAgIGlmICh0eXBlb2YgSGFtbWVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgdGFyZ2V0RWwgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIC8vIFN3aXBlIG1lbnUgZ2VzdHVyZVxyXG4gICAgICAgIGNvbnN0IHN3aXBlT3V0RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0RWwpXHJcblxyXG4gICAgICAgIGlmIChzd2lwZU91dEVsZW1lbnQpIHtcclxuICAgICAgICAgIGNvbnN0IGhhbW1lckluc3RhbmNlID0gbmV3IEhhbW1lcihzd2lwZU91dEVsZW1lbnQpXHJcblxyXG4gICAgICAgICAgaGFtbWVySW5zdGFuY2UuZ2V0KCdwYW4nKS5zZXQoeyBkaXJlY3Rpb246IEhhbW1lci5ESVJFQ1RJT05fQUxMLCB0aHJlc2hvbGQ6IDI1MCB9KVxyXG4gICAgICAgICAgaGFtbWVySW5zdGFuY2Uub24oJ3BhbmxlZnQnLCBjYWxsYmFjaylcclxuICAgICAgICB9XHJcbiAgICAgIH0sIDUwMClcclxuICAgIH1cclxuICB9LFxyXG5cclxuICAvLyAtLS1cclxuICAvLyBTd2lwZSBPdXQgT24gT3ZlcmxheSBUYXBcclxuICBfb3ZlcmxheVRhcCh0YXJnZXRFbCwgY2FsbGJhY2spIHtcclxuICAgIGNvbnN0IHsgSGFtbWVyIH0gPSB3aW5kb3dcclxuXHJcbiAgICBpZiAodHlwZW9mIEhhbW1lciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHRhcmdldEVsID09PSAnc3RyaW5nJykge1xyXG4gICAgICAvLyBTd2lwZSBvdXQgb3ZlcmxheSBlbGVtZW50XHJcbiAgICAgIGNvbnN0IHN3aXBlT3V0T3ZlcmxheUVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRhcmdldEVsKVxyXG5cclxuICAgICAgaWYgKHN3aXBlT3V0T3ZlcmxheUVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBoYW1tZXJJbnN0YW5jZSA9IG5ldyBIYW1tZXIoc3dpcGVPdXRPdmVybGF5RWxlbWVudClcclxuXHJcbiAgICAgICAgaGFtbWVySW5zdGFuY2Uub24oJ3RhcCcsIGNhbGxiYWNrKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSxcclxuXHJcbiAgLy8gLS0tXHJcbiAgLy8gQWRkIGNsYXNzZXNcclxuICBfYWRkQ2xhc3MoY2xzLCBlbCA9IHRoaXMuUk9PVF9FTCkge1xyXG4gICAgaWYgKGVsLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIC8vIEFkZCBjbGFzc2VzIHRvIG11bHRpcGxlIGVsZW1lbnRzXHJcbiAgICAgIGVsLmZvckVhY2goZSA9PiB7XHJcbiAgICAgICAgY2xzLnNwbGl0KCcgJykuZm9yRWFjaChjID0+IGUuY2xhc3NMaXN0LmFkZChjKSlcclxuICAgICAgfSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIEFkZCBjbGFzc2VzIHRvIHNpbmdsZSBlbGVtZW50XHJcbiAgICAgIGNscy5zcGxpdCgnICcpLmZvckVhY2goYyA9PiBlbC5jbGFzc0xpc3QuYWRkKGMpKVxyXG4gICAgfVxyXG4gIH0sXHJcblxyXG4gIC8vIC0tLVxyXG4gIC8vIFJlbW92ZSBjbGFzc2VzXHJcbiAgX3JlbW92ZUNsYXNzKGNscywgZWwgPSB0aGlzLlJPT1RfRUwpIHtcclxuICAgIGlmIChlbC5sZW5ndGggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAvLyBSZW1vdmUgY2xhc3NlcyB0byBtdWx0aXBsZSBlbGVtZW50c1xyXG4gICAgICBlbC5mb3JFYWNoKGUgPT4ge1xyXG4gICAgICAgIGNscy5zcGxpdCgnICcpLmZvckVhY2goYyA9PiBlLmNsYXNzTGlzdC5yZW1vdmUoYykpXHJcbiAgICAgIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBSZW1vdmUgY2xhc3NlcyB0byBzaW5nbGUgZWxlbWVudFxyXG4gICAgICBjbHMuc3BsaXQoJyAnKS5mb3JFYWNoKGMgPT4gZWwuY2xhc3NMaXN0LnJlbW92ZShjKSlcclxuICAgIH1cclxuICB9LFxyXG5cclxuICAvLyBUb2dnbGUgY2xhc3Nlc1xyXG4gIF90b2dnbGVDbGFzcyhlbCA9IHRoaXMuUk9PVF9FTCwgY2xzMSwgY2xzMikge1xyXG4gICAgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucyhjbHMxKSkge1xyXG4gICAgICBlbC5jbGFzc0xpc3QucmVwbGFjZShjbHMxLCBjbHMyKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZWwuY2xhc3NMaXN0LnJlcGxhY2UoY2xzMiwgY2xzMSlcclxuICAgIH1cclxuICB9LFxyXG5cclxuICAvLyAtLS1cclxuICAvLyBIYXMgY2xhc3NcclxuICBfaGFzQ2xhc3MoY2xzLCBlbCA9IHRoaXMuUk9PVF9FTCkge1xyXG4gICAgbGV0IHJlc3VsdCA9IGZhbHNlXHJcblxyXG4gICAgY2xzLnNwbGl0KCcgJykuZm9yRWFjaChjID0+IHtcclxuICAgICAgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucyhjKSkgcmVzdWx0ID0gdHJ1ZVxyXG4gICAgfSlcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0XHJcbiAgfSxcclxuXHJcbiAgX2ZpbmRQYXJlbnQoZWwsIGNscykge1xyXG4gICAgaWYgKChlbCAmJiBlbC50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdCT0RZJykgfHwgZWwudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnSFRNTCcpIHJldHVybiBudWxsXHJcbiAgICBlbCA9IGVsLnBhcmVudE5vZGVcclxuICAgIHdoaWxlIChlbCAmJiBlbC50YWdOYW1lLnRvVXBwZXJDYXNlKCkgIT09ICdCT0RZJyAmJiAhZWwuY2xhc3NMaXN0LmNvbnRhaW5zKGNscykpIHtcclxuICAgICAgZWwgPSBlbC5wYXJlbnROb2RlXHJcbiAgICB9XHJcbiAgICBlbCA9IGVsICYmIGVsLnRhZ05hbWUudG9VcHBlckNhc2UoKSAhPT0gJ0JPRFknID8gZWwgOiBudWxsXHJcbiAgICByZXR1cm4gZWxcclxuICB9LFxyXG5cclxuICAvLyAtLS1cclxuICAvLyBUcmlnZ2VyIHdpbmRvdyBldmVudFxyXG4gIF90cmlnZ2VyV2luZG93RXZlbnQobmFtZSkge1xyXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm5cclxuXHJcbiAgICBpZiAoZG9jdW1lbnQuY3JlYXRlRXZlbnQpIHtcclxuICAgICAgbGV0IGV2ZW50XHJcblxyXG4gICAgICBpZiAodHlwZW9mIEV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgZXZlbnQgPSBuZXcgRXZlbnQobmFtZSlcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpXHJcbiAgICAgICAgZXZlbnQuaW5pdEV2ZW50KG5hbWUsIGZhbHNlLCB0cnVlKVxyXG4gICAgICB9XHJcblxyXG4gICAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChldmVudClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHdpbmRvdy5maXJlRXZlbnQoYG9uJHtuYW1lfWAsIGRvY3VtZW50LmNyZWF0ZUV2ZW50T2JqZWN0KCkpXHJcbiAgICB9XHJcbiAgfSxcclxuXHJcbiAgLy8gLS0tXHJcbiAgLy8gVHJpZ2dlciBldmVudFxyXG4gIF90cmlnZ2VyRXZlbnQobmFtZSkge1xyXG4gICAgdGhpcy5fdHJpZ2dlcldpbmRvd0V2ZW50KGBsYXlvdXQke25hbWV9YClcclxuXHJcbiAgICB0aGlzLl9saXN0ZW5lcnMuZmlsdGVyKGxpc3RlbmVyID0+IGxpc3RlbmVyLmV2ZW50ID09PSBuYW1lKS5mb3JFYWNoKGxpc3RlbmVyID0+IGxpc3RlbmVyLmNhbGxiYWNrLmNhbGwobnVsbCkpXHJcbiAgfSxcclxuXHJcbiAgLy8gLS0tXHJcbiAgLy8gVXBkYXRlIHN0eWxlXHJcbiAgX3VwZGF0ZUlubGluZVN0eWxlKG5hdmJhckhlaWdodCA9IDAsIGZvb3RlckhlaWdodCA9IDApIHtcclxuICAgIGlmICghdGhpcy5fc3R5bGVFbCkge1xyXG4gICAgICB0aGlzLl9zdHlsZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKVxyXG4gICAgICB0aGlzLl9zdHlsZUVsLnR5cGUgPSAndGV4dC9jc3MnXHJcbiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodGhpcy5fc3R5bGVFbClcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBuZXdTdHlsZSA9IElOTElORV9TVFlMRVMucmVwbGFjZSgvXFx7bmF2YmFySGVpZ2h0XFx9L2dpLCBuYXZiYXJIZWlnaHQpLnJlcGxhY2UoXHJcbiAgICAgIC9cXHtmb290ZXJIZWlnaHRcXH0vZ2ksXHJcbiAgICAgIGZvb3RlckhlaWdodFxyXG4gICAgKVxyXG5cclxuICAgIGlmICh0aGlzLl9jdXJTdHlsZSAhPT0gbmV3U3R5bGUpIHtcclxuICAgICAgdGhpcy5fY3VyU3R5bGUgPSBuZXdTdHlsZVxyXG4gICAgICB0aGlzLl9zdHlsZUVsLnRleHRDb250ZW50ID0gbmV3U3R5bGVcclxuICAgIH1cclxuICB9LFxyXG5cclxuICAvLyAtLS1cclxuICAvLyBSZW1vdmUgc3R5bGVcclxuICBfcmVtb3ZlSW5saW5lU3R5bGUoKSB7XHJcbiAgICBpZiAodGhpcy5fc3R5bGVFbCkgZG9jdW1lbnQuaGVhZC5yZW1vdmVDaGlsZCh0aGlzLl9zdHlsZUVsKVxyXG4gICAgdGhpcy5fc3R5bGVFbCA9IG51bGxcclxuICAgIHRoaXMuX2N1clN0eWxlID0gbnVsbFxyXG4gIH0sXHJcblxyXG4gIC8vIC0tLVxyXG4gIC8vIFJlZHJhdyBsYXlvdXQgbWVudSAoU2FmYXJpIGJ1Z2ZpeClcclxuICBfcmVkcmF3TGF5b3V0TWVudSgpIHtcclxuICAgIGNvbnN0IGxheW91dE1lbnUgPSB0aGlzLmdldExheW91dE1lbnUoKVxyXG5cclxuICAgIGlmIChsYXlvdXRNZW51ICYmIGxheW91dE1lbnUucXVlcnlTZWxlY3RvcignLm1lbnUnKSkge1xyXG4gICAgICBjb25zdCBpbm5lciA9IGxheW91dE1lbnUucXVlcnlTZWxlY3RvcignLm1lbnUtaW5uZXInKVxyXG4gICAgICBjb25zdCB7IHNjcm9sbFRvcCB9ID0gaW5uZXJcclxuICAgICAgY29uc3QgcGFnZVNjcm9sbFRvcCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3BcclxuXHJcbiAgICAgIGxheW91dE1lbnUuc3R5bGUuZGlzcGxheSA9ICdub25lJ1xyXG4gICAgICAvLyBsYXlvdXRNZW51Lm9mZnNldEhlaWdodFxyXG4gICAgICBsYXlvdXRNZW51LnN0eWxlLmRpc3BsYXkgPSAnJ1xyXG4gICAgICBpbm5lci5zY3JvbGxUb3AgPSBzY3JvbGxUb3BcclxuICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA9IHBhZ2VTY3JvbGxUb3BcclxuXHJcbiAgICAgIHJldHVybiB0cnVlXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfSxcclxuXHJcbiAgLy8gLS0tXHJcbiAgLy8gQ2hlY2sgZm9yIHRyYW5zaXRpb24gc3VwcG9ydFxyXG4gIF9zdXBwb3J0c1RyYW5zaXRpb25FbmQoKSB7XHJcbiAgICBpZiAod2luZG93LlFVbml0KSByZXR1cm4gZmFsc2VcclxuXHJcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmJvZHkgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XHJcblxyXG4gICAgaWYgKCFlbCkgcmV0dXJuIGZhbHNlXHJcblxyXG4gICAgbGV0IHJlc3VsdCA9IGZhbHNlXHJcbiAgICBUUkFOU19QUk9QRVJUSUVTLmZvckVhY2goZXZudCA9PiB7XHJcbiAgICAgIGlmICh0eXBlb2YgZWwuc3R5bGVbZXZudF0gIT09ICd1bmRlZmluZWQnKSByZXN1bHQgPSB0cnVlXHJcbiAgICB9KVxyXG5cclxuICAgIHJldHVybiByZXN1bHRcclxuICB9LFxyXG5cclxuICAvLyAtLS1cclxuICAvLyBDYWxjdWxhdGUgY3VycmVudCBuYXZiYXIgaGVpZ2h0XHJcbiAgX2dldE5hdmJhckhlaWdodCgpIHtcclxuICAgIGNvbnN0IGxheW91dE5hdmJhciA9IHRoaXMuZ2V0TGF5b3V0TmF2YmFyKClcclxuXHJcbiAgICBpZiAoIWxheW91dE5hdmJhcikgcmV0dXJuIDBcclxuICAgIGlmICghdGhpcy5pc1NtYWxsU2NyZWVuKCkpIHJldHVybiBsYXlvdXROYXZiYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0XHJcblxyXG4gICAgLy8gTmVlZHMgc29tZSBsb2dpYyB0byBnZXQgbmF2YmFyIGhlaWdodCBvbiBzbWFsbCBzY3JlZW5zXHJcblxyXG4gICAgY29uc3QgY2xvbmVkRWwgPSBsYXlvdXROYXZiYXIuY2xvbmVOb2RlKHRydWUpXHJcbiAgICBjbG9uZWRFbC5pZCA9IG51bGxcclxuICAgIGNsb25lZEVsLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJ1xyXG4gICAgY2xvbmVkRWwuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXHJcblxyXG4gICAgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoY2xvbmVkRWwucXVlcnlTZWxlY3RvckFsbCgnLmNvbGxhcHNlLnNob3cnKSkuZm9yRWFjaChlbCA9PiB0aGlzLl9yZW1vdmVDbGFzcygnc2hvdycsIGVsKSlcclxuXHJcbiAgICBsYXlvdXROYXZiYXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2xvbmVkRWwsIGxheW91dE5hdmJhcilcclxuXHJcbiAgICBjb25zdCBuYXZiYXJIZWlnaHQgPSBjbG9uZWRFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcclxuXHJcbiAgICBjbG9uZWRFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNsb25lZEVsKVxyXG5cclxuICAgIHJldHVybiBuYXZiYXJIZWlnaHRcclxuICB9LFxyXG5cclxuICAvLyAtLS1cclxuICAvLyBHZXQgY3VycmVudCBmb290ZXIgaGVpZ2h0XHJcbiAgX2dldEZvb3RlckhlaWdodCgpIHtcclxuICAgIGNvbnN0IGxheW91dEZvb3RlciA9IHRoaXMuZ2V0TGF5b3V0Rm9vdGVyKClcclxuXHJcbiAgICBpZiAoIWxheW91dEZvb3RlcikgcmV0dXJuIDBcclxuXHJcbiAgICByZXR1cm4gbGF5b3V0Rm9vdGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxyXG4gIH0sXHJcblxyXG4gIC8vIC0tLVxyXG4gIC8vIEdldCBhbmltYXRpb24gZHVyYXRpb24gb2YgZWxlbWVudFxyXG4gIF9nZXRBbmltYXRpb25EdXJhdGlvbihlbCkge1xyXG4gICAgY29uc3QgZHVyYXRpb24gPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCkudHJhbnNpdGlvbkR1cmF0aW9uXHJcblxyXG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoZHVyYXRpb24pICogKGR1cmF0aW9uLmluZGV4T2YoJ21zJykgIT09IC0xID8gMSA6IDEwMDApXHJcbiAgfSxcclxuXHJcbiAgLy8gLS0tXHJcbiAgLy8gU2V0IG1lbnUgaG92ZXIgc3RhdGVcclxuICBfc2V0TWVudUhvdmVyU3RhdGUoaG92ZXJlZCkge1xyXG4gICAgdGhpc1tob3ZlcmVkID8gJ19hZGRDbGFzcycgOiAnX3JlbW92ZUNsYXNzJ10oJ2xheW91dC1tZW51LWhvdmVyJylcclxuICB9LFxyXG5cclxuICAvLyAtLS1cclxuICAvLyBUb2dnbGUgY29sbGFwc2VkXHJcbiAgX3NldENvbGxhcHNlZChjb2xsYXBzZWQpIHtcclxuICAgIGlmICh0aGlzLmlzU21hbGxTY3JlZW4oKSkge1xyXG4gICAgICBpZiAoY29sbGFwc2VkKSB7XHJcbiAgICAgICAgdGhpcy5fcmVtb3ZlQ2xhc3MoJ2xheW91dC1tZW51LWV4cGFuZGVkJylcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzZXRUaW1lb3V0KFxyXG4gICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9hZGRDbGFzcygnbGF5b3V0LW1lbnUtZXhwYW5kZWQnKVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHRoaXMuX3JlZHJhd0xheW91dE1lbnUoKSA/IDUgOiAwXHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzW2NvbGxhcHNlZCA/ICdfYWRkQ2xhc3MnIDogJ19yZW1vdmVDbGFzcyddKCdsYXlvdXQtbWVudS1jb2xsYXBzZWQnKVxyXG4gICAgfVxyXG4gIH0sXHJcblxyXG4gIC8vIC0tLVxyXG4gIC8vIEFkZCBsYXlvdXQgc2l2ZW5hdiB0b2dnbGUgYW5pbWF0aW9uRW5kIGV2ZW50XHJcbiAgX2JpbmRMYXlvdXRBbmltYXRpb25FbmRFdmVudChtb2RpZmllciwgY2IpIHtcclxuICAgIGNvbnN0IG1lbnUgPSB0aGlzLmdldE1lbnUoKVxyXG4gICAgY29uc3QgZHVyYXRpb24gPSBtZW51ID8gdGhpcy5fZ2V0QW5pbWF0aW9uRHVyYXRpb24obWVudSkgKyA1MCA6IDBcclxuXHJcbiAgICBpZiAoIWR1cmF0aW9uKSB7XHJcbiAgICAgIG1vZGlmaWVyLmNhbGwodGhpcylcclxuICAgICAgY2IuY2FsbCh0aGlzKVxyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl90cmFuc2l0aW9uQ2FsbGJhY2sgPSBlID0+IHtcclxuICAgICAgaWYgKGUudGFyZ2V0ICE9PSBtZW51KSByZXR1cm5cclxuICAgICAgdGhpcy5fdW5iaW5kTGF5b3V0QW5pbWF0aW9uRW5kRXZlbnQoKVxyXG4gICAgICBjYi5jYWxsKHRoaXMpXHJcbiAgICB9XHJcblxyXG4gICAgVFJBTlNfRVZFTlRTLmZvckVhY2goZSA9PiB7XHJcbiAgICAgIG1lbnUuYWRkRXZlbnRMaXN0ZW5lcihlLCB0aGlzLl90cmFuc2l0aW9uQ2FsbGJhY2ssIGZhbHNlKVxyXG4gICAgfSlcclxuXHJcbiAgICBtb2RpZmllci5jYWxsKHRoaXMpXHJcblxyXG4gICAgdGhpcy5fdHJhbnNpdGlvbkNhbGxiYWNrVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLl90cmFuc2l0aW9uQ2FsbGJhY2suY2FsbCh0aGlzLCB7IHRhcmdldDogbWVudSB9KVxyXG4gICAgfSwgZHVyYXRpb24pXHJcbiAgfSxcclxuXHJcbiAgLy8gLS0tXHJcbiAgLy8gUmVtb3ZlIGxheW91dCBzaXZlbmF2IHRvZ2dsZSBhbmltYXRpb25FbmQgZXZlbnRcclxuICBfdW5iaW5kTGF5b3V0QW5pbWF0aW9uRW5kRXZlbnQoKSB7XHJcbiAgICBjb25zdCBtZW51ID0gdGhpcy5nZXRNZW51KClcclxuXHJcbiAgICBpZiAodGhpcy5fdHJhbnNpdGlvbkNhbGxiYWNrVGltZW91dCkge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fdHJhbnNpdGlvbkNhbGxiYWNrVGltZW91dClcclxuICAgICAgdGhpcy5fdHJhbnNpdGlvbkNhbGxiYWNrVGltZW91dCA9IG51bGxcclxuICAgIH1cclxuXHJcbiAgICBpZiAobWVudSAmJiB0aGlzLl90cmFuc2l0aW9uQ2FsbGJhY2spIHtcclxuICAgICAgVFJBTlNfRVZFTlRTLmZvckVhY2goZSA9PiB7XHJcbiAgICAgICAgbWVudS5yZW1vdmVFdmVudExpc3RlbmVyKGUsIHRoaXMuX3RyYW5zaXRpb25DYWxsYmFjaywgZmFsc2UpXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX3RyYW5zaXRpb25DYWxsYmFjaykge1xyXG4gICAgICB0aGlzLl90cmFuc2l0aW9uQ2FsbGJhY2sgPSBudWxsXHJcbiAgICB9XHJcbiAgfSxcclxuXHJcbiAgLy8gLS0tXHJcbiAgLy8gQmluZCBkZWxheWVkIHdpbmRvdyByZXNpemUgZXZlbnRcclxuICBfYmluZFdpbmRvd1Jlc2l6ZUV2ZW50KCkge1xyXG4gICAgdGhpcy5fdW5iaW5kV2luZG93UmVzaXplRXZlbnQoKVxyXG5cclxuICAgIGNvbnN0IGNiID0gKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5fcmVzaXplVGltZW91dCkge1xyXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9yZXNpemVUaW1lb3V0KVxyXG4gICAgICAgIHRoaXMuX3Jlc2l6ZVRpbWVvdXQgPSBudWxsXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fdHJpZ2dlckV2ZW50KCdyZXNpemUnKVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3Jlc2l6ZUNhbGxiYWNrID0gKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5fcmVzaXplVGltZW91dCkgY2xlYXJUaW1lb3V0KHRoaXMuX3Jlc2l6ZVRpbWVvdXQpXHJcbiAgICAgIHRoaXMuX3Jlc2l6ZVRpbWVvdXQgPSBzZXRUaW1lb3V0KGNiLCB0aGlzLlJFU0laRV9ERUxBWSlcclxuICAgIH1cclxuXHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5fcmVzaXplQ2FsbGJhY2ssIGZhbHNlKVxyXG4gIH0sXHJcblxyXG4gIC8vIC0tLVxyXG4gIC8vIFVuYmluZCBkZWxheWVkIHdpbmRvdyByZXNpemUgZXZlbnRcclxuICBfdW5iaW5kV2luZG93UmVzaXplRXZlbnQoKSB7XHJcbiAgICBpZiAodGhpcy5fcmVzaXplVGltZW91dCkge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fcmVzaXplVGltZW91dClcclxuICAgICAgdGhpcy5fcmVzaXplVGltZW91dCA9IG51bGxcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fcmVzaXplQ2FsbGJhY2spIHtcclxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX3Jlc2l6ZUNhbGxiYWNrLCBmYWxzZSlcclxuICAgICAgdGhpcy5fcmVzaXplQ2FsbGJhY2sgPSBudWxsXHJcbiAgICB9XHJcbiAgfSxcclxuXHJcbiAgX2JpbmRNZW51TW91c2VFdmVudHMoKSB7XHJcbiAgICBpZiAodGhpcy5fbWVudU1vdXNlRW50ZXIgJiYgdGhpcy5fbWVudU1vdXNlTGVhdmUgJiYgdGhpcy5fd2luZG93VG91Y2hTdGFydCkgcmV0dXJuXHJcblxyXG4gICAgY29uc3QgbGF5b3V0TWVudSA9IHRoaXMuZ2V0TGF5b3V0TWVudSgpXHJcbiAgICBpZiAoIWxheW91dE1lbnUpIHJldHVybiB0aGlzLl91bmJpbmRNZW51TW91c2VFdmVudHMoKVxyXG5cclxuICAgIGlmICghdGhpcy5fbWVudU1vdXNlRW50ZXIpIHtcclxuICAgICAgdGhpcy5fbWVudU1vdXNlRW50ZXIgPSAoKSA9PiB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgdGhpcy5pc1NtYWxsU2NyZWVuKCkgfHxcclxuICAgICAgICAgICF0aGlzLl9oYXNDbGFzcygnbGF5b3V0LW1lbnUtY29sbGFwc2VkJykgfHxcclxuICAgICAgICAgIHRoaXMuaXNPZmZjYW52YXMoKSB8fFxyXG4gICAgICAgICAgdGhpcy5faGFzQ2xhc3MoJ2xheW91dC10cmFuc2l0aW9uaW5nJylcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLl9zZXRNZW51SG92ZXJTdGF0ZShmYWxzZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9zZXRNZW51SG92ZXJTdGF0ZSh0cnVlKVxyXG4gICAgICB9XHJcbiAgICAgIGxheW91dE1lbnUuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIHRoaXMuX21lbnVNb3VzZUVudGVyLCBmYWxzZSlcclxuICAgICAgbGF5b3V0TWVudS5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5fbWVudU1vdXNlRW50ZXIsIGZhbHNlKVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5fbWVudU1vdXNlTGVhdmUpIHtcclxuICAgICAgdGhpcy5fbWVudU1vdXNlTGVhdmUgPSAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5fc2V0TWVudUhvdmVyU3RhdGUoZmFsc2UpXHJcbiAgICAgIH1cclxuICAgICAgbGF5b3V0TWVudS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgdGhpcy5fbWVudU1vdXNlTGVhdmUsIGZhbHNlKVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5fd2luZG93VG91Y2hTdGFydCkge1xyXG4gICAgICB0aGlzLl93aW5kb3dUb3VjaFN0YXJ0ID0gZSA9PiB7XHJcbiAgICAgICAgaWYgKCFlIHx8ICFlLnRhcmdldCB8fCAhdGhpcy5fZmluZFBhcmVudChlLnRhcmdldCwgJy5sYXlvdXQtbWVudScpKSB7XHJcbiAgICAgICAgICB0aGlzLl9zZXRNZW51SG92ZXJTdGF0ZShmYWxzZSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl93aW5kb3dUb3VjaFN0YXJ0LCB0cnVlKVxyXG4gICAgfVxyXG4gIH0sXHJcblxyXG4gIF91bmJpbmRNZW51TW91c2VFdmVudHMoKSB7XHJcbiAgICBpZiAoIXRoaXMuX21lbnVNb3VzZUVudGVyICYmICF0aGlzLl9tZW51TW91c2VMZWF2ZSAmJiAhdGhpcy5fd2luZG93VG91Y2hTdGFydCkgcmV0dXJuXHJcblxyXG4gICAgY29uc3QgbGF5b3V0TWVudSA9IHRoaXMuZ2V0TGF5b3V0TWVudSgpXHJcblxyXG4gICAgaWYgKHRoaXMuX21lbnVNb3VzZUVudGVyKSB7XHJcbiAgICAgIGlmIChsYXlvdXRNZW51KSB7XHJcbiAgICAgICAgbGF5b3V0TWVudS5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgdGhpcy5fbWVudU1vdXNlRW50ZXIsIGZhbHNlKVxyXG4gICAgICAgIGxheW91dE1lbnUucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX21lbnVNb3VzZUVudGVyLCBmYWxzZSlcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9tZW51TW91c2VFbnRlciA9IG51bGxcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fbWVudU1vdXNlTGVhdmUpIHtcclxuICAgICAgaWYgKGxheW91dE1lbnUpIHtcclxuICAgICAgICBsYXlvdXRNZW51LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCB0aGlzLl9tZW51TW91c2VMZWF2ZSwgZmFsc2UpXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fbWVudU1vdXNlTGVhdmUgPSBudWxsXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX3dpbmRvd1RvdWNoU3RhcnQpIHtcclxuICAgICAgaWYgKGxheW91dE1lbnUpIHtcclxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX3dpbmRvd1RvdWNoU3RhcnQsIHRydWUpXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fd2luZG93VG91Y2hTdGFydCA9IG51bGxcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9zZXRNZW51SG92ZXJTdGF0ZShmYWxzZSlcclxuICB9LFxyXG5cclxuICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgLy8gKiBNZXRob2RzXHJcblxyXG4gIHNjcm9sbFRvQWN0aXZlKGFuaW1hdGUgPSBmYWxzZSkge1xyXG4gICAgdGhpcy5fc2Nyb2xsVG9BY3RpdmUoYW5pbWF0ZSlcclxuICB9LFxyXG5cclxuICBzd2lwZUluKGVsLCBjYWxsYmFjaykge1xyXG4gICAgdGhpcy5fc3dpcGVJbihlbCwgY2FsbGJhY2spXHJcbiAgfSxcclxuXHJcbiAgc3dpcGVPdXQoZWwsIGNhbGxiYWNrKSB7XHJcbiAgICB0aGlzLl9zd2lwZU91dChlbCwgY2FsbGJhY2spXHJcbiAgfSxcclxuXHJcbiAgb3ZlcmxheVRhcChlbCwgY2FsbGJhY2spIHtcclxuICAgIHRoaXMuX292ZXJsYXlUYXAoZWwsIGNhbGxiYWNrKVxyXG4gIH0sXHJcblxyXG4gIHNjcm9sbFBhZ2VUbyh0bywgZHVyYXRpb24gPSA1MDApIHtcclxuICAgIC8vIHQgPSBjdXJyZW50IHRpbWVcclxuICAgIC8vIGIgPSBzdGFydCB2YWx1ZVxyXG4gICAgLy8gYyA9IGNoYW5nZSBpbiB2YWx1ZVxyXG4gICAgLy8gZCA9IGR1cmF0aW9uXHJcbiAgICBjb25zdCBlYXNlSW5PdXRRdWFkID0gKHQsIGIsIGMsIGQpID0+IHtcclxuICAgICAgdCAvPSBkIC8gMlxyXG4gICAgICBpZiAodCA8IDEpIHJldHVybiAoYyAvIDIpICogdCAqIHQgKyBiXHJcbiAgICAgIHQgLT0gMVxyXG4gICAgICByZXR1cm4gKC1jIC8gMikgKiAodCAqICh0IC0gMikgLSAxKSArIGJcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudFxyXG5cclxuICAgIGlmICh0eXBlb2YgdG8gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHRvID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0bylcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgdG8gIT09ICdudW1iZXInKSB7XHJcbiAgICAgIHRvID0gdG8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgZWxlbWVudC5zY3JvbGxUb3BcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzdGFydCA9IGVsZW1lbnQuc2Nyb2xsVG9wXHJcbiAgICBjb25zdCBjaGFuZ2UgPSB0byAtIHN0YXJ0XHJcbiAgICBjb25zdCBzdGFydERhdGUgPSArbmV3IERhdGUoKVxyXG4gICAgLy8gY29uc3QgaW5jcmVtZW50ID0gMjBcclxuXHJcbiAgICBjb25zdCBhbmltYXRlU2Nyb2xsID0gKCkgPT4ge1xyXG4gICAgICBjb25zdCBjdXJyZW50RGF0ZSA9ICtuZXcgRGF0ZSgpXHJcbiAgICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gY3VycmVudERhdGUgLSBzdGFydERhdGVcclxuICAgICAgY29uc3QgdmFsID0gZWFzZUluT3V0UXVhZChjdXJyZW50VGltZSwgc3RhcnQsIGNoYW5nZSwgZHVyYXRpb24pXHJcbiAgICAgIGVsZW1lbnQuc2Nyb2xsVG9wID0gdmFsXHJcbiAgICAgIGlmIChjdXJyZW50VGltZSA8IGR1cmF0aW9uKSB7XHJcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGVTY3JvbGwpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZWxlbWVudC5zY3JvbGxUb3AgPSB0b1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBhbmltYXRlU2Nyb2xsKClcclxuICB9LFxyXG5cclxuICAvLyAtLS1cclxuICAvLyBDb2xsYXBzZSAvIGV4cGFuZCBsYXlvdXRcclxuICBzZXRDb2xsYXBzZWQoY29sbGFwc2VkID0gcmVxdWlyZWRQYXJhbSgnY29sbGFwc2VkJyksIGFuaW1hdGUgPSB0cnVlKSB7XHJcbiAgICBjb25zdCBsYXlvdXRNZW51ID0gdGhpcy5nZXRMYXlvdXRNZW51KClcclxuXHJcbiAgICBpZiAoIWxheW91dE1lbnUpIHJldHVyblxyXG5cclxuICAgIHRoaXMuX3VuYmluZExheW91dEFuaW1hdGlvbkVuZEV2ZW50KClcclxuXHJcbiAgICBpZiAoYW5pbWF0ZSAmJiB0aGlzLl9zdXBwb3J0c1RyYW5zaXRpb25FbmQoKSkge1xyXG4gICAgICB0aGlzLl9hZGRDbGFzcygnbGF5b3V0LXRyYW5zaXRpb25pbmcnKVxyXG4gICAgICBpZiAoY29sbGFwc2VkKSB0aGlzLl9zZXRNZW51SG92ZXJTdGF0ZShmYWxzZSlcclxuXHJcbiAgICAgIHRoaXMuX2JpbmRMYXlvdXRBbmltYXRpb25FbmRFdmVudChcclxuICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAvLyBDb2xsYXBzZSAvIEV4cGFuZFxyXG4gICAgICAgICAgdGhpcy5fc2V0Q29sbGFwc2VkKGNvbGxhcHNlZClcclxuICAgICAgICB9LFxyXG4gICAgICAgICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuX3JlbW92ZUNsYXNzKCdsYXlvdXQtdHJhbnNpdGlvbmluZycpXHJcbiAgICAgICAgICB0aGlzLl90cmlnZ2VyV2luZG93RXZlbnQoJ3Jlc2l6ZScpXHJcbiAgICAgICAgICB0aGlzLl90cmlnZ2VyRXZlbnQoJ3RvZ2dsZScpXHJcbiAgICAgICAgICB0aGlzLl9zZXRNZW51SG92ZXJTdGF0ZShmYWxzZSlcclxuICAgICAgICB9XHJcbiAgICAgIClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2FkZENsYXNzKCdsYXlvdXQtbm8tdHJhbnNpdGlvbicpXHJcbiAgICAgIGlmIChjb2xsYXBzZWQpIHRoaXMuX3NldE1lbnVIb3ZlclN0YXRlKGZhbHNlKVxyXG5cclxuICAgICAgLy8gQ29sbGFwc2UgLyBFeHBhbmRcclxuICAgICAgdGhpcy5fc2V0Q29sbGFwc2VkKGNvbGxhcHNlZClcclxuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuX3JlbW92ZUNsYXNzKCdsYXlvdXQtbm8tdHJhbnNpdGlvbicpXHJcbiAgICAgICAgdGhpcy5fdHJpZ2dlcldpbmRvd0V2ZW50KCdyZXNpemUnKVxyXG4gICAgICAgIHRoaXMuX3RyaWdnZXJFdmVudCgndG9nZ2xlJylcclxuICAgICAgICB0aGlzLl9zZXRNZW51SG92ZXJTdGF0ZShmYWxzZSlcclxuICAgICAgfSwgMSlcclxuICAgIH1cclxuICB9LFxyXG5cclxuICAvLyAtLS1cclxuICAvLyBUb2dnbGUgbGF5b3V0XHJcbiAgdG9nZ2xlQ29sbGFwc2VkKGFuaW1hdGUgPSB0cnVlKSB7XHJcbiAgICB0aGlzLnNldENvbGxhcHNlZCghdGhpcy5pc0NvbGxhcHNlZCgpLCBhbmltYXRlKVxyXG4gIH0sXHJcblxyXG4gIC8vIC0tLVxyXG4gIC8vIFNldCBsYXlvdXQgcG9zaXRpb25pbmdcclxuICBzZXRQb3NpdGlvbihmaXhlZCA9IHJlcXVpcmVkUGFyYW0oJ2ZpeGVkJyksIG9mZmNhbnZhcyA9IHJlcXVpcmVkUGFyYW0oJ29mZmNhbnZhcycpKSB7XHJcbiAgICB0aGlzLl9yZW1vdmVDbGFzcygnbGF5b3V0LW1lbnUtb2ZmY2FudmFzIGxheW91dC1tZW51LWZpeGVkIGxheW91dC1tZW51LWZpeGVkLW9mZmNhbnZhcycpXHJcblxyXG4gICAgaWYgKCFmaXhlZCAmJiBvZmZjYW52YXMpIHtcclxuICAgICAgdGhpcy5fYWRkQ2xhc3MoJ2xheW91dC1tZW51LW9mZmNhbnZhcycpXHJcbiAgICB9IGVsc2UgaWYgKGZpeGVkICYmICFvZmZjYW52YXMpIHtcclxuICAgICAgdGhpcy5fYWRkQ2xhc3MoJ2xheW91dC1tZW51LWZpeGVkJylcclxuICAgICAgdGhpcy5fcmVkcmF3TGF5b3V0TWVudSgpXHJcbiAgICB9IGVsc2UgaWYgKGZpeGVkICYmIG9mZmNhbnZhcykge1xyXG4gICAgICB0aGlzLl9hZGRDbGFzcygnbGF5b3V0LW1lbnUtZml4ZWQtb2ZmY2FudmFzJylcclxuICAgICAgdGhpcy5fcmVkcmF3TGF5b3V0TWVudSgpXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGUoKVxyXG4gIH0sXHJcblxyXG4gIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAvLyAqIEdldHRlcnNcclxuXHJcbiAgZ2V0TGF5b3V0TWVudSgpIHtcclxuICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubGF5b3V0LW1lbnUnKVxyXG4gIH0sXHJcblxyXG4gIGdldE1lbnUoKSB7XHJcbiAgICBjb25zdCBsYXlvdXRNZW51ID0gdGhpcy5nZXRMYXlvdXRNZW51KClcclxuXHJcbiAgICBpZiAoIWxheW91dE1lbnUpIHJldHVybiBudWxsXHJcblxyXG4gICAgcmV0dXJuICF0aGlzLl9oYXNDbGFzcygnbWVudScsIGxheW91dE1lbnUpID8gbGF5b3V0TWVudS5xdWVyeVNlbGVjdG9yKCcubWVudScpIDogbGF5b3V0TWVudVxyXG4gIH0sXHJcblxyXG4gIGdldExheW91dE5hdmJhcigpIHtcclxuICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubGF5b3V0LW5hdmJhcicpXHJcbiAgfSxcclxuXHJcbiAgZ2V0TGF5b3V0Rm9vdGVyKCkge1xyXG4gICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jb250ZW50LWZvb3RlcicpXHJcbiAgfSxcclxuXHJcbiAgZ2V0TGF5b3V0Q29udGFpbmVyKCkge1xyXG4gICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5sYXlvdXQtcGFnZScpXHJcbiAgfSxcclxuXHJcbiAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gIC8vICogU2V0dGVyc1xyXG5cclxuICBzZXROYXZiYXJGaXhlZChmaXhlZCA9IHJlcXVpcmVkUGFyYW0oJ2ZpeGVkJykpIHtcclxuICAgIHRoaXNbZml4ZWQgPyAnX2FkZENsYXNzJyA6ICdfcmVtb3ZlQ2xhc3MnXSgnbGF5b3V0LW5hdmJhci1maXhlZCcpXHJcbiAgICB0aGlzLnVwZGF0ZSgpXHJcbiAgfSxcclxuXHJcbiAgc2V0Rm9vdGVyRml4ZWQoZml4ZWQgPSByZXF1aXJlZFBhcmFtKCdmaXhlZCcpKSB7XHJcbiAgICB0aGlzW2ZpeGVkID8gJ19hZGRDbGFzcycgOiAnX3JlbW92ZUNsYXNzJ10oJ2xheW91dC1mb290ZXItZml4ZWQnKVxyXG4gICAgdGhpcy51cGRhdGUoKVxyXG4gIH0sXHJcblxyXG4gIHNldEZsaXBwZWQocmV2ZXJzZWQgPSByZXF1aXJlZFBhcmFtKCdyZXZlcnNlZCcpKSB7XHJcbiAgICB0aGlzW3JldmVyc2VkID8gJ19hZGRDbGFzcycgOiAnX3JlbW92ZUNsYXNzJ10oJ2xheW91dC1tZW51LWZsaXBwZWQnKVxyXG4gIH0sXHJcblxyXG4gIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAvLyAqIFVwZGF0ZVxyXG5cclxuICB1cGRhdGUoKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgICh0aGlzLmdldExheW91dE5hdmJhcigpICYmXHJcbiAgICAgICAgKCghdGhpcy5pc1NtYWxsU2NyZWVuKCkgJiYgdGhpcy5pc0xheW91dE5hdmJhckZ1bGwoKSAmJiB0aGlzLmlzRml4ZWQoKSkgfHwgdGhpcy5pc05hdmJhckZpeGVkKCkpKSB8fFxyXG4gICAgICAodGhpcy5nZXRMYXlvdXRGb290ZXIoKSAmJiB0aGlzLmlzRm9vdGVyRml4ZWQoKSlcclxuICAgICkge1xyXG4gICAgICB0aGlzLl91cGRhdGVJbmxpbmVTdHlsZSh0aGlzLl9nZXROYXZiYXJIZWlnaHQoKSwgdGhpcy5fZ2V0Rm9vdGVySGVpZ2h0KCkpXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fYmluZE1lbnVNb3VzZUV2ZW50cygpXHJcbiAgfSxcclxuXHJcbiAgc2V0QXV0b1VwZGF0ZShlbmFibGUgPSByZXF1aXJlZFBhcmFtKCdlbmFibGUnKSkge1xyXG4gICAgaWYgKGVuYWJsZSAmJiAhdGhpcy5fYXV0b1VwZGF0ZSkge1xyXG4gICAgICB0aGlzLm9uKCdyZXNpemUuSGVscGVyczphdXRvVXBkYXRlJywgKCkgPT4gdGhpcy51cGRhdGUoKSlcclxuICAgICAgdGhpcy5fYXV0b1VwZGF0ZSA9IHRydWVcclxuICAgIH0gZWxzZSBpZiAoIWVuYWJsZSAmJiB0aGlzLl9hdXRvVXBkYXRlKSB7XHJcbiAgICAgIHRoaXMub2ZmKCdyZXNpemUuSGVscGVyczphdXRvVXBkYXRlJylcclxuICAgICAgdGhpcy5fYXV0b1VwZGF0ZSA9IGZhbHNlXHJcbiAgICB9XHJcbiAgfSxcclxuXHJcbiAgLy8gVXBkYXRlIGN1c3RvbSBvcHRpb24gYmFzZWQgb24gZWxlbWVudFxyXG4gIHVwZGF0ZUN1c3RvbU9wdGlvbkNoZWNrKGVsKSB7XHJcbiAgICBpZiAoZWwuY2hlY2tlZCkge1xyXG4gICAgICAvLyBJZiBjdXN0b20gb3B0aW9uIGVsZW1lbnQgaXMgcmFkaW8sIHJlbW92ZSBjaGVja2VkIGZyb20gdGhlIHNpYmxpbmdzIChjbG9zZXN0IGAucm93YClcclxuICAgICAgaWYgKGVsLnR5cGUgPT09ICdyYWRpbycpIHtcclxuICAgICAgICBjb25zdCBjdXN0b21SYWRpb09wdGlvbkxpc3QgPSBbXS5zbGljZS5jYWxsKGVsLmNsb3Nlc3QoJy5yb3cnKS5xdWVyeVNlbGVjdG9yQWxsKCcuY3VzdG9tLW9wdGlvbicpKVxyXG4gICAgICAgIGN1c3RvbVJhZGlvT3B0aW9uTGlzdC5tYXAoZnVuY3Rpb24gKGN1c3RvbVJhZGlvT3B0aW9uRUwpIHtcclxuICAgICAgICAgIGN1c3RvbVJhZGlvT3B0aW9uRUwuY2xvc2VzdCgnLmN1c3RvbS1vcHRpb24nKS5jbGFzc0xpc3QucmVtb3ZlKCdjaGVja2VkJylcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICAgIGVsLmNsb3Nlc3QoJy5jdXN0b20tb3B0aW9uJykuY2xhc3NMaXN0LmFkZCgnY2hlY2tlZCcpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBlbC5jbG9zZXN0KCcuY3VzdG9tLW9wdGlvbicpLmNsYXNzTGlzdC5yZW1vdmUoJ2NoZWNrZWQnKVxyXG4gICAgfVxyXG4gIH0sXHJcblxyXG4gIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAvLyAqIFRlc3RzXHJcblxyXG4gIGlzUnRsKCkge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYm9keScpLmdldEF0dHJpYnV0ZSgnZGlyJykgPT09ICdydGwnIHx8XHJcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2h0bWwnKS5nZXRBdHRyaWJ1dGUoJ2RpcicpID09PSAncnRsJ1xyXG4gICAgKVxyXG4gIH0sXHJcblxyXG4gIGlzTW9iaWxlRGV2aWNlKCkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB3aW5kb3cub3JpZW50YXRpb24gIT09ICd1bmRlZmluZWQnIHx8IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignSUVNb2JpbGUnKSAhPT0gLTFcclxuICB9LFxyXG5cclxuICBpc1NtYWxsU2NyZWVuKCkge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgKHdpbmRvdy5pbm5lcldpZHRoIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCB8fCBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoKSA8IHRoaXMuTEFZT1VUX0JSRUFLUE9JTlRcclxuICAgIClcclxuICB9LFxyXG5cclxuICBpc0xheW91dE5hdmJhckZ1bGwoKSB7XHJcbiAgICByZXR1cm4gISFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubGF5b3V0LXdyYXBwZXIubGF5b3V0LW5hdmJhci1mdWxsJylcclxuICB9LFxyXG5cclxuICBpc0NvbGxhcHNlZCgpIHtcclxuICAgIGlmICh0aGlzLmlzU21hbGxTY3JlZW4oKSkge1xyXG4gICAgICByZXR1cm4gIXRoaXMuX2hhc0NsYXNzKCdsYXlvdXQtbWVudS1leHBhbmRlZCcpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5faGFzQ2xhc3MoJ2xheW91dC1tZW51LWNvbGxhcHNlZCcpXHJcbiAgfSxcclxuXHJcbiAgaXNGaXhlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9oYXNDbGFzcygnbGF5b3V0LW1lbnUtZml4ZWQgbGF5b3V0LW1lbnUtZml4ZWQtb2ZmY2FudmFzJylcclxuICB9LFxyXG5cclxuICBpc09mZmNhbnZhcygpIHtcclxuICAgIHJldHVybiB0aGlzLl9oYXNDbGFzcygnbGF5b3V0LW1lbnUtb2ZmY2FudmFzIGxheW91dC1tZW51LWZpeGVkLW9mZmNhbnZhcycpXHJcbiAgfSxcclxuXHJcbiAgaXNOYXZiYXJGaXhlZCgpIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuX2hhc0NsYXNzKCdsYXlvdXQtbmF2YmFyLWZpeGVkJykgfHwgKCF0aGlzLmlzU21hbGxTY3JlZW4oKSAmJiB0aGlzLmlzRml4ZWQoKSAmJiB0aGlzLmlzTGF5b3V0TmF2YmFyRnVsbCgpKVxyXG4gICAgKVxyXG4gIH0sXHJcblxyXG4gIGlzRm9vdGVyRml4ZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faGFzQ2xhc3MoJ2xheW91dC1mb290ZXItZml4ZWQnKVxyXG4gIH0sXHJcblxyXG4gIGlzRmxpcHBlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9oYXNDbGFzcygnbGF5b3V0LW1lbnUtZmxpcHBlZCcpXHJcbiAgfSxcclxuXHJcbiAgaXNMaWdodFN0eWxlKCkge1xyXG4gICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2xpZ2h0LXN0eWxlJylcclxuICB9LFxyXG5cclxuICBpc0RhcmtTdHlsZSgpIHtcclxuICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkYXJrLXN0eWxlJylcclxuICB9LFxyXG5cclxuICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgLy8gKiBFdmVudHNcclxuXHJcbiAgb24oZXZlbnQgPSByZXF1aXJlZFBhcmFtKCdldmVudCcpLCBjYWxsYmFjayA9IHJlcXVpcmVkUGFyYW0oJ2NhbGxiYWNrJykpIHtcclxuICAgIGNvbnN0IFtfZXZlbnRdID0gZXZlbnQuc3BsaXQoJy4nKVxyXG4gICAgbGV0IFssIC4uLm5hbWVzcGFjZV0gPSBldmVudC5zcGxpdCgnLicpXHJcbiAgICAvLyBsZXQgW19ldmVudCwgLi4ubmFtZXNwYWNlXSA9IGV2ZW50LnNwbGl0KCcuJylcclxuICAgIG5hbWVzcGFjZSA9IG5hbWVzcGFjZS5qb2luKCcuJykgfHwgbnVsbFxyXG5cclxuICAgIHRoaXMuX2xpc3RlbmVycy5wdXNoKHsgZXZlbnQ6IF9ldmVudCwgbmFtZXNwYWNlLCBjYWxsYmFjayB9KVxyXG4gIH0sXHJcblxyXG4gIG9mZihldmVudCA9IHJlcXVpcmVkUGFyYW0oJ2V2ZW50JykpIHtcclxuICAgIGNvbnN0IFtfZXZlbnRdID0gZXZlbnQuc3BsaXQoJy4nKVxyXG4gICAgbGV0IFssIC4uLm5hbWVzcGFjZV0gPSBldmVudC5zcGxpdCgnLicpXHJcbiAgICBuYW1lc3BhY2UgPSBuYW1lc3BhY2Uuam9pbignLicpIHx8IG51bGxcclxuXHJcbiAgICB0aGlzLl9saXN0ZW5lcnNcclxuICAgICAgLmZpbHRlcihsaXN0ZW5lciA9PiBsaXN0ZW5lci5ldmVudCA9PT0gX2V2ZW50ICYmIGxpc3RlbmVyLm5hbWVzcGFjZSA9PT0gbmFtZXNwYWNlKVxyXG4gICAgICAuZm9yRWFjaChsaXN0ZW5lciA9PiB0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKHRoaXMuX2xpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKSwgMSkpXHJcbiAgfSxcclxuXHJcbiAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gIC8vICogTGlmZSBjeWNsZVxyXG5cclxuICBpbml0KCkge1xyXG4gICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKSByZXR1cm5cclxuICAgIHRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZVxyXG5cclxuICAgIC8vIEluaXRpYWxpemUgYHN0eWxlYCBlbGVtZW50XHJcbiAgICB0aGlzLl91cGRhdGVJbmxpbmVTdHlsZSgwKVxyXG5cclxuICAgIC8vIEJpbmQgd2luZG93IHJlc2l6ZSBldmVudFxyXG4gICAgdGhpcy5fYmluZFdpbmRvd1Jlc2l6ZUV2ZW50KClcclxuXHJcbiAgICAvLyBCaW5kIGluaXQgZXZlbnRcclxuICAgIHRoaXMub2ZmKCdpbml0Ll9IZWxwZXJzJylcclxuICAgIHRoaXMub24oJ2luaXQuX0hlbHBlcnMnLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMub2ZmKCdyZXNpemUuX0hlbHBlcnM6cmVkcmF3TWVudScpXHJcbiAgICAgIHRoaXMub24oJ3Jlc2l6ZS5fSGVscGVyczpyZWRyYXdNZW51JywgKCkgPT4ge1xyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcclxuICAgICAgICB0aGlzLmlzU21hbGxTY3JlZW4oKSAmJiAhdGhpcy5pc0NvbGxhcHNlZCgpICYmIHRoaXMuX3JlZHJhd0xheW91dE1lbnUoKVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgLy8gRm9yY2UgcmVwYWludCBpbiBJRSAxMFxyXG4gICAgICBpZiAodHlwZW9mIGRvY3VtZW50LmRvY3VtZW50TW9kZSA9PT0gJ251bWJlcicgJiYgZG9jdW1lbnQuZG9jdW1lbnRNb2RlIDwgMTEpIHtcclxuICAgICAgICB0aGlzLm9mZigncmVzaXplLl9IZWxwZXJzOmllMTBSZXBhaW50Qm9keScpXHJcbiAgICAgICAgdGhpcy5vbigncmVzaXplLl9IZWxwZXJzOmllMTBSZXBhaW50Qm9keScsICgpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLmlzRml4ZWQoKSkgcmV0dXJuXHJcbiAgICAgICAgICBjb25zdCB7IHNjcm9sbFRvcCB9ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XHJcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcclxuICAgICAgICAgIC8vIGRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0XHJcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snXHJcbiAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuXHJcbiAgICB0aGlzLl90cmlnZ2VyRXZlbnQoJ2luaXQnKVxyXG4gIH0sXHJcblxyXG4gIGRlc3Ryb3koKSB7XHJcbiAgICBpZiAoIXRoaXMuX2luaXRpYWxpemVkKSByZXR1cm5cclxuICAgIHRoaXMuX2luaXRpYWxpemVkID0gZmFsc2VcclxuXHJcbiAgICB0aGlzLl9yZW1vdmVDbGFzcygnbGF5b3V0LXRyYW5zaXRpb25pbmcnKVxyXG4gICAgdGhpcy5fcmVtb3ZlSW5saW5lU3R5bGUoKVxyXG4gICAgdGhpcy5fdW5iaW5kTGF5b3V0QW5pbWF0aW9uRW5kRXZlbnQoKVxyXG4gICAgdGhpcy5fdW5iaW5kV2luZG93UmVzaXplRXZlbnQoKVxyXG4gICAgdGhpcy5fdW5iaW5kTWVudU1vdXNlRXZlbnRzKClcclxuICAgIHRoaXMuc2V0QXV0b1VwZGF0ZShmYWxzZSlcclxuXHJcbiAgICB0aGlzLm9mZignaW5pdC5fSGVscGVycycpXHJcblxyXG4gICAgLy8gUmVtb3ZlIGFsbCBsaXN0ZW5lcnMgZXhjZXB0IGBpbml0YFxyXG4gICAgdGhpcy5fbGlzdGVuZXJzXHJcbiAgICAgIC5maWx0ZXIobGlzdGVuZXIgPT4gbGlzdGVuZXIuZXZlbnQgIT09ICdpbml0JylcclxuICAgICAgLmZvckVhY2gobGlzdGVuZXIgPT4gdGhpcy5fbGlzdGVuZXJzLnNwbGljZSh0aGlzLl9saXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lciksIDEpKVxyXG4gIH0sXHJcblxyXG4gIC8vIC0tLVxyXG4gIC8vIEluaXQgUGFzc3dvcmQgVG9nZ2xlXHJcbiAgaW5pdFBhc3N3b3JkVG9nZ2xlKCkge1xyXG4gICAgY29uc3QgdG9nZ2xlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5mb3JtLXBhc3N3b3JkLXRvZ2dsZSBpJylcclxuICAgIGlmICh0eXBlb2YgdG9nZ2xlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdG9nZ2xlciAhPT0gbnVsbCkge1xyXG4gICAgICB0b2dnbGVyLmZvckVhY2goZWwgPT4ge1xyXG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XHJcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcclxuICAgICAgICAgIGNvbnN0IGZvcm1QYXNzd29yZFRvZ2dsZSA9IGVsLmNsb3Nlc3QoJy5mb3JtLXBhc3N3b3JkLXRvZ2dsZScpXHJcbiAgICAgICAgICBjb25zdCBmb3JtUGFzc3dvcmRUb2dnbGVJY29uID0gZm9ybVBhc3N3b3JkVG9nZ2xlLnF1ZXJ5U2VsZWN0b3IoJ2knKVxyXG4gICAgICAgICAgY29uc3QgZm9ybVBhc3N3b3JkVG9nZ2xlSW5wdXQgPSBmb3JtUGFzc3dvcmRUb2dnbGUucXVlcnlTZWxlY3RvcignaW5wdXQnKVxyXG5cclxuICAgICAgICAgIGlmIChmb3JtUGFzc3dvcmRUb2dnbGVJbnB1dC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSA9PT0gJ3RleHQnKSB7XHJcbiAgICAgICAgICAgIGZvcm1QYXNzd29yZFRvZ2dsZUlucHV0LnNldEF0dHJpYnV0ZSgndHlwZScsICdwYXNzd29yZCcpXHJcbiAgICAgICAgICAgIGZvcm1QYXNzd29yZFRvZ2dsZUljb24uY2xhc3NMaXN0LnJlcGxhY2UoJ3RpLWV5ZScsICd0aS1leWUtb2ZmJylcclxuICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybVBhc3N3b3JkVG9nZ2xlSW5wdXQuZ2V0QXR0cmlidXRlKCd0eXBlJykgPT09ICdwYXNzd29yZCcpIHtcclxuICAgICAgICAgICAgZm9ybVBhc3N3b3JkVG9nZ2xlSW5wdXQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQnKVxyXG4gICAgICAgICAgICBmb3JtUGFzc3dvcmRUb2dnbGVJY29uLmNsYXNzTGlzdC5yZXBsYWNlKCd0aS1leWUtb2ZmJywgJ3RpLWV5ZScpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9LFxyXG5cclxuICAvLy0tXHJcbiAgLy8gSW5pdCBjdXN0b20gb3B0aW9uIGNoZWNrXHJcbiAgaW5pdEN1c3RvbU9wdGlvbkNoZWNrKCkge1xyXG4gICAgY29uc3QgX3RoaXMgPSB0aGlzXHJcblxyXG4gICAgY29uc3QgY3VzdG9wT3B0aW9uTGlzdCA9IFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmN1c3RvbS1vcHRpb24gLmZvcm0tY2hlY2staW5wdXQnKSlcclxuICAgIGN1c3RvcE9wdGlvbkxpc3QubWFwKGZ1bmN0aW9uIChjdXN0b21PcHRpb25FTCkge1xyXG4gICAgICAvLyBVcGRhdGUgY3VzdG9tIG9wdGlvbnMgY2hlY2sgb24gcGFnZSBsb2FkXHJcbiAgICAgIF90aGlzLnVwZGF0ZUN1c3RvbU9wdGlvbkNoZWNrKGN1c3RvbU9wdGlvbkVMKVxyXG5cclxuICAgICAgLy8gVXBkYXRlIGN1c3RvbSBvcHRpb25zIGNoZWNrIG9uIGNsaWNrXHJcbiAgICAgIGN1c3RvbU9wdGlvbkVMLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XHJcbiAgICAgICAgX3RoaXMudXBkYXRlQ3VzdG9tT3B0aW9uQ2hlY2soY3VzdG9tT3B0aW9uRUwpXHJcbiAgICAgIH0pXHJcbiAgICB9KVxyXG4gIH0sXHJcblxyXG4gIC8vIC0tLVxyXG4gIC8vIEluaXQgU3BlZWNoIFRvIFRleHRcclxuICBpbml0U3BlZWNoVG9UZXh0KCkge1xyXG4gICAgY29uc3QgU3BlZWNoUmVjb2duaXRpb24gPSB3aW5kb3cuU3BlZWNoUmVjb2duaXRpb24gfHwgd2luZG93LndlYmtpdFNwZWVjaFJlY29nbml0aW9uXHJcbiAgICBjb25zdCBzcGVlY2hUb1RleHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3BlZWNoLXRvLXRleHQnKVxyXG4gICAgaWYgKFNwZWVjaFJlY29nbml0aW9uICE9PSB1bmRlZmluZWQgJiYgU3BlZWNoUmVjb2duaXRpb24gIT09IG51bGwpIHtcclxuICAgICAgaWYgKHR5cGVvZiBzcGVlY2hUb1RleHQgIT09ICd1bmRlZmluZWQnICYmIHNwZWVjaFRvVGV4dCAhPT0gbnVsbCkge1xyXG4gICAgICAgIGNvbnN0IHJlY29nbml0aW9uID0gbmV3IFNwZWVjaFJlY29nbml0aW9uKClcclxuICAgICAgICBjb25zdCB0b2dnbGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNwZWVjaC10by10ZXh0IGknKVxyXG4gICAgICAgIHRvZ2dsZXIuZm9yRWFjaChlbCA9PiB7XHJcbiAgICAgICAgICBsZXQgbGlzdGVuaW5nID0gZmFsc2VcclxuICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBlbC5jbG9zZXN0KCcuaW5wdXQtZ3JvdXAnKS5xdWVyeVNlbGVjdG9yKCcuZm9ybS1jb250cm9sJykuZm9jdXMoKVxyXG4gICAgICAgICAgICByZWNvZ25pdGlvbi5vbnNwZWVjaHN0YXJ0ID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGxpc3RlbmluZyA9IHRydWVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAobGlzdGVuaW5nID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgIHJlY29nbml0aW9uLnN0YXJ0KClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZWNvZ25pdGlvbi5vbmVycm9yID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGxpc3RlbmluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVjb2duaXRpb24ub25yZXN1bHQgPSBldmVudCA9PiB7XHJcbiAgICAgICAgICAgICAgZWwuY2xvc2VzdCgnLmlucHV0LWdyb3VwJykucXVlcnlTZWxlY3RvcignLmZvcm0tY29udHJvbCcpLnZhbHVlID0gZXZlbnQucmVzdWx0c1swXVswXS50cmFuc2NyaXB0XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVjb2duaXRpb24ub25zcGVlY2hlbmQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgbGlzdGVuaW5nID0gZmFsc2VcclxuICAgICAgICAgICAgICByZWNvZ25pdGlvbi5zdG9wKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSxcclxuXHJcbiAgLy8gLS0tXHJcbiAgLy8gSW5pdCBOYXZiYXIgRHJvcGRvd24gKGkuZSBub3RpZmljYXRpb24pIFBlcmZlY3RTY3JvbGxiYXJcclxuICBpbml0TmF2YmFyRHJvcGRvd25TY3JvbGxiYXIoKSB7XHJcbiAgICBjb25zdCBzY3JvbGxiYXJDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubmF2YmFyLWRyb3Bkb3duIC5zY3JvbGxhYmxlLWNvbnRhaW5lcicpXHJcbiAgICBjb25zdCB7IFBlcmZlY3RTY3JvbGxiYXIgfSA9IHdpbmRvd1xyXG5cclxuICAgIGlmIChQZXJmZWN0U2Nyb2xsYmFyICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKHR5cGVvZiBzY3JvbGxiYXJDb250YWluZXIgIT09ICd1bmRlZmluZWQnICYmIHNjcm9sbGJhckNvbnRhaW5lciAhPT0gbnVsbCkge1xyXG4gICAgICAgIHNjcm9sbGJhckNvbnRhaW5lci5mb3JFYWNoKGVsID0+IHtcclxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXdcclxuICAgICAgICAgIG5ldyBQZXJmZWN0U2Nyb2xsYmFyKGVsLCB7XHJcbiAgICAgICAgICAgIHdoZWVsUHJvcGFnYXRpb246IGZhbHNlLFxyXG4gICAgICAgICAgICBzdXBwcmVzc1Njcm9sbFg6IHRydWVcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0sXHJcblxyXG4gIC8vIEFqYXggQ2FsbCBQcm9taXNlXHJcbiAgYWpheENhbGwodXJsKSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCByZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxyXG4gICAgICByZXEub3BlbignR0VUJywgdXJsKVxyXG4gICAgICByZXEub25sb2FkID0gKCkgPT4gKHJlcS5zdGF0dXMgPT09IDIwMCA/IHJlc29sdmUocmVxLnJlc3BvbnNlKSA6IHJlamVjdChFcnJvcihyZXEuc3RhdHVzVGV4dCkpKVxyXG4gICAgICByZXEub25lcnJvciA9IGUgPT4gcmVqZWN0KEVycm9yKGBOZXR3b3JrIEVycm9yOiAke2V9YCkpXHJcbiAgICAgIHJlcS5zZW5kKClcclxuICAgIH0pXHJcbiAgfSxcclxuXHJcbiAgLy8gLS0tXHJcbiAgLy8gU2lkZWJhclRvZ2dsZSAoVXNlZCBpbiBBcHBzKVxyXG4gIGluaXRTaWRlYmFyVG9nZ2xlKCkge1xyXG4gICAgY29uc3Qgc2lkZWJhclRvZ2dsZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1icy10b2dnbGU9XCJzaWRlYmFyXCJdJylcclxuXHJcbiAgICBzaWRlYmFyVG9nZ2xlci5mb3JFYWNoKGVsID0+IHtcclxuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZWwuZ2V0QXR0cmlidXRlKCdkYXRhLXRhcmdldCcpXHJcbiAgICAgICAgY29uc3Qgb3ZlcmxheSA9IGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1vdmVybGF5JylcclxuICAgICAgICBjb25zdCBhcHBPdmVybGF5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmFwcC1vdmVybGF5JylcclxuICAgICAgICBjb25zdCB0YXJnZXRFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGFyZ2V0KVxyXG5cclxuICAgICAgICB0YXJnZXRFbC5mb3JFYWNoKHRlbCA9PiB7XHJcbiAgICAgICAgICB0ZWwuY2xhc3NMaXN0LnRvZ2dsZSgnc2hvdycpXHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHR5cGVvZiBvdmVybGF5ICE9PSAndW5kZWZpbmVkJyAmJlxyXG4gICAgICAgICAgICBvdmVybGF5ICE9PSBudWxsICYmXHJcbiAgICAgICAgICAgIG92ZXJsYXkgIT09IGZhbHNlICYmXHJcbiAgICAgICAgICAgIHR5cGVvZiBhcHBPdmVybGF5ICE9PSAndW5kZWZpbmVkJ1xyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGlmICh0ZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzaG93JykpIHtcclxuICAgICAgICAgICAgICBhcHBPdmVybGF5WzBdLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGFwcE92ZXJsYXlbMF0uY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXBwT3ZlcmxheVswXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xyXG4gICAgICAgICAgICAgIGUuY3VycmVudFRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JylcclxuICAgICAgICAgICAgICB0ZWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG4vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbi8vICogSW5pdGlhbGl6YXRpb25cclxuXHJcbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xyXG4gIEhlbHBlcnMuaW5pdCgpXHJcblxyXG4gIGlmIChIZWxwZXJzLmlzTW9iaWxlRGV2aWNlKCkgJiYgd2luZG93LmNocm9tZSkge1xyXG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2xheW91dC1tZW51LTEwMHZoJylcclxuICB9XHJcblxyXG4gIC8vIFVwZGF0ZSBsYXlvdXQgYWZ0ZXIgcGFnZSBsb2FkXHJcbiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIEhlbHBlcnMudXBkYXRlKClcclxuICBlbHNlXHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24gb25Db250ZW50TG9hZGVkKCkge1xyXG4gICAgICBIZWxwZXJzLnVwZGF0ZSgpXHJcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBvbkNvbnRlbnRMb2FkZWQpXHJcbiAgICB9KVxyXG59XHJcblxyXG4vLyAtLS1cclxuZXhwb3J0IHsgSGVscGVycyB9XHJcbiJdLCJuYW1lcyI6WyJUUkFOU19FVkVOVFMiLCJUUkFOU19QUk9QRVJUSUVTIiwiSU5MSU5FX1NUWUxFUyIsInJlcXVpcmVkUGFyYW0iLCJuYW1lIiwiRXJyb3IiLCJIZWxwZXJzIiwiUk9PVF9FTCIsIndpbmRvdyIsImRvY3VtZW50IiwiZG9jdW1lbnRFbGVtZW50IiwiTEFZT1VUX0JSRUFLUE9JTlQiLCJSRVNJWkVfREVMQVkiLCJtZW51UHNTY3JvbGwiLCJtYWluTWVudSIsIl9jdXJTdHlsZSIsIl9zdHlsZUVsIiwiX3Jlc2l6ZVRpbWVvdXQiLCJfcmVzaXplQ2FsbGJhY2siLCJfdHJhbnNpdGlvbkNhbGxiYWNrIiwiX3RyYW5zaXRpb25DYWxsYmFja1RpbWVvdXQiLCJfbGlzdGVuZXJzIiwiX2luaXRpYWxpemVkIiwiX2F1dG9VcGRhdGUiLCJfbGFzdFdpbmRvd0hlaWdodCIsIl9zY3JvbGxUb0FjdGl2ZSIsImFuaW1hdGUiLCJkdXJhdGlvbiIsImxheW91dE1lbnUiLCJnZXRMYXlvdXRNZW51IiwiYWN0aXZlRWwiLCJxdWVyeVNlbGVjdG9yIiwiZWFzZUluT3V0UXVhZCIsInQiLCJiIiwiYyIsImQiLCJlbGVtZW50IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwidG9wIiwic2Nyb2xsVG9wIiwicGFyc2VJbnQiLCJjbGllbnRIZWlnaHQiLCJzdGFydCIsImNoYW5nZSIsInN0YXJ0RGF0ZSIsIkRhdGUiLCJhbmltYXRlU2Nyb2xsIiwiY3VycmVudERhdGUiLCJjdXJyZW50VGltZSIsInZhbCIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsIl9zd2lwZUluIiwidGFyZ2V0RWwiLCJjYWxsYmFjayIsIkhhbW1lciIsInN3aXBlSW5FbGVtZW50IiwiaGFtbWVySW5zdGFuY2UiLCJvbiIsIl9zd2lwZU91dCIsInNldFRpbWVvdXQiLCJzd2lwZU91dEVsZW1lbnQiLCJnZXQiLCJzZXQiLCJkaXJlY3Rpb24iLCJESVJFQ1RJT05fQUxMIiwidGhyZXNob2xkIiwiX292ZXJsYXlUYXAiLCJzd2lwZU91dE92ZXJsYXlFbGVtZW50IiwiX2FkZENsYXNzIiwiY2xzIiwiZWwiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJmb3JFYWNoIiwiZSIsInNwbGl0IiwiY2xhc3NMaXN0IiwiYWRkIiwiX3JlbW92ZUNsYXNzIiwicmVtb3ZlIiwiX3RvZ2dsZUNsYXNzIiwiY2xzMSIsImNsczIiLCJjb250YWlucyIsInJlcGxhY2UiLCJfaGFzQ2xhc3MiLCJyZXN1bHQiLCJfZmluZFBhcmVudCIsInRhZ05hbWUiLCJ0b1VwcGVyQ2FzZSIsInBhcmVudE5vZGUiLCJfdHJpZ2dlcldpbmRvd0V2ZW50IiwiY3JlYXRlRXZlbnQiLCJldmVudCIsIkV2ZW50IiwiaW5pdEV2ZW50IiwiZGlzcGF0Y2hFdmVudCIsImZpcmVFdmVudCIsImNyZWF0ZUV2ZW50T2JqZWN0IiwiX3RyaWdnZXJFdmVudCIsImZpbHRlciIsImxpc3RlbmVyIiwiY2FsbCIsIl91cGRhdGVJbmxpbmVTdHlsZSIsIm5hdmJhckhlaWdodCIsImZvb3RlckhlaWdodCIsImNyZWF0ZUVsZW1lbnQiLCJ0eXBlIiwiaGVhZCIsImFwcGVuZENoaWxkIiwibmV3U3R5bGUiLCJ0ZXh0Q29udGVudCIsIl9yZW1vdmVJbmxpbmVTdHlsZSIsInJlbW92ZUNoaWxkIiwiX3JlZHJhd0xheW91dE1lbnUiLCJpbm5lciIsInBhZ2VTY3JvbGxUb3AiLCJzdHlsZSIsImRpc3BsYXkiLCJfc3VwcG9ydHNUcmFuc2l0aW9uRW5kIiwiUVVuaXQiLCJib2R5IiwiZXZudCIsIl9nZXROYXZiYXJIZWlnaHQiLCJsYXlvdXROYXZiYXIiLCJnZXRMYXlvdXROYXZiYXIiLCJpc1NtYWxsU2NyZWVuIiwiaGVpZ2h0IiwiY2xvbmVkRWwiLCJjbG9uZU5vZGUiLCJpZCIsInZpc2liaWxpdHkiLCJwb3NpdGlvbiIsIkFycmF5IiwicHJvdG90eXBlIiwic2xpY2UiLCJxdWVyeVNlbGVjdG9yQWxsIiwiaW5zZXJ0QmVmb3JlIiwiX2dldEZvb3RlckhlaWdodCIsImxheW91dEZvb3RlciIsImdldExheW91dEZvb3RlciIsIl9nZXRBbmltYXRpb25EdXJhdGlvbiIsImdldENvbXB1dGVkU3R5bGUiLCJ0cmFuc2l0aW9uRHVyYXRpb24iLCJwYXJzZUZsb2F0IiwiaW5kZXhPZiIsIl9zZXRNZW51SG92ZXJTdGF0ZSIsImhvdmVyZWQiLCJfc2V0Q29sbGFwc2VkIiwiY29sbGFwc2VkIiwiX2JpbmRMYXlvdXRBbmltYXRpb25FbmRFdmVudCIsIm1vZGlmaWVyIiwiY2IiLCJtZW51IiwiZ2V0TWVudSIsInRhcmdldCIsIl91bmJpbmRMYXlvdXRBbmltYXRpb25FbmRFdmVudCIsImFkZEV2ZW50TGlzdGVuZXIiLCJjbGVhclRpbWVvdXQiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiX2JpbmRXaW5kb3dSZXNpemVFdmVudCIsIl91bmJpbmRXaW5kb3dSZXNpemVFdmVudCIsIl9iaW5kTWVudU1vdXNlRXZlbnRzIiwiX21lbnVNb3VzZUVudGVyIiwiX21lbnVNb3VzZUxlYXZlIiwiX3dpbmRvd1RvdWNoU3RhcnQiLCJfdW5iaW5kTWVudU1vdXNlRXZlbnRzIiwiaXNPZmZjYW52YXMiLCJzY3JvbGxUb0FjdGl2ZSIsInN3aXBlSW4iLCJzd2lwZU91dCIsIm92ZXJsYXlUYXAiLCJzY3JvbGxQYWdlVG8iLCJ0byIsInNjcm9sbGluZ0VsZW1lbnQiLCJzZXRDb2xsYXBzZWQiLCJ0b2dnbGVDb2xsYXBzZWQiLCJpc0NvbGxhcHNlZCIsInNldFBvc2l0aW9uIiwiZml4ZWQiLCJvZmZjYW52YXMiLCJ1cGRhdGUiLCJnZXRMYXlvdXRDb250YWluZXIiLCJzZXROYXZiYXJGaXhlZCIsInNldEZvb3RlckZpeGVkIiwic2V0RmxpcHBlZCIsInJldmVyc2VkIiwiaXNMYXlvdXROYXZiYXJGdWxsIiwiaXNGaXhlZCIsImlzTmF2YmFyRml4ZWQiLCJpc0Zvb3RlckZpeGVkIiwic2V0QXV0b1VwZGF0ZSIsImVuYWJsZSIsIm9mZiIsInVwZGF0ZUN1c3RvbU9wdGlvbkNoZWNrIiwiY2hlY2tlZCIsImN1c3RvbVJhZGlvT3B0aW9uTGlzdCIsImNsb3Nlc3QiLCJtYXAiLCJjdXN0b21SYWRpb09wdGlvbkVMIiwiaXNSdGwiLCJnZXRBdHRyaWJ1dGUiLCJpc01vYmlsZURldmljZSIsIm9yaWVudGF0aW9uIiwibmF2aWdhdG9yIiwidXNlckFnZW50IiwiaW5uZXJXaWR0aCIsImNsaWVudFdpZHRoIiwiaXNGbGlwcGVkIiwiaXNMaWdodFN0eWxlIiwiaXNEYXJrU3R5bGUiLCJfZXZlbnQiLCJuYW1lc3BhY2UiLCJqb2luIiwicHVzaCIsInNwbGljZSIsImluaXQiLCJkb2N1bWVudE1vZGUiLCJkZXN0cm95IiwiaW5pdFBhc3N3b3JkVG9nZ2xlIiwidG9nZ2xlciIsInByZXZlbnREZWZhdWx0IiwiZm9ybVBhc3N3b3JkVG9nZ2xlIiwiZm9ybVBhc3N3b3JkVG9nZ2xlSWNvbiIsImZvcm1QYXNzd29yZFRvZ2dsZUlucHV0Iiwic2V0QXR0cmlidXRlIiwiaW5pdEN1c3RvbU9wdGlvbkNoZWNrIiwiX3RoaXMiLCJjdXN0b3BPcHRpb25MaXN0IiwiY3VzdG9tT3B0aW9uRUwiLCJpbml0U3BlZWNoVG9UZXh0IiwiU3BlZWNoUmVjb2duaXRpb24iLCJ3ZWJraXRTcGVlY2hSZWNvZ25pdGlvbiIsInNwZWVjaFRvVGV4dCIsInJlY29nbml0aW9uIiwibGlzdGVuaW5nIiwiZm9jdXMiLCJvbnNwZWVjaHN0YXJ0Iiwib25lcnJvciIsIm9ucmVzdWx0IiwidmFsdWUiLCJyZXN1bHRzIiwidHJhbnNjcmlwdCIsIm9uc3BlZWNoZW5kIiwic3RvcCIsImluaXROYXZiYXJEcm9wZG93blNjcm9sbGJhciIsInNjcm9sbGJhckNvbnRhaW5lciIsIlBlcmZlY3RTY3JvbGxiYXIiLCJ3aGVlbFByb3BhZ2F0aW9uIiwic3VwcHJlc3NTY3JvbGxYIiwiYWpheENhbGwiLCJ1cmwiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInJlcSIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsIm9ubG9hZCIsInN0YXR1cyIsInJlc3BvbnNlIiwic3RhdHVzVGV4dCIsInNlbmQiLCJpbml0U2lkZWJhclRvZ2dsZSIsInNpZGViYXJUb2dnbGVyIiwib3ZlcmxheSIsImFwcE92ZXJsYXkiLCJ0ZWwiLCJ0b2dnbGUiLCJjdXJyZW50VGFyZ2V0IiwiY2hyb21lIiwicmVhZHlTdGF0ZSIsIm9uQ29udGVudExvYWRlZCJdLCJzb3VyY2VSb290IjoiIn0=\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__;
|
|
/******/ })()
|
|
;
|
|
}); |