PageSourceSearch

https://www.cleanenergycu.org/wp-content/themes/cleanenergycu-theme/js/dist/bundle.js?ver=1790080924

js cleanenergycu.org collected 2026-09-24 09:59:04 UTC 277,503 bytes, 277 lines download raw bytes

1/*
2 * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
3 * This devtool is neither made for production nor for readable output files.
4 * It uses "eval()" calls to create a separate source file in the browser devtools.
5 * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
6 * or disable the default devtool with "devtool: false".
7 * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
8 */
9(function webpackUniversalModuleDefinition(root, factory) {
10	if(typeof exports === 'object' && typeof module === 'object')
11		module.exports = factory();
12	else if(typeof define === 'function' && define.amd)
13		define([], factory);
14	else if(typeof exports === 'object')
15		exports["pixLib"] = factory();
16	else
17		root["pixLib"] = factory();
18})(self, function() {
19return /******/ (function() { // webpackBootstrap
20/******/ 	var __webpack_modules__ = ({
21
22/***/ "./builder.js":
23/*!********************!*\
24  !*** ./builder.js ***!
25  \********************/
26/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
27
28"use strict";
29eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   domPurify: function() { return /* reexport default from dynamic */ dompurify__WEBPACK_IMPORTED_MODULE_6___default.a; },\n/* harmony export */   iframeResizer: function() { return /* reexport default export from named module */ iframe_resizer__WEBPACK_IMPORTED_MODULE_4__; },\n/* harmony export */   imagesLoaded: function() { return /* reexport default from dynamic */ imagesloaded__WEBPACK_IMPORTED_MODULE_5___default.a; },\n/* harmony export */   mustache: function() { return /* reexport safe */ mustache__WEBPACK_IMPORTED_MODULE_7__[\"default\"]; },\n/* harmony export */   pixCookie: function() { return /* reexport safe */ _js_utils_PixCookie__WEBPACK_IMPORTED_MODULE_3__[\"default\"]; },\n/* harmony export */   pixHeight: function() { return /* reexport safe */ _js_utils_PixHeight__WEBPACK_IMPORTED_MODULE_2__[\"default\"]; },\n/* harmony export */   pixSlideToggle: function() { return /* reexport safe */ _js_utils_PixSlideToggle__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; }\n/* harmony export */ });\n/* harmony import */ var _sass_style_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sass/style.scss */ \"./sass/style.scss\");\n/* harmony import */ var _js_utils_PixSlideToggle__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./js/utils/PixSlideToggle */ \"./js/utils/PixSlideToggle.js\");\n/* harmony import */ var _js_utils_PixHeight__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./js/utils/PixHeight */ \"./js/utils/PixHeight.js\");\n/* harmony import */ var _js_utils_PixCookie__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./js/utils/PixCookie */ \"./js/utils/PixCookie.js\");\n/* harmony import */ var iframe_resizer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! iframe-resizer */ \"./node_modules/iframe-resizer/index.js\");\n/* harmony import */ var imagesloaded__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! imagesloaded */ \"./node_modules/imagesloaded/imagesloaded.js\");\n/* harmony import */ var imagesloaded__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(imagesloaded__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var dompurify__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! dompurify */ \"./node_modules/dompurify/dist/purify.js\");\n/* harmony import */ var dompurify__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(dompurify__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var mustache__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! mustache */ \"./node_modules/mustache/mustache.mjs\");\n__webpack_require__(/*! ./js/main.js */ \"./js/main.js\");\n\n\n\n\n\n\n\n\n\n//# sourceURL=webpack://pixLib/./builder.js?\n}");
30
31/***/ }),
32
33/***/ "./js/main.js":
34/*!********************!*\
35  !*** ./js/main.js ***!
36  \********************/
37/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
38
39"use strict";
40eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var imagesloaded__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! imagesloaded */ \"./node_modules/imagesloaded/imagesloaded.js\");\n/* harmony import */ var imagesloaded__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(imagesloaded__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var dompurify__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dompurify */ \"./node_modules/dompurify/dist/purify.js\");\n/* harmony import */ var dompurify__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dompurify__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var iframe_resizer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! iframe-resizer */ \"./node_modules/iframe-resizer/index.js\");\n/* harmony import */ var _utils_PixInview__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils/PixInview */ \"./js/utils/PixInview.js\");\n/* harmony import */ var _utils_PixModal__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils/PixModal */ \"./js/utils/PixModal.js\");\n/* harmony import */ var _utils_PixSlideToggle__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils/PixSlideToggle */ \"./js/utils/PixSlideToggle.js\");\n/* harmony import */ var _utils_PixHeight__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/PixHeight */ \"./js/utils/PixHeight.js\");\n/* harmony import */ var _utils_PixCookie__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils/PixCookie */ \"./js/utils/PixCookie.js\");\n/* harmony import */ var chosen_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! chosen-js */ \"./node_modules/chosen-js/chosen.jquery.js\");\n/* harmony import */ var chosen_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(chosen_js__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var chosen_js_chosen_css__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! chosen-js/chosen.css */ \"./node_modules/chosen-js/chosen.css\");\n/* harmony import */ var mustache__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! mustache */ \"./node_modules/mustache/mustache.mjs\");\n\n\n\n\n\n\n\n\n\n\n\nvar pixSlideToggle = new _utils_PixSlideToggle__WEBPACK_IMPORTED_MODULE_5__[\"default\"]();\nvar pixCookie = new _utils_PixCookie__WEBPACK_IMPORTED_MODULE_7__[\"default\"]();\n(function ($) {\n  $(document).ready(function () {\n    // 1. Utility - Utility functions used throughout\n    // 2. Modules - definitions of individually functioning pieces of code.\n    // 3. Initilize - initialize all modules in one place so that we are sure\n    //      everything happens in the right order\n    // 4. Resize - Everything that happens on the resize event.\n\n    //\n    // 1. Utility\n    //    Utility functions used throughout\n    //\n\n    // stuff I use throughout\n    var $win = $(window),\n      $body = $('body'),\n      bodyEl = $body[0],\n      curWinWidth = $win.width(),\n      timer,\n      prevLayoutView = 'small',\n      layoutView = 'small',\n      smallMax = 767.98,\n      mediumMax = 960,\n      largeMax = 1280,\n      smallMediaQueryStart = '@media (min-width: 0em) and (max-width: 767.98px) {',\n      checkLayout = function () {\n        var $curWin = $(window);\n        curWinWidth = $curWin.width();\n        if (curWinWidth <= smallMax) {\n          layoutView = 'small';\n        } else if (curWinWidth > smallMax && curWinWidth < mediumMax) {\n          layoutView = 'medium';\n        } else if (curWinWidth > mediumMax && curWinWidth < largeMax) {\n          layoutView = 'large';\n        } else {\n          layoutView = 'xlarge';\n        }\n        window.layoutView = layoutView;\n        console.log(layoutView);\n      },\n      pixStyle = {\n        create: function ($el, id) {\n          if ($el.length === 0) {\n            // create the thing\n            var styleEl = document.createElement(\"style\");\n            styleEl.type = \"text\\/css\";\n            styleEl.id = id;\n            document.head.appendChild(styleEl);\n            $el = $(styleEl);\n          }\n          return $el;\n        }\n      };
40\n    var $links = $('a:not(.trusted)'),\n      linksLength = $links.length,\n      siteRoot = new RegExp(location.host),\n      $externalLinks = $(),\n      $speedBumpModal = $('#js-speed_bump'),\n      $speedBumpAccept = $('#js-speed_bump_accept'),\n      $speedBumpCancel = $('#js-speed_bump_cancel'),\n      $shareButtons = $('.js-share_button'),\n      getParameterByName = function (name, url) {\n        if (!url) url = window.location.href;\n        name = name.replace(/[\\[\\]]/g, \"\\\\$&\");\n        var regex = new RegExp(\"[?&]\" + name + \"(=([^&#]*)|&|#|$)\"),\n          results = regex.exec(url);\n        if (!results) return null;\n        if (!results[2]) return '';\n        return decodeURIComponent(results[2].replace(/\\+/g, \" \"));\n      },\n      speedBumpSetAcceptLink = function ($x, self) {\n        var href = $x[0].href,\n          isSpeedBump = /\\/speed-bump\\//.test(href),\n          url = '',\n          acceptButton = document.getElementById('js-speed_bump_accept');\n        if (isSpeedBump) {\n          url = getParameterByName('url', href);\n        } else {\n          url = href;\n        }\n        acceptButton.href = url;\n        acceptButton.target = '_blank';\n        acceptButton.addEventListener('click', function () {\n          self.close();\n        });\n      },\n      speedBumpSetCancelLink = function (self) {\n        var cancelButton = document.getElementById('js-speed_bump_cancel');\n        cancelButton.addEventListener('click', function (e) {\n          e.preventDefault();\n          self.close();\n        });\n      },\n      initExternalLinksModal = function ($x, e) {\n        if (!$('body').hasClass('page-template-tpl-speedBump')) {\n          e.preventDefault();\n          new _utils_PixModal__WEBPACK_IMPORTED_MODULE_4__[\"default\"]({\n            content: $speedBumpModal[0],\n            openOnInit: true,\n            openCallback: function (e) {\n              speedBumpSetAcceptLink($x, this);\n              speedBumpSetCancelLink(this);\n            }\n          });\n        }\n      },\n      approvedPartials = function (url) {\n        // Normalize the URL being tested\n        // Remove any scheme\n        if (url.indexOf(\"http\") == 0) {\n          url = url.substr(4);\n          if (url.indexOf(\"s\") == 0) {\n            url = url.substr(1);\n          }\n          // now remove \"://\"\n          url = url.substr(3);\n        }\n        // Remove a \"www\" subdomain\n        if (url.indexOf(\"www.\") == 0) {\n          url = url.substr(4);\n        }\n        // \"Bare\" URL at this point\n        var approvedPartialUrlsLength = phpVariables['approvedPartialUrls'].length;\n        if (approvedPartialUrlsLength > 0) {\n          for (var j = 0; j < approvedPartialUrlsLength; j++) {\n            if (url.indexOf(phpVariables['approvedPartialUrls'][j]) == 0) {\n              return true;\n            }\n          }\n        }\n        return false;\n      },\n      checkForExternalLink = function (url, link) {\n        var isTel = /^tel:/.test(url),\n          isMailto = /^mailto:/.test(url),\n          isAnchor = /^#/.test(url),\n          isSiteRoot = siteRoot.test(url),\n          isSpeedBump = /\\/speed-bump\\//.test(url);\n        if (!isTel && !isMailto && !isAnchor && !isSiteRoot) {\n          // is an external link, not sure if it should\n          $(link).attr('target', '_blank');\n        }\n        if ((isTel || isMailto || isAnchor || isSiteRoot) && !isSpeedBump) {\n          // not an external link\n          return false;\n        } else if (phpVariables['approvedUrls'].indexOf(url) != -1) {\n          // this is an external link, but is an approved url\n          return false;\n        } else if (approvedPartials(url)) {\n          return false;\n        } else {\n          // a true external link\n          // or\n          // a link to the speed-bump page\n          return true;\n        }\n      },\n      initExternalLink = function () {\n        for (var i = 0; i < linksLength; i++) {\n          var $curLink = $($links[i]);
40\n          var isExternalLink = checkForExternalLink($links[i].href, $links[i]);\n          if (isExternalLink) {\n            $externalLinks = $externalLinks.add($curLink);\n          }\n        }\n        $externalLinks.click(function (e) {\n          initExternalLinksModal($(this), e);\n        });\n      },\n      setSocialShareInModal = function (data, self) {\n        var shareButtonHtml = '';\n        shareButtonHtml += '<div ';\n        shareButtonHtml += 'class=\"speedbump_buttons--social_wrap a2a_kit\" ';\n        shareButtonHtml += 'data-a2a-url=\"' + data.shareurl + '\" ';\n        shareButtonHtml += 'data-a2a-title=\"' + data.sharetitle + '\"';\n        shareButtonHtml += '>';\n        shareButtonHtml += '<a ';\n        shareButtonHtml += 'href=\"#accept\" ';\n        shareButtonHtml += 'id=\"js-social_speed_bump_accept\" ';\n        shareButtonHtml += 'class=\" ';\n        shareButtonHtml += 'speedbump-accept ';\n        shareButtonHtml += 'a2a_button_' + data.shareservice + ' ';\n        shareButtonHtml += 'trusted ';\n        shareButtonHtml += 'co-button ';\n        shareButtonHtml += '\" ';\n        shareButtonHtml += '>';\n        shareButtonHtml += 'Accept';\n        shareButtonHtml += '</a>';\n        shareButtonHtml += '</div>';\n        var $shareAccept = $(shareButtonHtml);\n        $speedBumpCancel.after($shareAccept);\n        $shareAccept.click(function () {\n          self.close();\n        });\n        $speedBumpAccept.hide();\n        a2a.init('page');\n      },\n      initSocialModal = function (x) {\n        var data = $(x).data();\n        new _utils_PixModal__WEBPACK_IMPORTED_MODULE_4__[\"default\"]({\n          content: $speedBumpModal[0],\n          openCallback: function () {\n            setSocialShareInModal(data, this);\n            speedBumpSetCancelLink(this);\n          },\n          closeCallback: function () {\n            console.log('social modal close callback');\n            $speedBumpAccept.show();\n            var socialButtonWraps = document.querySelectorAll('.speedbump_buttons--social_wrap');\n            for (var i = 0; i < socialButtonWraps.length; i++) {\n              socialButtonWraps[i].remove();\n            }\n          },\n          openOnInit: true\n        });\n      };\n    initExternalLink();\n    $shareButtons.click(function () {\n      initSocialModal(this);\n    });\n    $('#js-locations_map_and_list').on('click', 'a', function (e) {\n      var $x = $(this),\n        url = $x.attr('href'),\n        isExternal = checkForExternalLink(url);\n      if (isExternal) {\n        initExternalLinksModal($x, e);\n      }\n    });\n    //\n    // Toggle Main Nav\n    //\n    var mainNav = {\n      toggleEl: document.getElementById('js-main_nav_toggle'),\n      panelEl: document.getElementById('js-mobile_menu'),\n      open: function () {\n        var that = this;\n        that.toggleEl.classList.remove('closed');\n        that.toggleEl.classList.add('open');\n        that.panelEl.classList.remove('closed');\n        that.panelEl.classList.add('open');\n        loginDropdown.close();\n      },\n      close: function () {\n        var that = this;\n        that.toggleEl.classList.add('closed');\n        that.toggleEl.classList.remove('open');\n        that.panelEl.classList.add('closed');\n        that.panelEl.classList.remove('open');\n      },\n      toggle: function () {\n        var that = this;\n        if (that.toggleEl.classList.contains('closed')) {\n          that.open();\n        } else {\n          that.close();\n        }\n      },\n      init: function () {\n        var that = this;\n        if (that.toggleEl) {\n          that.toggleEl.addEventListener('click', function () {\n            that.toggle();\n          });\n        }\n      }\n    };\n    //\n    // Main Menu\n    //\n    var mainMenu = {\n      toggles: document.getElementsByClassName('js-menu_toggle'),\n      curOpen: [],\n      closeAll: function () {\n        var that = this;\n        that.curOpen.forEach(el => {\n          that.close(el);\n        });\n        that.curOpen = [];\n      },\n      open: function (toggle, curSubMenu = false) {\n        var that = this;\n        curSubMenu = curSubMenu ? curSubMenu : toggle.parentNode.querySelector('.js-sub_menu');\n        pixSlideToggle.open(curSubMenu, function () {\n          toggle.classList.remove('closed');\n          toggle.classList.remove('is-transitioning');\n        });\n        that.curOpen.push(toggle);\n      },\n      close: function (toggle, curSubMenu = false) {\n        var that = this;\n        curSubMenu = curSubMenu ? curSubMenu : toggle.parentNode.querySelector('.js-sub_menu');\n        pixSlideToggle.close(curSubMenu, function () {\n          toggle.classList.add('closed');\n          toggle.classList.remove('is-transitioning');\n        });\n        that.curOpen = that.curOpen.filter(el => {\n          return el !== toggle;\n        });\n      },\n      toggle: function () {\n        var curSubMenu = this.parentNode.querySelector('.js-sub_menu');\n        if (layoutView !== 'small' && !curSubMenu.classList.contains('main_menu--sub_menu__top_level') || this.classList.contains('is-transitioning')) {\n          return false;\n        }\n        this.classList.add('is-transitioning');\n        if (layoutView !== 'small' && mainMenu.curOpen.indexOf(this) === -1) {\n          mainMenu.closeAll();\n        }\n        if (curSubMenu.classList.contains('closed')) {\n          mainMenu.open(this, curSubMenu);\n        } else {\n          mainMenu.close(this, curSubMenu);\n        }\n      },\n      init: function () {\n        var that = this;\n        for (var i = 0; i < that.toggles.length;
40 i++) {\n          that.toggles[i].addEventListener('click', that.toggle);\n        }\n      }\n    };\n    //\n    // Toggle Header Search\n    //\n    var headerSearch = {\n      toggle: document.getElementById('js-search_toggle'),\n      panel: document.getElementById('js-header_search'),\n      init: function () {\n        var that = this;\n        if (that.toggle) {\n          that.toggle.addEventListener('click', function () {\n            if (that.toggle.classList.contains('closed')) {\n              pixSlideToggle.open(that.panel, function () {\n                that.panel.querySelector('input[type=search]').focus();\n              });\n              that.toggle.classList.remove('closed');\n              that.toggle.classList.add('open');\n            } else {\n              pixSlideToggle.close(that.panel);\n              that.toggle.classList.add('closed');\n              that.toggle.classList.remove('open');\n            }\n          });\n        }\n      }\n    };\n    //\n    // Toggle Login Dropdown\n    //\n    var loginDropdown = {\n      openEventName: 'OpenOnlineBanking',\n      openEvent: false,\n      toggleEl: document.getElementById('js-header_login_toggle'),\n      submitEl: document.getElementById('loginbtn'),\n      panelEl: document.getElementById('js-header_login_panel'),\n      linkEls: document.querySelectorAll('a[href=\"#headerlogin\"]'),\n      loginText: document.getElementById('js-header_login_text'),\n      toggle: function () {\n        var that = this;\n        if (that.toggleEl.classList.contains('closed')) {\n          that.open();\n        } else {\n          that.close();\n        }\n      },\n      open: function () {\n        var that = this;\n        that.panelEl.classList.remove('closed');\n        that.toggleEl.classList.remove('closed');\n        that.loginText.innerHTML = \"Close\";\n        mainNav.close();\n        document.dispatchEvent(that.openEvent);\n      },\n      close: function () {\n        var that = this;\n        that.panelEl.classList.add('closed');\n        that.toggleEl.classList.add('closed');\n        that.loginText.innerHTML = \"Login\";\n      },\n      link: function () {\n        var that = this;\n        // @TODO\n        // factor out the jquery requirement from pixScrollTo\n        pixScrollTo($(that.toggleEl), function () {\n          that.open();\n          that.panelEl.querySelectorAll('input[type=\"text\"]')[0].focus();\n        });\n      },\n      init: function () {\n        var that = this;\n        if (that.toggleEl) {\n          try {\n            that.openEvent = new Event(that.openEventName);\n          } catch (err) {}\n          that.toggleEl.addEventListener('click', function (e) {\n            e.preventDefault();\n            that.toggle();\n          });\n          that.submitEl.addEventListener('click', function (e) {\n            that.close();\n          });\n          for (var i = 0; i < that.linkEls.length; i++) {\n            that.linkEls[i].addEventListener('click', function (e) {\n              e.preventDefault();\n              that.link();\n            });\n          }\n        }\n      }\n    };\n\n    //\n    // PixelSpoke Smooth Scroll To\n    //\n    var pixScrollTo = function ($target, callback) {\n      var callback = callback || function () {},\n        offset = 120,\n        targetPadding = $target.css('padding-top').replace('px', '');\n      if ($body.hasClass('admin-bar')) {\n        offset = offset + 32;\n      }\n      if (targetPadding) {\n        offset = offset - targetPadding;\n      }\n      $('html, body').animate({\n        scrollTop: $target.offset().top - offset\n      }, 1000, function () {\n        $target.focus();\n        callback();\n      });\n    };\n    //\n    // Scroll to FAQ\n    //\n    var testForOpenFAQs = function () {\n      var urlParams = new URLSearchParams(window.location.search);\n      var faqId = dompurify__WEBPACK_IMPORTED_MODULE_1___default().sanitize(urlParams.get('faqid'));\n      if (faqId) {\n        var $toggle = $('[data-accordid=' + faqId + ']'),\n          $siblings = $toggle.siblings('.js-accord_content');\n        pixAccordions.toggleAccord($toggle[0], function () {\n          pixScrollTo($toggle);\n        });\n      }\n    };\n    //\n    // Alert Bar\n    //\n    var pixAlertBar = {\n      $el: $('#js-alertbar'),\n      $close: $('#js-alertbar-close'),\n      cookieName: 'pix_alert_bar',\n      curCookie: '',\n      curAlert: '',\n      close: function () {\n        var that = this;\n        that.$el.removeClass('active');\n        pixCookie.set(that.cookieName, that.curAlert, '');\n      },\n      test: function () {\n        var that = this;\n        if (that.curCookie === that.curAlert) {\n          that.close();\n        }\n      },\n      init: function () {\n        var that = this;\n        if (that.$el.length > 0) {\n          that.curAlert = that.$el.data('alerthash').trim();\n          that.curCookie = pixCookie.get(that.cookieName);\n          that.test();\n          that.$close.click(function () {\n            that.close();\n          });\n        }\n      }\n    };\n    //\n    // Home Page Swapping & Member Class Setting\n    //\n    var pixMember = {\n      cookieName: 'ismember',\n      $loginForm: $('.co-online_banking--form'),\n      $memberComponents: $('.js-member_component'),\n      $prospectComponents: $('.js-prospect_component'),\n      memberTest: function () {\n        var that = this;\n        if (pixCookie.get(that.cookieName) == 1) {\n          that.isMember = true;\n        }\n      },\n      setMemberClasses: function () {\n        var that = this;\n        if (that.isMember) {\n          $body.addClass('retarget-member');\n        }\n      }
40,\n      setCookie: function (name, val) {\n        var that = this;\n        var now = new Date(),\n          time = now.getTime(),\n          month = 2592000;\n        time += month * 1000;\n        now.setTime(time);\n        pixCookie.set(name, val, now.toUTCString());\n      },\n      setMemberCookie: function () {\n        var that = this;\n        that.$loginForm.submit(function () {\n          that.setCookie(that.cookieName, '1');\n        });\n      },\n      setComponents: function () {\n        var that = this;\n        if (that.isMember) {\n          // hide the prospect components\n          that.$prospectComponents.remove();\n          // load the member components\n          var memberComponentLength = that.$memberComponents.length;\n          for (var i = 0; i < memberComponentLength; i++) {\n            var $curComponent = $(that.$memberComponents[i]),\n              newHtml = $curComponent.data('html');\n            if (typeof newHtml == 'undefined') {\n              $curComponent = $curComponent.find('div[data-html]').eq(0);\n              newHtml = $curComponent.data('html');\n            }\n            $curComponent.html(newHtml);\n          }\n        } else {\n          that.$memberComponents.remove();\n        }\n      },\n      init: function (callback) {\n        callback = callback || function () {};\n        var that = this;\n        that.setMemberCookie();\n        that.memberTest();\n        that.setMemberClasses();\n        callback();\n      }\n    };\n\n    //\n    // 3. Initilize\n    //    initialize all modules in one place so that we are sure everything\n    //    happens in the right order\n    //\n    checkLayout();\n    loginDropdown.init();\n    mainMenu.init();\n    pixMember.init(function () {\n      // add anything here that is dependent on the\n      // homepage being fully loaded\n      // pixPromos.init();\n    });
40\n    pixAlertBar.init();\n    headerSearch.init();\n    mainNav.init();\n    testForOpenFAQs();\n\n    //\n    // 4. Resize\n    //    Everything that happens on the resize event.\n    //    Resize is an important event, but it triggers waaaay too much.\n    //    We throttle it here to only trigger what we need every 200 miliseconds.\n    //\n    function layoutChange() {\n      if (prevLayoutView !== layoutView) {\n        // functions that need to fire when breakpoints change\n        prevLayoutView = layoutView;\n      }\n    }\n    $win.resize(function () {\n      clearTimeout(timer);\n      timer = setTimeout(function () {\n        // do resize stuff here\n        checkLayout();\n        layoutChange();\n      }, 200);\n    });\n  }); // end $(document).ready()\n  $(window).load(function () {\n    //\n    // Defer YouTube\n    //\n    // this will defer the setup of YouTube until the page is otherwise\n    // completely loaded. It will then only load YouTube when it comes\n    // into the viewport.\n    var deferYouTube = {\n      $wraps: $('.js-youtube_wrap'),\n      setWaypoint: function ($wrap, $frame) {\n        var wrapEl = $wrap[0];\n        var frameEl = $frame[0];\n        new _utils_PixInview__WEBPACK_IMPORTED_MODULE_3__[\"default\"]({\n          el: $wrap[0],\n          callback: function () {\n            frameEl.setAttribute('src', frameEl.dataset['src']);\n            wrapEl.classList.remove('loading');\n          },\n          fallbackToggle: true\n        });\n      },\n      init: function () {\n        var that = this,\n          wrapsLength = that.$wraps.length;\n        for (var i = 0; i < wrapsLength; i++) {\n          var $curWrap = $(that.$wraps[i]),\n            $curFrame = $curWrap.find('iframe');\n          that.setWaypoint($curWrap, $curFrame);\n        }\n      }\n    };\n    deferYouTube.init();\n  });\n})(jQuery);\n\n//# sourceURL=webpack://pixLib/./js/main.js?\n}");
41
42/***/ }),
43
44/***/ "./js/utils/PixCookie.js":
45/*!*******************************!*\
46  !*** ./js/utils/PixCookie.js ***!
47  \*******************************/
48/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
49
50"use strict";
51eval("{__webpack_require__.r(__webpack_exports__);\nfunction PixCookie() {\n  this.get = function (name) {\n    var match = document.cookie.match(new RegExp(name + '=([^;]+)'));\n    if (match) return match[1];\n  }, this.set = function (name, value, expiration) {\n    // for a cookie that only lasts the current session\n    // pass an empty string as expiration\n    // otherwise\n    // expiration should be in a UTC string\n    // here is an example of setting a cookie\n    // that expires in one month\n    /*\n    var now = new Date(),\n    \t\ttime = now.getTime(),\n    \t\tmonth = 2592000;\n    time += month * 1000;\n    now.setTime(time);\n    pixCookie.set('examplecookiename', 'examplevalue', now.toUTCString());\n    */\n    var expString = expiration === '' ? '' : '; expires=' + expiration;\n    document.cookie = name + '=' + value + expString + '; Secure; path=/';\n  }, this.remove = function (name) {\n    document.cookie = name + '= ' + '; expires=Thu, 01 Jan 1970 00:00:00 GMT' + '; path=/';\n  };\n}\n/* harmony default export */ __webpack_exports__[\"default\"] = (PixCookie);\n\n//# sourceURL=webpack://pixLib/./js/utils/PixCookie.js?\n}");
52
53/***/ }),
54
55/***/ "./js/utils/PixHeight.js":
56/*!*******************************!*\
57  !*** ./js/utils/PixHeight.js ***!
58  \*******************************/
59/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
60
61"use strict";
62eval("{__webpack_require__.r(__webpack_exports__);\nfunction PixHeight() {\n  this.level = els => {\n    let largestHeight = 0;\n    for (var i = 0; i < els.length; i++) {\n      let curHeight = els[i].offsetHeight;\n      largestHeight = curHeight > largestHeight ? curHeight : largestHeight;\n    }\n    for (var i = 0; i < els.length; i++) {\n      els[i].style.height = largestHeight + 'px';\n    }\n  };\n  this.reset = els => {\n    for (var i = 0; i < els.length; i++) {\n      els[i].style.height = 'auto';\n    }\n  };\n}\n/* harmony default export */ __webpack_exports__[\"default\"] = (PixHeight);\n\n//# sourceURL=webpack://pixLib/./js/utils/PixHeight.js?\n}");
63
64/***/ }),
65
66/***/ "./js/utils/PixInview.js":
67/*!*******************************!*\
68  !*** ./js/utils/PixInview.js ***!
69  \*******************************/
70/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
71
72"use strict";
73eval("{__webpack_require__.r(__webpack_exports__);\n//\n// PixelSpoke InView\n// A stripped down way to first an event whe an element comes into the viewport\n//\nfunction PixInview(args) {\n  // @param {Object} args - the object that holds the args\n  // @param {htmlEntity} args.el - the element that should trigger the callback when it comes into view\n  // @param {function} args.callback - the function to run when the element comes into view\n  // @param {bool} args.fallbackToggle - if IntersectionObserver isn't supported should we just fire the callback or not at all\n  this.el = args.el;\n  this.callback = args.callback || function () {};\n  this.fallbackToggle = args.fallbackToggle;\n  if (typeof IntersectionObserver === 'undefined' && this.fallbackToggle && this.el) {\n    // fire callback as fallback\n    this.callback();\n  } else if (this.el && typeof IntersectionObserver !== 'undefined') {\n    var that = this;\n    var observer = new IntersectionObserver(function (entries, observer, callback) {\n      entries.forEach(function (entry) {\n        if (entry.intersectionRatio > 0) {\n          that.callback();\n          observer.unobserve(entry.target);\n        }\n      });\n    }, {\n      rootMargin: '0px',\n      threshold: 0\n    });\n    observer.observe(this.el);\n  }\n}\n/* harmony default export */ __webpack_exports__[\"default\"] = (PixInview);\n\n//# sourceURL=webpack://pixLib/./js/utils/PixInview.js?\n}");
74
75/***/ }),
76
77/***/ "./js/utils/PixModal.js":
78/*!******************************!*\
79  !*** ./js/utils/PixModal.js ***!
80  \******************************/
81/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
82
83"use strict";
84eval("{__webpack_require__.r(__webpack_exports__);\n//\n// PixelSpoke Basic Modal Window\n// Example:\n//\n/*\nvar testModal = {\n\ttoggleEl: document.getElementById('js-header_login_toggle'),\n\tel: document.getElementById('js-test_modal'),\n\ttrigger: document.getElementById('js-test_trigger'),\n\tcallback: function() {\n\t\tconsole.log('testModal KABLAMO!!')\n\t},\n\tinit: function() {\n\t\tvar that = this;\n\t\tvar curModal = new PixModal({\n\t\t\tcontent: that.el,\n\t\t\topenCallback: that.callback,\n\t\t\tcloseCallback: () => {\n\t\t\t\tconsole.log('closeCallback successefull')\n\t\t\t}\n\t\t})\n\t\tthat.trigger.addEventListener('click', () => {\n\t\t\tcurModal.open()\n\t\t})\n\t}\n}\ntestModal.init();\nvar anotherTestModal = {\n\tmodal: false,\n\t// triggerEl: document.getElementById('test-id'),\n\t// otherTriggerEl: document.getElementById('other-test-id'),\n\ttriggers: document.getElementsByClassName('modal-triggers'),\n\tinit: function() {\n\t\tvar that = this;\n\t\tthat.modal = new PixModal({\n\t\t\tcontent: document.getElementById('test-content')\n\t\t});\n\t\t// that.triggerEl.addEventListener('click', function() {\n\t\t// \tthat.modal.open();\n\t\t// });\n\t\t// that.otherTriggerEl.addEventListener('click', function() {\n\t\t// \tthat.modal.open();\n\t\t// });\n\t\tfor ( var i = 0; i < that.triggers.length; i++ ) {\n\t\t\tthat.triggers[i].addEventListener('click', function() {\n\t\t\t\tthat.modal.open();\n\t\t\t})\n\t\t}\n\t}\n}\nanotherTestModal.init();\n*/\nfunction PixModal(args) {\n  // options\n  this.content = args.content;\n  this.openCallback = args.openCallback || function () {};\n  this.closeCallback = args.closeCallback || function () {};\n  this.openOnInit = args.openOnInit || false;\n  // internal vars\n  this.wrap = false;\n  this.innerWrap = false;\n  this.closeButton = false;\n  // initialization\n  this.content.style.display = 'none';\n  // methods\n  this.open = () => {\n    let that = this;\n    that.wrap = document.createElement('div');\n    that.wrap.className = 'pix_modal is-closed';\n    that.wrap.addEventListener('click', e => {\n      if (e.target.className === 'pix_modal') {\n        that.close();\n      }\n    });\n    that.innerWrap = document.createElement('div');\n    that.innerWrap.className = 'pix_modal--inner js-pix_modal_inner';\n    that.innerWrap.appendChild(that.content);\n    that.closeButton = document.createElement('button');\n    that.closeButton.className = 'pix_modal--close';\n    that.closeButtonIcon = document.createElement('i');\n    that.closeButtonIcon.className = 'pix_modal--close_icon';\n    that.closeButton.appendChild(that.closeButtonIcon);\n    that.closeButton.setAttribute('aria-label', 'close modal');\n    that.closeButton.addEventListener('click', () => {\n      that.close();\n    });\n    that.innerWrap.appendChild(that.closeButton);\n    that.content.style.display = 'block';\n    that.wrap.appendChild(that.innerWrap);\n    document.body.appendChild(that.wrap);\n    setTimeout(() => {\n      that.wrap.classList.remove('is-closed');\n      that.openCallback();\n    }, 5);\n  };\n  this.close = () => {\n    var that = this;\n    that.wrap.classList.add('is-closed');\n    that.closeCallback();\n    setTimeout(() => {\n      that.wrap.remove();\n    }, 500);\n  };\n  if (this.openOnInit) this.open();\n}\n/* harmony default export */ __webpack_exports__[\"default\"] = (PixModal);\n\n//# sourceURL=webpack://pixLib/./js/utils/PixModal.js?\n}");
85
86/***/ }),
87
88/***/ "./js/utils/PixSlideToggle.js":
89/*!************************************!*\
90  !*** ./js/utils/PixSlideToggle.js ***!
91  \************************************/
92/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
93
94"use strict";
95eval("{__webpack_require__.r(__webpack_exports__);\n//\n// Slide Toggle\n// The elelement must have a transition applied to the height in CSS\n// eg:\n// .site_header--search {\n// \theight: 0px; // to default as open set the initial value to auto\n// \toverflow: hidden;\n// \ttransition: height 0.35s ease-in-out;\n// }\n//\n// Adapted From: https://codepen.io/brundolf/pen/dvoGyw?editors=0110\nfunction PixSlideToggle() {\n  this.close = (element, callback) => {\n    callback = callback || function () {};\n    // get the height of the element's inner content, regardless of its actual size\n    var sectionHeight = element.scrollHeight;\n    // temporarily disable all css transitions\n    var elementTransition = element.style.transition;\n    element.style.transition = '';\n    // on the next frame (as soon as the previous style change has taken effect),\n    // explicitly set the element's height to its current pixel height, so we\n    // aren't transitioning out of 'auto'\n    requestAnimationFrame(function () {\n      element.style.height = sectionHeight + 'px';\n      element.style.transition = elementTransition;\n      // on the next frame (as soon as the previous style change has taken effect),\n      // have the element transition to height: 0\n      requestAnimationFrame(function () {\n        element.style.height = 0 + 'px';\n        setTimeout(function () {\n          // mark the section as \"currently collapsed\"\n          element.classList.add('closed');\n          callback();\n        }, 200);\n      });\n    });\n  };\n  this.open = (element, callback) => {\n    callback = callback || function () {};\n    element.classList.remove('closed');\n    // get the height of the element's inner content, regardless of its actual size\n    var sectionHeight = element.scrollHeight;\n    // have the element transition to the height of its inner content\n    element.style.height = sectionHeight + 'px';\n    // when the next css transition finishes (which should be the one we just triggered)\n    element.addEventListener('transitionend', function (e) {\n      // remove \"height\" from the element's inline styles, so it can return to its initial value\n      element.style.height = 'auto';\n      callback();\n    }, {\n      once: true\n    });\n  };\n  this.toggle = element => {\n    if (element.classList.contains('closed')) {\n      this.open(element);\n    } else {\n      this.close(element);\n    }\n  };\n}\n/* harmony default export */ __webpack_exports__[\"default\"] = (PixSlideToggle);\n\n//# sourceURL=webpack://pixLib/./js/utils/PixSlideToggle.js?\n}");
96
97/***/ }),
98
vendor: 49,136 bytes, lines 99-108
99/***/ "./node_modules/chosen-js/chosen.jquery.js":
100/*!*************************************************!*\
101  !*** ./node_modules/chosen-js/chosen.jquery.js ***!
102  \*************************************************/
103/***/ (function() {
104
105eval("{(function() {\n  var $, AbstractChosen, Chosen, SelectParser,\n    bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  SelectParser = (function() {\n    function SelectParser() {\n      this.options_index = 0;\n      this.parsed = [];\n    }\n\n    SelectParser.prototype.add_node = function(child) {\n      if (child.nodeName.toUpperCase() === \"OPTGROUP\") {\n        return this.add_group(child);\n      } else {\n        return this.add_option(child);\n      }\n    };\n\n    SelectParser.prototype.add_group = function(group) {\n      var group_position, i, len, option, ref, results1;\n      group_position = this.parsed.length;\n      this.parsed.push({\n        array_index: group_position,\n        group: true,\n        label: group.label,\n        title: group.title ? group.title : void 0,\n        children: 0,\n        disabled: group.disabled,\n        classes: group.className\n      });\n      ref = group.childNodes;\n      results1 = [];\n      for (i = 0, len = ref.length; i < len; i++) {\n        option = ref[i];\n        results1.push(this.add_option(option, group_position, group.disabled));\n      }\n      return results1;\n    };\n\n    SelectParser.prototype.add_option = function(option, group_position, group_disabled) {\n      if (option.nodeName.toUpperCase() === \"OPTION\") {\n        if (option.text !== \"\") {\n          if (group_position != null) {\n            this.parsed[group_position].children += 1;\n          }\n          this.parsed.push({\n            array_index: this.parsed.length,\n            options_index: this.options_index,\n            value: option.value,\n            text: option.text,\n            html: option.innerHTML,\n            title: option.title ? option.title : void 0,\n            selected: option.selected,\n            disabled: group_disabled === true ? group_disabled : option.disabled,\n            group_array_index: group_position,\n            group_label: group_position != null ? this.parsed[group_position].label : null,\n            classes: option.className,\n            style: option.style.cssText\n          });\n        } else {\n          this.parsed.push({\n            array_index: this.parsed.length,\n            options_index: this.options_index,\n            empty: true\n          });\n        }\n        return this.options_index += 1;\n      }\n    };\n\n    return SelectParser;\n\n  })();\n\n  SelectParser.select_to_array = function(select) {\n    var child, i, len, parser, ref;\n    parser = new SelectParser();\n    ref = select.childNodes;\n    for (i = 0, len = ref.length; i < len; i++) {\n      child = ref[i];\n      parser.add_node(child);\n    }\n    return parser.parsed;\n  };\n\n  AbstractChosen = (function() {\n    function AbstractChosen(form_field, options1) {\n      this.form_field = form_field;\n      this.options = options1 != null ? options1 : {};\n      this.label_click_handler = bind(this.label_click_handler, this);\n      if (!AbstractChosen.browser_is_supported()) {\n        return;\n      }\n      this.is_multiple = this.form_field.multiple;\n      this.set_default_text();\n      this.set_default_values();\n      this.setup();\n      this.set_up_html();\n      this.register_observers();\n      this.on_ready();\n    }\n\n    AbstractChosen.prototype.set_default_values = function() {\n      this.click_test_action = (function(_this) {\n        return function(evt) {\n          return _this.test_active_click(evt);\n        };\n      })(this);\n      this.activate_action = (function(_this) {\n        return function(evt) {\n          return _this.activate_field(evt);\n        };\n      })(this);\n      this.active_field = false;\n      this.mouse_on_container = false;\n      this.results_showing = false;\n      this.result_highlighted = null;\n      this.is_rtl = this.options.rtl || /\\bchosen-rtl\\b/.test(this.form_field.className);\n      this.allow_single_deselect = (this.options.allow_single_deselect != null) && (this.form_field.options[0] != null) && this.form_field.options[0].text === \"\" ? this.options.allow_single_deselect : false;\n      this.disable_search_threshold = this.options.disable_search_threshold || 0;\n      this.disable_search = this.options.disable_search || false;\n      this.enable_split_word_search = this.options.enable_split_word_search != null ? this.options.enable_split_word_search : true;\n      this.group_search = this.options.group_search != null ? this.options.group_search : true;\n      this.search_contains = this.options.search_contains || false;\n      this.single_backstroke_delete = this.options.single_backstroke_delete != null ? this.options.single_backstroke_delete : true;\n      this.max_selected_options = this.options.max_selected_options || Infinity;\n      this.inherit_select_classes = this.options.inherit_select_classes || false;\n      this.display_selected_options = this.options.display_selected_options != null ? this.options.display_selected_options : true;\n      this.display_disabled_options = this.options.display_disabled_options != null ? this.options.display_disabled_options : true;\n      this.include_group_label_in_selected = this.options.include_group_label_in_selected || false;\n      this.max_shown_results = this.options.max_shown_results || Number.POSITIVE_INFINITY;\n      this.case_sensitive_search = this.options.case_sensitive_search || false;\n      return this.hide_results_on_select = this.options.hide_results_on_select != null ? this.options.hide_results_on_select : true;\n    };\n\n    AbstractChosen.prototype.set_default_text = function() {\n      if (this.form_field.getAttribute(\"data-placeholder\")) {\n        this.default_text = this.form_field.getAttribute(\"data-placeholder\");\n      } else if (this.is_multiple) {\n        this.default_text = this.options.placeholder_text_multiple || this.options.placeholder_text || AbstractChosen.default_multiple_text;\n      } else {\n        this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || AbstractChosen.default_single_text;\n      }\n      this.default_text = this.escape_html(this.default_text);\n      return this.results_none_found = this.form_field.getAttribute(\"data-no_results_text\") || this.options.no_results_text || AbstractChosen.default_no_result_text;\n    };\n\n    AbstractChosen.prototype.choice_label = function(item) {\n      if (this.include_group_label_in_selected && (item.group_label != null)) {\n        return \"<b class='group-name'>\" + (this.escape_html(item.group_label)) + \"</b>\" + item.html;\n      } else {\n        return item.html;\n      }\n    };\n\n    AbstractChosen.prototype.mouse_enter = function() {\n      return this.mouse_on_container = true;\n    };\n\n    AbstractChosen.prototype.mouse_leave = function() {\n      return this.mouse_on_container = false;\n    };\n\n    AbstractChosen.prototype.input_focus = function(evt) {\n      if (this.is_multiple) {\n        if (!this.active_field) {\n          return setTimeout(((function(_this) {\n            return function() {\n              return _this.container_mousedown();\n            };\n          })(this)), 50);\n        }\n      } else {\n        if (!this.active_field) {\n          return this.activate_field();\n        }\n      }\n    };\n\n    AbstractChosen.prototype.input_blur = function(evt) {\n      if (!this.mouse_on_container) {\n        this.active_field = false;\n        return setTimeout(((function(_this) {\n          return function() {\n            return _this.blur_test();\n          };\n        })(this)), 100);\n      }\n    };\n\n    AbstractChosen.prototype.label_click_handler = function(evt) {\n      if (this.is_multiple) {\n        return this.container_mousedown(evt);\n      } else {\n        return this.activate_field();\n      }\n    };\n\n    AbstractChosen.prototype.results_option_build = function(options) {\n      var content, data, data_content, i, len, ref, shown_results;\n      content = '';\n      shown_results = 0;\n      ref = this.results_data;\n      for (i = 0, len = ref.length; i < len; i++) {\n        data = ref[i];\n        data_content = '';\n        if (data.group) {\n          data_content = this.result_add_group(data);\n        } else {\n          data_content = this.result_add_option(data);\n        }\n        if (data_content !== '') {\n          shown_results++;\n          content += data_content;\n        }\n        if (options != null ? options.first : void 0) {\n          if (data.selected && this.is_multiple) {\n            this.choice_build(data);\n          } else if (data.selected && !this.is_multiple) {\n            this.single_set_selected_text(this.choice_label(data));\n          }\n        }\n        if (shown_results >= this.max_shown_results) {\n          break;\n        }\n      }\n      return content;\n    };\n\n    AbstractChosen.prototype.result_add_option = function(option) {\n      var classes, option_el;\n      if (!option.search_match) {\n        return '';\n      }\n      if (!this.include_option_in_results(option)) {\n        return '';\n      }\n      classes = [];\n      if (!option.disabled && !(option.selected && this.is_multiple)) {\n        classes.push(\"active-result\");\n      }\n      if (option.disabled && !(option.selected && this.is_multiple)) {\n        classes.push(\"disabled-result\");\n      }\n      if (option.selected) {\n        classes.push(\"result-selected\");\n      }\n      if (option.group_array_index != null) {\n        classes.push(\"group-option\");\n      }\n      if (option.classes !== \"\") {\n        classes.push(option.classes);\n      }\n      option_el = document.createElement(\"li\");\n      option_el.className = classes.join(\" \");\n      if (option.style) {\n        option_el.style.cssText = option.style;\n      }\n      option_el.setAttribute(\"data-option-array-index\", option.array_index);\n      option_el.innerHTML = option.highlighted_html || option.html;\n      if (option.title) {\n        option_el.title = option.title;\n      }\n      return this.outerHTML(option_el);\n    };\n\n    AbstractChosen.prototype.result_add_group = function(group) {\n      var classes, group_el;\n      if (!(group.search_match || group.group_match)) {\n        return '';\n      }\n      if (!(group.active_options > 0)) {\n        return '';\n      }\n      classes = [];\n      classes.push(\"group-result\");\n      if (group.classes) {\n        classes.push(group.classes);\n      }\n      group_el = document.createElement(\"li\");\n      group_el.className = classes.join(\" \");\n      group_el.innerHTML = group.highlighted_html || this.escape_html(group.label);\n      if (group.title) {\n        group_el.title = group.title;\n      }\n      return this.outerHTML(group_el);\n    };\n\n    AbstractChosen.prototype.results_update_field = function() {\n      this.set_default_text();\n      if (!this.is_multiple) {\n        this.results_reset_cleanup();\n      }\n      this.result_clear_highlight();\n      this.results_build();\n      if (this.results_showing) {\n        return this.winnow_results();\n      }\n    };\n\n    AbstractChosen.prototype.reset_single_select_options = function() {\n      var i, len, ref, result, results1;\n      ref = this.results_data;\n      results1 = [];\n      for (i = 0, len = ref.length; i < len; i++) {\n        result = ref[i];\n        if (result.selected) {\n          results1.push(result.selected = false);\n        } else {\n          results1.push(void 0);\n        }\n      }\n      return results1;\n    };\n\n    AbstractChosen.prototype.results_toggle = function() {\n      if (this.results_showing) {\n        return this.results_hide();\n      } else {\n        return this.results_show();\n      }\n    };\n\n    AbstractChosen.prototype.results_search = function(evt) {\n      if (this.results_showing) {\n        return this.winnow_results();\n      } else {\n        return this.results_show();\n      }\n    };\n\n    AbstractChosen.prototype.winnow_results = function(options) {\n      var escapedQuery, fix, i, len, option, prefix, query, ref, regex, results, results_group, search_match, startpos, suffix, text;\n      this.no_results_clear();\n      results = 0;\n      query = this.get_search_text();\n      escapedQuery = query.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, \"\\\\$&\");\n      regex = this.get_search_regex(escapedQuery);\n      ref = this.results_data;\n      for (i = 0, len = ref.length; i < len; i++) {\n        option = ref[i];\n        option.search_match = false;\n        results_group = null;\n        search_match = null;\n        option.highlighted_html = '';\n        if (this.include_option_in_results(option)) {\n          if (option.group) {\n            option.group_match = false;\n            option.active_options = 0;\n          }\n          if ((option.group_array_index != null) && this.results_data[option.group_array_index]) {\n            results_group = this.results_data[option.group_array_index];\n            if (results_group.active_options === 0 && results_group.search_match) {\n              results += 1;\n            }\n            results_group.active_options += 1;\n          }\n          text = option.group ? option.label : option.text;\n          if (!(option.group && !this.group_search)) {\n            search_match = this.search_string_match(text, regex);\n            option.search_match = search_match != null;\n            if (option.search_match && !option.group) {\n              results += 1;\n            }\n            if (option.search_match) {\n              if (query.length) {\n                startpos = search_match.index;\n                prefix = text.slice(0, startpos);\n                fix = text.slice(startpos, startpos + query.length);\n                suffix = text.slice(startpos + query.length);\n                option.highlighted_html = (this.escape_html(prefix)) + \"<em>\" + (this.escape_html(fix)) + \"</em>\" + (this.escape_html(suffix));\n              }\n              if (results_group != null) {\n                results_group.group_match = true;\n              }\n            } else if ((option.group_array_index != null) && this.results_data[option.group_array_index].search_match) {\n              option.search_match = true;\n            }\n          }\n        }\n      }\n      this.result_clear_highlight();\n      if (results < 1 && query.length) {\n        this.update_results_content(\"\");\n        return this.no_results(query);\n      } else {\n        this.update_results_content(this.results_option_build());\n        if (!(options != null ? options.skip_highlight : void 0)) {\n          return this.winnow_results_set_highlight();\n        }\n      }\n    };\n\n    AbstractChosen.prototype.get_search_regex = function(escaped_search_string) {\n      var regex_flag, regex_string;\n      regex_string = this.search_contains ? escaped_search_string : \"(^|\\\\s|\\\\b)\" + escaped_search_string + \"[^\\\\s]*\";\n      if (!(this.enable_split_word_search || this.search_contains)) {\n        regex_string = \"^\" + regex_string;\n      }\n      regex_flag = this.case_sensitive_search ? \"\" : \"i\";\n      return new RegExp(regex_string, regex_flag);\n    };\n\n    AbstractChosen.prototype.search_string_match = function(search_string, regex) {\n      var match;\n      match = regex.exec(search_string);\n      if (!this.search_contains && (match != null ? match[1] : void 0)) {\n        match.index += 1;\n      }\n      return match;\n    };\n\n    AbstractChosen.prototype.choices_count = function() {\n      var i, len, option, ref;\n      if (this.selected_option_count != null) {\n        return this.selected_option_count;\n      }\n      this.selected_option_count = 0;\n      ref = this.form_field.options;\n      for (i = 0, len = ref.length; i < len; i++) {\n        option = ref[i];\n        if (option.selected) {\n          this.selected_option_count += 1;\n        }\n      }\n      return this.selected_option_count;\n    };\n\n    AbstractChosen.prototype.choices_click = function(evt) {\n      evt.preventDefault();\n      this.activate_field();\n      if (!(this.results_showing || this.is_disabled)) {\n        return this.results_show();\n      }\n    };\n\n    AbstractChosen.prototype.keydown_checker = function(evt) {\n      var ref, stroke;\n      stroke = (ref = evt.which) != null ? ref : evt.keyCode;\n      this.search_field_scale();\n      if (stroke !== 8 && this.pending_backstroke) {\n        this.clear_backstroke();\n      }\n      switch (stroke) {\n        case 8:\n          this.backstroke_length = this.get_search_field_value().length;\n          break;\n        case 9:\n          if (this.results_showing && !this.is_multiple) {\n            this.result_select(evt);\n          }\n          this.mouse_on_container = false;\n          break;\n        case 13:\n          if (this.results_showing) {\n            evt.preventDefault();\n          }\n          break;\n        case 27:\n          if (this.results_showing) {\n            evt.preventDefault();\n          }\n          break;\n        case 32:\n          if (this.disable_search) {\n            evt.preventDefault();\n          }\n          break;\n        case 38:\n          evt.preventDefault();\n          this.keyup_arrow();\n          break;\n        case 40:\n          evt.preventDefault();\n          this.keydown_arrow();\n          break;\n      }\n    };\n\n    AbstractChosen.prototype.keyup_checker = function(evt) {\n      var ref, stroke;\n      stroke = (ref = evt.which) != null ? ref : evt.keyCode;\n      this.search_field_scale();\n      switch (stroke) {\n        case 8:\n          if (this.is_multiple && this.backstroke_length < 1 && this.choices_count() > 0) {\n            this.keydown_backstroke();\n          } else if (!this.pending_backstroke) {\n            this.result_clear_highlight();\n            this.results_search();\n          }\n          break;\n        case 13:\n          evt.preventDefault();\n          if (this.results_showing) {\n            this.result_select(evt);\n          }\n          break;\n        case 27:\n          if (this.results_showing) {\n            this.results_hide();\n          }\n          break;\n        case 9:\n        case 16:\n        case 17:\n        case 18:\n        case 38:\n        case 40:\n        case 91:\n          break;\n        default:\n          this.results_search();\n          break;\n      }\n    };\n\n    AbstractChosen.prototype.clipboard_event_checker = function(evt) {\n      if (this.is_disabled) {\n        return;\n      }\n      return setTimeout(((function(_this) {\n        return function() {\n          return _this.results_search();\n        };\n      })(this)), 50);\n    };\n\n    AbstractChosen.prototype.container_width = function() {\n      if (this.options.width != null) {\n        return this.options.width;\n      } else {\n        return this.form_field.offsetWidth + \"px\";\n      }\n    };\n\n    AbstractChosen.prototype.include_option_in_results = function(option) {\n      if (this.is_multiple && (!this.display_selected_options && option.selected)) {\n        return false;\n      }\n      if (!this.display_disabled_options && option.disabled) {\n        return false;\n      }\n      if (option.empty) {\n        return false;\n      }\n      return true;\n    };\n\n    AbstractChosen.prototype.search_results_touchstart = function(evt) {\n      this.touch_started = true;\n      return this.search_results_mouseover(evt);\n    };\n\n    AbstractChosen.prototype.search_results_touchmove = function(evt) {\n      this.touch_started = false;\n      return this.search_results_mouseout(evt);\n    };\n\n    AbstractChosen.prototype.search_results_touchend = function(evt) {\n      if (this.touch_started) {\n        return this.search_results_mouseup(evt);\n      }\n    };\n\n    AbstractChosen.prototype.outerHTML = function(element) {\n      var tmp;\n      if (element.outerHTML) {\n        return element.outerHTML;\n      }\n      tmp = document.createElement(\"div\");\n      tmp.appendChild(element);\n      return tmp.innerHTML;\n    };\n\n    AbstractChosen.prototype.get_single_html = function() {\n      return \"<a class=\\\"chosen-single chosen-default\\\">\\n  <span>\" + this.default_text + \"</span>\\n  <div><b></b></div>\\n</a>\\n<div class=\\\"chosen-drop\\\">\\n  <div class=\\\"chosen-search\\\">\\n    <input class=\\\"chosen-search-input\\\" type=\\\"text\\\" autocomplete=\\\"off\\\" />\\n  </div>\\n  <ul class=\\\"chosen-results\\\"></ul>\\n</div>\";\n    };\n\n    AbstractChosen.prototype.get_multi_html = function() {\n      return \"<ul class=\\\"chosen-choices\\\">\\n  <li class=\\\"search-field\\\">\\n    <input class=\\\"chosen-search-input\\\" type=\\\"text\\\" autocomplete=\\\"off\\\" value=\\\"\" + this.default_text + \"\\\" />\\n  </li>\\n</ul>\\n<div class=\\\"chosen-drop\\\">\\n  <ul class=\\\"chosen-results\\\"></ul>\\n</div>\";\n    };\n\n    AbstractChosen.prototype.get_no_results_html = function(terms) {\n      return \"<li class=\\\"no-results\\\">\\n  \" + this.results_none_found + \" <span>\" + (this.escape_html(terms)) + \"</span>\\n</li>\";\n    };\n\n    AbstractChosen.browser_is_supported = function() {\n      if (\"Microsoft Internet Explorer\" === window.navigator.appName) {\n        return document.documentMode >= 8;\n      }\n      if (/iP(od|hone)/i.test(window.navigator.userAgent) || /IEMobile/i.test(window.navigator.userAgent) || /Windows Phone/i.test(window.navigator.userAgent) || /BlackBerry/i.test(window.navigator.userAgent) || /BB10/i.test(window.navigator.userAgent) || /Android.*Mobile/i.test(window.navigator.userAgent)) {\n        return false;\n      }\n      return true;\n    };\n\n    AbstractChosen.default_multiple_text = \"Select Some Options\";\n\n    AbstractChosen.default_single_text = \"Select an Option\";\n\n    AbstractChosen.default_no_result_text = \"No results match\";\n\n    return AbstractChosen;\n\n  })();\n\n  $ = jQuery;\n\n  $.fn.extend({\n    chosen: function(options) {\n      if (!AbstractChosen.browser_is_supported()) {\n        return this;\n      }\n      return this.each(function(input_field) {\n        var $this, chosen;\n        $this = $(this);\n        chosen = $this.data('chosen');\n        if (options === 'destroy') {\n          if (chosen instanceof Chosen) {\n            chosen.destroy();\n          }\n          return;\n        }\n        if (!(chosen instanceof Chosen)) {\n          $this.data('chosen', new Chosen(this, options));\n        }\n      });\n    }\n  });\n\n  Chosen = (function(superClass) {\n    extend(Chosen, superClass);\n\n    function Chosen() {\n      return Chosen.__super__.constructor.apply(this, arguments);\n    }\n\n    Chosen.prototype.setup = function() {\n      this.form_field_jq = $(this.form_field);\n      return this.current_selectedIndex = this.form_field.selectedIndex;\n    };\n\n    Chosen.prototype.set_up_html = function() {\n      var container_classes, container_props;\n      container_classes = [\"chosen-container\"];\n      container_classes.push(\"chosen-container-\" + (this.is_multiple ? \"multi\" : \"single\"));\n      if (this.inherit_select_classes && this.form_field.className) {\n        container_classes.push(this.form_field.className);\n      }\n      if (this.is_rtl) {\n        container_classes.push(\"chosen-rtl\");\n      }\n      container_props = {\n        'class': container_classes.join(' '),\n        'title': this.form_field.title\n      };\n      if (this.form_field.id.length) {\n        container_props.id = this.form_field.id.replace(/[^\\w]/g, '_') + \"_chosen\";\n      }\n      this.container = $(\"<div />\", container_props);\n      this.container.width(this.container_width());\n      if (this.is_multiple) {\n        this.container.html(this.get_multi_html());\n      } else {\n        this.container.html(this.get_single_html());\n      }\n      this.form_field_jq.hide().after(this.container);\n      this.dropdown = this.container.find('div.chosen-drop').first();\n      this.search_field = this.container.find('input').first();\n      this.search_results = this.container.find('ul.chosen-results').first();\n      this.search_field_scale();\n      this.search_no_results = this.container.find('li.no-results').first();\n      if (this.is_multiple) {\n        this.search_choices = this.container.find('ul.chosen-choices').first();\n        this.search_container = this.container.find('li.search-field').first();\n      } else {\n        this.search_container = this.container.find('div.chosen-search').first();\n        this.selected_item = this.container.find('.chosen-single').first();\n      }\n      this.results_build();\n      this.set_tab_index();\n      return this.set_label_behavior();\n    };\n\n    Chosen.prototype.on_ready = function() {\n      return this.form_field_jq.trigger(\"chosen:ready\", {\n        chosen: this\n      });\n    };\n\n    Chosen.prototype.register_observers = function() {\n      this.container.on('touchstart.chosen', (function(_this) {\n        return function(evt) {\n          _this.container_mousedown(evt);\n        };\n      })(this));\n      this.container.on('touchend.chosen', (function(_this) {\n        return function(evt) {\n          _this.container_mouseup(evt);\n        };\n      })(this));\n      this.container.on('mousedown.chosen', (function(_this) {\n        return function(evt) {\n          _this.container_mousedown(evt);\n        };\n      })(this));\n      this.container.on('mouseup.chosen', (function(_this) {\n        return function(evt) {\n          _this.container_mouseup(evt);\n        };\n      })(this));\n      this.container.on('mouseenter.chosen', (function(_this) {\n        return function(evt) {\n          _this.mouse_enter(evt);\n        };\n      })(this));\n      this.container.on('mouseleave.chosen', (function(_this) {\n        return function(evt) {\n          _this.mouse_leave(evt);\n        };\n      })(this));\n      this.search_results.on('mouseup.chosen', (function(_this) {\n        return function(evt) {\n          _this.search_results_mouseup(evt);\n        };\n      })(this));\n      this.search_results.on('mouseover.chosen', (function(_this) {\n        return function(evt) {\n          _this.search_results_mouseover(evt);\n        };\n      })(this));\n      this.search_results.on('mouseout.chosen', (function(_this) {\n        return function(evt) {\n          _this.search_results_mouseout(evt);\n        };\n      })(this));\n      this.search_results.on('mousewheel.chosen DOMMouseScroll.chosen', (function(_this) {\n        return function(evt) {\n          _this.search_results_mousewheel(evt);\n        };\n      })(this));\n      this.search_results.on('touchstart.chosen', (function(_this) {\n        return function(evt) {\n          _this.search_results_touchstart(evt);\n        };\n      })(this));\n      this.search_results.on('touchmove.chosen', (function(_this) {\n        return function(evt) {\n          _this.search_results_touchmove(evt);\n        };\n      })(this));\n      this.search_results.on('touchend.chosen', (function(_this) {\n        return function(evt) {\n          _this.search_results_touchend(evt);\n        };\n      })(this));\n      this.form_field_jq.on(\"chosen:updated.chosen\", (function(_this) {\n        return function(evt) {\n          _this.results_update_field(evt);\n        };\n      })(this));\n      this.form_field_jq.on(\"chosen:activate.chosen\", (function(_this) {\n        return function(evt) {\n          _this.activate_field(evt);\n        };\n      })(this));\n      this.form_field_jq.on(\"chosen:open.chosen\", (function(_this) {\n        return function(evt) {\n          _this.container_mousedown(evt);\n        };\n      })(this));\n      this.form_field_jq.on(\"chosen:close.chosen\", (function(_this) {\n        return function(evt) {\n          _this.close_field(evt);\n        };\n      })(this));\n      this.search_field.on('blur.chosen', (function(_this) {\n        return function(evt) {\n          _this.input_blur(evt);\n        };\n      })(this));\n      this.search_field.on('keyup.chosen', (function(_this) {\n        return function(evt) {\n          _this.keyup_checker(evt);\n        };\n      })(this));\n      this.search_field.on('keydown.chosen', (function(_this) {\n        return function(evt) {\n          _this.keydown_checker(evt);\n        };\n      })(this));\n      this.search_field.on('focus.chosen', (function(_this) {\n        return function(evt) {\n          _this.input_focus(evt);\n        };\n      })(this));\n      this.search_field.on('cut.chosen', (function(_this) {\n        return function(evt) {\n          _this.clipboard_event_checker(evt);\n        };\n      })(this));\n      this.search_field.on('paste.chosen', (function(_this) {\n        return function(evt) {\n          _this.clipboard_event_checker(evt);\n        };\n      })(this));\n      if (this.is_multiple) {\n        return this.search_choices.on('click.chosen', (function(_this) {\n          return function(evt) {\n            _this.choices_click(evt);\n          };\n        })(this));\n      } else {\n        return this.container.on('click.chosen', function(evt) {\n          evt.preventDefault();\n        });\n      }\n    };\n\n    Chosen.prototype.destroy = function() {\n      $(this.container[0].ownerDocument).off('click.chosen', this.click_test_action);\n      if (this.form_field_label.length > 0) {\n        this.form_field_label.off('click.chosen');\n      }\n      if (this.search_field[0].tabIndex) {\n        this.form_field_jq[0].tabIndex = this.search_field[0].tabIndex;\n      }\n      this.container.remove();\n      this.form_field_jq.removeData('chosen');\n      return this.form_field_jq.show();\n    };\n\n    Chosen.prototype.search_field_disabled = function() {\n      this.is_disabled = this.form_field.disabled || this.form_field_jq.parents('fieldset').is(':disabled');\n      this.container.toggleClass('chosen-disabled', this.is_disabled);\n      this.search_field[0].disabled = this.is_disabled;\n      if (!this.is_multiple) {\n        this.selected_item.off('focus.chosen', this.activate_field);\n      }\n      if (this.is_disabled) {\n        return this.close_field();\n      } else if (!this.is_multiple) {\n        return this.selected_item.on('focus.chosen', this.activate_field);\n      }\n    };\n\n    Chosen.prototype.container_mousedown = function(evt) {\n      var ref;\n      if (this.is_disabled) {\n        return;\n      }\n      if (evt && ((ref = evt.type) === 'mousedown' || ref === 'touchstart') && !this.results_showing) {\n        evt.preventDefault();\n      }\n      if (!((evt != null) && ($(evt.target)).hasClass(\"search-choice-close\"))) {\n        if (!this.active_field) {\n          if (this.is_multiple) {\n            this.search_field.val(\"\");\n          }\n          $(this.container[0].ownerDocument).on('click.chosen', this.click_test_action);\n          this.results_show();\n        } else if (!this.is_multiple && evt && (($(evt.target)[0] === this.selected_item[0]) || $(evt.target).parents(\"a.chosen-single\").length)) {\n          evt.preventDefault();\n          this.results_toggle();\n        }\n        return this.activate_field();\n      }\n    };\n\n    Chosen.prototype.container_mouseup = function(evt) {\n      if (evt.target.nodeName === \"ABBR\" && !this.is_disabled) {\n        return this.results_reset(evt);\n      }\n    };\n\n    Chosen.prototype.search_results_mousewheel = function(evt) {\n      var delta;\n      if (evt.originalEvent) {\n        delta = evt.originalEvent.deltaY || -evt.originalEvent.wheelDelta || evt.originalEvent.detail;\n      }\n      if (delta != null) {\n        evt.preventDefault();\n        if (evt.type === 'DOMMouseScroll') {\n          delta = delta * 40;\n        }\n        return this.search_results.scrollTop(delta + this.search_results.scrollTop());\n      }\n    };\n\n    Chosen.prototype.blur_test = function(evt) {\n      if (!this.active_field && this.container.hasClass(\"chosen-container-active\")) {\n        return this.close_field();\n      }\n    };\n\n    Chosen.prototype.close_field = function() {\n      $(this.container[0].ownerDocument).off(\"click.chosen\", this.click_test_action);\n      this.active_field = false;\n      this.results_hide();\n      this.container.removeClass(\"chosen-container-active\");\n      this.clear_backstroke();\n      this.show_search_field_default();\n      this.search_field_scale();\n      return this.search_field.blur();\n    };\n\n    Chosen.prototype.activate_field = function() {\n      if (this.is_disabled) {\n        return;\n      }\n      this.container.addClass(\"chosen-container-active\");\n      this.active_field = true;\n      this.search_field.val(this.search_field.val());\n      return this.search_field.focus();\n    };\n\n    Chosen.prototype.test_active_click = function(evt) {\n      var active_container;\n      active_container = $(evt.target).closest('.chosen-container');\n      if (active_container.length && this.container[0] === active_container[0]) {\n        return this.active_field = true;\n      } else {\n        return this.close_field();\n      }\n    };\n\n    Chosen.prototype.results_build = function() {\n      this.parsing = true;\n      this.selected_option_count = null;\n      this.results_data = SelectParser.select_to_array(this.form_field);\n      if (this.is_multiple) {\n        this.search_choices.find(\"li.search-choice\").remove();\n      } else {\n        this.single_set_selected_text();\n        if (this.disable_search || this.form_field.options.length <= this.disable_search_threshold) {\n          this.search_field[0].readOnly = true;\n          this.container.addClass(\"chosen-container-single-nosearch\");\n        } else {\n          this.search_field[0].readOnly = false;\n          this.container.removeClass(\"chosen-container-single-nosearch\");\n        }\n      }\n      this.update_results_content(this.results_option_build({\n        first: true\n      }));\n      this.search_field_disabled();\n      this.show_search_field_default();\n      this.search_field_scale();\n      return this.parsing = false;\n    };\n\n    Chosen.prototype.result_do_highlight = function(el) {\n      var high_bottom, high_top, maxHeight, visible_bottom, visible_top;\n      if (el.length) {\n        this.result_clear_highlight();\n        this.result_highlight = el;\n        this.result_highlight.addClass(\"highlighted\");\n        maxHeight = parseInt(this.search_results.css(\"maxHeight\"), 10);\n        visible_top = this.search_results.scrollTop();\n        visible_bottom = maxHeight + visible_top;\n        high_top = this.result_highlight.position().top + this.search_results.scrollTop();\n        high_bottom = high_top + this.result_highlight.outerHeight();\n        if (high_bottom >= visible_bottom) {\n          return this.search_results.scrollTop((high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0);\n        } else if (high_top < visible_top) {\n          return this.search_results.scrollTop(high_top);\n        }\n      }\n    };\n\n    Chosen.prototype.result_clear_highlight = function() {\n      if (this.result_highlight) {\n        this.result_highlight.removeClass(\"highlighted\");\n      }\n      return this.result_highlight = null;\n    };\n\n    Chosen.prototype.results_show = function() {\n      if (this.is_multiple && this.max_selected_options <= this.choices_count()) {\n        this.form_field_jq.trigger(\"chosen:maxselected\", {\n          chosen: this\n        });\n        return false;\n      }\n      this.container.addClass(\"chosen-with-drop\");\n      this.results_showing = true;\n      this.search_field.focus();\n      this.search_field.val(this.get_search_field_value());\n      this.winnow_results();\n      return this.form_field_jq.trigger(\"chosen:showing_dropdown\", {\n        chosen: this\n      });\n    };\n\n    Chosen.prototype.update_results_content = function(content) {\n      return this.search_results.html(content);\n    };\n\n    Chosen.prototype.results_hide = function() {\n      if (this.results_showing) {\n        this.result_clear_highlight();\n        this.container.removeClass(\"chosen-with-drop\");\n        this.form_field_jq.trigger(\"chosen:hiding_dropdown\", {\n          chosen: this\n        });\n      }\n      return this.results_showing = false;\n    };\n\n    Chosen.prototype.set_tab_index = function(el) {\n      var ti;\n      if (this.form_field.tabIndex) {\n        ti = this.form_field.tabIndex;\n        this.form_field.tabIndex = -1;\n        return this.search_field[0].tabIndex = ti;\n      }\n    };\n\n    Chosen.prototype.set_label_behavior = function() {\n      this.form_field_label = this.form_field_jq.parents(\"label\");\n      if (!this.form_field_label.length && this.form_field.id.length) {\n        this.form_field_label = $(\"label[for='\" + this.form_field.id + \"']\");\n      }\n      if (this.form_field_label.length > 0) {\n        return this.form_field_label.on('click.chosen', this.label_click_handler);\n      }\n    };\n\n    Chosen.prototype.show_search_field_default = function() {\n      if (this.is_multiple && this.choices_count() < 1 && !this.active_field) {\n        this.search_field.val(this.default_text);\n        return this.search_field.addClass(\"default\");\n      } else {\n        this.search_field.val(\"\");\n        return this.search_field.removeClass(\"default\");\n      }\n    };\n\n    Chosen.prototype.search_results_mouseup = function(evt) {\n      var target;\n      target = $(evt.target).hasClass(\"active-result\") ? $(evt.target) : $(evt.target).parents(\".active-result\").first();\n      if (target.length) {\n        this.result_highlight = target;\n        this.result_select(evt);\n        return this.search_field.focus();\n      }\n    };\n\n    Chosen.prototype.search_results_mouseover = function(evt) {\n      var target;\n      target = $(evt.target).hasClass(\"active-result\") ? $(evt.target) : $(evt.target).parents(\".active-result\").first();\n      if (target) {\n        return this.result_do_highlight(target);\n      }\n    };\n\n    Chosen.prototype.search_results_mouseout = function(evt) {\n      if ($(evt.target).hasClass(\"active-result\") || $(evt.target).parents('.active-result').first()) {\n        return this.result_clear_highlight();\n      }\n    };\n\n    Chosen.prototype.choice_build = function(item) {\n      var choice, close_link;\n      choice = $('<li />', {\n        \"class\": \"search-choice\"\n      }).html(\"<span>\" + (this.choice_label(item)) + \"</span>\");\n      if (item.disabled) {\n        choice.addClass('search-choice-disabled');\n      } else {\n        close_link = $('<a />', {\n          \"class\": 'search-choice-close',\n          'data-option-array-index': item.array_index\n        });\n        close_link.on('click.chosen', (function(_this) {\n          return function(evt) {\n            return _this.choice_destroy_link_click(evt);\n          };\n        })(this));\n        choice.append(close_link);\n      }\n      return this.search_container.before(choice);\n    };\n\n    Chosen.prototype.choice_destroy_link_click = function(evt) {\n      evt.preventDefault();\n      evt.stopPropagation();\n      if (!this.is_disabled) {\n        return this.choice_destroy($(evt.target));\n      }\n    };\n\n    Chosen.prototype.choice_destroy = function(link) {\n      if (this.result_deselect(link[0].getAttribute(\"data-option-array-index\"))) {\n        if (this.active_field) {\n          this.search_field.focus();\n        } else {\n          this.show_search_field_default();\n        }\n        if (this.is_multiple && this.choices_count() > 0 && this.get_search_field_value().length < 1) {\n          this.results_hide();\n        }\n        link.parents('li').first().remove();\n        return this.search_field_scale();\n      }\n    };\n\n    Chosen.prototype.results_reset = function() {\n      this.reset_single_select_options();\n      this.form_field.options[0].selected = true;\n      this.single_set_selected_text();\n      this.show_search_field_default();\n      this.results_reset_cleanup();\n      this.trigger_form_field_change();\n      if (this.active_field) {\n        return this.results_hide();\n      }\n    };\n\n    Chosen.prototype.results_reset_cleanup = function() {\n      this.current_selectedIndex = this.form_field.selectedIndex;\n      return this.selected_item.find(\"abbr\").remove();\n    };\n\n    Chosen.prototype.result_select = function(evt) {\n      var high, item;\n      if (this.result_highlight) {\n        high = this.result_highlight;\n        this.result_clear_highlight();\n        if (this.is_multiple && this.max_selected_options <= this.choices_count()) {\n          this.form_field_jq.trigger(\"chosen:maxselected\", {\n            chosen: this\n          });\n          return false;\n        }\n        if (this.is_multiple) {\n          high.removeClass(\"active-result\");\n        } else {\n          this.reset_single_select_options();\n        }\n        high.addClass(\"result-selected\");\n        item = this.results_data[high[0].getAttribute(\"data-option-array-index\")];\n        item.selected = true;\n        this.form_field.options[item.options_index].selected = true;\n        this.selected_option_count = null;\n        if (this.is_multiple) {\n          this.choice_build(item);\n        } else {\n          this.single_set_selected_text(this.choice_label(item));\n        }\n        if (this.is_multiple && (!this.hide_results_on_select || (evt.metaKey || evt.ctrlKey))) {\n          if (evt.metaKey || evt.ctrlKey) {\n            this.winnow_results({\n              skip_highlight: true\n            });\n          } else {\n            this.search_field.val(\"\");\n            this.winnow_results();\n          }\n        } else {\n          this.results_hide();\n          this.show_search_field_default();\n        }\n        if (this.is_multiple || this.form_field.selectedIndex !== this.current_selectedIndex) {\n          this.trigger_form_field_change({\n            selected: this.form_field.options[item.options_index].value\n          });\n        }\n        this.current_selectedIndex = this.form_field.selectedIndex;\n        evt.preventDefault();\n        return this.search_field_scale();\n      }\n    };\n\n    Chosen.prototype.single_set_selected_text = function(text) {\n      if (text == null) {\n        text = this.default_text;\n      }\n      if (text === this.default_text) {\n        this.selected_item.addClass(\"chosen-default\");\n      } else {\n        this.single_deselect_control_build();\n        this.selected_item.removeClass(\"chosen-default\");\n      }\n      return this.selected_item.find(\"span\").html(text);\n    };\n\n    Chosen.prototype.result_deselect = function(pos) {\n      var result_data;\n      result_data = this.results_data[pos];\n      if (!this.form_field.options[result_data.options_index].disabled) {\n        result_data.selected = false;\n        this.form_field.options[result_data.options_index].selected = false;\n        this.selected_option_count = null;\n        this.result_clear_highlight();\n        if (this.results_showing) {\n          this.winnow_results();\n        }\n        this.trigger_form_field_change({\n          deselected: this.form_field.options[result_data.options_index].value\n        });\n        this.search_field_scale();\n        return true;\n      } else {\n        return false;\n      }\n    };\n\n    Chosen.prototype.single_deselect_control_build = function() {\n      if (!this.allow_single_deselect) {\n        return;\n      }\n      if (!this.selected_item.find(\"abbr\").length) {\n        this.selected_item.find(\"span\").first().after(\"<abbr class=\\\"search-choice-close\\\"></abbr>\");\n      }\n      return this.selected_item.addClass(\"chosen-single-with-deselect\");\n    };\n\n    Chosen.prototype.get_search_field_value = function() {\n      return this.search_field.val();\n    };\n\n    Chosen.prototype.get_search_text = function() {\n      return $.trim(this.get_search_field_value());\n    };\n\n    Chosen.prototype.escape_html = function(text) {\n      return $('<div/>').text(text).html();\n    };\n\n    Chosen.prototype.winnow_results_set_highlight = function() {\n      var do_high, selected_results;\n      selected_results = !this.is_multiple ? this.search_results.find(\".result-selected.active-result\") : [];\n      do_high = selected_results.length ? selected_results.first() : this.search_results.find(\".active-result\").first();\n      if (do_high != null) {\n        return this.result_do_highlight(do_high);\n      }\n    };\n\n    Chosen.prototype.no_results = function(terms) {\n      var no_results_html;\n      no_results_html = this.get_no_results_html(terms);\n      this.search_results.append(no_results_html);\n      return this.form_field_jq.trigger(\"chosen:no_results\", {\n        chosen: this\n      });\n    };\n\n    Chosen.prototype.no_results_clear = function() {\n      return this.search_results.find(\".no-results\").remove();\n    };\n\n    Chosen.prototype.keydown_arrow = function() {\n      var next_sib;\n      if (this.results_showing && this.result_highlight) {\n        next_sib = this.result_highlight.nextAll(\"li.active-result\").first();\n        if (next_sib) {\n          return this.result_do_highlight(next_sib);\n        }\n      } else {\n        return this.results_show();\n      }\n    };\n\n    Chosen.prototype.keyup_arrow = function() {\n      var prev_sibs;\n      if (!this.results_showing && !this.is_multiple) {\n        return this.results_show();\n      } else if (this.result_highlight) {\n        prev_sibs = this.result_highlight.prevAll(\"li.active-result\");\n        if (prev_sibs.length) {\n          return this.result_do_highlight(prev_sibs.first());\n        } else {\n          if (this.choices_count() > 0) {\n            this.results_hide();\n          }\n          return this.result_clear_highlight();\n        }\n      }\n    };\n\n    Chosen.prototype.keydown_backstroke = function() {\n      var next_available_destroy;\n      if (this.pending_backstroke) {\n        this.choice_destroy(this.pending_backstroke.find(\"a\").first());\n        return this.clear_backstroke();\n      } else {\n        next_available_destroy = this.search_container.siblings(\"li.search-choice\").last();\n        if (next_available_destroy.length && !next_available_destroy.hasClass(\"search-choice-disabled\")) {\n          this.pending_backstroke = next_available_destroy;\n          if (this.single_backstroke_delete) {\n            return this.keydown_backstroke();\n          } else {\n            return this.pending_backstroke.addClass(\"search-choice-focus\");\n          }\n        }\n      }\n    };\n\n    Chosen.prototype.clear_backstroke = function() {\n      if (this.pending_backstroke) {\n        this.pending_backstroke.removeClass(\"search-choice-focus\");\n      }\n      return this.pending_backstroke = null;\n    };\n\n    Chosen.prototype.search_field_scale = function() {\n      var div, i, len, style, style_block, styles, width;\n      if (!this.is_multiple) {\n        return;\n      }\n      style_block = {\n        position: 'absolute',\n        left: '-1000px',\n        top: '-1000px',\n        display: 'none',\n        whiteSpace: 'pre'\n      };\n      styles = ['fontSize', 'fontStyle', 'fontWeight', 'fontFamily', 'lineHeight', 'textTransform', 'letterSpacing'];\n      for (i = 0, len = styles.length; i < len; i++) {\n        style = styles[i];\n        style_block[style] = this.search_field.css(style);\n      }\n      div = $('<div />').css(style_block);\n      div.text(this.get_search_field_value());\n      $('body').append(div);\n      width = div.width() + 25;\n      div.remove();\n      if (this.container.is(':visible')) {\n        width = Math.min(this.container.outerWidth() - 10, width);\n      }\n      return this.search_field.width(width);\n    };\n\n    Chosen.prototype.trigger_form_field_change = function(extra) {\n      this.form_field_jq.trigger(\"input\", extra);\n      return this.form_field_jq.trigger(\"change\", extra);\n    };\n\n    return Chosen;\n\n  })(AbstractChosen);\n\n}).call(this);\n\n\n//# sourceURL=webpack://pixLib/./node_modules/chosen-js/chosen.jquery.js?\n}");
106
107/***/ }),
108
vendor: 69,139 bytes, lines 109-118
109/***/ "./node_modules/dompurify/dist/purify.js":
110/*!***********************************************!*\
111  !*** ./node_modules/dompurify/dist/purify.js ***!
112  \***********************************************/
113/***/ (function(module) {
114
115eval("{/*! @license DOMPurify 2.5.9 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/2.5.9/LICENSE */\n\n(function (global, factory) {\n   true ? module.exports = factory() :\n  0;\n})(this, (function () { 'use strict';\n\n  function _typeof(obj) {\n    \"@babel/helpers - typeof\";\n\n    return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n      return typeof obj;\n    } : function (obj) {\n      return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    }, _typeof(obj);\n  }\n  function _setPrototypeOf(o, p) {\n    _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n      o.__proto__ = p;\n      return o;\n    };\n    return _setPrototypeOf(o, p);\n  }\n  function _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n      Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n  function _construct(Parent, args, Class) {\n    if (_isNativeReflectConstruct()) {\n      _construct = Reflect.construct;\n    } else {\n      _construct = function _construct(Parent, args, Class) {\n        var a = [null];\n        a.push.apply(a, args);\n        var Constructor = Function.bind.apply(Parent, a);\n        var instance = new Constructor();\n        if (Class) _setPrototypeOf(instance, Class.prototype);\n        return instance;\n      };\n    }\n    return _construct.apply(null, arguments);\n  }\n  function _toConsumableArray(arr) {\n    return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n  }\n  function _arrayWithoutHoles(arr) {\n    if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n  }\n  function _iterableToArray(iter) {\n    if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n  }\n  function _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n  }\n  function _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n    return arr2;\n  }\n  function _nonIterableSpread() {\n    throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n  }\n\n  var hasOwnProperty = Object.hasOwnProperty,\n    setPrototypeOf = Object.setPrototypeOf,\n    isFrozen = Object.isFrozen,\n    getPrototypeOf = Object.getPrototypeOf,\n    getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n  var freeze = Object.freeze,\n    seal = Object.seal,\n    create = Object.create; // eslint-disable-line import/no-mutable-exports\n  var _ref = typeof Reflect !== 'undefined' && Reflect,\n    apply = _ref.apply,\n    construct = _ref.construct;\n  if (!apply) {\n    apply = function apply(fun, thisValue, args) {\n      return fun.apply(thisValue, args);\n    };\n  }\n  if (!freeze) {\n    freeze = function freeze(x) {\n      return x;\n    };\n  }\n  if (!seal) {\n    seal = function seal(x) {\n      return x;\n    };\n  }\n  if (!construct) {\n    construct = function construct(Func, args) {\n      return _construct(Func, _toConsumableArray(args));\n    };\n  }\n  var arrayForEach = unapply(Array.prototype.forEach);\n  var arrayPop = unapply(Array.prototype.pop);\n  var arrayPush = unapply(Array.prototype.push);\n  var stringToLowerCase = unapply(String.prototype.toLowerCase);\n  var stringToString = unapply(String.prototype.toString);\n  var stringMatch = unapply(String.prototype.match);\n  var stringReplace = unapply(String.prototype.replace);\n  var stringIndexOf = unapply(String.prototype.indexOf);\n  var stringTrim = unapply(String.prototype.trim);\n  var regExpTest = unapply(RegExp.prototype.test);\n  var typeErrorCreate = unconstruct(TypeError);\n  function unapply(func) {\n    return function (thisArg) {\n      for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n        args[_key - 1] = arguments[_key];\n      }\n      return apply(func, thisArg, args);\n    };\n  }\n  function unconstruct(func) {\n    return function () {\n      for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        args[_key2] = arguments[_key2];\n      }\n      return construct(func, args);\n    };\n  }\n\n  /* Add properties to a lookup table */\n  function addToSet(set, array, transformCaseFunc) {\n    var _transformCaseFunc;\n    transformCaseFunc = (_transformCaseFunc = transformCaseFunc) !== null && _transformCaseFunc !== void 0 ? _transformCaseFunc : stringToLowerCase;\n    if (setPrototypeOf) {\n      // Make 'in' and truthy checks like Boolean(set.constructor)\n      // independent of any properties defined on Object.prototype.\n      // Prevent prototype setters from intercepting set as a this value.\n      setPrototypeOf(set, null);\n    }\n    var l = array.length;\n    while (l--) {\n      var element = array[l];\n      if (typeof element === 'string') {\n        var lcElement = transformCaseFunc(element);\n        if (lcElement !== element) {\n          // Config presets (e.g. tags.js, attrs.js) are immutable.\n          if (!isFrozen(array)) {\n            array[l] = lcElement;\n          }\n          element = lcElement;\n        }\n      }\n      set[element] = true;\n    }\n    return set;\n  }\n\n  /* Shallow clone an object */\n  function clone(object) {\n    var newObject = create(null);\n    var property;\n    for (property in object) {\n      if (apply(hasOwnProperty, object, [property]) === true) {\n        newObject[property] = object[property];\n      }\n    }\n    return newObject;\n  }\n\n  /* IE10 doesn't support __lookupGetter__ so lets'\n   * simulate it. It also automatically checks\n   * if the prop is function or getter and behaves\n   * accordingly. */\n  function lookupGetter(object, prop) {\n    while (object !== null) {\n      var desc = getOwnPropertyDescriptor(object, prop);\n      if (desc) {\n        if (desc.get) {\n          return unapply(desc.get);\n        }\n        if (typeof desc.value === 'function') {\n          return unapply(desc.value);\n        }\n      }\n      object = getPrototypeOf(object);\n    }\n    function fallbackValue(element) {\n      console.warn('fallback value for', element);\n      return null;\n    }\n    return fallbackValue;\n  }\n\n  var html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'section', 'select', 'shadow', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']);\n\n  // SVG\n  var svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);\n  var svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']);\n\n  // List of SVG elements that are disallowed by default.\n  // We still need to know them so that we can do namespace\n  // checks properly in case one wants to add them to\n  // allow-list.\n  var svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'fedropshadow', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use']);\n  var mathMl$1 = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover']);\n\n  // Similarly to SVG, we want to know all MathML elements,\n  // even those that we disallow by default.\n  var mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);\n  var text = freeze(['#text']);\n\n  var html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'pattern', 'placeholder', 'playsinline', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'xmlns', 'slot']);\n  var svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dur', 'edgemode', 'elevation', 'end', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']);\n  var mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnsalign', 'columnlines', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lspace', 'lquote', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']);\n  var xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);\n\n  // eslint-disable-next-line unicorn/better-regex\n  var MUSTACHE_EXPR = seal(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode\n  var ERB_EXPR = seal(/<%[\\w\\W]*|[\\w\\W]*%>/gm);\n  var TMPLIT_EXPR = seal(/\\${[\\w\\W]*}/gm);\n  var DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]+$/); // eslint-disable-line no-useless-escape\n  var ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\n  var IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n  );\n  var IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\n  var ATTR_WHITESPACE = seal(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n  );\n  var DOCTYPE_NAME = seal(/^html$/i);\n  var CUSTOM_ELEMENT = seal(/^[a-z][.\\w]*(-[.\\w]+)+$/i);\n\n  var getGlobal = function getGlobal() {\n    return typeof window === 'undefined' ? null : window;\n  };\n\n  /**\n   * Creates a no-op policy for internal use only.\n   * Don't export this function outside this module!\n   * @param {?TrustedTypePolicyFactory} trustedTypes The policy factory.\n   * @param {Document} document The document object (to determine policy name suffix)\n   * @return {?TrustedTypePolicy} The policy created (or null, if Trusted Types\n   * are not supported).\n   */\n  var _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, document) {\n    if (_typeof(trustedTypes) !== 'object' || typeof trustedTypes.createPolicy !== 'function') {\n      return null;\n    }\n\n    // Allow the callers to control the unique policy name\n    // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n    // Policy creation with duplicate names throws in Trusted Types.\n    var suffix = null;\n    var ATTR_NAME = 'data-tt-policy-suffix';\n    if (document.currentScript && document.currentScript.hasAttribute(ATTR_NAME)) {\n      suffix = document.currentScript.getAttribute(ATTR_NAME);\n    }\n    var policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n    try {\n      return trustedTypes.createPolicy(policyName, {\n        createHTML: function createHTML(html) {\n          return html;\n        },\n        createScriptURL: function createScriptURL(scriptUrl) {\n          return scriptUrl;\n        }\n      });\n    } catch (_) {\n      // Policy creation failed (most likely another DOMPurify script has\n      // already run). Skip creating the policy, as this will only cause errors\n      // if TT are enforced.\n      console.warn('TrustedTypes policy ' + policyName + ' could not be created.');\n      return null;\n    }\n  };\n  function createDOMPurify() {\n    var window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();\n    var DOMPurify = function DOMPurify(root) {\n      return createDOMPurify(root);\n    };\n\n    /**\n     * Version label, exposed for easier checks\n     * if DOMPurify is up to date or not\n     */\n    DOMPurify.version = '2.5.9';\n\n    /**\n     * Array of elements that DOMPurify removed during sanitation.\n     * Empty if nothing was removed.\n     */\n    DOMPurify.removed = [];\n    if (!window || !window.document || window.document.nodeType !== 9) {\n      // Not running in a browser, provide a factory function\n      // so that you can pass your own Window\n      DOMPurify.isSupported = false;\n      return DOMPurify;\n    }\n    var originalDocument = window.document;\n    var document = window.document;\n    var DocumentFragment = window.DocumentFragment,\n      HTMLTemplateElement = window.HTMLTemplateElement,\n      Node = window.Node,\n      Element = window.Element,\n      NodeFilter = window.NodeFilter,\n      _window$NamedNodeMap = window.NamedNodeMap,\n      NamedNodeMap = _window$NamedNodeMap === void 0 ? window.NamedNodeMap || window.MozNamedAttrMap : _window$NamedNodeMap,\n      HTMLFormElement = window.HTMLFormElement,\n      DOMParser = window.DOMParser,\n      trustedTypes = window.trustedTypes;\n    var ElementPrototype = Element.prototype;\n    var cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n    var getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n    var getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n    var getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n\n    // As per issue #47, the web-components registry is inherited by a\n    // new document created via createHTMLDocument. As per the spec\n    // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n    // a new empty registry is used when creating a template contents owner\n    // document, so we use that as our parent document to ensure nothing\n    // is inherited.\n    if (typeof HTMLTemplateElement === 'function') {\n      var template = document.createElement('template');\n      if (template.content && template.content.ownerDocument) {\n        document = template.content.ownerDocument;\n      }\n    }\n    var trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, originalDocument);\n    var emptyHTML = trustedTypesPolicy ? trustedTypesPolicy.createHTML('') : '';\n    var _document = document,\n      implementation = _document.implementation,\n      createNodeIterator = _document.createNodeIterator,\n      createDocumentFragment = _document.createDocumentFragment,\n      getElementsByTagName = _document.getElementsByTagName;\n    var importNode = originalDocument.importNode;\n    var documentMode = {};\n    try {\n      documentMode = clone(document).documentMode ? document.documentMode : {};\n    } catch (_) {}\n    var hooks = {};\n\n    /**\n     * Expose whether this browser supports running the full DOMPurify.\n     */\n    DOMPurify.isSupported = typeof getParentNode === 'function' && implementation && implementation.createHTMLDocument !== undefined && documentMode !== 9;\n    var MUSTACHE_EXPR$1 = MUSTACHE_EXPR,\n      ERB_EXPR$1 = ERB_EXPR,\n      TMPLIT_EXPR$1 = TMPLIT_EXPR,\n      DATA_ATTR$1 = DATA_ATTR,\n      ARIA_ATTR$1 = ARIA_ATTR,\n      IS_SCRIPT_OR_DATA$1 = IS_SCRIPT_OR_DATA,\n      ATTR_WHITESPACE$1 = ATTR_WHITESPACE,\n      CUSTOM_ELEMENT$1 = CUSTOM_ELEMENT;\n    var IS_ALLOWED_URI$1 = IS_ALLOWED_URI;\n\n    /**\n     * We consider the elements and attributes below to be safe. Ideally\n     * don't add any new ones but feel free to remove unwanted ones.\n     */\n\n    /* allowed element names */\n    var ALLOWED_TAGS = null;\n    var DEFAULT_ALLOWED_TAGS = addToSet({}, [].concat(_toConsumableArray(html$1), _toConsumableArray(svg$1), _toConsumableArray(svgFilters), _toConsumableArray(mathMl$1), _toConsumableArray(text)));\n\n    /* Allowed attribute names */\n    var ALLOWED_ATTR = null;\n    var DEFAULT_ALLOWED_ATTR = addToSet({}, [].concat(_toConsumableArray(html), _toConsumableArray(svg), _toConsumableArray(mathMl), _toConsumableArray(xml)));\n\n    /*\n     * Configure how DOMPUrify should handle custom elements and their attributes as well as customized built-in elements.\n     * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n     * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n     * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n     */\n    var CUSTOM_ELEMENT_HANDLING = Object.seal(Object.create(null, {\n      tagNameCheck: {\n        writable: true,\n        configurable: false,\n        enumerable: true,\n        value: null\n      },\n      attributeNameCheck: {\n        writable: true,\n        configurable: false,\n        enumerable: true,\n        value: null\n      },\n      allowCustomizedBuiltInElements: {\n        writable: true,\n        configurable: false,\n        enumerable: true,\n        value: false\n      }\n    }));\n\n    /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n    var FORBID_TAGS = null;\n\n    /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n    var FORBID_ATTR = null;\n\n    /* Decide if ARIA attributes are okay */\n    var ALLOW_ARIA_ATTR = true;\n\n    /* Decide if custom data attributes are okay */\n    var ALLOW_DATA_ATTR = true;\n\n    /* Decide if unknown protocols are okay */\n    var ALLOW_UNKNOWN_PROTOCOLS = false;\n\n    /* Decide if self-closing tags in attributes are allowed.\n     * Usually removed due to a mXSS issue in jQuery 3.0 */\n    var ALLOW_SELF_CLOSE_IN_ATTR = true;\n\n    /* Output should be safe for common template engines.\n     * This means, DOMPurify removes data attributes, mustaches and ERB\n     */\n    var SAFE_FOR_TEMPLATES = false;\n\n    /* Output should be safe even for XML used within HTML and alike.\n     * This means, DOMPurify removes comments when containing risky content.\n     */\n    var SAFE_FOR_XML = true;\n\n    /* Decide if document with <html>... should be returned */\n    var WHOLE_DOCUMENT = false;\n\n    /* Track whether config is already set on this instance of DOMPurify. */\n    var SET_CONFIG = false;\n\n    /* Decide if all elements (e.g. style, script) must be children of\n     * document.body. By default, browsers might move them to document.head */\n    var FORCE_BODY = false;\n\n    /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n     * string (or a TrustedHTML object if Trusted Types are supported).\n     * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n     */\n    var RETURN_DOM = false;\n\n    /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n     * string  (or a TrustedHTML object if Trusted Types are supported) */\n    var RETURN_DOM_FRAGMENT = false;\n\n    /* Try to return a Trusted Type object instead of a string, return a string in\n     * case Trusted Types are not supported  */\n    var RETURN_TRUSTED_TYPE = false;\n\n    /* Output should be free from DOM clobbering attacks?\n     * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n     */\n    var SANITIZE_DOM = true;\n\n    /* Achieve full DOM Clobbering protection by isolating the namespace of named\n     * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n     *\n     * HTML/DOM spec rules that enable DOM Clobbering:\n     *   - Named Access on Window (§7.3.3)\n     *   - DOM Tree Accessors (§3.1.5)\n     *   - Form Element Parent-Child Relations (§4.10.3)\n     *   - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n     *   - HTMLCollection (§4.2.10.2)\n     *\n     * Namespace isolation is implemented by prefixing `id` and `name` attributes\n     * with a constant string, i.e., `user-content-`\n     */\n    var SANITIZE_NAMED_PROPS = false;\n    var SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n\n    /* Keep element content when removing element? */\n    var KEEP_CONTENT = true;\n\n    /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n     * of importing it into a new Document and returning a sanitized copy */\n    var IN_PLACE = false;\n\n    /* Allow usage of profiles like html, svg and mathMl */\n    var USE_PROFILES = {};\n\n    /* Tags to ignore content of when KEEP_CONTENT is true */\n    var FORBID_CONTENTS = null;\n    var DEFAULT_FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp']);\n\n    /* Tags that are safe for data: URIs */\n    var DATA_URI_TAGS = null;\n    var DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);\n\n    /* Attributes safe for values like \"javascript:\" */\n    var URI_SAFE_ATTRIBUTES = null;\n    var DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);\n    var MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n    var SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n    var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n    /* Document namespace */\n    var NAMESPACE = HTML_NAMESPACE;\n    var IS_EMPTY_INPUT = false;\n\n    /* Allowed XHTML+XML namespaces */\n    var ALLOWED_NAMESPACES = null;\n    var DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString);\n\n    /* Parsing of strict XHTML documents */\n    var PARSER_MEDIA_TYPE;\n    var SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];\n    var DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n    var transformCaseFunc;\n\n    /* Keep a reference to config to pass to hooks */\n    var CONFIG = null;\n\n    /* Ideally, do not touch anything below this line */\n    /* ______________________________________________ */\n\n    var formElement = document.createElement('form');\n    var isRegexOrFunction = function isRegexOrFunction(testValue) {\n      return testValue instanceof RegExp || testValue instanceof Function;\n    };\n\n    /**\n     * _parseConfig\n     *\n     * @param  {Object} cfg optional config literal\n     */\n    // eslint-disable-next-line complexity\n    var _parseConfig = function _parseConfig(cfg) {\n      if (CONFIG && CONFIG === cfg) {\n        return;\n      }\n\n      /* Shield configuration object from tampering */\n      if (!cfg || _typeof(cfg) !== 'object') {\n        cfg = {};\n      }\n\n      /* Shield configuration object from prototype pollution */\n      cfg = clone(cfg);\n      PARSER_MEDIA_TYPE =\n      // eslint-disable-next-line unicorn/prefer-includes\n      SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? PARSER_MEDIA_TYPE = DEFAULT_PARSER_MEDIA_TYPE : PARSER_MEDIA_TYPE = cfg.PARSER_MEDIA_TYPE;\n\n      // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\n      transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase;\n\n      /* Set configuration parameters */\n      ALLOWED_TAGS = 'ALLOWED_TAGS' in cfg ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS;\n      ALLOWED_ATTR = 'ALLOWED_ATTR' in cfg ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR;\n      ALLOWED_NAMESPACES = 'ALLOWED_NAMESPACES' in cfg ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES;\n      URI_SAFE_ATTRIBUTES = 'ADD_URI_SAFE_ATTR' in cfg ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES),\n      // eslint-disable-line indent\n      cfg.ADD_URI_SAFE_ATTR,\n      // eslint-disable-line indent\n      transformCaseFunc // eslint-disable-line indent\n      ) // eslint-disable-line indent\n      : DEFAULT_URI_SAFE_ATTRIBUTES;\n      DATA_URI_TAGS = 'ADD_DATA_URI_TAGS' in cfg ? addToSet(clone(DEFAULT_DATA_URI_TAGS),\n      // eslint-disable-line indent\n      cfg.ADD_DATA_URI_TAGS,\n      // eslint-disable-line indent\n      transformCaseFunc // eslint-disable-line indent\n      ) // eslint-disable-line indent\n      : DEFAULT_DATA_URI_TAGS;\n      FORBID_CONTENTS = 'FORBID_CONTENTS' in cfg ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS;\n      FORBID_TAGS = 'FORBID_TAGS' in cfg ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : {};\n      FORBID_ATTR = 'FORBID_ATTR' in cfg ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : {};\n      USE_PROFILES = 'USE_PROFILES' in cfg ? cfg.USE_PROFILES : false;\n      ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n      ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n      ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n      ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true\n      SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n      SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false; // Default true\n      WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n      RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n      RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n      RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n      FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n      SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n      SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\n      KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n      IN_PLACE = cfg.IN_PLACE || false; // Default false\n      IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI$1;\n      NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n      CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};\n      if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) {\n        CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;\n      }\n      if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) {\n        CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;\n      }\n      if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') {\n        CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;\n      }\n      if (SAFE_FOR_TEMPLATES) {\n        ALLOW_DATA_ATTR = false;\n      }\n      if (RETURN_DOM_FRAGMENT) {\n        RETURN_DOM = true;\n      }\n\n      /* Parse profile info */\n      if (USE_PROFILES) {\n        ALLOWED_TAGS = addToSet({}, _toConsumableArray(text));\n        ALLOWED_ATTR = [];\n        if (USE_PROFILES.html === true) {\n          addToSet(ALLOWED_TAGS, html$1);\n          addToSet(ALLOWED_ATTR, html);\n        }\n        if (USE_PROFILES.svg === true) {\n          addToSet(ALLOWED_TAGS, svg$1);\n          addToSet(ALLOWED_ATTR, svg);\n          addToSet(ALLOWED_ATTR, xml);\n        }\n        if (USE_PROFILES.svgFilters === true) {\n          addToSet(ALLOWED_TAGS, svgFilters);\n          addToSet(ALLOWED_ATTR, svg);\n          addToSet(ALLOWED_ATTR, xml);\n        }\n        if (USE_PROFILES.mathMl === true) {\n          addToSet(ALLOWED_TAGS, mathMl$1);\n          addToSet(ALLOWED_ATTR, mathMl);\n          addToSet(ALLOWED_ATTR, xml);\n        }\n      }\n\n      /* Merge configuration parameters */\n      if (cfg.ADD_TAGS) {\n        if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n          ALLOWED_TAGS = clone(ALLOWED_TAGS);\n        }\n        addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n      }\n      if (cfg.ADD_ATTR) {\n        if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n          ALLOWED_ATTR = clone(ALLOWED_ATTR);\n        }\n        addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n      }\n      if (cfg.ADD_URI_SAFE_ATTR) {\n        addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);\n      }\n      if (cfg.FORBID_CONTENTS) {\n        if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n          FORBID_CONTENTS = clone(FORBID_CONTENTS);\n        }\n        addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);\n      }\n\n      /* Add #text in case KEEP_CONTENT is set to true */\n      if (KEEP_CONTENT) {\n        ALLOWED_TAGS['#text'] = true;\n      }\n\n      /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n      if (WHOLE_DOCUMENT) {\n        addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\n      }\n\n      /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n      if (ALLOWED_TAGS.table) {\n        addToSet(ALLOWED_TAGS, ['tbody']);\n        delete FORBID_TAGS.tbody;\n      }\n\n      // Prevent further manipulation of configuration.\n      // Not available in IE8, Safari 5, etc.\n      if (freeze) {\n        freeze(cfg);\n      }\n      CONFIG = cfg;\n    };\n    var MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']);\n    var HTML_INTEGRATION_POINTS = addToSet({}, ['annotation-xml']);\n\n    // Certain elements are allowed in both SVG and HTML\n    // namespace. We need to specify them explicitly\n    // so that they don't get erroneously deleted from\n    // HTML namespace.\n    var COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);\n\n    /* Keep track of all possible SVG and MathML tags\n     * so that we can perform the namespace checks\n     * correctly. */\n    var ALL_SVG_TAGS = addToSet({}, svg$1);\n    addToSet(ALL_SVG_TAGS, svgFilters);\n    addToSet(ALL_SVG_TAGS, svgDisallowed);\n    var ALL_MATHML_TAGS = addToSet({}, mathMl$1);\n    addToSet(ALL_MATHML_TAGS, mathMlDisallowed);\n\n    /**\n     *\n     *\n     * @param  {Element} element a DOM element whose namespace is being checked\n     * @returns {boolean} Return false if the element has a\n     *  namespace that a spec-compliant parser would never\n     *  return. Return true otherwise.\n     */\n    var _checkValidNamespace = function _checkValidNamespace(element) {\n      var parent = getParentNode(element);\n\n      // In JSDOM, if we're inside shadow DOM, then parentNode\n      // can be null. We just simulate parent in this case.\n      if (!parent || !parent.tagName) {\n        parent = {\n          namespaceURI: NAMESPACE,\n          tagName: 'template'\n        };\n      }\n      var tagName = stringToLowerCase(element.tagName);\n      var parentTagName = stringToLowerCase(parent.tagName);\n      if (!ALLOWED_NAMESPACES[element.namespaceURI]) {\n        return false;\n      }\n      if (element.namespaceURI === SVG_NAMESPACE) {\n        // The only way to switch from HTML namespace to SVG\n        // is via <svg>. If it happens via any other tag, then\n        // it should be killed.\n        if (parent.namespaceURI === HTML_NAMESPACE) {\n          return tagName === 'svg';\n        }\n\n        // The only way to switch from MathML to SVG is via`\n        // svg if parent is either <annotation-xml> or MathML\n        // text integration points.\n        if (parent.namespaceURI === MATHML_NAMESPACE) {\n          return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\n        }\n\n        // We only allow elements that are defined in SVG\n        // spec. All others are disallowed in SVG namespace.\n        return Boolean(ALL_SVG_TAGS[tagName]);\n      }\n      if (element.namespaceURI === MATHML_NAMESPACE) {\n        // The only way to switch from HTML namespace to MathML\n        // is via <math>. If it happens via any other tag, then\n        // it should be killed.\n        if (parent.namespaceURI === HTML_NAMESPACE) {\n          return tagName === 'math';\n        }\n\n        // The only way to switch from SVG to MathML is via\n        // <math> and HTML integration points\n        if (parent.namespaceURI === SVG_NAMESPACE) {\n          return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n        }\n\n        // We only allow elements that are defined in MathML\n        // spec. All others are disallowed in MathML namespace.\n        return Boolean(ALL_MATHML_TAGS[tagName]);\n      }\n      if (element.namespaceURI === HTML_NAMESPACE) {\n        // The only way to switch from SVG to HTML is via\n        // HTML integration points, and from MathML to HTML\n        // is via MathML text integration points\n        if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {\n          return false;\n        }\n        if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {\n          return false;\n        }\n\n        // We disallow tags that are specific for MathML\n        // or SVG and should never appear in HTML namespace\n        return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);\n      }\n\n      // For XHTML and XML documents that support custom namespaces\n      if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) {\n        return true;\n      }\n\n      // The code should never reach this place (this means\n      // that the element somehow got namespace that is not\n      // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).\n      // Return false just in case.\n      return false;\n    };\n\n    /**\n     * _forceRemove\n     *\n     * @param  {Node} node a DOM node\n     */\n    var _forceRemove = function _forceRemove(node) {\n      arrayPush(DOMPurify.removed, {\n        element: node\n      });\n      try {\n        // eslint-disable-next-line unicorn/prefer-dom-node-remove\n        node.parentNode.removeChild(node);\n      } catch (_) {\n        try {\n          node.outerHTML = emptyHTML;\n        } catch (_) {\n          node.remove();\n        }\n      }\n    };\n\n    /**\n     * _removeAttribute\n     *\n     * @param  {String} name an Attribute name\n     * @param  {Node} node a DOM node\n     */\n    var _removeAttribute = function _removeAttribute(name, node) {\n      try {\n        arrayPush(DOMPurify.removed, {\n          attribute: node.getAttributeNode(name),\n          from: node\n        });\n      } catch (_) {\n        arrayPush(DOMPurify.removed, {\n          attribute: null,\n          from: node\n        });\n      }\n      node.removeAttribute(name);\n\n      // We void attribute values for unremovable \"is\"\" attributes\n      if (name === 'is' && !ALLOWED_ATTR[name]) {\n        if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n          try {\n            _forceRemove(node);\n          } catch (_) {}\n        } else {\n          try {\n            node.setAttribute(name, '');\n          } catch (_) {}\n        }\n      }\n    };\n\n    /**\n     * _initDocument\n     *\n     * @param  {String} dirty a string of dirty markup\n     * @return {Document} a DOM, filled with the dirty markup\n     */\n    var _initDocument = function _initDocument(dirty) {\n      /* Create a HTML document */\n      var doc;\n      var leadingWhitespace;\n      if (FORCE_BODY) {\n        dirty = '<remove></remove>' + dirty;\n      } else {\n        /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n        var matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n        leadingWhitespace = matches && matches[0];\n      }\n      if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) {\n        // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\n        dirty = '<html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body>' + dirty + '</body></html>';\n      }\n      var dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;\n      /*\n       * Use the DOMParser API by default, fallback later if needs be\n       * DOMParser not work for svg when has multiple root element.\n       */\n      if (NAMESPACE === HTML_NAMESPACE) {\n        try {\n          doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n        } catch (_) {}\n      }\n\n      /* Use createHTMLDocument in case DOMParser is not available */\n      if (!doc || !doc.documentElement) {\n        doc = implementation.createDocument(NAMESPACE, 'template', null);\n        try {\n          doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;\n        } catch (_) {\n          // Syntax error if dirtyPayload is invalid xml\n        }\n      }\n      var body = doc.body || doc.documentElement;\n      if (dirty && leadingWhitespace) {\n        body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);\n      }\n\n      /* Work on whole document or just its body */\n      if (NAMESPACE === HTML_NAMESPACE) {\n        return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];\n      }\n      return WHOLE_DOCUMENT ? doc.documentElement : body;\n    };\n\n    /**\n     * _createIterator\n     *\n     * @param  {Document} root document/fragment to create iterator for\n     * @return {Iterator} iterator instance\n     */\n    var _createIterator = function _createIterator(root) {\n      return createNodeIterator.call(root.ownerDocument || root, root,\n      // eslint-disable-next-line no-bitwise\n      NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_PROCESSING_INSTRUCTION | NodeFilter.SHOW_CDATA_SECTION, null, false);\n    };\n\n    /**\n     * _isClobbered\n     *\n     * @param  {Node} elm element to check for clobbering attacks\n     * @return {Boolean} true if clobbered, false if safe\n     */\n    var _isClobbered = function _isClobbered(elm) {\n      return elm instanceof HTMLFormElement && (typeof elm.nodeName !== 'string' || typeof elm.textContent !== 'string' || typeof elm.removeChild !== 'function' || !(elm.attributes instanceof NamedNodeMap) || typeof elm.removeAttribute !== 'function' || typeof elm.setAttribute !== 'function' || typeof elm.namespaceURI !== 'string' || typeof elm.insertBefore !== 'function' || typeof elm.hasChildNodes !== 'function');\n    };\n\n    /**\n     * _isNode\n     *\n     * @param  {Node} obj object to check whether it's a DOM node\n     * @return {Boolean} true is object is a DOM node\n     */\n    var _isNode = function _isNode(object) {\n      return _typeof(Node) === 'object' ? object instanceof Node : object && _typeof(object) === 'object' && typeof object.nodeType === 'number' && typeof object.nodeName === 'string';\n    };\n\n    /**\n     * _executeHook\n     * Execute user configurable hooks\n     *\n     * @param  {String} entryPoint  Name of the hook's entry point\n     * @param  {Node} currentNode node to work on with the hook\n     * @param  {Object} data additional hook parameters\n     */\n    var _executeHook = function _executeHook(entryPoint, currentNode, data) {\n      if (!hooks[entryPoint]) {\n        return;\n      }\n      arrayForEach(hooks[entryPoint], function (hook) {\n        hook.call(DOMPurify, currentNode, data, CONFIG);\n      });\n    };\n\n    /**\n     * _sanitizeElements\n     *\n     * @protect nodeName\n     * @protect textContent\n     * @protect removeChild\n     *\n     * @param   {Node} currentNode to check for permission to exist\n     * @return  {Boolean} true if node was killed, false if left alive\n     */\n    var _sanitizeElements = function _sanitizeElements(currentNode) {\n      var content;\n\n      /* Execute a hook if present */\n      _executeHook('beforeSanitizeElements', currentNode, null);\n\n      /* Check if element is clobbered or can clobber */\n      if (_isClobbered(currentNode)) {\n        _forceRemove(currentNode);\n        return true;\n      }\n\n      /* Check if tagname contains Unicode */\n      if (regExpTest(/[\\u0080-\\uFFFF]/, currentNode.nodeName)) {\n        _forceRemove(currentNode);\n        return true;\n      }\n\n      /* Now let's check the element's type and name */\n      var tagName = transformCaseFunc(currentNode.nodeName);\n\n      /* Execute a hook if present */\n      _executeHook('uponSanitizeElement', currentNode, {\n        tagName: tagName,\n        allowedTags: ALLOWED_TAGS\n      });\n\n      /* Detect mXSS attempts abusing namespace confusion */\n      if (currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && (!_isNode(currentNode.content) || !_isNode(currentNode.content.firstElementChild)) && regExpTest(/<[/\\w]/g, currentNode.innerHTML) && regExpTest(/<[/\\w]/g, currentNode.textContent)) {\n        _forceRemove(currentNode);\n        return true;\n      }\n\n      /* Mitigate a problem with templates inside select */\n      if (tagName === 'select' && regExpTest(/<template/i, currentNode.innerHTML)) {\n        _forceRemove(currentNode);\n        return true;\n      }\n\n      /* Remove any ocurrence of processing instructions */\n      if (currentNode.nodeType === 7) {\n        _forceRemove(currentNode);\n        return true;\n      }\n\n      /* Remove any kind of possibly harmful comments */\n      if (SAFE_FOR_XML && currentNode.nodeType === 8 && regExpTest(/<[/\\w]/g, currentNode.data)) {\n        _forceRemove(currentNode);\n        return true;\n      }\n\n      /* Remove element if anything forbids its presence */\n      if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n        /* Check if we have a custom element to handle */\n        if (!FORBID_TAGS[tagName] && _basicCustomElementTest(tagName)) {\n          if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) return false;\n          if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) return false;\n        }\n\n        /* Keep content except for bad-listed elements */\n        if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n          var parentNode = getParentNode(currentNode) || currentNode.parentNode;\n          var childNodes = getChildNodes(currentNode) || currentNode.childNodes;\n          if (childNodes && parentNode) {\n            var childCount = childNodes.length;\n            for (var i = childCount - 1; i >= 0; --i) {\n              var childClone = cloneNode(childNodes[i], true);\n              childClone.__removalCount = (currentNode.__removalCount || 0) + 1;\n              parentNode.insertBefore(childClone, getNextSibling(currentNode));\n            }\n          }\n        }\n        _forceRemove(currentNode);\n        return true;\n      }\n\n      /* Check whether element has a valid namespace */\n      if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {\n        _forceRemove(currentNode);\n        return true;\n      }\n\n      /* Make sure that older browsers don't get fallback-tag mXSS */\n      if ((tagName === 'noscript' || tagName === 'noembed' || tagName === 'noframes') && regExpTest(/<\\/no(script|embed|frames)/i, currentNode.innerHTML)) {\n        _forceRemove(currentNode);\n        return true;\n      }\n\n      /* Sanitize element content to be template-safe */\n      if (SAFE_FOR_TEMPLATES && currentNode.nodeType === 3) {\n        /* Get the element's text content */\n        content = currentNode.textContent;\n        content = stringReplace(content, MUSTACHE_EXPR$1, ' ');\n        content = stringReplace(content, ERB_EXPR$1, ' ');\n        content = stringReplace(content, TMPLIT_EXPR$1, ' ');\n        if (currentNode.textContent !== content) {\n          arrayPush(DOMPurify.removed, {\n            element: currentNode.cloneNode()\n          });\n          currentNode.textContent = content;\n        }\n      }\n\n      /* Execute a hook if present */\n      _executeHook('afterSanitizeElements', currentNode, null);\n      return false;\n    };\n\n    /**\n     * _isValidAttribute\n     *\n     * @param  {string} lcTag Lowercase tag name of containing element.\n     * @param  {string} lcName Lowercase attribute name.\n     * @param  {string} value Attribute value.\n     * @return {Boolean} Returns true if `value` is valid, otherwise false.\n     */\n    // eslint-disable-next-line complexity\n    var _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {\n      /* Make sure attribute cannot clobber */\n      if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {\n        return false;\n      }\n\n      /* Allow valid data-* attributes: At least one character after \"-\"\n          (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)\n          XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)\n          We don't need to check the value; it's always URI safe. */\n      if (ALLOW_DATA_ATTR && !FORBID_ATTR[lcName] && regExpTest(DATA_ATTR$1, lcName)) ; else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR$1, lcName)) ; else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) {\n        if (\n        // First condition does a very basic check if a) it's basically a valid custom element tagname AND\n        // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n        // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck\n        _basicCustomElementTest(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName)) ||\n        // Alternative, second condition checks if it's an `is`-attribute, AND\n        // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n        lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))) ; else {\n          return false;\n        }\n        /* Check value is safe. First, is attr inert? If so, is safe */\n      } else if (URI_SAFE_ATTRIBUTES[lcName]) ; else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE$1, ''))) ; else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) ; else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA$1, stringReplace(value, ATTR_WHITESPACE$1, ''))) ; else if (value) {\n        return false;\n      } else ;\n      return true;\n    };\n\n    /**\n     * _basicCustomElementCheck\n     * checks if at least one dash is included in tagName, and it's not the first char\n     * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name\n     * @param {string} tagName name of the tag of the node to sanitize\n     */\n    var _basicCustomElementTest = function _basicCustomElementTest(tagName) {\n      return tagName !== 'annotation-xml' && stringMatch(tagName, CUSTOM_ELEMENT$1);\n    };\n\n    /**\n     * _sanitizeAttributes\n     *\n     * @protect attributes\n     * @protect nodeName\n     * @protect removeAttribute\n     * @protect setAttribute\n     *\n     * @param  {Node} currentNode to sanitize\n     */\n    var _sanitizeAttributes = function _sanitizeAttributes(currentNode) {\n      var attr;\n      var value;\n      var lcName;\n      var l;\n      /* Execute a hook if present */\n      _executeHook('beforeSanitizeAttributes', currentNode, null);\n      var attributes = currentNode.attributes;\n\n      /* Check if we have attributes; if not we might have a text node */\n      if (!attributes || _isClobbered(currentNode)) {\n        return;\n      }\n      var hookEvent = {\n        attrName: '',\n        attrValue: '',\n        keepAttr: true,\n        allowedAttributes: ALLOWED_ATTR\n      };\n      l = attributes.length;\n\n      /* Go backwards over all attributes; safely remove bad ones */\n      while (l--) {\n        attr = attributes[l];\n        var _attr = attr,\n          name = _attr.name,\n          namespaceURI = _attr.namespaceURI;\n        value = name === 'value' ? attr.value : stringTrim(attr.value);\n        lcName = transformCaseFunc(name);\n\n        /* Execute a hook if present */\n        hookEvent.attrName = lcName;\n        hookEvent.attrValue = value;\n        hookEvent.keepAttr = true;\n        hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set\n        _executeHook('uponSanitizeAttribute', currentNode, hookEvent);\n        value = hookEvent.attrValue;\n\n        /* Did the hooks approve of the attribute? */\n        if (hookEvent.forceKeepAttr) {\n          continue;\n        }\n\n        /* Remove attribute */\n        _removeAttribute(name, currentNode);\n\n        /* Did the hooks approve of the attribute? */\n        if (!hookEvent.keepAttr) {\n          continue;\n        }\n\n        /* Work around a security issue in jQuery 3.0 */\n        if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(/\\/>/i, value)) {\n          _removeAttribute(name, currentNode);\n          continue;\n        }\n\n        /* Sanitize attribute content to be template-safe */\n        if (SAFE_FOR_TEMPLATES) {\n          value = stringReplace(value, MUSTACHE_EXPR$1, ' ');\n          value = stringReplace(value, ERB_EXPR$1, ' ');\n          value = stringReplace(value, TMPLIT_EXPR$1, ' ');\n        }\n\n        /* Is `value` valid for this attribute? */\n        var lcTag = transformCaseFunc(currentNode.nodeName);\n        if (!_isValidAttribute(lcTag, lcName, value)) {\n          continue;\n        }\n\n        /* Full DOM Clobbering protection via namespace isolation,\n         * Prefix id and name attributes with `user-content-`\n         */\n        if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name')) {\n          // Remove the attribute with this value\n          _removeAttribute(name, currentNode);\n\n          // Prefix the value and later re-create the attribute with the sanitized value\n          value = SANITIZE_NAMED_PROPS_PREFIX + value;\n        }\n\n        /* Work around a security issue with comments inside attributes */\n        if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i, value)) {\n          _removeAttribute(name, currentNode);\n          continue;\n        }\n\n        /* Handle attributes that require Trusted Types */\n        if (trustedTypesPolicy && _typeof(trustedTypes) === 'object' && typeof trustedTypes.getAttributeType === 'function') {\n          if (namespaceURI) ; else {\n            switch (trustedTypes.getAttributeType(lcTag, lcName)) {\n              case 'TrustedHTML':\n                {\n                  value = trustedTypesPolicy.createHTML(value);\n                  break;\n                }\n              case 'TrustedScriptURL':\n                {\n                  value = trustedTypesPolicy.createScriptURL(value);\n                  break;\n                }\n            }\n          }\n        }\n\n        /* Handle invalid data-* attribute set by try-catching it */\n        try {\n          if (namespaceURI) {\n            currentNode.setAttributeNS(namespaceURI, name, value);\n          } else {\n            /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. \"x-schema\". */\n            currentNode.setAttribute(name, value);\n          }\n          if (_isClobbered(currentNode)) {\n            _forceRemove(currentNode);\n          } else {\n            arrayPop(DOMPurify.removed);\n          }\n        } catch (_) {}\n      }\n\n      /* Execute a hook if present */\n      _executeHook('afterSanitizeAttributes', currentNode, null);\n    };\n\n    /**\n     * _sanitizeShadowDOM\n     *\n     * @param  {DocumentFragment} fragment to iterate over recursively\n     */\n    var _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) {\n      var shadowNode;\n      var shadowIterator = _createIterator(fragment);\n\n      /* Execute a hook if present */\n      _executeHook('beforeSanitizeShadowDOM', fragment, null);\n      while (shadowNode = shadowIterator.nextNode()) {\n        /* Execute a hook if present */\n        _executeHook('uponSanitizeShadowNode', shadowNode, null);\n        /* Sanitize tags and elements */\n        _sanitizeElements(shadowNode);\n\n        /* Check attributes next */\n        _sanitizeAttributes(shadowNode);\n\n        /* Deep shadow DOM detected */\n        if (shadowNode.content instanceof DocumentFragment) {\n          _sanitizeShadowDOM(shadowNode.content);\n        }\n      }\n\n      /* Execute a hook if present */\n      _executeHook('afterSanitizeShadowDOM', fragment, null);\n    };\n\n    /**\n     * Sanitize\n     * Public method providing core sanitation functionality\n     *\n     * @param {String|Node} dirty string or DOM node\n     * @param {Object} configuration object\n     */\n    // eslint-disable-next-line complexity\n    DOMPurify.sanitize = function (dirty) {\n      var cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      var body;\n      var importedNode;\n      var currentNode;\n      var oldNode;\n      var returnNode;\n      /* Make sure we have a string to sanitize.\n        DO NOT return early, as this will return the wrong type if\n        the user has requested a DOM object rather than a string */\n      IS_EMPTY_INPUT = !dirty;\n      if (IS_EMPTY_INPUT) {\n        dirty = '<!-->';\n      }\n\n      /* Stringify, in case dirty is an object */\n      if (typeof dirty !== 'string' && !_isNode(dirty)) {\n        if (typeof dirty.toString === 'function') {\n          dirty = dirty.toString();\n          if (typeof dirty !== 'string') {\n            throw typeErrorCreate('dirty is not a string, aborting');\n          }\n        } else {\n          throw typeErrorCreate('toString is not a function');\n        }\n      }\n\n      /* Check we can run. Otherwise fall back or ignore */\n      if (!DOMPurify.isSupported) {\n        if (_typeof(window.toStaticHTML) === 'object' || typeof window.toStaticHTML === 'function') {\n          if (typeof dirty === 'string') {\n            return window.toStaticHTML(dirty);\n          }\n          if (_isNode(dirty)) {\n            return window.toStaticHTML(dirty.outerHTML);\n          }\n        }\n        return dirty;\n      }\n\n      /* Assign config vars */\n      if (!SET_CONFIG) {\n        _parseConfig(cfg);\n      }\n\n      /* Clean up removed elements */\n      DOMPurify.removed = [];\n\n      /* Check if dirty is correctly typed for IN_PLACE */\n      if (typeof dirty === 'string') {\n        IN_PLACE = false;\n      }\n      if (IN_PLACE) {\n        /* Do some early pre-sanitization to avoid unsafe root nodes */\n        if (dirty.nodeName) {\n          var tagName = transformCaseFunc(dirty.nodeName);\n          if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n            throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');\n          }\n        }\n      } else if (dirty instanceof Node) {\n        /* If dirty is a DOM element, append to an empty document to avoid\n           elements being stripped by the parser */\n        body = _initDocument('<!---->');\n        importedNode = body.ownerDocument.importNode(dirty, true);\n        if (importedNode.nodeType === 1 && importedNode.nodeName === 'BODY') {\n          /* Node is already a body, use as is */\n          body = importedNode;\n        } else if (importedNode.nodeName === 'HTML') {\n          body = importedNode;\n        } else {\n          // eslint-disable-next-line unicorn/prefer-dom-node-append\n          body.appendChild(importedNode);\n        }\n      } else {\n        /* Exit directly if we have nothing to do */\n        if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT &&\n        // eslint-disable-next-line unicorn/prefer-includes\n        dirty.indexOf('<') === -1) {\n          return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;\n        }\n\n        /* Initialize the document to work on */\n        body = _initDocument(dirty);\n\n        /* Check we have a DOM node from the data */\n        if (!body) {\n          return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';\n        }\n      }\n\n      /* Remove first element node (ours) if FORCE_BODY is set */\n      if (body && FORCE_BODY) {\n        _forceRemove(body.firstChild);\n      }\n\n      /* Get node iterator */\n      var nodeIterator = _createIterator(IN_PLACE ? dirty : body);\n\n      /* Now start iterating over the created document */\n      while (currentNode = nodeIterator.nextNode()) {\n        /* Fix IE's strange behavior with manipulated textNodes #89 */\n        if (currentNode.nodeType === 3 && currentNode === oldNode) {\n          continue;\n        }\n\n        /* Sanitize tags and elements */\n        _sanitizeElements(currentNode);\n\n        /* Check attributes next */\n        _sanitizeAttributes(currentNode);\n\n        /* Shadow DOM detected, sanitize it */\n        if (currentNode.content instanceof DocumentFragment) {\n          _sanitizeShadowDOM(currentNode.content);\n        }\n        oldNode = currentNode;\n      }\n      oldNode = null;\n\n      /* If we sanitized `dirty` in-place, return it. */\n      if (IN_PLACE) {\n        return dirty;\n      }\n\n      /* Return sanitized string or DOM */\n      if (RETURN_DOM) {\n        if (RETURN_DOM_FRAGMENT) {\n          returnNode = createDocumentFragment.call(body.ownerDocument);\n          while (body.firstChild) {\n            // eslint-disable-next-line unicorn/prefer-dom-node-append\n            returnNode.appendChild(body.firstChild);\n          }\n        } else {\n          returnNode = body;\n        }\n        if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmod) {\n          /*\n            AdoptNode() is not used because internal state is not reset\n            (e.g. the past names map of a HTMLFormElement), this is safe\n            in theory but we would rather not risk another attack vector.\n            The state that is cloned by importNode() is explicitly defined\n            by the specs.\n          */\n          returnNode = importNode.call(originalDocument, returnNode, true);\n        }\n        return returnNode;\n      }\n      var serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n\n      /* Serialize doctype if allowed */\n      if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {\n        serializedHTML = '<!DOCTYPE ' + body.ownerDocument.doctype.name + '>\\n' + serializedHTML;\n      }\n\n      /* Sanitize final string template-safe */\n      if (SAFE_FOR_TEMPLATES) {\n        serializedHTML = stringReplace(serializedHTML, MUSTACHE_EXPR$1, ' ');\n        serializedHTML = stringReplace(serializedHTML, ERB_EXPR$1, ' ');\n        serializedHTML = stringReplace(serializedHTML, TMPLIT_EXPR$1, ' ');\n      }\n      return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;\n    };\n\n    /**\n     * Public method to set the configuration once\n     * setConfig\n     *\n     * @param {Object} cfg configuration object\n     */\n    DOMPurify.setConfig = function (cfg) {\n      _parseConfig(cfg);\n      SET_CONFIG = true;\n    };\n\n    /**\n     * Public method to remove the configuration\n     * clearConfig\n     *\n     */\n    DOMPurify.clearConfig = function () {\n      CONFIG = null;\n      SET_CONFIG = false;\n    };\n\n    /**\n     * Public method to check if an attribute value is valid.\n     * Uses last set config, if any. Otherwise, uses config defaults.\n     * isValidAttribute\n     *\n     * @param  {string} tag Tag name of containing element.\n     * @param  {string} attr Attribute name.\n     * @param  {string} value Attribute value.\n     * @return {Boolean} Returns true if `value` is valid. Otherwise, returns false.\n     */\n    DOMPurify.isValidAttribute = function (tag, attr, value) {\n      /* Initialize shared config vars if necessary. */\n      if (!CONFIG) {\n        _parseConfig({});\n      }\n      var lcTag = transformCaseFunc(tag);\n      var lcName = transformCaseFunc(attr);\n      return _isValidAttribute(lcTag, lcName, value);\n    };\n\n    /**\n     * AddHook\n     * Public method to add DOMPurify hooks\n     *\n     * @param {String} entryPoint entry point for the hook to add\n     * @param {Function} hookFunction function to execute\n     */\n    DOMPurify.addHook = function (entryPoint, hookFunction) {\n      if (typeof hookFunction !== 'function') {\n        return;\n      }\n      hooks[entryPoint] = hooks[entryPoint] || [];\n      arrayPush(hooks[entryPoint], hookFunction);\n    };\n\n    /**\n     * RemoveHook\n     * Public method to remove a DOMPurify hook at a given entryPoint\n     * (pops it from the stack of hooks if more are present)\n     *\n     * @param {String} entryPoint entry point for the hook to remove\n     * @return {Function} removed(popped) hook\n     */\n    DOMPurify.removeHook = function (entryPoint) {\n      if (hooks[entryPoint]) {\n        return arrayPop(hooks[entryPoint]);\n      }\n    };\n\n    /**\n     * RemoveHooks\n     * Public method to remove all DOMPurify hooks at a given entryPoint\n     *\n     * @param  {String} entryPoint entry point for the hooks to remove\n     */\n    DOMPurify.removeHooks = function (entryPoint) {\n      if (hooks[entryPoint]) {\n        hooks[entryPoint] = [];\n      }\n    };\n\n    /**\n     * RemoveAllHooks\n     * Public method to remove all DOMPurify hooks\n     *\n     */\n    DOMPurify.removeAllHooks = function () {\n      hooks = {};\n    };\n    return DOMPurify;\n  }\n  var purify = createDOMPurify();\n\n  return purify;\n\n}));\n//# sourceMappingURL=purify.js.map\n\n\n//# sourceURL=webpack://pixLib/./node_modules/dompurify/dist/purify.js?\n}");
116
117/***/ }),
118
vendor: 2,836 bytes, lines 119-128
119/***/ "./node_modules/ev-emitter/ev-emitter.js":
120/*!***********************************************!*\
121  !*** ./node_modules/ev-emitter/ev-emitter.js ***!
122  \***********************************************/
123/***/ (function(module) {
124
125eval("{/**\n * EvEmitter v2.1.1\n * Lil' event emitter\n * MIT License\n */\n\n( function( global, factory ) {\n  // universal module definition\n  if (  true && module.exports ) {\n    // CommonJS - Browserify, Webpack\n    module.exports = factory();\n  } else {\n    // Browser globals\n    global.EvEmitter = factory();\n  }\n\n}( typeof window != 'undefined' ? window : this, function() {\n\nfunction EvEmitter() {}\n\nlet proto = EvEmitter.prototype;\n\nproto.on = function( eventName, listener ) {\n  if ( !eventName || !listener ) return this;\n\n  // set events hash\n  let events = this._events = this._events || {};\n  // set listeners array\n  let listeners = events[ eventName ] = events[ eventName ] || [];\n  // only add once\n  if ( !listeners.includes( listener ) ) {\n    listeners.push( listener );\n  }\n\n  return this;\n};\n\nproto.once = function( eventName, listener ) {\n  if ( !eventName || !listener ) return this;\n\n  // add event\n  this.on( eventName, listener );\n  // set once flag\n  // set onceEvents hash\n  let onceEvents = this._onceEvents = this._onceEvents || {};\n  // set onceListeners object\n  let onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n  // set flag\n  onceListeners[ listener ] = true;\n\n  return this;\n};\n\nproto.off = function( eventName, listener ) {\n  let listeners = this._events && this._events[ eventName ];\n  if ( !listeners || !listeners.length ) return this;\n\n  let index = listeners.indexOf( listener );\n  if ( index != -1 ) {\n    listeners.splice( index, 1 );\n  }\n\n  return this;\n};\n\nproto.emitEvent = function( eventName, args ) {\n  let listeners = this._events && this._events[ eventName ];\n  if ( !listeners || !listeners.length ) return this;\n\n  // copy over to avoid interference if .off() in listener\n  listeners = listeners.slice( 0 );\n  args = args || [];\n  // once stuff\n  let onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n\n  for ( let listener of listeners ) {\n    let isOnce = onceListeners && onceListeners[ listener ];\n    if ( isOnce ) {\n      // remove listener\n      // remove before trigger to prevent recursion\n      this.off( eventName, listener );\n      // unset once flag\n      delete onceListeners[ listener ];\n    }\n    // trigger listener\n    listener.apply( this, args );\n  }\n\n  return this;\n};\n\nproto.allOff = function() {\n  delete this._events;\n  delete this._onceEvents;\n  return this;\n};\n\nreturn EvEmitter;\n\n} ) );\n\n\n//# sourceURL=webpack://pixLib/./node_modules/ev-emitter/ev-emitter.js?\n}");
126
127/***/ }),
128
vendor: 762 bytes, lines 129-138
129/***/ "./node_modules/iframe-resizer/index.js":
130/*!**********************************************!*\
131  !*** ./node_modules/iframe-resizer/index.js ***!
132  \**********************************************/
133/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
134
135eval("{const iframeResize = __webpack_require__(/*! ./js/iframeResizer */ \"./node_modules/iframe-resizer/js/iframeResizer.js\")\n\nmodule.exports = {\n  iframeResize: iframeResize,\n  iframeResizer: iframeResize, // Backwards compatibility\n  contentWindow: __webpack_require__(/*! ./js/iframeResizer.contentWindow */ \"./node_modules/iframe-resizer/js/iframeResizer.contentWindow.js\")\n}\n\n\n//# sourceURL=webpack://pixLib/./node_modules/iframe-resizer/index.js?\n}");
136
137/***/ }),
138
vendor: 36,806 bytes, lines 139-148
139/***/ "./node_modules/iframe-resizer/js/iframeResizer.contentWindow.js":
140/*!***********************************************************************!*\
141  !*** ./node_modules/iframe-resizer/js/iframeResizer.contentWindow.js ***!
142  \***********************************************************************/
143/***/ (function(module) {
144
145eval("{/*\n * File: iframeResizer.contentWindow.js\n * Desc: Include this file in any page being loaded into an iframe\n *       to force the iframe to resize to the content size.\n * Requires: iframeResizer.js on host page.\n * Doc: https://iframe-resizer.com\n * Author: David J. Bradshaw - [email protected]\n *\n */\n\n// eslint-disable-next-line sonarjs/cognitive-complexity, no-shadow-restricted-names\n;(function (undefined) {\n  if (typeof window === 'undefined') return // don't run for server side render\n\n  var autoResize = true,\n    base = 10,\n    bodyBackground = '',\n    bodyMargin = 0,\n    bodyMarginStr = '',\n    bodyObserver = null,\n    bodyPadding = '',\n    calculateWidth = false,\n    doubleEventList = { resize: 1, click: 1 },\n    eventCancelTimer = 128,\n    firstRun = true,\n    height = 1,\n    heightCalcModeDefault = 'bodyOffset',\n    heightCalcMode = heightCalcModeDefault,\n    initLock = true,\n    initMsg = '',\n    inPageLinks = {},\n    interval = 32,\n    intervalTimer = null,\n    logging = false,\n    mouseEvents = false,\n    msgID = '[iFrameSizer]', // Must match host page msg ID\n    msgIdLen = msgID.length,\n    myID = '',\n    resetRequiredMethods = {\n      max: 1,\n      min: 1,\n      bodyScroll: 1,\n      documentElementScroll: 1\n    },\n    resizeFrom = 'child',\n    sendPermit = true,\n    target = window.parent,\n    targetOriginDefault = '*',\n    tolerance = 0,\n    triggerLocked = false,\n    triggerLockedTimer = null,\n    throttledTimer = 16,\n    width = 1,\n    widthCalcModeDefault = 'scroll',\n    widthCalcMode = widthCalcModeDefault,\n    win = window,\n    onMessage = function () {\n      warn('onMessage function not defined')\n    },\n    onReady = function () {},\n    onPageInfo = function () {},\n    customCalcMethods = {\n      height: function () {\n        warn('Custom height calculation function not defined')\n        return document.documentElement.offsetHeight\n      },\n      width: function () {\n        warn('Custom width calculation function not defined')\n        return document.body.scrollWidth\n      }\n    },\n    eventHandlersByName = {},\n    passiveSupported = false\n\n  function noop() {}\n\n  try {\n    var options = Object.create(\n      {},\n      {\n        passive: {\n          // eslint-disable-next-line getter-return\n          get: function () {\n            passiveSupported = true\n          }\n        }\n      }\n    )\n    window.addEventListener('test', noop, options)\n    window.removeEventListener('test', noop, options)\n  } catch (error) {\n    /* */\n  }\n\n  function addEventListener(el, evt, func, options) {\n    el.addEventListener(evt, func, passiveSupported ? options || {} : false)\n  }\n\n  function removeEventListener(el, evt, func) {\n    el.removeEventListener(evt, func, false)\n  }\n\n  function capitalizeFirstLetter(string) {\n    return string.charAt(0).toUpperCase() + string.slice(1)\n  }\n\n  // Based on underscore.js\n  function throttle(func) {\n    var context,\n      args,\n      result,\n      timeout = null,\n      previous = 0,\n      later = function () {\n        previous = Date.now()\n        timeout = null\n        result = func.apply(context, args)\n        if (!timeout) {\n          // eslint-disable-next-line no-multi-assign\n          context = args = null\n        }\n      }\n\n    return function () {\n      var now = Date.now()\n\n      if (!previous) {\n        previous = now\n      }\n\n      var remaining = throttledTimer - (now - previous)\n\n      context = this\n      args = arguments\n\n      if (remaining <= 0 || remaining > throttledTimer) {\n        if (timeout) {\n          clearTimeout(timeout)\n          timeout = null\n        }\n\n        previous = now\n        result = func.apply(context, args)\n\n        if (!timeout) {\n          // eslint-disable-next-line no-multi-assign\n          context = args = null\n        }\n      } else if (!timeout) {\n        timeout = setTimeout(later, remaining)\n      }\n\n      return result\n    }\n  }\n\n  function formatLogMsg(msg) {\n    return msgID + '[' + myID + '] ' + msg\n  }\n\n  function log(msg) {\n    if (logging && 'object' === typeof window.console) {\n      // eslint-disable-next-line no-console\n      console.log(formatLogMsg(msg))\n    }\n  }\n\n  function warn(msg) {\n    if ('object' === typeof window.console) {\n      // eslint-disable-next-line no-console\n      console.warn(formatLogMsg(msg))\n    }\n  }\n\n  function init() {\n    readDataFromParent()\n    log('Initialising iFrame (' + window.location.href + ')')\n    readDataFromPage()\n    setMargin()\n    setBodyStyle('background', bodyBackground)\n    setBodyStyle('padding', bodyPadding)\n    injectClearFixIntoBodyElement()\n    checkHeightMode()\n    checkWidthMode()\n    stopInfiniteResizingOfIFrame()\n    setupPublicMethods()\n    setupMouseEvents()\n    startEventListeners()\n    inPageLinks = setupInPageLinks()\n    sendSize('init', 'Init message from host page')\n    onReady()\n  }\n\n  function readDataFromParent() {\n    function strBool(str) {\n      return 'true' === str\n    }\n\n    var data = initMsg.slice(msgIdLen).split(':')\n\n    myID = data[0]\n    bodyMargin = undefined === data[1] ? bodyMargin : Number(data[1]) // For V1 compatibility\n    calculateWidth = undefined === data[2] ? calculateWidth : strBool(data[2])\n    logging = undefined === data[3] ? logging : strBool(data[3])\n    interval = undefined === data[4] ? interval : Number(data[4])\n    autoResize = undefined === data[6] ? autoResize : strBool(data[6])\n    bodyMarginStr = data[7]\n    heightCalcMode = undefined === data[8] ? heightCalcMode : data[8]\n    bodyBackground = data[9]\n    bodyPadding = data[10]\n    tolerance = undefined === data[11] ? tolerance : Number(data[11])\n    inPageLinks.enable = undefined === data[12] ? false : strBool(data[12])\n    resizeFrom = undefined === data[13] ? resizeFrom : data[13]\n    widthCalcMode = undefined === data[14] ? widthCalcMode : data[14]\n    mouseEvents = undefined === data[15] ? mouseEvents : strBool(data[15])\n  }\n\n  function depricate(key) {\n    var splitName = key.split('Callback')\n\n    if (splitName.length === 2) {\n      var name =\n        'on' + splitName[0].charAt(0).toUpperCase() + splitName[0].slice(1)\n      this[name] = this[key]\n      delete this[key]\n      warn(\n        \"Deprecated: '\" +\n          key +\n          \"' has been renamed '\" +\n          name +\n          \"'. The old method will be removed in the next major version.\"\n      )\n    }\n  }\n\n  function readDataFromPage() {\n    function readData() {\n      var data = window.iFrameResizer\n\n      log('Reading data from page: ' + JSON.stringify(data))\n      Object.keys(data).forEach(depricate, data)\n\n      onMessage = 'onMessage' in data ? data.onMessage : onMessage\n      onReady = 'onReady' in data ? data.onReady : onReady\n      targetOriginDefault =\n        'targetOrigin' in data ? data.targetOrigin : targetOriginDefault\n      heightCalcMode =\n        'heightCalculationMethod' in data\n          ? data.heightCalculationMethod\n          : heightCalcMode\n      widthCalcMode =\n        'widthCalculationMethod' in data\n          ? data.widthCalculationMethod\n          : widthCalcMode\n    }\n\n    function setupCustomCalcMethods(calcMode, calcFunc) {\n      if ('function' === typeof calcMode) {\n        log('Setup custom ' + calcFunc + 'CalcMethod')\n        customCalcMethods[calcFunc] = calcMode\n        calcMode = 'custom'\n      }\n\n      return calcMode\n    }\n\n    if (\n      'iFrameResizer' in window &&\n      Object === window.iFrameResizer.constructor\n    ) {\n      readData()\n      heightCalcMode = setupCustomCalcMethods(heightCalcMode, 'height')\n      widthCalcMode = setupCustomCalcMethods(widthCalcMode, 'width')\n    }\n\n    log('TargetOrigin for parent set to: ' + targetOriginDefault)\n  }\n\n  function chkCSS(attr, value) {\n    if (-1 !== value.indexOf('-')) {\n      warn('Negative CSS value ignored for ' + attr)\n      value = ''\n    }\n    return value\n  }\n\n  function setBodyStyle(attr, value) {\n    if (undefined !== value && '' !== value && 'null' !== value) {\n      document.body.style[attr] = value\n      log('Body ' + attr + ' set to \"' + value + '\"')\n    }\n  }\n\n  function setMargin() {\n    // If called via V1 script, convert bodyMargin from int to str\n    if (undefined === bodyMarginStr) {\n      bodyMarginStr = bodyMargin + 'px'\n    }\n\n    setBodyStyle('margin', chkCSS('margin', bodyMarginStr))\n  }\n\n  function stopInfiniteResizingOfIFrame() {\n    document.documentElement.style.height = ''\n    document.body.style.height = ''\n    log('HTML & body height set to \"auto\"')\n  }\n\n  function manageTriggerEvent(options) {\n    var listener = {\n      add: function (eventName) {\n        function handleEvent() {\n          sendSize(options.eventName, options.eventType)\n        }\n\n        eventHandlersByName[eventName] = handleEvent\n\n        addEventListener(window, eventName, handleEvent, { passive: true })\n      },\n      remove: function (eventName) {\n        var handleEvent = eventHandlersByName[eventName]\n        delete eventHandlersByName[eventName]\n\n        removeEventListener(window, eventName, handleEvent)\n      }\n    }\n\n    if (options.eventNames && Array.prototype.map) {\n      options.eventName = options.eventNames[0]\n      options.eventNames.map(listener[options.method])\n    } else {\n      listener[options.method](options.eventName)\n    }\n\n    log(\n      capitalizeFirstLetter(options.method) +\n        ' event listener: ' +\n        options.eventType\n    )\n  }\n\n  function manageEventListeners(method) {\n    manageTriggerEvent({\n      method: method,\n      eventType: 'Animation Start',\n      eventNames: ['animationstart', 'webkitAnimationStart']\n    })\n    manageTriggerEvent({\n      method: method,\n      eventType: 'Animation Iteration',\n      eventNames: ['animationiteration', 'webkitAnimationIteration']\n    })\n    manageTriggerEvent({\n      method: method,\n      eventType: 'Animation End',\n      eventNames: ['animationend', 'webkitAnimationEnd']\n    })\n    manageTriggerEvent({\n      method: method,\n      eventType: 'Input',\n      eventName: 'input'\n    })\n    manageTriggerEvent({\n      method: method,\n      eventType: 'Mouse Up',\n      eventName: 'mouseup'\n    })\n    manageTriggerEvent({\n      method: method,\n      eventType: 'Mouse Down',\n      eventName: 'mousedown'\n    })\n    manageTriggerEvent({\n      method: method,\n      eventType: 'Orientation Change',\n      eventName: 'orientationchange'\n    })\n    manageTriggerEvent({\n      method: method,\n      eventType: 'Print',\n      eventNames: ['afterprint', 'beforeprint']\n    })\n    manageTriggerEvent({\n      method: method,\n      eventType: 'Ready State Change',\n      eventName: 'readystatechange'\n    })\n    manageTriggerEvent({\n      method: method,\n      eventType: 'Touch Start',\n      eventName: 'touchstart'\n    })\n    manageTriggerEvent({\n      method: method,\n      eventType: 'Touch End',\n      eventName: 'touchend'\n    })\n    manageTriggerEvent({\n      method: method,\n      eventType: 'Touch Cancel',\n      eventName: 'touchcancel'\n    })\n    manageTriggerEvent({\n      method: method,\n      eventType: 'Transition Start',\n      eventNames: [\n        'transitionstart',\n        'webkitTransitionStart',\n        'MSTransitionStart',\n        'oTransitionStart',\n        'otransitionstart'\n      ]\n    })\n    manageTriggerEvent({\n      method: method,\n      eventType: 'Transition Iteration',\n      eventNames: [\n        'transitioniteration',\n        'webkitTransitionIteration',\n        'MSTransitionIteration',\n        'oTransitionIteration',\n        'otransitioniteration'\n      ]\n    })\n    manageTriggerEvent({\n      method: method,\n      eventType: 'Transition End',\n      eventNames: [\n        'transitionend',\n        'webkitTransitionEnd',\n        'MSTransitionEnd',\n        'oTransitionEnd',\n        'otransitionend'\n      ]\n    })\n    if ('child' === resizeFrom) {\n      manageTriggerEvent({\n        method: method,\n        eventType: 'IFrame Resized',\n        eventName: 'resize'\n      })\n    }\n  }\n\n  function checkCalcMode(calcMode, calcModeDefault, modes, type) {\n    if (calcModeDefault !== calcMode) {\n      if (!(calcMode in modes)) {\n        warn(\n          calcMode + ' is not a valid option for ' + type + 'CalculationMethod.'\n        )\n        calcMode = calcModeDefault\n      }\n      log(type + ' calculation method set to \"' + calcMode + '\"')\n    }\n\n    return calcMode\n  }\n\n  function checkHeightMode() {\n    heightCalcMode = checkCalcMode(\n      heightCalcMode,\n      heightCalcModeDefault,\n      getHeight,\n      'height'\n    )\n  }\n\n  function checkWidthMode() {\n    widthCalcMode = checkCalcMode(\n      widthCalcMode,\n      widthCalcModeDefault,\n      getWidth,\n      'width'\n    )\n  }\n\n  function startEventListeners() {\n    if (true === autoResize) {\n      manageEventListeners('add')\n      setupMutationObserver()\n    } else {\n      log('Auto Resize disabled')\n    }\n  }\n\n  //   function stopMsgsToParent() {\n  //     log('Disable outgoing messages')\n  //     sendPermit = false\n  //   }\n\n  //   function removeMsgListener() {\n  //     log('Remove event listener: Message')\n  //     removeEventListener(window, 'message', receiver)\n  //   }\n\n  function disconnectMutationObserver() {\n    if (null !== bodyObserver) {\n      /* istanbul ignore next */ // Not testable in PhantonJS\n      bodyObserver.disconnect()\n    }\n  }\n\n  function stopEventListeners() {\n    manageEventListeners('remove')\n    disconnectMutationObserver()\n    clearInterval(intervalTimer)\n  }\n\n  //   function teardown() {\n  //     stopMsgsToParent()\n  //     removeMsgListener()\n  //     if (true === autoResize) stopEventListeners()\n  //   }\n\n  function injectClearFixIntoBodyElement() {\n    var clearFix = document.createElement('div')\n    clearFix.style.clear = 'both'\n    // Guard against the following having been globally redefined in CSS.\n    clearFix.style.display = 'block'\n    clearFix.style.height = '0'\n    document.body.appendChild(clearFix)\n  }\n\n  function setupInPageLinks() {\n    function getPagePosition() {\n      return {\n        x:\n          window.pageXOffset === undefined\n            ? document.documentElement.scrollLeft\n            : window.pageXOffset,\n        y:\n          window.pageYOffset === undefined\n            ? document.documentElement.scrollTop\n            : window.pageYOffset\n      }\n    }\n\n    function getElementPosition(el) {\n      var elPosition = el.getBoundingClientRect(),\n        pagePosition = getPagePosition()\n\n      return {\n        x: parseInt(elPosition.left, 10) + parseInt(pagePosition.x, 10),\n        y: parseInt(elPosition.top, 10) + parseInt(pagePosition.y, 10)\n      }\n    }\n\n    function findTarget(location) {\n      function jumpToTarget(target) {\n        var jumpPosition = getElementPosition(target)\n\n        log(\n          'Moving to in page link (#' +\n            hash +\n            ') at x: ' +\n            jumpPosition.x +\n            ' y: ' +\n            jumpPosition.y\n        )\n        sendMsg(jumpPosition.y, jumpPosition.x, 'scrollToOffset') // X&Y reversed at sendMsg uses height/width\n      }\n\n      var hash = location.split('#')[1] || location, // Remove # if present\n        hashData = decodeURIComponent(hash),\n        target =\n          document.getElementById(hashData) ||\n          document.getElementsByName(hashData)[0]\n\n      if (undefined === target) {\n        log(\n          'In page link (#' +\n            hash +\n            ') not found in iFrame, so sending to parent'\n        )\n        sendMsg(0, 0, 'inPageLink', '#' + hash)\n      } else {\n        jumpToTarget(target)\n      }\n    }\n\n    function checkLocationHash() {\n      var hash = window.location.hash\n      var href = window.location.href\n\n      if ('' !== hash && '#' !== hash) {\n        findTarget(href)\n      }\n    }\n\n    function bindAnchors() {\n      function setupLink(el) {\n        function linkClicked(e) {\n          e.preventDefault()\n\n          /* jshint validthis:true */\n          findTarget(this.getAttribute('href'))\n        }\n\n        if ('#' !== el.getAttribute('href')) {\n          addEventListener(el, 'click', linkClicked)\n        }\n      }\n\n      Array.prototype.forEach.call(\n        document.querySelectorAll('a[href^=\"#\"]'),\n        setupLink\n      )\n    }\n\n    function bindLocationHash() {\n      addEventListener(window, 'hashchange', checkLocationHash)\n    }\n\n    function initCheck() {\n      // Check if page loaded with location hash after init resize\n      setTimeout(checkLocationHash, eventCancelTimer)\n    }\n\n    function enableInPageLinks() {\n      /* istanbul ignore else */ // Not testable in phantonJS\n      if (Array.prototype.forEach && document.querySelectorAll) {\n        log('Setting up location.hash handlers')\n        bindAnchors()\n        bindLocationHash()\n        initCheck()\n      } else {\n        warn(\n          'In page linking not fully supported in this browser! (See README.md for IE8 workaround)'\n        )\n      }\n    }\n\n    if (inPageLinks.enable) {\n      enableInPageLinks()\n    } else {\n      log('In page linking not enabled')\n    }\n\n    return {\n      findTarget: findTarget\n    }\n  }\n\n  function setupMouseEvents() {\n    if (mouseEvents !== true) return\n\n    function sendMouse(e) {\n      sendMsg(0, 0, e.type, e.screenY + ':' + e.screenX)\n    }\n\n    function addMouseListener(evt, name) {\n      log('Add event listener: ' + name)\n      addEventListener(window.document, evt, sendMouse)\n    }\n\n    addMouseListener('mouseenter', 'Mouse Enter')\n    addMouseListener('mouseleave', 'Mouse Leave')\n  }\n\n  function setupPublicMethods() {\n    log('Enable public methods')\n\n    win.parentIFrame = {\n      autoResize: function autoResizeF(resize) {\n        if (true === resize && false === autoResize) {\n          autoResize = true\n          startEventListeners()\n        } else if (false === resize && true === autoResize) {\n          autoResize = false\n          stopEventListeners()\n        }\n        sendMsg(0, 0, 'autoResize', JSON.stringify(autoResize))\n        return autoResize\n      },\n\n      close: function closeF() {\n        sendMsg(0, 0, 'close')\n        // teardown()\n      },\n\n      getId: function getIdF() {\n        return myID\n      },\n\n      getPageInfo: function getPageInfoF(callback) {\n        if ('function' === typeof callback) {\n          onPageInfo = callback\n          sendMsg(0, 0, 'pageInfo')\n        } else {\n          onPageInfo = function () {}\n          sendMsg(0, 0, 'pageInfoStop')\n        }\n      },\n\n      moveToAnchor: function moveToAnchorF(hash) {\n        inPageLinks.findTarget(hash)\n      },\n\n      reset: function resetF() {\n        resetIFrame('parentIFrame.reset')\n      },\n\n      scrollTo: function scrollToF(x, y) {\n        sendMsg(y, x, 'scrollTo') // X&Y reversed at sendMsg uses height/width\n      },\n\n      scrollToOffset: function scrollToF(x, y) {\n        sendMsg(y, x, 'scrollToOffset') // X&Y reversed at sendMsg uses height/width\n      },\n\n      sendMessage: function sendMessageF(msg, targetOrigin) {\n        sendMsg(0, 0, 'message', JSON.stringify(msg), targetOrigin)\n      },\n\n      setHeightCalculationMethod: function setHeightCalculationMethodF(\n        heightCalculationMethod\n      ) {\n        heightCalcMode = heightCalculationMethod\n        checkHeightMode()\n      },\n\n      setWidthCalculationMethod: function setWidthCalculationMethodF(\n        widthCalculationMethod\n      ) {\n        widthCalcMode = widthCalculationMethod\n        checkWidthMode()\n      },\n\n      setTargetOrigin: function setTargetOriginF(targetOrigin) {\n        log('Set targetOrigin: ' + targetOrigin)\n        targetOriginDefault = targetOrigin\n      },\n\n      size: function sizeF(customHeight, customWidth) {\n        var valString =\n          '' + (customHeight || '') + (customWidth ? ',' + customWidth : '')\n        sendSize(\n          'size',\n          'parentIFrame.size(' + valString + ')',\n          customHeight,\n          customWidth\n        )\n      }\n    }\n  }\n\n  function initInterval() {\n    if (0 !== interval) {\n      log('setInterval: ' + interval + 'ms')\n      intervalTimer = setInterval(function () {\n        sendSize('interval', 'setInterval: ' + interval)\n      }, Math.abs(interval))\n    }\n  }\n\n  // Not testable in PhantomJS\n  /* istanbul ignore next */\n  function setupBodyMutationObserver() {\n    function addImageLoadListners(mutation) {\n      function addImageLoadListener(element) {\n        if (false === element.complete) {\n          log('Attach listeners to ' + element.src)\n          element.addEventListener('load', imageLoaded, false)\n          element.addEventListener('error', imageError, false)\n          elements.push(element)\n        }\n      }\n\n      if (mutation.type === 'attributes' && mutation.attributeName === 'src') {\n        addImageLoadListener(mutation.target)\n      } else if (mutation.type === 'childList') {\n        Array.prototype.forEach.call(\n          mutation.target.querySelectorAll('img'),\n          addImageLoadListener\n        )\n      }\n    }\n\n    function removeFromArray(element) {\n      elements.splice(elements.indexOf(element), 1)\n    }\n\n    function removeImageLoadListener(element) {\n      log('Remove listeners from ' + element.src)\n      element.removeEventListener('load', imageLoaded, false)\n      element.removeEventListener('error', imageError, false)\n      removeFromArray(element)\n    }\n\n    function imageEventTriggered(event, type, typeDesc) {\n      removeImageLoadListener(event.target)\n      sendSize(type, typeDesc + ': ' + event.target.src)\n    }\n\n    function imageLoaded(event) {\n      imageEventTriggered(event, 'imageLoad', 'Image loaded')\n    }\n\n    function imageError(event) {\n      imageEventTriggered(event, 'imageLoadFailed', 'Image load failed')\n    }\n\n    function mutationObserved(mutations) {\n      sendSize(\n        'mutationObserver',\n        'mutationObserver: ' + mutations[0].target + ' ' + mutations[0].type\n      )\n\n      // Deal with WebKit / Blink asyncing image loading when tags are injected into the page\n      mutations.forEach(addImageLoadListners)\n    }\n\n    function createMutationObserver() {\n      var target = document.querySelector('body'),\n        config = {\n          attributes: true,\n          attributeOldValue: false,\n          characterData: true,\n          characterDataOldValue: false,\n          childList: true,\n          subtree: true\n        }\n\n      observer = new MutationObserver(mutationObserved)\n\n      log('Create body MutationObserver')\n      observer.observe(target, config)\n\n      return observer\n    }\n\n    var elements = [],\n      MutationObserver =\n        window.MutationObserver || window.WebKitMutationObserver,\n      observer = createMutationObserver()\n\n    return {\n      disconnect: function () {\n        if ('disconnect' in observer) {\n          log('Disconnect body MutationObserver')\n          observer.disconnect()\n          elements.forEach(removeImageLoadListener)\n        }\n      }\n    }\n  }\n\n  function setupMutationObserver() {\n    var forceIntervalTimer = 0 > interval\n\n    // Not testable in PhantomJS\n    /* istanbul ignore if */ if (\n      window.MutationObserver ||\n      window.WebKitMutationObserver\n    ) {\n      if (forceIntervalTimer) {\n        initInterval()\n      } else {\n        bodyObserver = setupBodyMutationObserver()\n      }\n    } else {\n      log('MutationObserver not supported in this browser!')\n      initInterval()\n    }\n  }\n\n  // document.documentElement.offsetHeight is not reliable, so\n  // we have to jump through hoops to get a better value.\n  function getComputedStyle(prop, el) {\n    var retVal = 0\n    el = el || document.body // Not testable in phantonJS\n\n    retVal = document.defaultView.getComputedStyle(el, null)\n    retVal = null === retVal ? 0 : retVal[prop]\n\n    return parseInt(retVal, base)\n  }\n\n  function chkEventThottle(timer) {\n    if (timer > throttledTimer / 2) {\n      throttledTimer = 2 * timer\n      log('Event throttle increased to ' + throttledTimer + 'ms')\n    }\n  }\n\n  // Idea from https://github.com/guardian/iframe-messenger\n  function getMaxElement(side, elements) {\n    var elementsLength = elements.length,\n      elVal = 0,\n      maxVal = 0,\n      Side = capitalizeFirstLetter(side),\n      timer = Date.now()\n\n    for (var i = 0; i < elementsLength; i++) {\n      elVal =\n        elements[i].getBoundingClientRect()[side] +\n        getComputedStyle('margin' + Side, elements[i])\n      if (elVal > maxVal) {\n        maxVal = elVal\n      }\n    }\n\n    timer = Date.now() - timer\n\n    log('Parsed ' + elementsLength + ' HTML elements')\n    log('Element position calculated in ' + timer + 'ms')\n\n    chkEventThottle(timer)\n\n    return maxVal\n  }\n\n  function getAllMeasurements(dimensions) {\n    return [\n      dimensions.bodyOffset(),\n      dimensions.bodyScroll(),\n      dimensions.documentElementOffset(),\n      dimensions.documentElementScroll()\n    ]\n  }\n\n  function getTaggedElements(side, tag) {\n    function noTaggedElementsFound() {\n      warn('No tagged elements (' + tag + ') found on page')\n      return document.querySelectorAll('body *')\n    }\n\n    var elements = document.querySelectorAll('[' + tag + ']')\n\n    if (elements.length === 0) noTaggedElementsFound()\n\n    return getMaxElement(side, elements)\n  }\n\n  function getAllElements() {\n    return document.querySelectorAll('body *')\n  }\n\n  var getHeight = {\n      bodyOffset: function getBodyOffsetHeight() {\n        return (\n          document.body.offsetHeight +\n          getComputedStyle('marginTop') +\n          getComputedStyle('marginBottom')\n        )\n      },\n\n      offset: function () {\n        return getHeight.bodyOffset() // Backwards compatibility\n      },\n\n      bodyScroll: function getBodyScrollHeight() {\n        return document.body.scrollHeight\n      },\n\n      custom: function getCustomWidth() {\n        return customCalcMethods.height()\n      },\n\n      documentElementOffset: function getDEOffsetHeight() {\n        return document.documentElement.offsetHeight\n      },\n\n      documentElementScroll: function getDEScrollHeight() {\n        return document.documentElement.scrollHeight\n      },\n\n      max: function getMaxHeight() {\n        return Math.max.apply(null, getAllMeasurements(getHeight))\n      },\n\n      min: function getMinHeight() {\n        return Math.min.apply(null, getAllMeasurements(getHeight))\n      },\n\n      grow: function growHeight() {\n        return getHeight.max() // Run max without the forced downsizing\n      },\n\n      lowestElement: function getBestHeight() {\n        return Math.max(\n          getHeight.bodyOffset() || getHeight.documentElementOffset(),\n          getMaxElement('bottom', getAllElements())\n        )\n      },\n\n      taggedElement: function getTaggedElementsHeight() {\n        return getTaggedElements('bottom', 'data-iframe-height')\n      }\n    },\n    getWidth = {\n      bodyScroll: function getBodyScrollWidth() {\n        return document.body.scrollWidth\n      },\n\n      bodyOffset: function getBodyOffsetWidth() {\n        return document.body.offsetWidth\n      },\n\n      custom: function getCustomWidth() {\n        return customCalcMethods.width()\n      },\n\n      documentElementScroll: function getDEScrollWidth() {\n        return document.documentElement.scrollWidth\n      },\n\n      documentElementOffset: function getDEOffsetWidth() {\n        return document.documentElement.offsetWidth\n      },\n\n      scroll: function getMaxWidth() {\n        return Math.max(getWidth.bodyScroll(), getWidth.documentElementScroll())\n      },\n\n      max: function getMaxWidth() {\n        return Math.max.apply(null, getAllMeasurements(getWidth))\n      },\n\n      min: function getMinWidth() {\n        return Math.min.apply(null, getAllMeasurements(getWidth))\n      },\n\n      rightMostElement: function rightMostElement() {\n        return getMaxElement('right', getAllElements())\n      },\n\n      taggedElement: function getTaggedElementsWidth() {\n        return getTaggedElements('right', 'data-iframe-width')\n      }\n    }\n\n  function sizeIFrame(\n    triggerEvent,\n    triggerEventDesc,\n    customHeight,\n    customWidth\n  ) {\n    function resizeIFrame() {\n      height = currentHeight\n      width = currentWidth\n\n      sendMsg(height, width, triggerEvent)\n    }\n\n    function isSizeChangeDetected() {\n      function checkTolarance(a, b) {\n        var retVal = Math.abs(a - b) <= tolerance\n        return !retVal\n      }\n\n      currentHeight =\n        undefined === customHeight ? getHeight[heightCalcMode]() : customHeight\n      currentWidth =\n        undefined === customWidth ? getWidth[widthCalcMode]() : customWidth\n\n      return (\n        checkTolarance(height, currentHeight) ||\n        (calculateWidth && checkTolarance(width, currentWidth))\n      )\n    }\n\n    function isForceResizableEvent() {\n      return !(triggerEvent in { init: 1, interval: 1, size: 1 })\n    }\n\n    function isForceResizableCalcMode() {\n      return (\n        heightCalcMode in resetRequiredMethods ||\n        (calculateWidth && widthCalcMode in resetRequiredMethods)\n      )\n    }\n\n    function logIgnored() {\n      log('No change in size detected')\n    }\n\n    function checkDownSizing() {\n      if (isForceResizableEvent() && isForceResizableCalcMode()) {\n        resetIFrame(triggerEventDesc)\n      } else if (!(triggerEvent in { interval: 1 })) {\n        logIgnored()\n      }\n    }\n\n    var currentHeight, currentWidth\n\n    if (isSizeChangeDetected() || 'init' === triggerEvent) {\n      lockTrigger()\n      resizeIFrame()\n    } else {\n      checkDownSizing()\n    }\n  }\n\n  var sizeIFrameThrottled = throttle(sizeIFrame)\n\n  function sendSize(triggerEvent, triggerEventDesc, customHeight, customWidth) {\n    function recordTrigger() {\n      if (!(triggerEvent in { reset: 1, resetPage: 1, init: 1 })) {\n        log('Trigger event: ' + triggerEventDesc)\n      }\n    }\n\n    function isDoubleFiredEvent() {\n      return triggerLocked && triggerEvent in doubleEventList\n    }\n\n    if (isDoubleFiredEvent()) {\n      log('Trigger event cancelled: ' + triggerEvent)\n    } else {\n      recordTrigger()\n      if (triggerEvent === 'init') {\n        sizeIFrame(triggerEvent, triggerEventDesc, customHeight, customWidth)\n      } else {\n        sizeIFrameThrottled(\n          triggerEvent,\n          triggerEventDesc,\n          customHeight,\n          customWidth\n        )\n      }\n    }\n  }\n\n  function lockTrigger() {\n    if (!triggerLocked) {\n      triggerLocked = true\n      log('Trigger event lock on')\n    }\n    clearTimeout(triggerLockedTimer)\n    triggerLockedTimer = setTimeout(function () {\n      triggerLocked = false\n      log('Trigger event lock off')\n      log('--')\n    }, eventCancelTimer)\n  }\n\n  function triggerReset(triggerEvent) {\n    height = getHeight[heightCalcMode]()\n    width = getWidth[widthCalcMode]()\n\n    sendMsg(height, width, triggerEvent)\n  }\n\n  function resetIFrame(triggerEventDesc) {\n    var hcm = heightCalcMode\n    heightCalcMode = heightCalcModeDefault\n\n    log('Reset trigger event: ' + triggerEventDesc)\n    lockTrigger()\n    triggerReset('reset')\n\n    heightCalcMode = hcm\n  }\n\n  function sendMsg(height, width, triggerEvent, msg, targetOrigin) {\n    function setTargetOrigin() {\n      if (undefined === targetOrigin) {\n        targetOrigin = targetOriginDefault\n      } else {\n        log('Message targetOrigin: ' + targetOrigin)\n      }\n    }\n\n    function sendToParent() {\n      var size = height + ':' + width,\n        message =\n          myID +\n          ':' +\n          size +\n          ':' +\n          triggerEvent +\n          (undefined === msg ? '' : ':' + msg)\n\n      log('Sending message to host page (' + message + ')')\n      target.postMessage(msgID + message, targetOrigin)\n    }\n\n    if (true === sendPermit) {\n      setTargetOrigin()\n      sendToParent()\n    }\n  }\n\n  function receiver(event) {\n    var processRequestFromParent = {\n      init: function initFromParent() {\n        initMsg = event.data\n        target = event.source\n\n        init()\n        firstRun = false\n        setTimeout(function () {\n          initLock = false\n        }, eventCancelTimer)\n      },\n\n      reset: function resetFromParent() {\n        if (initLock) {\n          log('Page reset ignored by init')\n        } else {\n          log('Page size reset by host page')\n          triggerReset('resetPage')\n        }\n      },\n\n      resize: function resizeFromParent() {\n        sendSize('resizeParent', 'Parent window requested size check')\n      },\n\n      moveToAnchor: function moveToAnchorF() {\n        inPageLinks.findTarget(getData())\n      },\n      inPageLink: function inPageLinkF() {\n        this.moveToAnchor()\n      }, // Backward compatibility\n\n      pageInfo: function pageInfoFromParent() {\n        var msgBody = getData()\n        log('PageInfoFromParent called from parent: ' + msgBody)\n        onPageInfo(JSON.parse(msgBody))\n        log(' --')\n      },\n\n      message: function messageFromParent() {\n        var msgBody = getData()\n\n        log('onMessage called from parent: ' + msgBody)\n        // eslint-disable-next-line sonarjs/no-extra-arguments\n        onMessage(JSON.parse(msgBody))\n        log(' --')\n      }\n    }\n\n    function isMessageForUs() {\n      return msgID === ('' + event.data).slice(0, msgIdLen) // ''+ Protects against non-string messages\n    }\n\n    function getMessageType() {\n      return event.data.split(']')[1].split(':')[0]\n    }\n\n    function getData() {\n      return event.data.slice(event.data.indexOf(':') + 1)\n    }\n\n    function isMiddleTier() {\n      return (\n        (!( true && module.exports) &&\n          'iFrameResize' in window) ||\n        (window.jQuery !== undefined &&\n          'iFrameResize' in window.jQuery.prototype)\n      )\n    }\n\n    function isInitMsg() {\n      // Test if this message is from a child below us. This is an ugly test, however, updating\n      // the message format would break backwards compatibility.\n      return event.data.split(':')[2] in { true: 1, false: 1 }\n    }\n\n    function callFromParent() {\n      var messageType = getMessageType()\n\n      if (messageType in processRequestFromParent) {\n        processRequestFromParent[messageType]()\n      } else if (!isMiddleTier() && !isInitMsg()) {\n        warn('Unexpected message (' + event.data + ')')\n      }\n    }\n\n    function processMessage() {\n      if (false === firstRun) {\n        callFromParent()\n      } else if (isInitMsg()) {\n        processRequestFromParent.init()\n      } else {\n        log(\n          'Ignored message of type \"' +\n            getMessageType() +\n            '\". Received before initialization.'\n        )\n      }\n    }\n\n    if (isMessageForUs()) {\n      processMessage()\n    }\n  }\n\n  // Normally the parent kicks things off when it detects the iFrame has loaded.\n  // If this script is async-loaded, then tell parent page to retry init.\n  function chkLateLoaded() {\n    if ('loading' !== document.readyState) {\n      window.parent.postMessage('[iFrameResizerChild]Ready', '*')\n    }\n  }\n\n  // Setup if not already running\n  if (!('iframeResizer' in window)) {\n    window.iframeChildListener = function (data) {\n      receiver({ data, sameDomian: true })\n    }\n    addEventListener(window, 'message', receiver)\n    addEventListener(window, 'readystatechange', chkLateLoaded)\n    chkLateLoaded()\n  }\n\n  \n})()\n\n\n//# sourceURL=webpack://pixLib/./node_modules/iframe-resizer/js/iframeResizer.contentWindow.js?\n}");
146
147/***/ }),
148
vendor: 41,145 bytes, lines 149-158
149/***/ "./node_modules/iframe-resizer/js/iframeResizer.js":
150/*!*********************************************************!*\
151  !*** ./node_modules/iframe-resizer/js/iframeResizer.js ***!
152  \*********************************************************/
153/***/ (function(module, exports) {
154
155eval("{var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*\n * File: iframeResizer.js\n * Desc: Force iframes to size to content.\n * Requires: iframeResizer.contentWindow.js to be loaded into the target frame.\n * Doc: https://iframe-resizer.com\n * Author: David J. Bradshaw - [email protected]\n */\n\nconsole.info(`\nIFRAME-RESIZER\n\nIframe-Resizer 5 is now available via the following two packages:\n\n * @iframe-resizer/parent\n * @iframe-resizer/child\n\nAdditionally their are also new versions of iframe-resizer for React, Vue, and jQuery.\n\nVersion 5 of iframe-resizer has been extensively rewritten to use modern browser APIs, which has enabled significantly better performance and greater accuracy in the detection of content resizing events.\n\nPlease see https://iframe-resizer.com/upgrade for more details.\n`)\n\n// eslint-disable-next-line sonarjs/cognitive-complexity, no-shadow-restricted-names\n;(function (undefined) {\n  if (typeof window === 'undefined') return // don't run for server side render\n\n  // var VERSION = '4.3.11'\n\n  var count = 0,\n    destroyObserver,\n    logEnabled = false,\n    hiddenCheckEnabled = false,\n    msgHeader = 'message',\n    msgHeaderLen = msgHeader.length,\n    msgId = '[iFrameSizer]', // Must match iframe msg ID\n    msgIdLen = msgId.length,\n    pagePosition = null,\n    requestAnimationFrame = window.requestAnimationFrame,\n    resetRequiredMethods = Object.freeze({\n      max: 1,\n      scroll: 1,\n      bodyScroll: 1,\n      documentElementScroll: 1\n    }),\n    settings = {},\n    timer = null,\n    defaults = Object.freeze({\n      autoResize: true,\n      bodyBackground: null,\n      bodyMargin: null,\n      bodyMarginV1: 8,\n      bodyPadding: null,\n      checkOrigin: true,\n      inPageLinks: false,\n      enablePublicMethods: true,\n      heightCalculationMethod: 'bodyOffset',\n      id: 'iFrameResizer',\n      interval: 32,\n      license: '1jqr0si6pnt',\n      log: false,\n      maxHeight: Infinity,\n      maxWidth: Infinity,\n      minHeight: 0,\n      minWidth: 0,\n      mouseEvents: true,\n      resizeFrom: 'parent',\n      scrolling: false,\n      sizeHeight: true,\n      sizeWidth: false,\n      warningTimeout: 5000,\n      tolerance: 0,\n      widthCalculationMethod: 'scroll',\n      onClose: function () {\n        return true\n      },\n      onClosed: function () {},\n      onInit: function () {},\n      onMessage: function () {\n        warn('onMessage function not defined')\n      },\n      onMouseEnter: function () {},\n      onMouseLeave: function () {},\n      onResized: function () {},\n      onScroll: function () {\n        return true\n      }\n    })\n\n  function getMutationObserver() {\n    return (\n      window.MutationObserver ||\n      window.WebKitMutationObserver ||\n      window.MozMutationObserver\n    )\n  }\n\n  function addEventListener(el, evt, func) {\n    el.addEventListener(evt, func, false)\n  }\n\n  function removeEventListener(el, evt, func) {\n    el.removeEventListener(evt, func, false)\n  }\n\n  function setupRequestAnimationFrame() {\n    var vendors = ['moz', 'webkit', 'o', 'ms']\n    var x\n\n    // Remove vendor prefixing if prefixed and break early if not\n    for (x = 0; x < vendors.length && !requestAnimationFrame; x += 1) {\n      requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame']\n    }\n\n    if (requestAnimationFrame) {\n      // Firefox extension content-scripts have a globalThis object that is not the same as window.\n      // Binding `requestAnimationFrame` to window allows the function to work and prevents errors\n      // being thrown when run in that context, and should be a no-op in every other context.\n      requestAnimationFrame = requestAnimationFrame.bind(window)\n    } else {\n      log('setup', 'RequestAnimationFrame not supported')\n    }\n  }\n\n  function getMyID(iframeId) {\n    var retStr = 'Host page: ' + iframeId\n\n    if (window.top !== window.self) {\n      retStr =\n        window.parentIFrame && window.parentIFrame.getId\n          ? window.parentIFrame.getId() + ': ' + iframeId\n          : 'Nested host page: ' + iframeId\n    }\n\n    return retStr\n  }\n\n  function formatLogHeader(iframeId) {\n    return msgId + '[' + getMyID(iframeId) + ']'\n  }\n\n  function isLogEnabled(iframeId) {\n    return settings[iframeId] ? settings[iframeId].log : logEnabled\n  }\n\n  function log(iframeId, msg) {\n    output('log', iframeId, msg, isLogEnabled(iframeId))\n  }\n\n  function info(iframeId, msg) {\n    output('info', iframeId, msg, isLogEnabled(iframeId))\n  }\n\n  function warn(iframeId, msg) {\n    output('warn', iframeId, msg, true)\n  }\n\n  function output(type, iframeId, msg, enabled) {\n    if (true === enabled && 'object' === typeof window.console) {\n      // eslint-disable-next-line no-console\n      console[type](formatLogHeader(iframeId), msg)\n    }\n  }\n\n  function iFrameListener(event) {\n    function resizeIFrame() {\n      function resize() {\n        setSize(messageData)\n        setPagePosition(iframeId)\n        on('onResized', messageData)\n      }\n\n      ensureInRange('Height')\n      ensureInRange('Width')\n\n      syncResize(resize, messageData, 'init')\n    }\n\n    function processMsg() {\n      var data = msg.slice(msgIdLen).split(':')\n      var height = data[1] ? parseInt(data[1], 10) : 0\n      var iframe = settings[data[0]] && settings[data[0]].iframe\n      var compStyle = getComputedStyle(iframe)\n\n      return {\n        iframe: iframe,\n        id: data[0],\n        height: height + getPaddingEnds(compStyle) + getBorderEnds(compStyle),\n        width: data[2],\n        type: data[3]\n      }\n    }\n\n    function getPaddingEnds(compStyle) {\n      if (compStyle.boxSizing !== 'border-box') {\n        return 0\n      }\n      var top = compStyle.paddingTop ? parseInt(compStyle.paddingTop, 10) : 0\n      var bot = compStyle.paddingBottom\n        ? parseInt(compStyle.paddingBottom, 10)\n        : 0\n      return top + bot\n    }\n\n    function getBorderEnds(compStyle) {\n      if (compStyle.boxSizing !== 'border-box') {\n        return 0\n      }\n      var top = compStyle.borderTopWidth\n        ? parseInt(compStyle.borderTopWidth, 10)\n        : 0\n      var bot = compStyle.borderBottomWidth\n        ? parseInt(compStyle.borderBottomWidth, 10)\n        : 0\n      return top + bot\n    }\n\n    function ensureInRange(Dimension) {\n      var max = Number(settings[iframeId]['max' + Dimension]),\n        min = Number(settings[iframeId]['min' + Dimension]),\n        dimension = Dimension.toLowerCase(),\n        size = Number(messageData[dimension])\n\n      log(iframeId, 'Checking ' + dimension + ' is in range ' + min + '-' + max)\n\n      if (size < min) {\n        size = min\n        log(iframeId, 'Set ' + dimension + ' to min value')\n      }\n\n      if (size > max) {\n        size = max\n        log(iframeId, 'Set ' + dimension + ' to max value')\n      }\n\n      messageData[dimension] = '' + size\n    }\n\n    function isMessageFromIFrame() {\n      function checkAllowedOrigin() {\n        function checkList() {\n          var i = 0,\n            retCode = false\n\n          log(\n            iframeId,\n            'Checking connection is from allowed list of origins: ' +\n              checkOrigin\n          )\n\n          for (; i < checkOrigin.length; i++) {\n            if (checkOrigin[i] === origin) {\n              retCode = true\n              break\n            }\n          }\n          return retCode\n        }\n\n        function checkSingle() {\n          var remoteHost = settings[iframeId] && settings[iframeId].remoteHost\n          log(iframeId, 'Checking connection is from: ' + remoteHost)\n          return origin === remoteHost\n        }\n\n        return checkOrigin.constructor === Array ? checkList() : checkSingle()\n      }\n\n      var origin = event.origin,\n        checkOrigin = settings[iframeId] && settings[iframeId].checkOrigin\n\n      if (checkOrigin && '' + origin !== 'null' && !checkAllowedOrigin()) {\n        throw new Error(\n          'Unexpected message received from: ' +\n            origin +\n            ' for ' +\n            messageData.iframe.id +\n            '. Message was: ' +\n            event.data +\n            '. This error can be disabled by setting the checkOrigin: false option or by providing of array of trusted domains.'\n        )\n      }\n\n      return true\n    }\n\n    function isMessageForUs() {\n      return (\n        msgId === ('' + msg).slice(0, msgIdLen) &&\n        msg.slice(msgIdLen).split(':')[0] in settings\n      ) // ''+Protects against non-string msg\n    }\n\n    function isMessageFromMetaParent() {\n      // Test if this message is from a parent above us. This is an ugly test, however, updating\n      // the message format would break backwards compatibility.\n      var retCode = messageData.type in { true: 1, false: 1, undefined: 1 }\n\n      if (retCode) {\n        log(iframeId, 'Ignoring init message from meta parent page')\n      }\n\n      return retCode\n    }\n\n    function getMsgBody(offset) {\n      return msg.slice(msg.indexOf(':') + msgHeaderLen + offset)\n    }\n\n    function forwardMsgFromIFrame(msgBody) {\n      log(\n        iframeId,\n        'onMessage passed: {iframe: ' +\n          messageData.iframe.id +\n          ', message: ' +\n          msgBody +\n          '}'\n      )\n\n      on('onMessage', {\n        iframe: messageData.iframe,\n        message: JSON.parse(msgBody)\n      })\n\n      log(iframeId, '--')\n    }\n\n    function getPageInfo() {\n      var bodyPosition = document.body.getBoundingClientRect(),\n        iFramePosition = messageData.iframe.getBoundingClientRect()\n\n      return JSON.stringify({\n        iframeHeight: iFramePosition.height,\n        iframeWidth: iFramePosition.width,\n        clientHeight: Math.max(\n          document.documentElement.clientHeight,\n          window.innerHeight || 0\n        ),\n        clientWidth: Math.max(\n          document.documentElement.clientWidth,\n          window.innerWidth || 0\n        ),\n        offsetTop: parseInt(iFramePosition.top - bodyPosition.top, 10),\n        offsetLeft: parseInt(iFramePosition.left - bodyPosition.left, 10),\n        scrollTop: window.pageYOffset,\n        scrollLeft: window.pageXOffset,\n        documentHeight: document.documentElement.clientHeight,\n        documentWidth: document.documentElement.clientWidth,\n        windowHeight: window.innerHeight,\n        windowWidth: window.innerWidth\n      })\n    }\n\n    function sendPageInfoToIframe(iframe, iframeId) {\n      function debouncedTrigger() {\n        trigger('Send Page Info', 'pageInfo:' + getPageInfo(), iframe, iframeId)\n      }\n      debounceFrameEvents(debouncedTrigger, 32, iframeId)\n    }\n\n    function startPageInfoMonitor() {\n      function setListener(type, func) {\n        function sendPageInfo() {\n          if (settings[id]) {\n            sendPageInfoToIframe(settings[id].iframe, id)\n          } else {\n            stop()\n          }\n        }\n\n        ;['scroll', 'resize'].forEach(function (evt) {\n          log(id, type + evt + ' listener for sendPageInfo')\n          func(window, evt, sendPageInfo)\n        })\n      }\n\n      function stop() {\n        setListener('Remove ', removeEventListener)\n      }\n\n      function start() {\n        setListener('Add ', addEventListener)\n      }\n\n      var id = iframeId // Create locally scoped copy of iFrame ID\n\n      start()\n\n      if (settings[id]) {\n        settings[id].stopPageInfo = stop\n      }\n    }\n\n    function stopPageInfoMonitor() {\n      if (settings[iframeId] && settings[iframeId].stopPageInfo) {\n        settings[iframeId].stopPageInfo()\n        delete settings[iframeId].stopPageInfo\n      }\n    }\n\n    function checkIFrameExists() {\n      var retBool = true\n\n      if (null === messageData.iframe) {\n        warn(iframeId, 'IFrame (' + messageData.id + ') not found')\n        retBool = false\n      }\n      return retBool\n    }\n\n    function getElementPosition(target) {\n      var iFramePosition = target.getBoundingClientRect()\n\n      getPagePosition(iframeId)\n\n      return {\n        x: Math.floor(Number(iFramePosition.left) + Number(pagePosition.x)),\n        y: Math.floor(Number(iFramePosition.top) + Number(pagePosition.y))\n      }\n    }\n\n    function scrollRequestFromChild(addOffset) {\n      /* istanbul ignore next */ // Not testable in Karma\n      function reposition() {\n        pagePosition = newPosition\n        scrollTo()\n        log(iframeId, '--')\n      }\n\n      function calcOffset() {\n        return {\n          x: Number(messageData.width) + offset.x,\n          y: Number(messageData.height) + offset.y\n        }\n      }\n\n      function scrollParent() {\n        if (window.parentIFrame) {\n          window.parentIFrame['scrollTo' + (addOffset ? 'Offset' : '')](\n            newPosition.x,\n            newPosition.y\n          )\n        } else {\n          warn(\n            iframeId,\n            'Unable to scroll to requested position, window.parentIFrame not found'\n          )\n        }\n      }\n\n      var offset = addOffset\n          ? getElementPosition(messageData.iframe)\n          : { x: 0, y: 0 },\n        newPosition = calcOffset()\n\n      log(\n        iframeId,\n        'Reposition requested from iFrame (offset x:' +\n          offset.x +\n          ' y:' +\n          offset.y +\n          ')'\n      )\n\n      if (window.top === window.self) {\n        reposition()\n      } else {\n        scrollParent()\n      }\n    }\n\n    function scrollTo() {\n      if (false === on('onScroll', pagePosition)) {\n        unsetPagePosition()\n      } else {\n        setPagePosition(iframeId)\n      }\n    }\n\n    function findTarget(location) {\n      function jumpToTarget() {\n        var jumpPosition = getElementPosition(target)\n\n        log(\n          iframeId,\n          'Moving to in page link (#' +\n            hash +\n            ') at x: ' +\n            jumpPosition.x +\n            ' y: ' +\n            jumpPosition.y\n        )\n        pagePosition = {\n          x: jumpPosition.x,\n          y: jumpPosition.y\n        }\n\n        scrollTo()\n        log(iframeId, '--')\n      }\n\n      function jumpToParent() {\n        if (window.parentIFrame) {\n          window.parentIFrame.moveToAnchor(hash)\n        } else {\n          log(\n            iframeId,\n            'In page link #' +\n              hash +\n              ' not found and window.parentIFrame not found'\n          )\n        }\n      }\n\n      var hash = location.split('#')[1] || '',\n        hashData = decodeURIComponent(hash),\n        target =\n          document.getElementById(hashData) ||\n          document.getElementsByName(hashData)[0]\n\n      if (target) {\n        jumpToTarget()\n      } else if (window.top === window.self) {\n        log(iframeId, 'In page link #' + hash + ' not found')\n      } else {\n        jumpToParent()\n      }\n    }\n\n    function onMouse(event) {\n      var mousePos = {}\n\n      if (Number(messageData.width) === 0 && Number(messageData.height) === 0) {\n        var data = getMsgBody(9).split(':')\n        mousePos = {\n          x: data[1],\n          y: data[0]\n        }\n      } else {\n        mousePos = {\n          x: messageData.width,\n          y: messageData.height\n        }\n      }\n\n      on(event, {\n        iframe: messageData.iframe,\n        screenX: Number(mousePos.x),\n        screenY: Number(mousePos.y),\n        type: messageData.type\n      })\n    }\n\n    function on(funcName, val) {\n      return chkEvent(iframeId, funcName, val)\n    }\n\n    function actionMsg() {\n      if (settings[iframeId] && settings[iframeId].firstRun) firstRun()\n\n      switch (messageData.type) {\n        case 'close': {\n          closeIFrame(messageData.iframe)\n          break\n        }\n\n        case 'message': {\n          forwardMsgFromIFrame(getMsgBody(6))\n          break\n        }\n\n        case 'mouseenter': {\n          onMouse('onMouseEnter')\n          break\n        }\n\n        case 'mouseleave': {\n          onMouse('onMouseLeave')\n          break\n        }\n\n        case 'autoResize': {\n          settings[iframeId].autoResize = JSON.parse(getMsgBody(9))\n          break\n        }\n\n        case 'scrollTo': {\n          scrollRequestFromChild(false)\n          break\n        }\n\n        case 'scrollToOffset': {\n          scrollRequestFromChild(true)\n          break\n        }\n\n        case 'pageInfo': {\n          sendPageInfoToIframe(\n            settings[iframeId] && settings[iframeId].iframe,\n            iframeId\n          )\n          startPageInfoMonitor()\n          break\n        }\n\n        case 'pageInfoStop': {\n          stopPageInfoMonitor()\n          break\n        }\n\n        case 'inPageLink': {\n          findTarget(getMsgBody(9))\n          break\n        }\n\n        case 'reset': {\n          resetIFrame(messageData)\n          break\n        }\n\n        case 'init': {\n          resizeIFrame()\n          on('onInit', messageData.iframe)\n          break\n        }\n\n        default: {\n          if (\n            Number(messageData.width) === 0 &&\n            Number(messageData.height) === 0\n          ) {\n            warn(\n              'Unsupported message received (' +\n                messageData.type +\n                '), this is likely due to the iframe containing a later ' +\n                'version of iframe-resizer than the parent page'\n            )\n          } else {\n            resizeIFrame()\n          }\n        }\n      }\n    }\n\n    function hasSettings(iframeId) {\n      var retBool = true\n\n      if (!settings[iframeId]) {\n        retBool = false\n        warn(\n          messageData.type +\n            ' No settings for ' +\n            iframeId +\n            '. Message was: ' +\n            msg\n        )\n      }\n\n      return retBool\n    }\n\n    function iFrameReadyMsgReceived() {\n      // eslint-disable-next-line no-restricted-syntax, guard-for-in\n      for (var iframeId in settings) {\n        trigger(\n          'iFrame requested init',\n          createOutgoingMsg(iframeId),\n          settings[iframeId].iframe,\n          iframeId\n        )\n      }\n    }\n\n    function firstRun() {\n      if (settings[iframeId]) {\n        settings[iframeId].firstRun = false\n      }\n    }\n\n    var msg = event.data,\n      messageData = {},\n      iframeId = null\n\n    if ('[iFrameResizerChild]Ready' === msg) {\n      iFrameReadyMsgReceived()\n    } else if (isMessageForUs()) {\n      messageData = processMsg()\n      iframeId = messageData.id\n      if (settings[iframeId]) {\n        settings[iframeId].loaded = true\n      }\n\n      if (!isMessageFromMetaParent() && hasSettings(iframeId)) {\n        log(iframeId, 'Received: ' + msg)\n\n        if (checkIFrameExists() && isMessageFromIFrame()) {\n          actionMsg()\n        }\n      }\n    } else {\n      info(iframeId, 'Ignored: ' + msg)\n    }\n  }\n\n  function chkEvent(iframeId, funcName, val) {\n    var func = null,\n      retVal = null\n\n    if (settings[iframeId]) {\n      func = settings[iframeId][funcName]\n\n      if ('function' === typeof func) {\n        retVal = func(val)\n      } else {\n        throw new TypeError(\n          funcName + ' on iFrame[' + iframeId + '] is not a function'\n        )\n      }\n    }\n\n    return retVal\n  }\n\n  function removeIframeListeners(iframe) {\n    var iframeId = iframe.id\n    delete settings[iframeId]\n  }\n\n  function closeIFrame(iframe) {\n    var iframeId = iframe.id\n    if (chkEvent(iframeId, 'onClose', iframeId) === false) {\n      log(iframeId, 'Close iframe cancelled by onClose event')\n      return\n    }\n    log(iframeId, 'Removing iFrame: ' + iframeId)\n\n    try {\n      // Catch race condition error with React\n      if (iframe.parentNode) {\n        iframe.parentNode.removeChild(iframe)\n      }\n    } catch (error) {\n      warn(error)\n    }\n\n    chkEvent(iframeId, 'onClosed', iframeId)\n    log(iframeId, '--')\n    removeIframeListeners(iframe)\n    if (destroyObserver) {\n      destroyObserver.disconnect()\n      destroyObserver = null\n    }\n  }\n\n  function getPagePosition(iframeId) {\n    if (null === pagePosition) {\n      pagePosition = {\n        x:\n          window.pageXOffset === undefined\n            ? document.documentElement.scrollLeft\n            : window.pageXOffset,\n        y:\n          window.pageYOffset === undefined\n            ? document.documentElement.scrollTop\n            : window.pageYOffset\n      }\n      log(\n        iframeId,\n        'Get page position: ' + pagePosition.x + ',' + pagePosition.y\n      )\n    }\n  }\n\n  function setPagePosition(iframeId) {\n    if (null !== pagePosition) {\n      window.scrollTo(pagePosition.x, pagePosition.y)\n      log(\n        iframeId,\n        'Set page position: ' + pagePosition.x + ',' + pagePosition.y\n      )\n      unsetPagePosition()\n    }\n  }\n\n  function unsetPagePosition() {\n    pagePosition = null\n  }\n\n  function resetIFrame(messageData) {\n    function reset() {\n      setSize(messageData)\n      trigger('reset', 'reset', messageData.iframe, messageData.id)\n    }\n\n    log(\n      messageData.id,\n      'Size reset requested by ' +\n        ('init' === messageData.type ? 'host page' : 'iFrame')\n    )\n    getPagePosition(messageData.id)\n    syncResize(reset, messageData, 'reset')\n  }\n\n  function setSize(messageData) {\n    function setDimension(dimension) {\n      if (!messageData.id) {\n        log('undefined', 'messageData id not set')\n        return\n      }\n      messageData.iframe.style[dimension] = messageData[dimension] + 'px'\n      log(\n        messageData.id,\n        'IFrame (' +\n          iframeId +\n          ') ' +\n          dimension +\n          ' set to ' +\n          messageData[dimension] +\n          'px'\n      )\n    }\n\n    function chkZero(dimension) {\n      // FireFox sets dimension of hidden iFrames to zero.\n      // So if we detect that set up an event to check for\n      // when iFrame becomes visible.\n\n      /* istanbul ignore next */ // Not testable in PhantomJS\n      if (!hiddenCheckEnabled && '0' === messageData[dimension]) {\n        hiddenCheckEnabled = true\n        log(iframeId, 'Hidden iFrame detected, creating visibility listener')\n        fixHiddenIFrames()\n      }\n    }\n\n    function processDimension(dimension) {\n      setDimension(dimension)\n      chkZero(dimension)\n    }\n\n    var iframeId = messageData.iframe.id\n\n    if (settings[iframeId]) {\n      if (settings[iframeId].sizeHeight) {\n        processDimension('height')\n      }\n      if (settings[iframeId].sizeWidth) {\n        processDimension('width')\n      }\n    }\n  }\n\n  function syncResize(func, messageData, doNotSync) {\n    /* istanbul ignore if */ // Not testable in PhantomJS\n    if (\n      doNotSync !== messageData.type &&\n      requestAnimationFrame &&\n      // including check for jasmine because had trouble getting spy to work in unit test using requestAnimationFrame\n      !window.jasmine\n    ) {\n      log(messageData.id, 'Requesting animation frame')\n      requestAnimationFrame(func)\n    } else {\n      func()\n    }\n  }\n\n  function trigger(calleeMsg, msg, iframe, id, noResponseWarning) {\n    function postMessageToIFrame() {\n      var target = settings[id] && settings[id].targetOrigin\n      log(\n        id,\n        '[' +\n          calleeMsg +\n          '] Sending msg to iframe[' +\n          id +\n          '] (' +\n          msg +\n          ') targetOrigin: ' +\n          target\n      )\n      iframe.contentWindow.postMessage(msgId + msg, target)\n    }\n\n    function iFrameNotFound() {\n      warn(id, '[' + calleeMsg + '] IFrame(' + id + ') not found')\n    }\n\n    function chkAndSend() {\n      if (\n        iframe &&\n        'contentWindow' in iframe &&\n        null !== iframe.contentWindow\n      ) {\n        // Null test for PhantomJS\n        postMessageToIFrame()\n      } else {\n        iFrameNotFound()\n      }\n    }\n\n    function warnOnNoResponse() {\n      function warning() {\n        if (settings[id] && !settings[id].loaded && !errorShown) {\n          errorShown = true\n          warn(\n            id,\n            'IFrame has not responded within ' +\n              settings[id].warningTimeout / 1000 +\n              ' seconds. Check iFrameResizer.contentWindow.js has been loaded in iFrame. This message can be ignored if everything is working, or you can set the warningTimeout option to a higher value or zero to suppress this warning.'\n          )\n        }\n      }\n\n      if (\n        !!noResponseWarning &&\n        settings[id] &&\n        !!settings[id].warningTimeout\n      ) {\n        settings[id].msgTimeout = setTimeout(\n          warning,\n          settings[id].warningTimeout\n        )\n      }\n    }\n\n    var errorShown = false\n\n    id = id || iframe.id\n\n    if (settings[id]) {\n      chkAndSend()\n      warnOnNoResponse()\n    }\n  }\n\n  function createOutgoingMsg(iframeId) {\n    return (\n      iframeId +\n      ':' +\n      settings[iframeId].bodyMarginV1 +\n      ':' +\n      settings[iframeId].sizeWidth +\n      ':' +\n      settings[iframeId].log +\n      ':' +\n      settings[iframeId].interval +\n      ':' +\n      settings[iframeId].enablePublicMethods +\n      ':' +\n      settings[iframeId].autoResize +\n      ':' +\n      settings[iframeId].bodyMargin +\n      ':' +\n      settings[iframeId].heightCalculationMethod +\n      ':' +\n      settings[iframeId].bodyBackground +\n      ':' +\n      settings[iframeId].bodyPadding +\n      ':' +\n      settings[iframeId].tolerance +\n      ':' +\n      settings[iframeId].inPageLinks +\n      ':' +\n      settings[iframeId].resizeFrom +\n      ':' +\n      settings[iframeId].widthCalculationMethod +\n      ':' +\n      settings[iframeId].mouseEvents\n    )\n  }\n\n  function isNumber(value) {\n    return typeof value === 'number'\n  }\n\n  function setupIFrame(iframe, options) {\n    function setLimits() {\n      function addStyle(style) {\n        var styleValue = settings[iframeId][style]\n        if (Infinity !== styleValue && 0 !== styleValue) {\n          iframe.style[style] = isNumber(styleValue)\n            ? styleValue + 'px'\n            : styleValue\n          log(iframeId, 'Set ' + style + ' = ' + iframe.style[style])\n        }\n      }\n\n      function chkMinMax(dimension) {\n        if (\n          settings[iframeId]['min' + dimension] >\n          settings[iframeId]['max' + dimension]\n        ) {\n          throw new Error(\n            'Value for min' +\n              dimension +\n              ' can not be greater than max' +\n              dimension\n          )\n        }\n      }\n\n      chkMinMax('Height')\n      chkMinMax('Width')\n\n      addStyle('maxHeight')\n      addStyle('minHeight')\n      addStyle('maxWidth')\n      addStyle('minWidth')\n    }\n\n    function newId() {\n      var id = (options && options.id) || defaults.id + count++\n      if (null !== document.getElementById(id)) {\n        id += count++\n      }\n      return id\n    }\n\n    function ensureHasId(iframeId) {\n      if (typeof iframeId !== 'string') {\n        throw new TypeError('Invaild id for iFrame. Expected String')\n      }\n\n      if ('' === iframeId) {\n        // eslint-disable-next-line no-multi-assign\n        iframe.id = iframeId = newId()\n        logEnabled = (options || {}).log\n        log(\n          iframeId,\n          'Added missing iframe ID: ' + iframeId + ' (' + iframe.src + ')'\n        )\n      }\n\n      return iframeId\n    }\n\n    function setScrolling() {\n      log(\n        iframeId,\n        'IFrame scrolling ' +\n          (settings[iframeId] && settings[iframeId].scrolling\n            ? 'enabled'\n            : 'disabled') +\n          ' for ' +\n          iframeId\n      )\n      iframe.style.overflow =\n        false === (settings[iframeId] && settings[iframeId].scrolling)\n          ? 'hidden'\n          : 'auto'\n      switch (settings[iframeId] && settings[iframeId].scrolling) {\n        case 'omit': {\n          break\n        }\n\n        case true: {\n          iframe.scrolling = 'yes'\n          break\n        }\n\n        case false: {\n          iframe.scrolling = 'no'\n          break\n        }\n\n        default: {\n          iframe.scrolling = settings[iframeId]\n            ? settings[iframeId].scrolling\n            : 'no'\n        }\n      }\n    }\n\n    // The V1 iFrame script expects an int, where as in V2 expects a CSS\n    // string value such as '1px 3em', so if we have an int for V2, set V1=V2\n    // and then convert V2 to a string PX value.\n    function setupBodyMarginValues() {\n      if (\n        'number' ===\n          typeof (settings[iframeId] && settings[iframeId].bodyMargin) ||\n        '0' === (settings[iframeId] && settings[iframeId].bodyMargin)\n      ) {\n        settings[iframeId].bodyMarginV1 = settings[iframeId].bodyMargin\n        settings[iframeId].bodyMargin =\n          '' + settings[iframeId].bodyMargin + 'px'\n      }\n    }\n\n    function checkReset() {\n      // Reduce scope of firstRun to function, because IE8's JS execution\n      // context stack is borked and this value gets externally\n      // changed midway through running this function!!!\n      var firstRun = settings[iframeId] && settings[iframeId].firstRun,\n        resetRequertMethod =\n          settings[iframeId] &&\n          settings[iframeId].heightCalculationMethod in resetRequiredMethods\n\n      if (!firstRun && resetRequertMethod) {\n        resetIFrame({ iframe: iframe, height: 0, width: 0, type: 'init' })\n      }\n    }\n\n    function setupIFrameObject() {\n      if (settings[iframeId]) {\n        settings[iframeId].iframe.iFrameResizer = {\n          close: closeIFrame.bind(null, settings[iframeId].iframe),\n\n          removeListeners: removeIframeListeners.bind(\n            null,\n            settings[iframeId].iframe\n          ),\n\n          resize: trigger.bind(\n            null,\n            'Window resize',\n            'resize',\n            settings[iframeId].iframe\n          ),\n\n          moveToAnchor: function (anchor) {\n            trigger(\n              'Move to anchor',\n              'moveToAnchor:' + anchor,\n              settings[iframeId].iframe,\n              iframeId\n            )\n          },\n\n          sendMessage: function (message) {\n            message = JSON.stringify(message)\n            trigger(\n              'Send Message',\n              'message:' + message,\n              settings[iframeId].iframe,\n              iframeId\n            )\n          }\n        }\n      }\n    }\n\n    // We have to call trigger twice, as we can not be sure if all\n    // iframes have completed loading when this code runs. The\n    // event listener also catches the page changing in the iFrame.\n    function init(msg) {\n      function iFrameLoaded() {\n        trigger('iFrame.onload', msg, iframe, undefined, true)\n        checkReset()\n      }\n\n      function createDestroyObserver(MutationObserver) {\n        if (!iframe.parentNode) {\n          return null\n        }\n\n        var destroyObserver = new MutationObserver(function (mutations) {\n          mutations.forEach(function (mutation) {\n            var removedNodes = Array.prototype.slice.call(mutation.removedNodes) // Transform NodeList into an Array\n            removedNodes.forEach(function (removedNode) {\n              if (removedNode === iframe) {\n                closeIFrame(iframe)\n              }\n            })\n          })\n        })\n        destroyObserver.observe(iframe.parentNode, {\n          childList: true\n        })\n        return destroyObserver\n      }\n\n      var MutationObserver = getMutationObserver()\n      if (MutationObserver) {\n        destroyObserver = createDestroyObserver(MutationObserver)\n      }\n\n      addEventListener(iframe, 'load', iFrameLoaded)\n      trigger('init', msg, iframe, undefined, true)\n    }\n\n    function checkOptions(options) {\n      if ('object' !== typeof options) {\n        throw new TypeError('Options is not an object')\n      }\n    }\n\n    function copyOptions(options) {\n      // eslint-disable-next-line no-restricted-syntax\n      for (var option in defaults) {\n        if (Object.prototype.hasOwnProperty.call(defaults, option)) {\n          settings[iframeId][option] = Object.prototype.hasOwnProperty.call(\n            options,\n            option\n          )\n            ? options[option]\n            : defaults[option]\n        }\n      }\n    }\n\n    function getTargetOrigin(remoteHost) {\n      return '' === remoteHost ||\n        null !== remoteHost.match(/^(about:blank|javascript:|file:\\/\\/)/)\n        ? '*'\n        : remoteHost\n    }\n\n    function depricate(key) {\n      var splitName = key.split('Callback')\n\n      if (splitName.length === 2) {\n        var name =\n          'on' + splitName[0].charAt(0).toUpperCase() + splitName[0].slice(1)\n        this[name] = this[key]\n        delete this[key]\n        warn(\n          iframeId,\n          \"Deprecated: '\" +\n            key +\n            \"' has been renamed '\" +\n            name +\n            \"'. The old method will be removed in the next major version.\"\n        )\n      }\n    }\n\n    function processOptions(options) {\n      options = options || {}\n\n      settings[iframeId] = Object.create(null) // Protect against prototype attacks\n      settings[iframeId].iframe = iframe\n      settings[iframeId].firstRun = true\n      settings[iframeId].remoteHost =\n        iframe.src && iframe.src.split('/').slice(0, 3).join('/')\n\n      checkOptions(options)\n      Object.keys(options).forEach(depricate, options)\n      copyOptions(options)\n\n      if (settings[iframeId]) {\n        settings[iframeId].targetOrigin =\n          true === settings[iframeId].checkOrigin\n            ? getTargetOrigin(settings[iframeId].remoteHost)\n            : '*'\n      }\n    }\n\n    function beenHere() {\n      return iframeId in settings && 'iFrameResizer' in iframe\n    }\n\n    var iframeId = ensureHasId(iframe.id)\n\n    if (beenHere()) {\n      warn(iframeId, 'Ignored iFrame, already setup.')\n    } else {\n      processOptions(options)\n      setScrolling()\n      setLimits()\n      setupBodyMarginValues()\n      init(createOutgoingMsg(iframeId))\n      setupIFrameObject()\n    }\n  }\n\n  function debouce(fn, time) {\n    if (null === timer) {\n      timer = setTimeout(function () {\n        timer = null\n        fn()\n      }, time)\n    }\n  }\n\n  var frameTimer = {}\n  function debounceFrameEvents(fn, time, frameId) {\n    if (!frameTimer[frameId]) {\n      frameTimer[frameId] = setTimeout(function () {\n        frameTimer[frameId] = null\n        fn()\n      }, time)\n    }\n  }\n\n  // Not testable in PhantomJS\n  /* istanbul ignore next */\n\n  function fixHiddenIFrames() {\n    function checkIFrames() {\n      function checkIFrame(settingId) {\n        function chkDimension(dimension) {\n          return (\n            '0px' ===\n            (settings[settingId] && settings[settingId].iframe.style[dimension])\n          )\n        }\n\n        function isVisible(el) {\n          return null !== el.offsetParent\n        }\n\n        if (\n          settings[settingId] &&\n          isVisible(settings[settingId].iframe) &&\n          (chkDimension('height') || chkDimension('width'))\n        ) {\n          trigger(\n            'Visibility change',\n            'resize',\n            settings[settingId].iframe,\n            settingId\n          )\n        }\n      }\n\n      Object.keys(settings).forEach(function (key) {\n        checkIFrame(key)\n      })\n    }\n\n    function mutationObserved(mutations) {\n      log(\n        'window',\n        'Mutation observed: ' + mutations[0].target + ' ' + mutations[0].type\n      )\n      debouce(checkIFrames, 16)\n    }\n\n    function createMutationObserver() {\n      var target = document.querySelector('body'),\n        config = {\n          attributes: true,\n          attributeOldValue: false,\n          characterData: true,\n          characterDataOldValue: false,\n          childList: true,\n          subtree: true\n        },\n        observer = new MutationObserver(mutationObserved)\n\n      observer.observe(target, config)\n    }\n\n    var MutationObserver = getMutationObserver()\n    if (MutationObserver) {\n      createMutationObserver()\n    }\n  }\n\n  function resizeIFrames(event) {\n    function resize() {\n      sendTriggerMsg('Window ' + event, 'resize')\n    }\n\n    log('window', 'Trigger event: ' + event)\n    debouce(resize, 16)\n  }\n\n  // Not testable in PhantomJS\n  /* istanbul ignore next */\n  function tabVisible() {\n    function resize() {\n      sendTriggerMsg('Tab Visible', 'resize')\n    }\n\n    if ('hidden' !== document.visibilityState) {\n      log('document', 'Trigger event: Visibility change')\n      debouce(resize, 16)\n    }\n  }\n\n  function sendTriggerMsg(eventName, event) {\n    function isIFrameResizeEnabled(iframeId) {\n      return (\n        settings[iframeId] &&\n        'parent' === settings[iframeId].resizeFrom &&\n        settings[iframeId].autoResize &&\n        !settings[iframeId].firstRun\n      )\n    }\n\n    Object.keys(settings).forEach(function (iframeId) {\n      if (isIFrameResizeEnabled(iframeId)) {\n        trigger(eventName, event, settings[iframeId].iframe, iframeId)\n      }\n    })\n  }\n\n  function setupEventListeners() {\n    addEventListener(window, 'message', iFrameListener)\n\n    addEventListener(window, 'resize', function () {\n      resizeIFrames('resize')\n    })\n\n    addEventListener(document, 'visibilitychange', tabVisible)\n\n    addEventListener(document, '-webkit-visibilitychange', tabVisible)\n  }\n\n  function factory() {\n    function init(options, element) {\n      function chkType() {\n        if (!element.tagName) {\n          throw new TypeError('Object is not a valid DOM element')\n        } else if ('IFRAME' !== element.tagName.toUpperCase()) {\n          throw new TypeError(\n            'Expected <IFRAME> tag, found <' + element.tagName + '>'\n          )\n        }\n      }\n\n      if (element) {\n        chkType()\n        setupIFrame(element, options)\n        iFrames.push(element)\n      }\n    }\n\n    function warnDeprecatedOptions(options) {\n      if (options && options.enablePublicMethods) {\n        warn(\n          'enablePublicMethods option has been removed, public methods are now always available in the iFrame'\n        )\n      }\n    }\n\n    var iFrames\n\n    setupRequestAnimationFrame()\n    setupEventListeners()\n\n    return function iFrameResizeF(options, target) {\n      iFrames = [] // Only return iFrames past in on this call\n\n      warnDeprecatedOptions(options)\n\n      switch (typeof target) {\n        case 'undefined':\n        case 'string': {\n          Array.prototype.forEach.call(\n            document.querySelectorAll(target || 'iframe'),\n            init.bind(undefined, options)\n          )\n          break\n        }\n\n        case 'object': {\n          init(options, target)\n          break\n        }\n\n        default: {\n          throw new TypeError('Unexpected data type (' + typeof target + ')')\n        }\n      }\n\n      return iFrames\n    }\n  }\n\n  function createJQueryPublicMethod($) {\n    if (!$.fn) {\n      info('', 'Unable to bind to jQuery, it is not fully loaded.')\n    } else if (!$.fn.iFrameResize) {\n      $.fn.iFrameResize = function $iFrameResizeF(options) {\n        function init(index, element) {\n          setupIFrame(element, options)\n        }\n\n        return this.filter('iframe').each(init).end()\n      }\n    }\n  }\n\n  if (window.jQuery !== undefined) {\n    createJQueryPublicMethod(window.jQuery)\n  }\n\n  if (true) {\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\n  } else // removed by dead control flow\n{}\n  window.iFrameResize = window.iFrameResize || factory()\n})()\n\n\n//# sourceURL=webpack://pixLib/./node_modules/iframe-resizer/js/iframeResizer.js?\n}");
156
157/***/ }),
158
vendor: 10,323 bytes, lines 159-168
159/***/ "./node_modules/imagesloaded/imagesloaded.js":
160/*!***************************************************!*\
161  !*** ./node_modules/imagesloaded/imagesloaded.js ***!
162  \***************************************************/
163/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
164
165eval("{/*!\n * imagesLoaded v5.0.0\n * JavaScript is all like \"You images are done yet or what?\"\n * MIT License\n */\n\n( function( window, factory ) {\n  // universal module definition\n  if (  true && module.exports ) {\n    // CommonJS\n    module.exports = factory( window, __webpack_require__(/*! ev-emitter */ \"./node_modules/ev-emitter/ev-emitter.js\") );\n  } else {\n    // browser global\n    window.imagesLoaded = factory( window, window.EvEmitter );\n  }\n\n} )( typeof window !== 'undefined' ? window : this,\n    function factory( window, EvEmitter ) {\n\nlet $ = window.jQuery;\nlet console = window.console;\n\n// -------------------------- helpers -------------------------- //\n\n// turn element or nodeList into an array\nfunction makeArray( obj ) {\n  // use object if already an array\n  if ( Array.isArray( obj ) ) return obj;\n\n  let isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n  // convert nodeList to array\n  if ( isArrayLike ) return [ ...obj ];\n\n  // array of single index\n  return [ obj ];\n}\n\n// -------------------------- imagesLoaded -------------------------- //\n\n/**\n * @param {[Array, Element, NodeList, String]} elem\n * @param {[Object, Function]} options - if function, use as callback\n * @param {Function} onAlways - callback function\n * @returns {ImagesLoaded}\n */\nfunction ImagesLoaded( elem, options, onAlways ) {\n  // coerce ImagesLoaded() without new, to be new ImagesLoaded()\n  if ( !( this instanceof ImagesLoaded ) ) {\n    return new ImagesLoaded( elem, options, onAlways );\n  }\n  // use elem as selector string\n  let queryElem = elem;\n  if ( typeof elem == 'string' ) {\n    queryElem = document.querySelectorAll( elem );\n  }\n  // bail if bad element\n  if ( !queryElem ) {\n    console.error(`Bad element for imagesLoaded ${queryElem || elem}`);\n    return;\n  }\n\n  this.elements = makeArray( queryElem );\n  this.options = {};\n  // shift arguments if no options set\n  if ( typeof options == 'function' ) {\n    onAlways = options;\n  } else {\n    Object.assign( this.options, options );\n  }\n\n  if ( onAlways ) this.on( 'always', onAlways );\n\n  this.getImages();\n  // add jQuery Deferred object\n  if ( $ ) this.jqDeferred = new $.Deferred();\n\n  // HACK check async to allow time to bind listeners\n  setTimeout( this.check.bind( this ) );\n}\n\nImagesLoaded.prototype = Object.create( EvEmitter.prototype );\n\nImagesLoaded.prototype.getImages = function() {\n  this.images = [];\n\n  // filter & find items if we have an item selector\n  this.elements.forEach( this.addElementImages, this );\n};\n\nconst elementNodeTypes = [ 1, 9, 11 ];\n\n/**\n * @param {Node} elem\n */\nImagesLoaded.prototype.addElementImages = function( elem ) {\n  // filter siblings\n  if ( elem.nodeName === 'IMG' ) {\n    this.addImage( elem );\n  }\n  // get background image on element\n  if ( this.options.background === true ) {\n    this.addElementBackgroundImages( elem );\n  }\n\n  // find children\n  // no non-element nodes, #143\n  let { nodeType } = elem;\n  if ( !nodeType || !elementNodeTypes.includes( nodeType ) ) return;\n\n  let childImgs = elem.querySelectorAll('img');\n  // concat childElems to filterFound array\n  for ( let img of childImgs ) {\n    this.addImage( img );\n  }\n\n  // get child background images\n  if ( typeof this.options.background == 'string' ) {\n    let children = elem.querySelectorAll( this.options.background );\n    for ( let child of children ) {\n      this.addElementBackgroundImages( child );\n    }\n  }\n};\n\nconst reURL = /url\\((['\"])?(.*?)\\1\\)/gi;\n\nImagesLoaded.prototype.addElementBackgroundImages = function( elem ) {\n  let style = getComputedStyle( elem );\n  // Firefox returns null if in a hidden iframe https://bugzil.la/548397\n  if ( !style ) return;\n\n  // get url inside url(\"...\")\n  let matches = reURL.exec( style.backgroundImage );\n  while ( matches !== null ) {\n    let url = matches && matches[2];\n    if ( url ) {\n      this.addBackground( url, elem );\n    }\n    matches = reURL.exec( style.backgroundImage );\n  }\n};\n\n/**\n * @param {Image} img\n */\nImagesLoaded.prototype.addImage = function( img ) {\n  let loadingImage = new LoadingImage( img );\n  this.images.push( loadingImage );\n};\n\nImagesLoaded.prototype.addBackground = function( url, elem ) {\n  let background = new Background( url, elem );\n  this.images.push( background );\n};\n\nImagesLoaded.prototype.check = function() {\n  this.progressedCount = 0;\n  this.hasAnyBroken = false;\n  // complete if no images\n  if ( !this.images.length ) {\n    this.complete();\n    return;\n  }\n\n  /* eslint-disable-next-line func-style */\n  let onProgress = ( image, elem, message ) => {\n    // HACK - Chrome triggers event before object properties have changed. #83\n    setTimeout( () => {\n      this.progress( image, elem, message );\n    } );\n  };\n\n  this.images.forEach( function( loadingImage ) {\n    loadingImage.once( 'progress', onProgress );\n    loadingImage.check();\n  } );\n};\n\nImagesLoaded.prototype.progress = function( image, elem, message ) {\n  this.progressedCount++;\n  this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded;\n  // progress event\n  this.emitEvent( 'progress', [ this, image, elem ] );\n  if ( this.jqDeferred && this.jqDeferred.notify ) {\n    this.jqDeferred.notify( this, image );\n  }\n  // check if completed\n  if ( this.progressedCount === this.images.length ) {\n    this.complete();\n  }\n\n  if ( this.options.debug && console ) {\n    console.log( `progress: ${message}`, image, elem );\n  }\n};\n\nImagesLoaded.prototype.complete = function() {\n  let eventName = this.hasAnyBroken ? 'fail' : 'done';\n  this.isComplete = true;\n  this.emitEvent( eventName, [ this ] );\n  this.emitEvent( 'always', [ this ] );\n  if ( this.jqDeferred ) {\n    let jqMethod = this.hasAnyBroken ? 'reject' : 'resolve';\n    this.jqDeferred[ jqMethod ]( this );\n  }\n};\n\n// --------------------------  -------------------------- //\n\nfunction LoadingImage( img ) {\n  this.img = img;\n}\n\nLoadingImage.prototype = Object.create( EvEmitter.prototype );\n\nLoadingImage.prototype.check = function() {\n  // If complete is true and browser supports natural sizes,\n  // try to check for image status manually.\n  let isComplete = this.getIsImageComplete();\n  if ( isComplete ) {\n    // report based on naturalWidth\n    this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );\n    return;\n  }\n\n  // If none of the checks above matched, simulate loading on detached element.\n  this.proxyImage = new Image();\n  // add crossOrigin attribute. #204\n  if ( this.img.crossOrigin ) {\n    this.proxyImage.crossOrigin = this.img.crossOrigin;\n  }\n  this.proxyImage.addEventListener( 'load', this );\n  this.proxyImage.addEventListener( 'error', this );\n  // bind to image as well for Firefox. #191\n  this.img.addEventListener( 'load', this );\n  this.img.addEventListener( 'error', this );\n  this.proxyImage.src = this.img.currentSrc || this.img.src;\n};\n\nLoadingImage.prototype.getIsImageComplete = function() {\n  // check for non-zero, non-undefined naturalWidth\n  // fixes Safari+InfiniteScroll+Masonry bug infinite-scroll#671\n  return this.img.complete && this.img.naturalWidth;\n};\n\nLoadingImage.prototype.confirm = function( isLoaded, message ) {\n  this.isLoaded = isLoaded;\n  let { parentNode } = this.img;\n  // emit progress with parent <picture> or self <img>\n  let elem = parentNode.nodeName === 'PICTURE' ? parentNode : this.img;\n  this.emitEvent( 'progress', [ this, elem, message ] );\n};\n\n// ----- events ----- //\n\n// trigger specified handler for event type\nLoadingImage.prototype.handleEvent = function( event ) {\n  let method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\nLoadingImage.prototype.onload = function() {\n  this.confirm( true, 'onload' );\n  this.unbindEvents();\n};\n\nLoadingImage.prototype.onerror = function() {\n  this.confirm( false, 'onerror' );\n  this.unbindEvents();\n};\n\nLoadingImage.prototype.unbindEvents = function() {\n  this.proxyImage.removeEventListener( 'load', this );\n  this.proxyImage.removeEventListener( 'error', this );\n  this.img.removeEventListener( 'load', this );\n  this.img.removeEventListener( 'error', this );\n};\n\n// -------------------------- Background -------------------------- //\n\nfunction Background( url, element ) {\n  this.url = url;\n  this.element = element;\n  this.img = new Image();\n}\n\n// inherit LoadingImage prototype\nBackground.prototype = Object.create( LoadingImage.prototype );\n\nBackground.prototype.check = function() {\n  this.img.addEventListener( 'load', this );\n  this.img.addEventListener( 'error', this );\n  this.img.src = this.url;\n  // check if image is already complete\n  let isComplete = this.getIsImageComplete();\n  if ( isComplete ) {\n    this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );\n    this.unbindEvents();\n  }\n};\n\nBackground.prototype.unbindEvents = function() {\n  this.img.removeEventListener( 'load', this );\n  this.img.removeEventListener( 'error', this );\n};\n\nBackground.prototype.confirm = function( isLoaded, message ) {\n  this.isLoaded = isLoaded;\n  this.emitEvent( 'progress', [ this, this.element, message ] );\n};\n\n// -------------------------- jQuery -------------------------- //\n\nImagesLoaded.makeJQueryPlugin = function( jQuery ) {\n  jQuery = jQuery || window.jQuery;\n  if ( !jQuery ) return;\n\n  // set local variable\n  $ = jQuery;\n  // $().imagesLoaded()\n  $.fn.imagesLoaded = function( options, onAlways ) {\n    let instance = new ImagesLoaded( this, options, onAlways );\n    return instance.jqDeferred.promise( $( this ) );\n  };\n};\n// try making plugin\nImagesLoaded.makeJQueryPlugin();\n\n// --------------------------  -------------------------- //\n\nreturn ImagesLoaded;\n\n} );\n\n\n//# sourceURL=webpack://pixLib/./node_modules/imagesloaded/imagesloaded.js?\n}");
166
167/***/ }),
168
vendor: 474 bytes, lines 169-179
169/***/ "./node_modules/chosen-js/chosen.css":
170/*!*******************************************!*\
171  !*** ./node_modules/chosen-js/chosen.css ***!
172  \*******************************************/
173/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
174
175"use strict";
176eval("{__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n//# sourceURL=webpack://pixLib/./node_modules/chosen-js/chosen.css?\n}");
177
178/***/ }),
179
180/***/ "./sass/style.scss":
181/*!*************************!*\
182  !*** ./sass/style.scss ***!
183  \*************************/
184/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
185
186"use strict";
187eval("{__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n//# sourceURL=webpack://pixLib/./sass/style.scss?\n}");
188
189/***/ }),
190
vendor: 24,855 bytes, lines 191-200
191/***/ "./node_modules/mustache/mustache.mjs":
192/*!********************************************!*\
193  !*** ./node_modules/mustache/mustache.mjs ***!
194  \********************************************/
195/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
196
197"use strict";
198eval("{__webpack_require__.r(__webpack_exports__);\n/*!\n * mustache.js - Logic-less {{mustache}} templates with JavaScript\n * http://github.com/janl/mustache.js\n */\n\nvar objectToString = Object.prototype.toString;\nvar isArray = Array.isArray || function isArrayPolyfill (object) {\n  return objectToString.call(object) === '[object Array]';\n};\n\nfunction isFunction (object) {\n  return typeof object === 'function';\n}\n\n/**\n * More correct typeof string handling array\n * which normally returns typeof 'object'\n */\nfunction typeStr (obj) {\n  return isArray(obj) ? 'array' : typeof obj;\n}\n\nfunction escapeRegExp (string) {\n  return string.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, '\\\\$&');\n}\n\n/**\n * Null safe way of checking whether or not an object,\n * including its prototype, has a given property\n */\nfunction hasProperty (obj, propName) {\n  return obj != null && typeof obj === 'object' && (propName in obj);\n}\n\n/**\n * Safe way of detecting whether or not the given thing is a primitive and\n * whether it has the given property\n */\nfunction primitiveHasOwnProperty (primitive, propName) {\n  return (\n    primitive != null\n    && typeof primitive !== 'object'\n    && primitive.hasOwnProperty\n    && primitive.hasOwnProperty(propName)\n  );\n}\n\n// Workaround for https://issues.apache.org/jira/browse/COUCHDB-577\n// See https://github.com/janl/mustache.js/issues/189\nvar regExpTest = RegExp.prototype.test;\nfunction testRegExp (re, string) {\n  return regExpTest.call(re, string);\n}\n\nvar nonSpaceRe = /\\S/;\nfunction isWhitespace (string) {\n  return !testRegExp(nonSpaceRe, string);\n}\n\nvar entityMap = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  \"'\": '&#39;',\n  '/': '&#x2F;',\n  '`': '&#x60;',\n  '=': '&#x3D;'\n};\n\nfunction escapeHtml (string) {\n  return String(string).replace(/[&<>\"'`=\\/]/g, function fromEntityMap (s) {\n    return entityMap[s];\n  });\n}\n\nvar whiteRe = /\\s*/;\nvar spaceRe = /\\s+/;\nvar equalsRe = /\\s*=/;\nvar curlyRe = /\\s*\\}/;\nvar tagRe = /#|\\^|\\/|>|\\{|&|=|!/;\n\n/**\n * Breaks up the given `template` string into a tree of tokens. If the `tags`\n * argument is given here it must be an array with two string values: the\n * opening and closing tags used in the template (e.g. [ \"<%\", \"%>\" ]). Of\n * course, the default is to use mustaches (i.e. mustache.tags).\n *\n * A token is an array with at least 4 elements. The first element is the\n * mustache symbol that was used inside the tag, e.g. \"#\" or \"&\". If the tag\n * did not contain a symbol (i.e. {{myValue}}) this element is \"name\". For\n * all text that appears outside a symbol this element is \"text\".\n *\n * The second element of a token is its \"value\". For mustache tags this is\n * whatever else was inside the tag besides the opening symbol. For text tokens\n * this is the text itself.\n *\n * The third and fourth elements of the token are the start and end indices,\n * respectively, of the token in the original template.\n *\n * Tokens that are the root node of a subtree contain two more elements: 1) an\n * array of tokens in the subtree and 2) the index in the original template at\n * which the closing tag for that section begins.\n *\n * Tokens for partials also contain two more elements: 1) a string value of\n * indendation prior to that tag and 2) the index of that tag on that line -\n * eg a value of 2 indicates the partial is the third tag on this line.\n */\nfunction parseTemplate (template, tags) {\n  if (!template)\n    return [];\n  var lineHasNonSpace = false;\n  var sections = [];     // Stack to hold section tokens\n  var tokens = [];       // Buffer to hold the tokens\n  var spaces = [];       // Indices of whitespace tokens on the current line\n  var hasTag = false;    // Is there a {{tag}} on the current line?\n  var nonSpace = false;  // Is there a non-space char on the current line?\n  var indentation = '';  // Tracks indentation for tags that use it\n  var tagIndex = 0;      // Stores a count of number of tags encountered on a line\n\n  // Strips all whitespace tokens array for the current line\n  // if there was a {{#tag}} on it and otherwise only space.\n  function stripSpace () {\n    if (hasTag && !nonSpace) {\n      while (spaces.length)\n        delete tokens[spaces.pop()];\n    } else {\n      spaces = [];\n    }\n\n    hasTag = false;\n    nonSpace = false;\n  }\n\n  var openingTagRe, closingTagRe, closingCurlyRe;\n  function compileTags (tagsToCompile) {\n    if (typeof tagsToCompile === 'string')\n      tagsToCompile = tagsToCompile.split(spaceRe, 2);\n\n    if (!isArray(tagsToCompile) || tagsToCompile.length !== 2)\n      throw new Error('Invalid tags: ' + tagsToCompile);\n\n    openingTagRe = new RegExp(escapeRegExp(tagsToCompile[0]) + '\\\\s*');\n    closingTagRe = new RegExp('\\\\s*' + escapeRegExp(tagsToCompile[1]));\n    closingCurlyRe = new RegExp('\\\\s*' + escapeRegExp('}' + tagsToCompile[1]));\n  }\n\n  compileTags(tags || mustache.tags);\n\n  var scanner = new Scanner(template);\n\n  var start, type, value, chr, token, openSection;\n  while (!scanner.eos()) {\n    start = scanner.pos;\n\n    // Match any text between tags.\n    value = scanner.scanUntil(openingTagRe);\n\n    if (value) {\n      for (var i = 0, valueLength = value.length; i < valueLength; ++i) {\n        chr = value.charAt(i);\n\n        if (isWhitespace(chr)) {\n          spaces.push(tokens.length);\n          indentation += chr;\n        } else {\n          nonSpace = true;\n          lineHasNonSpace = true;\n          indentation += ' ';\n        }\n\n        tokens.push([ 'text', chr, start, start + 1 ]);\n        start += 1;\n\n        // Check for whitespace on the current line.\n        if (chr === '\\n') {\n          stripSpace();\n          indentation = '';\n          tagIndex = 0;\n          lineHasNonSpace = false;\n        }\n      }\n    }\n\n    // Match the opening tag.\n    if (!scanner.scan(openingTagRe))\n      break;\n\n    hasTag = true;\n\n    // Get the tag type.\n    type = scanner.scan(tagRe) || 'name';\n    scanner.scan(whiteRe);\n\n    // Get the tag value.\n    if (type === '=') {\n      value = scanner.scanUntil(equalsRe);\n      scanner.scan(equalsRe);\n      scanner.scanUntil(closingTagRe);\n    } else if (type === '{') {\n      value = scanner.scanUntil(closingCurlyRe);\n      scanner.scan(curlyRe);\n      scanner.scanUntil(closingTagRe);\n      type = '&';\n    } else {\n      value = scanner.scanUntil(closingTagRe);\n    }\n\n    // Match the closing tag.\n    if (!scanner.scan(closingTagRe))\n      throw new Error('Unclosed tag at ' + scanner.pos);\n\n    if (type == '>') {\n      token = [ type, value, start, scanner.pos, indentation, tagIndex, lineHasNonSpace ];\n    } else {\n      token = [ type, value, start, scanner.pos ];\n    }\n    tagIndex++;\n    tokens.push(token);\n\n    if (type === '#' || type === '^') {\n      sections.push(token);\n    } else if (type === '/') {\n      // Check section nesting.\n      openSection = sections.pop();\n\n      if (!openSection)\n        throw new Error('Unopened section \"' + value + '\" at ' + start);\n\n      if (openSection[1] !== value)\n        throw new Error('Unclosed section \"' + openSection[1] + '\" at ' + start);\n    } else if (type === 'name' || type === '{' || type === '&') {\n      nonSpace = true;\n    } else if (type === '=') {\n      // Set the tags for the next time around.\n      compileTags(value);\n    }\n  }\n\n  stripSpace();\n\n  // Make sure there are no open sections when we're done.\n  openSection = sections.pop();\n\n  if (openSection)\n    throw new Error('Unclosed section \"' + openSection[1] + '\" at ' + scanner.pos);\n\n  return nestTokens(squashTokens(tokens));\n}\n\n/**\n * Combines the values of consecutive text tokens in the given `tokens` array\n * to a single token.\n */\nfunction squashTokens (tokens) {\n  var squashedTokens = [];\n\n  var token, lastToken;\n  for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {\n    token = tokens[i];\n\n    if (token) {\n      if (token[0] === 'text' && lastToken && lastToken[0] === 'text') {\n        lastToken[1] += token[1];\n        lastToken[3] = token[3];\n      } else {\n        squashedTokens.push(token);\n        lastToken = token;\n      }\n    }\n  }\n\n  return squashedTokens;\n}\n\n/**\n * Forms the given array of `tokens` into a nested tree structure where\n * tokens that represent a section have two additional items: 1) an array of\n * all tokens that appear in that section and 2) the index in the original\n * template that represents the end of that section.\n */\nfunction nestTokens (tokens) {\n  var nestedTokens = [];\n  var collector = nestedTokens;\n  var sections = [];\n\n  var token, section;\n  for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {\n    token = tokens[i];\n\n    switch (token[0]) {\n      case '#':\n      case '^':\n        collector.push(token);\n        sections.push(token);\n        collector = token[4] = [];\n        break;\n      case '/':\n        section = sections.pop();\n        section[5] = token[2];\n        collector = sections.length > 0 ? sections[sections.length - 1][4] : nestedTokens;\n        break;\n      default:\n        collector.push(token);\n    }\n  }\n\n  return nestedTokens;\n}\n\n/**\n * A simple string scanner that is used by the template parser to find\n * tokens in template strings.\n */\nfunction Scanner (string) {\n  this.string = string;\n  this.tail = string;\n  this.pos = 0;\n}\n\n/**\n * Returns `true` if the tail is empty (end of string).\n */\nScanner.prototype.eos = function eos () {\n  return this.tail === '';\n};\n\n/**\n * Tries to match the given regular expression at the current position.\n * Returns the matched text if it can match, the empty string otherwise.\n */\nScanner.prototype.scan = function scan (re) {\n  var match = this.tail.match(re);\n\n  if (!match || match.index !== 0)\n    return '';\n\n  var string = match[0];\n\n  this.tail = this.tail.substring(string.length);\n  this.pos += string.length;\n\n  return string;\n};\n\n/**\n * Skips all text until the given regular expression can be matched. Returns\n * the skipped string, which is the entire tail if no match can be made.\n */\nScanner.prototype.scanUntil = function scanUntil (re) {\n  var index = this.tail.search(re), match;\n\n  switch (index) {\n    case -1:\n      match = this.tail;\n      this.tail = '';\n      break;\n    case 0:\n      match = '';\n      break;\n    default:\n      match = this.tail.substring(0, index);\n      this.tail = this.tail.substring(index);\n  }\n\n  this.pos += match.length;\n\n  return match;\n};\n\n/**\n * Represents a rendering context by wrapping a view object and\n * maintaining a reference to the parent context.\n */\nfunction Context (view, parentContext) {\n  this.view = view;\n  this.cache = { '.': this.view };\n  this.parent = parentContext;\n}\n\n/**\n * Creates a new context using the given view with this context\n * as the parent.\n */\nContext.prototype.push = function push (view) {\n  return new Context(view, this);\n};\n\n/**\n * Returns the value of the given name in this context, traversing\n * up the context hierarchy if the value is absent in this context's view.\n */\nContext.prototype.lookup = function lookup (name) {\n  var cache = this.cache;\n\n  var value;\n  if (cache.hasOwnProperty(name)) {\n    value = cache[name];\n  } else {\n    var context = this, intermediateValue, names, index, lookupHit = false;\n\n    while (context) {\n      if (name.indexOf('.') > 0) {\n        intermediateValue = context.view;\n        names = name.split('.');\n        index = 0;\n\n        /**\n         * Using the dot notion path in `name`, we descend through the\n         * nested objects.\n         *\n         * To be certain that the lookup has been successful, we have to\n         * check if the last object in the path actually has the property\n         * we are looking for. We store the result in `lookupHit`.\n         *\n         * This is specially necessary for when the value has been set to\n         * `undefined` and we want to avoid looking up parent contexts.\n         *\n         * In the case where dot notation is used, we consider the lookup\n         * to be successful even if the last \"object\" in the path is\n         * not actually an object but a primitive (e.g., a string, or an\n         * integer), because it is sometimes useful to access a property\n         * of an autoboxed primitive, such as the length of a string.\n         **/\n        while (intermediateValue != null && index < names.length) {\n          if (index === names.length - 1)\n            lookupHit = (\n              hasProperty(intermediateValue, names[index])\n              || primitiveHasOwnProperty(intermediateValue, names[index])\n            );\n\n          intermediateValue = intermediateValue[names[index++]];\n        }\n      } else {\n        intermediateValue = context.view[name];\n\n        /**\n         * Only checking against `hasProperty`, which always returns `false` if\n         * `context.view` is not an object. Deliberately omitting the check\n         * against `primitiveHasOwnProperty` if dot notation is not used.\n         *\n         * Consider this example:\n         * ```\n         * Mustache.render(\"The length of a football field is {{#length}}{{length}}{{/length}}.\", {length: \"100 yards\"})\n         * ```\n         *\n         * If we were to check also against `primitiveHasOwnProperty`, as we do\n         * in the dot notation case, then render call would return:\n         *\n         * \"The length of a football field is 9.\"\n         *\n         * rather than the expected:\n         *\n         * \"The length of a football field is 100 yards.\"\n         **/\n        lookupHit = hasProperty(context.view, name);\n      }\n\n      if (lookupHit) {\n        value = intermediateValue;\n        break;\n      }\n\n      context = context.parent;\n    }\n\n    cache[name] = value;\n  }\n\n  if (isFunction(value))\n    value = value.call(this.view);\n\n  return value;\n};\n\n/**\n * A Writer knows how to take a stream of tokens and render them to a\n * string, given a context. It also maintains a cache of templates to\n * avoid the need to parse the same template twice.\n */\nfunction Writer () {\n  this.templateCache = {\n    _cache: {},\n    set: function set (key, value) {\n      this._cache[key] = value;\n    },\n    get: function get (key) {\n      return this._cache[key];\n    },\n    clear: function clear () {\n      this._cache = {};\n    }\n  };\n}\n\n/**\n * Clears all cached templates in this writer.\n */\nWriter.prototype.clearCache = function clearCache () {\n  if (typeof this.templateCache !== 'undefined') {\n    this.templateCache.clear();\n  }\n};\n\n/**\n * Parses and caches the given `template` according to the given `tags` or\n * `mustache.tags` if `tags` is omitted,  and returns the array of tokens\n * that is generated from the parse.\n */\nWriter.prototype.parse = function parse (template, tags) {\n  var cache = this.templateCache;\n  var cacheKey = template + ':' + (tags || mustache.tags).join(':');\n  var isCacheEnabled = typeof cache !== 'undefined';\n  var tokens = isCacheEnabled ? cache.get(cacheKey) : undefined;\n\n  if (tokens == undefined) {\n    tokens = parseTemplate(template, tags);\n    isCacheEnabled && cache.set(cacheKey, tokens);\n  }\n  return tokens;\n};\n\n/**\n * High-level method that is used to render the given `template` with\n * the given `view`.\n *\n * The optional `partials` argument may be an object that contains the\n * names and templates of partials that are used in the template. It may\n * also be a function that is used to load partial templates on the fly\n * that takes a single argument: the name of the partial.\n *\n * If the optional `config` argument is given here, then it should be an\n * object with a `tags` attribute or an `escape` attribute or both.\n * If an array is passed, then it will be interpreted the same way as\n * a `tags` attribute on a `config` object.\n *\n * The `tags` attribute of a `config` object must be an array with two\n * string values: the opening and closing tags used in the template (e.g.\n * [ \"<%\", \"%>\" ]). The default is to mustache.tags.\n *\n * The `escape` attribute of a `config` object must be a function which\n * accepts a string as input and outputs a safely escaped string.\n * If an `escape` function is not provided, then an HTML-safe string\n * escaping function is used as the default.\n */\nWriter.prototype.render = function render (template, view, partials, config) {\n  var tags = this.getConfigTags(config);\n  var tokens = this.parse(template, tags);\n  var context = (view instanceof Context) ? view : new Context(view, undefined);\n  return this.renderTokens(tokens, context, partials, template, config);\n};\n\n/**\n * Low-level method that renders the given array of `tokens` using\n * the given `context` and `partials`.\n *\n * Note: The `originalTemplate` is only ever used to extract the portion\n * of the original template that was contained in a higher-order section.\n * If the template doesn't use higher-order sections, this argument may\n * be omitted.\n */\nWriter.prototype.renderTokens = function renderTokens (tokens, context, partials, originalTemplate, config) {\n  var buffer = '';\n\n  var token, symbol, value;\n  for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {\n    value = undefined;\n    token = tokens[i];\n    symbol = token[0];\n\n    if (symbol === '#') value = this.renderSection(token, context, partials, originalTemplate, config);\n    else if (symbol === '^') value = this.renderInverted(token, context, partials, originalTemplate, config);\n    else if (symbol === '>') value = this.renderPartial(token, context, partials, config);\n    else if (symbol === '&') value = this.unescapedValue(token, context);\n    else if (symbol === 'name') value = this.escapedValue(token, context, config);\n    else if (symbol === 'text') value = this.rawValue(token);\n\n    if (value !== undefined)\n      buffer += value;\n  }\n\n  return buffer;\n};\n\nWriter.prototype.renderSection = function renderSection (token, context, partials, originalTemplate, config) {\n  var self = this;\n  var buffer = '';\n  var value = context.lookup(token[1]);\n\n  // This function is used to render an arbitrary template\n  // in the current context by higher-order sections.\n  function subRender (template) {\n    return self.render(template, context, partials, config);\n  }\n\n  if (!value) return;\n\n  if (isArray(value)) {\n    for (var j = 0, valueLength = value.length; j < valueLength; ++j) {\n      buffer += this.renderTokens(token[4], context.push(value[j]), partials, originalTemplate, config);\n    }\n  } else if (typeof value === 'object' || typeof value === 'string' || typeof value === 'number') {\n    buffer += this.renderTokens(token[4], context.push(value), partials, originalTemplate, config);\n  } else if (isFunction(value)) {\n    if (typeof originalTemplate !== 'string')\n      throw new Error('Cannot use higher-order sections without the original template');\n\n    // Extract the portion of the original template that the section contains.\n    value = value.call(context.view, originalTemplate.slice(token[3], token[5]), subRender);\n\n    if (value != null)\n      buffer += value;\n  } else {\n    buffer += this.renderTokens(token[4], context, partials, originalTemplate, config);\n  }\n  return buffer;\n};\n\nWriter.prototype.renderInverted = function renderInverted (token, context, partials, originalTemplate, config) {\n  var value = context.lookup(token[1]);\n\n  // Use JavaScript's definition of falsy. Include empty arrays.\n  // See https://github.com/janl/mustache.js/issues/186\n  if (!value || (isArray(value) && value.length === 0))\n    return this.renderTokens(token[4], context, partials, originalTemplate, config);\n};\n\nWriter.prototype.indentPartial = function indentPartial (partial, indentation, lineHasNonSpace) {\n  var filteredIndentation = indentation.replace(/[^ \\t]/g, '');\n  var partialByNl = partial.split('\\n');\n  for (var i = 0; i < partialByNl.length; i++) {\n    if (partialByNl[i].length && (i > 0 || !lineHasNonSpace)) {\n      partialByNl[i] = filteredIndentation + partialByNl[i];\n    }\n  }\n  return partialByNl.join('\\n');\n};\n\nWriter.prototype.renderPartial = function renderPartial (token, context, partials, config) {\n  if (!partials) return;\n  var tags = this.getConfigTags(config);\n\n  var value = isFunction(partials) ? partials(token[1]) : partials[token[1]];\n  if (value != null) {\n    var lineHasNonSpace = token[6];\n    var tagIndex = token[5];\n    var indentation = token[4];\n    var indentedValue = value;\n    if (tagIndex == 0 && indentation) {\n      indentedValue = this.indentPartial(value, indentation, lineHasNonSpace);\n    }\n    var tokens = this.parse(indentedValue, tags);\n    return this.renderTokens(tokens, context, partials, indentedValue, config);\n  }\n};\n\nWriter.prototype.unescapedValue = function unescapedValue (token, context) {\n  var value = context.lookup(token[1]);\n  if (value != null)\n    return value;\n};\n\nWriter.prototype.escapedValue = function escapedValue (token, context, config) {\n  var escape = this.getConfigEscape(config) || mustache.escape;\n  var value = context.lookup(token[1]);\n  if (value != null)\n    return (typeof value === 'number' && escape === mustache.escape) ? String(value) : escape(value);\n};\n\nWriter.prototype.rawValue = function rawValue (token) {\n  return token[1];\n};\n\nWriter.prototype.getConfigTags = function getConfigTags (config) {\n  if (isArray(config)) {\n    return config;\n  }\n  else if (config && typeof config === 'object') {\n    return config.tags;\n  }\n  else {\n    return undefined;\n  }\n};\n\nWriter.prototype.getConfigEscape = function getConfigEscape (config) {\n  if (config && typeof config === 'object' && !isArray(config)) {\n    return config.escape;\n  }\n  else {\n    return undefined;\n  }\n};\n\nvar mustache = {\n  name: 'mustache.js',\n  version: '4.2.0',\n  tags: [ '{{', '}}' ],\n  clearCache: undefined,\n  escape: undefined,\n  parse: undefined,\n  render: undefined,\n  Scanner: undefined,\n  Context: undefined,\n  Writer: undefined,\n  /**\n   * Allows a user to override the default caching strategy, by providing an\n   * object with set, get and clear methods. This can also be used to disable\n   * the cache by setting it to the literal `undefined`.\n   */\n  set templateCache (cache) {\n    defaultWriter.templateCache = cache;\n  },\n  /**\n   * Gets the default or overridden caching object from the default writer.\n   */\n  get templateCache () {\n    return defaultWriter.templateCache;\n  }\n};\n\n// All high-level mustache.* functions use this writer.\nvar defaultWriter = new Writer();\n\n/**\n * Clears all cached templates in the default writer.\n */\nmustache.clearCache = function clearCache () {\n  return defaultWriter.clearCache();\n};\n\n/**\n * Parses and caches the given template in the default writer and returns the\n * array of tokens it contains. Doing this ahead of time avoids the need to\n * parse templates on the fly as they are rendered.\n */\nmustache.parse = function parse (template, tags) {\n  return defaultWriter.parse(template, tags);\n};\n\n/**\n * Renders the `template` with the given `view`, `partials`, and `config`\n * using the default writer.\n */\nmustache.render = function render (template, view, partials, config) {\n  if (typeof template !== 'string') {\n    throw new TypeError('Invalid template! Template should be a \"string\" ' +\n                        'but \"' + typeStr(template) + '\" was given as the first ' +\n                        'argument for mustache#render(template, view, partials)');\n  }\n\n  return defaultWriter.render(template, view, partials, config);\n};\n\n// Export the escaping function so that the user may override it.\n// See https://github.com/janl/mustache.js/issues/244\nmustache.escape = escapeHtml;\n\n// Export these mainly for testing, but also for advanced usage.\nmustache.Scanner = Scanner;\nmustache.Context = Context;\nmustache.Writer = Writer;\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (mustache);\n\n\n//# sourceURL=webpack://pixLib/./node_modules/mustache/mustache.mjs?\n}");
199
200/***/ })
200
201
202/******/ 	});
203/************************************************************************/
204/******/ 	// The module cache
205/******/ 	var __webpack_module_cache__ = {};
206/******/ 	
207/******/ 	// The require function
208/******/ 	function __webpack_require__(moduleId) {
209/******/ 		// Check if module is in cache
210/******/ 		var cachedModule = __webpack_module_cache__[moduleId];
211/******/ 		if (cachedModule !== undefined) {
212/******/ 			return cachedModule.exports;
213/******/ 		}
214/******/ 		// Create a new module (and put it into the cache)
215/******/ 		var module = __webpack_module_cache__[moduleId] = {
216/******/ 			// no module.id needed
217/******/ 			// no module.loaded needed
218/******/ 			exports: {}
219/******/ 		};
220/******/ 	
221/******/ 		// Execute the module function
222/******/ 		if (!(moduleId in __webpack_modules__)) {
223/******/ 			delete __webpack_module_cache__[moduleId];
224/******/ 			var e = new Error("Cannot find module '" + moduleId + "'");
225/******/ 			e.code = 'MODULE_NOT_FOUND';
226/******/ 			throw e;
227/******/ 		}
228/******/ 		__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
229/******/ 	
230/******/ 		// Return the exports of the module
231/******/ 		return module.exports;
232/******/ 	}
233/******/ 	
234/************************************************************************/
235/******/ 	/* webpack/runtime/compat get default export */
236/******/ 	// getDefaultExport function for compatibility with non-harmony modules
237/******/ 	__webpack_require__.n = function(module) {
238/******/ 		var getter = module && module.__esModule ?
239/******/ 			function() { return module['default']; } :
240/******/ 			function() { return module; };
241/******/ 		__webpack_require__.d(getter, { a: getter });
242/******/ 		return getter;
243/******/ 	};
244/******/ 	
245/******/ 	/* webpack/runtime/define property getters */
246/******/ 	// define getter/value functions for harmony exports
247/******/ 	__webpack_require__.d = function(exports, definition) {
248/******/ 		for(var key in definition) {
249/******/ 			if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
250/******/ 				Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
251/******/ 			}
252/******/ 		}
253/******/ 	};
254/******/ 	
255/******/ 	/* webpack/runtime/hasOwnProperty shorthand */
256/******/ 	__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); };
257/******/ 	
258/******/ 	/* webpack/runtime/make namespace object */
259/******/ 	// define __esModule on exports
260/******/ 	__webpack_require__.r = function(exports) {
261/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
262/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
263/******/ 		}
264/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
265/******/ 	};
266/******/ 	
267/************************************************************************/
268/******/ 	
269/******/ 	// startup
270/******/ 	// Load entry module and return exports
271/******/ 	// This entry module can't be inlined because the eval devtool is used.
272/******/ 	var __webpack_exports__ = __webpack_require__("./builder.js");
273/******/ 	
274/******/ 	return __webpack_exports__;
275/******/ })()
276;
277});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.