{
  "version": 3,
  "sources": ["/cdn/shop/t/28/assets/theme.js?section_id=store-availability"],
  "sourcesContent": ["(function (factory) {\n  typeof define === 'function' && define.amd ? define('index', factory) :\n  factory();\n}((function () { 'use strict';\n\n  function _typeof(obj) {\n    \"@babel/helpers - typeof\";\n\n    if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n      _typeof = function (obj) {\n        return typeof obj;\n      };\n    } else {\n      _typeof = function (obj) {\n        return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n      };\n    }\n\n    return _typeof(obj);\n  }\n\n  function _classCallCheck(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  }\n\n  function _defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  function _createClass(Constructor, protoProps, staticProps) {\n    if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) _defineProperties(Constructor, staticProps);\n    return Constructor;\n  }\n\n  function _inherits(subClass, superClass) {\n    if (typeof superClass !== \"function\" && superClass !== null) {\n      throw new TypeError(\"Super expression must either be null or a function\");\n    }\n\n    subClass.prototype = Object.create(superClass && superClass.prototype, {\n      constructor: {\n        value: subClass,\n        writable: true,\n        configurable: true\n      }\n    });\n    if (superClass) _setPrototypeOf(subClass, superClass);\n  }\n\n  function _getPrototypeOf(o) {\n    _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n      return o.__proto__ || Object.getPrototypeOf(o);\n    };\n    return _getPrototypeOf(o);\n  }\n\n  function _setPrototypeOf(o, p) {\n    _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n      o.__proto__ = p;\n      return o;\n    };\n\n    return _setPrototypeOf(o, p);\n  }\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\n    try {\n      Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));\n      return true;\n    } catch (e) {\n      return false;\n    }\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\n    return _construct.apply(null, arguments);\n  }\n\n  function _isNativeFunction(fn) {\n    return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\n  }\n\n  function _wrapNativeSuper(Class) {\n    var _cache = typeof Map === \"function\" ? new Map() : undefined;\n\n    _wrapNativeSuper = function _wrapNativeSuper(Class) {\n      if (Class === null || !_isNativeFunction(Class)) return Class;\n\n      if (typeof Class !== \"function\") {\n        throw new TypeError(\"Super expression must either be null or a function\");\n      }\n\n      if (typeof _cache !== \"undefined\") {\n        if (_cache.has(Class)) return _cache.get(Class);\n\n        _cache.set(Class, Wrapper);\n      }\n\n      function Wrapper() {\n        return _construct(Class, arguments, _getPrototypeOf(this).constructor);\n      }\n\n      Wrapper.prototype = Object.create(Class.prototype, {\n        constructor: {\n          value: Wrapper,\n          enumerable: false,\n          writable: true,\n          configurable: true\n        }\n      });\n      return _setPrototypeOf(Wrapper, Class);\n    };\n\n    return _wrapNativeSuper(Class);\n  }\n\n  function _assertThisInitialized(self) {\n    if (self === void 0) {\n      throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n    }\n\n    return self;\n  }\n\n  function _possibleConstructorReturn(self, call) {\n    if (call && (typeof call === \"object\" || typeof call === \"function\")) {\n      return call;\n    }\n\n    return _assertThisInitialized(self);\n  }\n\n  function _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n\n    return function _createSuperInternal() {\n      var Super = _getPrototypeOf(Derived),\n          result;\n\n      if (hasNativeReflectConstruct) {\n        var NewTarget = _getPrototypeOf(this).constructor;\n\n        result = Reflect.construct(Super, arguments, NewTarget);\n      } else {\n        result = Super.apply(this, arguments);\n      }\n\n      return _possibleConstructorReturn(this, result);\n    };\n  }\n\n  function _toConsumableArray(arr) {\n    return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n  }\n\n  function _arrayWithoutHoles(arr) {\n    if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n  }\n\n  function _iterableToArray(iter) {\n    if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n  }\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\n  function _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n\n    for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n    return arr2;\n  }\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  function _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n      if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n        if (it) o = it;\n        var i = 0;\n\n        var F = function () {};\n\n        return {\n          s: F,\n          n: function () {\n            if (i >= o.length) return {\n              done: true\n            };\n            return {\n              done: false,\n              value: o[i++]\n            };\n          },\n          e: function (e) {\n            throw e;\n          },\n          f: F\n        };\n      }\n\n      throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n\n    var normalCompletion = true,\n        didErr = false,\n        err;\n    return {\n      s: function () {\n        it = o[Symbol.iterator]();\n      },\n      n: function () {\n        var step = it.next();\n        normalCompletion = step.done;\n        return step;\n      },\n      e: function (e) {\n        didErr = true;\n        err = e;\n      },\n      f: function () {\n        try {\n          if (!normalCompletion && it.return != null) it.return();\n        } finally {\n          if (didErr) throw err;\n        }\n      }\n    };\n  }\n\n  var animationQueue = {};\n\n  var Animation = /*#__PURE__*/function () {\n    function Animation() {\n      _classCallCheck(this, Animation);\n    }\n\n    _createClass(Animation, null, [{\n      key: \"slideUp\",\n\n      /**\n       * Slide up aims to close an element. To do that, we take the height of the element, and set it to 0 to\n       * force an animation\n       */\n      value: function slideUp(element, callback) {\n        var propertyToAnimate = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'height';\n        element.style[propertyToAnimate] = \"\".concat(element.scrollHeight, \"px\"); // Force previous height to allow CSS transition\n\n        element.offsetHeight; // Force redraw\n\n        element.style[propertyToAnimate] = 0;\n\n        if (animationQueue[element.id]) {\n          element.removeEventListener('transitionend', animationQueue[element.id]);\n          delete animationQueue[element.id];\n        }\n\n        var transitionEnded = function transitionEnded(event) {\n          if (event.propertyName === 'height') {\n            element.removeEventListener('transitionend', transitionEnded);\n            (callback || function () {})();\n          }\n        };\n\n        element.addEventListener('transitionend', transitionEnded);\n      }\n      /**\n       * Slide down aims to open an element. To do that, you must make sure that the element you are trying to open\n       * is set with height: 0; overflow: hidden in the CSS, and does not contain any padding nor margin.\n       */\n\n    }, {\n      key: \"slideDown\",\n      value: function slideDown(element, callback) {\n        var propertyToAnimate = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'height';\n        // To do the animation we temporarily hide it, check the height, and transition to it\n        element.style[propertyToAnimate] = \"\".concat(element.scrollHeight, \"px\");\n\n        var transitionEnded = function transitionEnded(event) {\n          if (event.propertyName === propertyToAnimate) {\n            var defaultValue = 'auto';\n\n            if (propertyToAnimate === 'max-height') {\n              defaultValue = 'none';\n            }\n\n            element.style[propertyToAnimate] = defaultValue; // Allows the content to grow normally\n\n            element.removeEventListener('transitionend', transitionEnded);\n            delete animationQueue[element.id];\n            (callback || function () {})();\n          }\n        };\n\n        element.addEventListener('transitionend', transitionEnded);\n        animationQueue[element.id] = transitionEnded;\n      }\n    }]);\n\n    return Animation;\n  }();\n\n  /**\n   * Various DOM helper\n   */\n  var Dom = /*#__PURE__*/function () {\n    function Dom() {\n      _classCallCheck(this, Dom);\n    }\n\n    _createClass(Dom, null, [{\n      key: \"getSiblings\",\n\n      /**\n       * Get all the previous and next siblings, optionally filtered by a selector\n       */\n      value: function getSiblings(element, filter) {\n        var includeSelf = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n        var siblings = [];\n        var currentElement = element; // Do the previous first\n\n        while (currentElement = currentElement.previousElementSibling) {\n          if (!filter || currentElement.matches(filter)) {\n            siblings.push(currentElement);\n          }\n        }\n\n        if (includeSelf) {\n          siblings.push(element);\n        } // Then the next side\n\n\n        currentElement = element;\n\n        while (currentElement = currentElement.nextElementSibling) {\n          if (!filter || currentElement.matches(filter)) {\n            siblings.push(currentElement);\n          }\n        }\n\n        return siblings;\n      }\n    }]);\n\n    return Dom;\n  }();\n\n  var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n  function getDefaultExportFromCjs (x) {\n  \treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n  }\n\n  function createCommonjsModule(fn, basedir, module) {\n  \treturn module = {\n  \t\tpath: basedir,\n  \t\texports: {},\n  \t\trequire: function (path, base) {\n  \t\t\treturn commonjsRequire(path, (base === undefined || base === null) ? module.path : base);\n  \t\t}\n  \t}, fn(module, module.exports), module.exports;\n  }\n\n  function commonjsRequire () {\n  \tthrow new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs');\n  }\n\n  var browser = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n      value: true\n    });\n    exports[\"default\"] = void 0;\n    /**\n     * DOM event delegator\n     *\n     * The delegator will listen\n     * for events that bubble up\n     * to the root node.\n     *\n     * @constructor\n     * @param {Node|string} [root] The root node or a selector string matching the root node\n     */\n\n    function Delegate(root) {\n      /**\n       * Maintain a map of listener\n       * lists, keyed by event name.\n       *\n       * @type Object\n       */\n      this.listenerMap = [{}, {}];\n\n      if (root) {\n        this.root(root);\n      }\n      /** @type function() */\n\n\n      this.handle = Delegate.prototype.handle.bind(this); // Cache of event listeners removed during an event cycle\n\n      this._removedListeners = [];\n    }\n    /**\n     * Start listening for events\n     * on the provided DOM element\n     *\n     * @param  {Node|string} [root] The root node or a selector string matching the root node\n     * @returns {Delegate} This method is chainable\n     */\n\n\n    Delegate.prototype.root = function (root) {\n      var listenerMap = this.listenerMap;\n      var eventType; // Remove master event listeners\n\n      if (this.rootElement) {\n        for (eventType in listenerMap[1]) {\n          if (listenerMap[1].hasOwnProperty(eventType)) {\n            this.rootElement.removeEventListener(eventType, this.handle, true);\n          }\n        }\n\n        for (eventType in listenerMap[0]) {\n          if (listenerMap[0].hasOwnProperty(eventType)) {\n            this.rootElement.removeEventListener(eventType, this.handle, false);\n          }\n        }\n      } // If no root or root is not\n      // a dom node, then remove internal\n      // root reference and exit here\n\n\n      if (!root || !root.addEventListener) {\n        if (this.rootElement) {\n          delete this.rootElement;\n        }\n\n        return this;\n      }\n      /**\n       * The root node at which\n       * listeners are attached.\n       *\n       * @type Node\n       */\n\n\n      this.rootElement = root; // Set up master event listeners\n\n      for (eventType in listenerMap[1]) {\n        if (listenerMap[1].hasOwnProperty(eventType)) {\n          this.rootElement.addEventListener(eventType, this.handle, true);\n        }\n      }\n\n      for (eventType in listenerMap[0]) {\n        if (listenerMap[0].hasOwnProperty(eventType)) {\n          this.rootElement.addEventListener(eventType, this.handle, false);\n        }\n      }\n\n      return this;\n    };\n    /**\n     * @param {string} eventType\n     * @returns boolean\n     */\n\n\n    Delegate.prototype.captureForType = function (eventType) {\n      return ['blur', 'error', 'focus', 'load', 'resize', 'scroll'].indexOf(eventType) !== -1;\n    };\n    /**\n     * Attach a handler to one\n     * event for all elements\n     * that match the selector,\n     * now or in the future\n     *\n     * The handler function receives\n     * three arguments: the DOM event\n     * object, the node that matched\n     * the selector while the event\n     * was bubbling and a reference\n     * to itself. Within the handler,\n     * 'this' is equal to the second\n     * argument.\n     *\n     * The node that actually received\n     * the event can be accessed via\n     * 'event.target'.\n     *\n     * @param {string} eventType Listen for these events\n     * @param {string|undefined} selector Only handle events on elements matching this selector, if undefined match root element\n     * @param {function()} handler Handler function - event data passed here will be in event.data\n     * @param {boolean} [useCapture] see 'useCapture' in <https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener>\n     * @returns {Delegate} This method is chainable\n     */\n\n\n    Delegate.prototype.on = function (eventType, selector, handler, useCapture) {\n      var root;\n      var listenerMap;\n      var matcher;\n      var matcherParam;\n\n      if (!eventType) {\n        throw new TypeError('Invalid event type: ' + eventType);\n      } // handler can be passed as\n      // the second or third argument\n\n\n      if (typeof selector === 'function') {\n        useCapture = handler;\n        handler = selector;\n        selector = null;\n      } // Fallback to sensible defaults\n      // if useCapture not set\n\n\n      if (useCapture === undefined) {\n        useCapture = this.captureForType(eventType);\n      }\n\n      if (typeof handler !== 'function') {\n        throw new TypeError('Handler must be a type of Function');\n      }\n\n      root = this.rootElement;\n      listenerMap = this.listenerMap[useCapture ? 1 : 0]; // Add master handler for type if not created yet\n\n      if (!listenerMap[eventType]) {\n        if (root) {\n          root.addEventListener(eventType, this.handle, useCapture);\n        }\n\n        listenerMap[eventType] = [];\n      }\n\n      if (!selector) {\n        matcherParam = null; // COMPLEX - matchesRoot needs to have access to\n        // this.rootElement, so bind the function to this.\n\n        matcher = matchesRoot.bind(this); // Compile a matcher for the given selector\n      } else if (/^[a-z]+$/i.test(selector)) {\n        matcherParam = selector;\n        matcher = matchesTag;\n      } else if (/^#[a-z0-9\\-_]+$/i.test(selector)) {\n        matcherParam = selector.slice(1);\n        matcher = matchesId;\n      } else {\n        matcherParam = selector;\n        matcher = Element.prototype.matches;\n      } // Add to the list of listeners\n\n\n      listenerMap[eventType].push({\n        selector: selector,\n        handler: handler,\n        matcher: matcher,\n        matcherParam: matcherParam\n      });\n      return this;\n    };\n    /**\n     * Remove an event handler\n     * for elements that match\n     * the selector, forever\n     *\n     * @param {string} [eventType] Remove handlers for events matching this type, considering the other parameters\n     * @param {string} [selector] If this parameter is omitted, only handlers which match the other two will be removed\n     * @param {function()} [handler] If this parameter is omitted, only handlers which match the previous two will be removed\n     * @returns {Delegate} This method is chainable\n     */\n\n\n    Delegate.prototype.off = function (eventType, selector, handler, useCapture) {\n      var i;\n      var listener;\n      var listenerMap;\n      var listenerList;\n      var singleEventType; // Handler can be passed as\n      // the second or third argument\n\n      if (typeof selector === 'function') {\n        useCapture = handler;\n        handler = selector;\n        selector = null;\n      } // If useCapture not set, remove\n      // all event listeners\n\n\n      if (useCapture === undefined) {\n        this.off(eventType, selector, handler, true);\n        this.off(eventType, selector, handler, false);\n        return this;\n      }\n\n      listenerMap = this.listenerMap[useCapture ? 1 : 0];\n\n      if (!eventType) {\n        for (singleEventType in listenerMap) {\n          if (listenerMap.hasOwnProperty(singleEventType)) {\n            this.off(singleEventType, selector, handler);\n          }\n        }\n\n        return this;\n      }\n\n      listenerList = listenerMap[eventType];\n\n      if (!listenerList || !listenerList.length) {\n        return this;\n      } // Remove only parameter matches\n      // if specified\n\n\n      for (i = listenerList.length - 1; i >= 0; i--) {\n        listener = listenerList[i];\n\n        if ((!selector || selector === listener.selector) && (!handler || handler === listener.handler)) {\n          this._removedListeners.push(listener);\n\n          listenerList.splice(i, 1);\n        }\n      } // All listeners removed\n\n\n      if (!listenerList.length) {\n        delete listenerMap[eventType]; // Remove the main handler\n\n        if (this.rootElement) {\n          this.rootElement.removeEventListener(eventType, this.handle, useCapture);\n        }\n      }\n\n      return this;\n    };\n    /**\n     * Handle an arbitrary event.\n     *\n     * @param {Event} event\n     */\n\n\n    Delegate.prototype.handle = function (event) {\n      var i;\n      var l;\n      var type = event.type;\n      var root;\n      var phase;\n      var listener;\n      var returned;\n      var listenerList = [];\n      var target;\n      var eventIgnore = 'ftLabsDelegateIgnore';\n\n      if (event[eventIgnore] === true) {\n        return;\n      }\n\n      target = event.target; // Hardcode value of Node.TEXT_NODE\n      // as not defined in IE8\n\n      if (target.nodeType === 3) {\n        target = target.parentNode;\n      } // Handle SVG <use> elements in IE\n\n\n      if (target.correspondingUseElement) {\n        target = target.correspondingUseElement;\n      }\n\n      root = this.rootElement;\n      phase = event.eventPhase || (event.target !== event.currentTarget ? 3 : 2); // eslint-disable-next-line default-case\n\n      switch (phase) {\n        case 1:\n          //Event.CAPTURING_PHASE:\n          listenerList = this.listenerMap[1][type];\n          break;\n\n        case 2:\n          //Event.AT_TARGET:\n          if (this.listenerMap[0] && this.listenerMap[0][type]) {\n            listenerList = listenerList.concat(this.listenerMap[0][type]);\n          }\n\n          if (this.listenerMap[1] && this.listenerMap[1][type]) {\n            listenerList = listenerList.concat(this.listenerMap[1][type]);\n          }\n\n          break;\n\n        case 3:\n          //Event.BUBBLING_PHASE:\n          listenerList = this.listenerMap[0][type];\n          break;\n      }\n\n      var toFire = []; // Need to continuously check\n      // that the specific list is\n      // still populated in case one\n      // of the callbacks actually\n      // causes the list to be destroyed.\n\n      l = listenerList.length;\n\n      while (target && l) {\n        for (i = 0; i < l; i++) {\n          listener = listenerList[i]; // Bail from this loop if\n          // the length changed and\n          // no more listeners are\n          // defined between i and l.\n\n          if (!listener) {\n            break;\n          }\n\n          if (target.tagName && [\"button\", \"input\", \"select\", \"textarea\"].indexOf(target.tagName.toLowerCase()) > -1 && target.hasAttribute(\"disabled\")) {\n            // Remove things that have previously fired\n            toFire = [];\n          } // Check for match and fire\n          // the event if there's one\n          //\n          // TODO:MCG:20120117: Need a way\n          // to check if event#stopImmediatePropagation\n          // was called. If so, break both loops.\n          else if (listener.matcher.call(target, listener.matcherParam, target)) {\n              toFire.push([event, target, listener]);\n            }\n        } // TODO:MCG:20120117: Need a way to\n        // check if event#stopPropagation\n        // was called. If so, break looping\n        // through the DOM. Stop if the\n        // delegation root has been reached\n\n\n        if (target === root) {\n          break;\n        }\n\n        l = listenerList.length; // Fall back to parentNode since SVG children have no parentElement in IE\n\n        target = target.parentElement || target.parentNode; // Do not traverse up to document root when using parentNode, though\n\n        if (target instanceof HTMLDocument) {\n          break;\n        }\n      }\n\n      var ret;\n\n      for (i = 0; i < toFire.length; i++) {\n        // Has it been removed during while the event function was fired\n        if (this._removedListeners.indexOf(toFire[i][2]) > -1) {\n          continue;\n        }\n\n        returned = this.fire.apply(this, toFire[i]); // Stop propagation to subsequent\n        // callbacks if the callback returned\n        // false\n\n        if (returned === false) {\n          toFire[i][0][eventIgnore] = true;\n          toFire[i][0].preventDefault();\n          ret = false;\n          break;\n        }\n      }\n\n      return ret;\n    };\n    /**\n     * Fire a listener on a target.\n     *\n     * @param {Event} event\n     * @param {Node} target\n     * @param {Object} listener\n     * @returns {boolean}\n     */\n\n\n    Delegate.prototype.fire = function (event, target, listener) {\n      return listener.handler.call(target, event, target);\n    };\n    /**\n     * Check whether an element\n     * matches a tag selector.\n     *\n     * Tags are NOT case-sensitive,\n     * except in XML (and XML-based\n     * languages such as XHTML).\n     *\n     * @param {string} tagName The tag name to test against\n     * @param {Element} element The element to test with\n     * @returns boolean\n     */\n\n\n    function matchesTag(tagName, element) {\n      return tagName.toLowerCase() === element.tagName.toLowerCase();\n    }\n    /**\n     * Check whether an element\n     * matches the root.\n     *\n     * @param {?String} selector In this case this is always passed through as null and not used\n     * @param {Element} element The element to test with\n     * @returns boolean\n     */\n\n\n    function matchesRoot(selector, element) {\n      if (this.rootElement === window) {\n        return (// Match the outer document (dispatched from document)\n          element === document || // The <html> element (dispatched from document.body or document.documentElement)\n          element === document.documentElement || // Or the window itself (dispatched from window)\n          element === window\n        );\n      }\n\n      return this.rootElement === element;\n    }\n    /**\n     * Check whether the ID of\n     * the element in 'this'\n     * matches the given ID.\n     *\n     * IDs are case-sensitive.\n     *\n     * @param {string} id The ID to test against\n     * @param {Element} element The element to test with\n     * @returns boolean\n     */\n\n\n    function matchesId(id, element) {\n      return id === element.id;\n    }\n    /**\n     * Short hand for off()\n     * and root(), ie both\n     * with no parameters\n     *\n     * @return void\n     */\n\n\n    Delegate.prototype.destroy = function () {\n      this.off();\n      this.root();\n    };\n\n    var _default = Delegate;\n    exports[\"default\"] = _default;\n    module.exports = exports[\"default\"];\n  });\n  var Delegate = /*@__PURE__*/getDefaultExportFromCjs(browser);\n\n  var CollapsibleManager = /*#__PURE__*/function () {\n    function CollapsibleManager() {\n      _classCallCheck(this, CollapsibleManager);\n\n      this.domDelegate = new Delegate(document.body);\n\n      this._attachListeners();\n    }\n\n    _createClass(CollapsibleManager, [{\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        this.domDelegate.on('click', '[data-action=\"toggle-collapsible\"]:not([disabled])', this._toggleCollapsible.bind(this));\n        document.addEventListener('collapsible:toggle', this._toggleCollapsible.bind(this));\n      }\n      /**\n       * Toggle a given collapsible\n       */\n\n    }, {\n      key: \"_toggleCollapsible\",\n      value: function _toggleCollapsible(event, target) {\n        var _this = this;\n\n        // If the target is null, it may be because someone has sent the global event \"collapsible:toggle\". If that the case\n        // we can retrieve the toggle button by using the event.detail.id\n        if (!target && event.detail) {\n          target = document.querySelector(\"[aria-controls=\\\"\".concat(event.detail.id, \"\\\"]\"));\n        }\n\n        var isOpen = target.getAttribute('aria-expanded') === 'true',\n            parentCollapsible = target.parentNode;\n\n        if (isOpen) {\n          this._close(parentCollapsible);\n        } else {\n          this._open(parentCollapsible);\n        } // We make sure to close any siblings collapsible as well\n\n\n        if (target.getAttribute('data-close-siblings') !== 'false') {\n          Dom.getSiblings(parentCollapsible).forEach(function (collapsibleToClose) {\n            return _this._close(collapsibleToClose);\n          });\n        }\n      }\n      /**\n       * Open a given collapsible\n       */\n\n    }, {\n      key: \"_open\",\n      value: function _open(collapsible) {\n        var toggleButton = collapsible.querySelector('[aria-controls]');\n\n        if (!toggleButton || toggleButton.getAttribute('aria-expanded') === 'true') {\n          return; // It's already open\n        }\n\n        var collapsibleContent = collapsible.querySelector(\"#\".concat(toggleButton.getAttribute('aria-controls')));\n        toggleButton.setAttribute('aria-expanded', 'true');\n\n        if (collapsibleContent.hasAttribute('aria-hidden')) {\n          collapsibleContent.setAttribute('aria-hidden', 'false');\n        }\n\n        Animation.slideDown(collapsibleContent, function () {\n          if (toggleButton.hasAttribute('data-collapsible-force-overflow')) {\n            collapsibleContent.style.overflow = 'visible';\n          } // If there is an autofocus field, we focus it\n\n\n          var autofocusElement = collapsibleContent.querySelector('[autofocus]');\n\n          if (autofocusElement) {\n            autofocusElement.focus();\n          }\n        });\n      }\n      /**\n       * Close a given collapsible\n       */\n\n    }, {\n      key: \"_close\",\n      value: function _close(collapsible) {\n        var toggleButton = collapsible.querySelector('[aria-controls]');\n\n        if (!toggleButton || toggleButton.getAttribute('aria-expanded') === 'false') {\n          return; // It's already closed\n        }\n\n        var collapsibleContent = collapsible.querySelector(\"#\".concat(toggleButton.getAttribute('aria-controls')));\n\n        if (toggleButton.hasAttribute('data-collapsible-force-overflow')) {\n          collapsibleContent.style.overflow = 'hidden';\n        }\n\n        if (collapsibleContent.hasAttribute('aria-hidden')) {\n          collapsibleContent.setAttribute('aria-hidden', 'true');\n        }\n\n        toggleButton.setAttribute('aria-expanded', 'false');\n        Animation.slideUp(collapsibleContent);\n      }\n    }]);\n\n    return CollapsibleManager;\n  }();\n\n  var CountrySelector = /*#__PURE__*/function () {\n    function CountrySelector(countrySelect, provinceSelect) {\n      _classCallCheck(this, CountrySelector);\n\n      this.countrySelect = countrySelect;\n      this.provinceSelect = provinceSelect;\n\n      if (this.countrySelect && this.provinceSelect) {\n        this._attachListeners();\n\n        this._initSelectors();\n      }\n    }\n\n    _createClass(CountrySelector, [{\n      key: \"destroy\",\n      value: function destroy() {\n        if (this.countrySelect) {\n          this.countrySelect.removeEventListener('change', this._onCountryChangedListener);\n        }\n      }\n    }, {\n      key: \"_initSelectors\",\n      value: function _initSelectors() {\n        // Check first the default value of country\n        var defaultCountry = this.countrySelect.getAttribute('data-default');\n\n        if (defaultCountry) {\n          for (var i = 0; i !== this.countrySelect.options.length; ++i) {\n            if (this.countrySelect.options[i].text === defaultCountry) {\n              this.countrySelect.selectedIndex = i;\n              break;\n            }\n          }\n        } else {\n          this.countrySelect.selectedIndex = 0;\n        }\n\n        var event = new Event('change', {\n          bubbles: true\n        });\n        this.countrySelect.dispatchEvent(event); // Then the province\n\n        var defaultProvince = this.provinceSelect.getAttribute('data-default');\n\n        if (defaultProvince) {\n          for (var _i = 0; _i !== this.provinceSelect.options.length; ++_i) {\n            if (this.provinceSelect.options[_i].text === defaultProvince) {\n              this.provinceSelect.selectedIndex = _i;\n              break;\n            }\n          }\n        }\n      }\n    }, {\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        this._onCountryChangedListener = this._onCountryChanged.bind(this);\n        this.countrySelect.addEventListener('change', this._onCountryChangedListener);\n      }\n    }, {\n      key: \"_onCountryChanged\",\n      value: function _onCountryChanged() {\n        var _this = this;\n\n        var selectedOption = this.countrySelect.options[this.countrySelect.selectedIndex];\n\n        if (!selectedOption) {\n          return;\n        }\n\n        var provinces = JSON.parse(selectedOption.getAttribute('data-provinces') || '[]'); // First remove all options\n\n        this.provinceSelect.innerHTML = '';\n\n        if (provinces.length === 0) {\n          this.provinceSelect.closest('.form__input-wrapper').style.display = 'none';\n          return;\n        } // We need to build the provinces array\n\n\n        provinces.forEach(function (data) {\n          _this.provinceSelect.options.add(new Option(data[1], data[0]));\n        });\n        this.provinceSelect.closest('.form__input-wrapper').style.display = 'block';\n      }\n    }]);\n\n    return CountrySelector;\n  }();\n\n  var Responsive = /*#__PURE__*/function () {\n    function Responsive() {\n      _classCallCheck(this, Responsive);\n    }\n\n    _createClass(Responsive, null, [{\n      key: \"matchesBreakpoint\",\n      value: function matchesBreakpoint(breakpoint) {\n        switch (breakpoint) {\n          case 'phone':\n            return window.matchMedia('screen and (max-width: 640px)').matches;\n\n          case 'tablet':\n            return window.matchMedia('screen and (min-width: 641px) and (max-width: 1023px)').matches;\n\n          case 'tablet-and-up':\n            return window.matchMedia('screen and (min-width: 641px)').matches;\n\n          case 'pocket':\n            return window.matchMedia('screen and (max-width: 1023px)').matches;\n\n          case 'lap':\n            return window.matchMedia('screen and (min-width: 1024px) and (max-width: 1279px)').matches;\n\n          case 'lap-and-up':\n            return window.matchMedia('screen and (min-width: 1024px)').matches;\n\n          case 'desk':\n            return window.matchMedia('screen and (min-width: 1280px)').matches;\n\n          case 'widescreen':\n            return window.matchMedia('screen and (min-width: 1440px)').matches;\n\n          case 'supports-hover':\n            return window.matchMedia('(hover: hover) and (pointer: fine)').matches;\n        }\n      }\n    }, {\n      key: \"getCurrentBreakpoint\",\n      value: function getCurrentBreakpoint() {\n        if (window.matchMedia('screen and (max-width: 640px)').matches) {\n          return 'phone';\n        }\n\n        if (window.matchMedia('screen and (min-width: 641px) and (max-width: 1023px)').matches) {\n          return 'tablet';\n        }\n\n        if (window.matchMedia('screen and (min-width: 1024px) and (max-width: 1279px)').matches) {\n          return 'lap';\n        }\n\n        if (window.matchMedia('screen and (min-width: 1280px)').matches) {\n          return 'desk';\n        }\n      }\n    }]);\n\n    return Responsive;\n  }();\n\n  var DesktopNavigation = /*#__PURE__*/function () {\n    function DesktopNavigation(element, navigationLayout, openTrigger) {\n      _classCallCheck(this, DesktopNavigation);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.delegateRoot = new Delegate(document.documentElement);\n      this.useInlineNavigation = navigationLayout === 'inline';\n      this.isNavigationVisible = this.useInlineNavigation;\n      this.openTrigger = openTrigger; // If we use a device that does not support hover, we force the open trigger to be on click (for instance iPad)\n\n      if (!Responsive.matchesBreakpoint('supports-hover')) {\n        this.openTrigger = 'click';\n      }\n\n      this.openItems = [];\n      this.dropdownActivationTimeouts = {};\n      this.dropdownDeactivationTimeouts = {};\n      this.DROPDOWN_TIMEOUT = 100;\n\n      this._attachListeners();\n\n      if (this.useInlineNavigation) {\n        this._setupInlineNavigation();\n      }\n    }\n\n    _createClass(DesktopNavigation, [{\n      key: \"destroy\",\n      value: function destroy() {\n        this.delegateElement.off();\n        this.delegateRoot.off();\n      }\n    }, {\n      key: \"onBlockSelect\",\n      value: function onBlockSelect(event) {\n        var _this = this;\n\n        if (!this.useInlineNavigation) {\n          this._openNavigation();\n        } // We receive a reference to the mega-menu, but for simpler handling, we simulate as if the button was hovered. First, we must close\n        // mega-menu if there is already one that is open\n\n\n        Dom.getSiblings(event.target.parentNode, '.is-dropdown-open').forEach(function (openItem) {\n          _this._deactivateDropdown(event, openItem.querySelector('[data-type=\"menuitem\"][aria-haspopup]'));\n        }); // The previousElementSibling is always the link itself\n\n        this._activateDropdown(event, event.target.previousElementSibling);\n      }\n    }, {\n      key: \"onBlockDeselect\",\n      value: function onBlockDeselect(event) {\n        if (!this.useInlineNavigation) {\n          this._closeNavigation();\n        } // The deactivation is done on the wrapping div (so parentNode)\n\n\n        this._deactivateDropdown(event, event.target.parentNode);\n      }\n    }, {\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        this.delegateElement.on('focusout', this._onFocusOut.bind(this));\n        this.delegateRoot.on('click', this._onClick.bind(this));\n        this.delegateElement.on('click', '[data-action=\"toggle-menu\"]', this._toggleNavigation.bind(this));\n\n        if (this.openTrigger === 'hover') {\n          this.delegateElement.on('focusin', '[data-type=\"menuitem\"][aria-haspopup]', this._activateDropdown.bind(this));\n          this.delegateElement.on('mouseover', '[data-type=\"menuitem\"][aria-haspopup]', this._activateDropdown.bind(this));\n          this.delegateElement.on('mouseover', '[data-type=\"menu\"][aria-hidden=\"false\"]', this._blockDropdownDeactivation.bind(this));\n          this.delegateElement.on('focusout', '.is-dropdown-open', this._deactivateDropdown.bind(this));\n          this.delegateElement.on('mouseout', '.is-dropdown-open', this._deactivateDropdown.bind(this));\n        } else {\n          this.delegateElement.on('click', '[data-type=\"menuitem\"][aria-haspopup]', this._toggleDropdown.bind(this));\n        }\n      }\n      /**\n       * When the whole menu looses focus, it's automatically closed (in the case of condensed menu)\n       */\n\n    }, {\n      key: \"_onFocusOut\",\n      value: function _onFocusOut(event) {\n        // event.relatedTarget is the new target that receives focus\n        if (event.relatedTarget !== null && !this.element.contains(event.relatedTarget)) {\n          this._closeNavigation();\n        }\n      }\n      /**\n       * We need to catch click outside the element to automatically close menu\n       */\n\n    }, {\n      key: \"_onClick\",\n      value: function _onClick(event) {\n        if (!this.element.contains(event.target)) {\n          this._closeNavigation();\n        }\n      }\n      /**\n       * Open the navigation (really make sense for condensed menu-\n       */\n\n    }, {\n      key: \"_openNavigation\",\n      value: function _openNavigation() {\n        // Inline navigation is always visible so there is nothing to open\n        if (this.useInlineNavigation) {\n          return;\n        }\n\n        this.element.querySelector('[data-action=\"toggle-menu\"]').setAttribute('aria-expanded', 'true');\n        this.element.querySelector('[data-type=\"menu\"]').setAttribute('aria-hidden', 'false');\n        this.isNavigationVisible = true;\n      }\n      /**\n       * Close the navigation (really make sense for condensed menu)\n       */\n\n    }, {\n      key: \"_closeNavigation\",\n      value: function _closeNavigation() {\n        var _this2 = this;\n\n        if (!this.useInlineNavigation) {\n          this.element.querySelector('[data-action=\"toggle-menu\"]').setAttribute('aria-expanded', 'false');\n          this.element.querySelector('[data-type=\"menu\"]').setAttribute('aria-hidden', 'true');\n        }\n\n        this.isNavigationVisible = false;\n\n        if (this.openTrigger === 'click') {\n          var cloneOpenItems = this.openItems.slice(0);\n          cloneOpenItems.forEach(function (item) {\n            _this2._deactivateDropdown(event, item);\n          });\n        }\n      }\n      /**\n       * Toggle navigation\n       */\n\n    }, {\n      key: \"_toggleNavigation\",\n      value: function _toggleNavigation(event) {\n        if (this.isNavigationVisible) {\n          this._closeNavigation();\n        } else {\n          this._openNavigation();\n        }\n      }\n      /**\n       * Toggle a dropdown\n       */\n\n    }, {\n      key: \"_toggleDropdown\",\n      value: function _toggleDropdown(event, target) {\n        // If the link is currently not expanded, we block the click\n        if (target.getAttribute('aria-expanded') === 'false') {\n          event.preventDefault();\n        }\n\n        if (target.getAttribute('aria-expanded') === 'true') {\n          // If the link target is \"#\", by convention we close the dropdown, otherwise we just follow the link\n          if (target.getAttribute('href') === '#') {\n            event.preventDefault();\n\n            this._deactivateDropdown(event, target.closest('.is-dropdown-open'));\n          }\n        } else {\n          this._activateDropdown(event, target);\n        }\n      }\n      /**\n       * Open a dropdown menu\n       */\n\n    }, {\n      key: \"_activateDropdown\",\n      value: function _activateDropdown(event, target) {\n        var _this3 = this;\n\n        // If we are on click, we first need to close any other dropdown (if needed)\n        if (this.openTrigger === 'click') {\n          var cloneOpenItems = this.openItems.slice(0);\n          cloneOpenItems.forEach(function (item) {\n            if (!item.contains(target)) {\n              _this3._deactivateDropdown(event, item);\n            }\n          });\n        }\n\n        var menuToOpen = Dom.getSiblings(target, '[aria-hidden]')[0];\n\n        var callback = function callback() {\n          target.setAttribute('aria-expanded', 'true');\n          target.parentNode.classList.add('is-dropdown-open');\n          menuToOpen.setAttribute('aria-hidden', 'false'); // If this menu was scheduled for deactivation, we remove the scheduling as it is now meant to open\n\n          if (_this3.openTrigger === 'hover' && _this3.dropdownDeactivationTimeouts[menuToOpen.id]) {\n            clearTimeout(_this3.dropdownDeactivationTimeouts[menuToOpen.id]);\n            delete _this3.dropdownDeactivationTimeouts[menuToOpen.id];\n          } // If we are in inline navigation, we may be on the edge of the screen. If that's the case we check if any of the sub-sub-menu goes outside the screen. If\n          // this is the case, sub-sub-menu will be displayed on the left\n\n\n          if (_this3.useInlineNavigation) {\n            var windowWidth = window.innerWidth,\n                shouldOpenLeft = false;\n            menuToOpen.querySelectorAll('.nav-dropdown').forEach(function (subSubMenu) {\n              if (subSubMenu.getBoundingClientRect().right > windowWidth) {\n                shouldOpenLeft = true;\n              }\n            });\n\n            if (shouldOpenLeft) {\n              menuToOpen.classList.add('nav-dropdown--inverse');\n            }\n          }\n\n          target.closest('[data-type=\"menu\"]').classList.add('nav-dropdown--glued');\n\n          if (menuToOpen.classList.contains('mega-menu')) {\n            _this3._setupMegaMenu(menuToOpen);\n          }\n\n          if (_this3.openTrigger === 'click') {\n            _this3.openItems.push(target.parentNode);\n          }\n        }; // If we are using on click, we can directly close, otherwise we apply a slight delay before closing the menu,\n        // so that the deactivation could be cancelled if the mouse is back to the dropdown (which can happen when doing\n        // horizontal movement)\n\n\n        if (this.openTrigger === 'click') {\n          callback();\n        } else {\n          // Any other menu that has been scheduled for activation must be deactivated as it's now this one that is supposed to open\n          for (var toDeactivate in this.dropdownActivationTimeouts) {\n            if (this.dropdownActivationTimeouts.hasOwnProperty(toDeactivate)) {\n              clearTimeout(this.dropdownActivationTimeouts[toDeactivate]);\n              delete this.dropdownActivationTimeouts[toDeactivate];\n            }\n          }\n\n          callback();\n          /*this.dropdownActivationTimeouts[menuToOpen.id] = setTimeout(() => {\n            callback();\n            delete this.dropdownActivationTimeouts[menuToOpen.id];\n          }, this.DROPDOWN_TIMEOUT);*/\n        }\n      }\n      /**\n       * Close a dropdown menu\n       */\n\n    }, {\n      key: \"_deactivateDropdown\",\n      value: function _deactivateDropdown(event, target) {\n        var _this4 = this;\n\n        // event.relatedTarget is the new target. This allows to make sure to only close the dropdown if we leave the containing div\n        if (this.openTrigger === 'hover' && target.contains(event.relatedTarget)) {\n          return;\n        }\n\n        var menuToClose = target.querySelector('[aria-hidden]');\n\n        var callback = function callback() {\n          target.classList.remove('is-dropdown-open');\n          target.querySelector('[data-type=\"menuitem\"]').setAttribute('aria-expanded', 'false');\n          var menuToClose = target.querySelector('[aria-hidden]');\n          menuToClose.setAttribute('aria-hidden', 'true');\n          target.closest('[data-type=\"menu\"]').classList.remove('nav-dropdown--glued'); // If on click, we also close all sub-menus that may be open\n\n          if (_this4.openTrigger === 'click') {\n            target.querySelectorAll('.is-dropdown-open').forEach(function (item) {\n              _this4._deactivateDropdown(event, item);\n\n              var index = _this4.openItems.indexOf(item);\n\n              if (index > -1) {\n                _this4.openItems.splice(index, 1);\n              }\n            }); // It has been deactivated so we also remove this one\n\n            var index = _this4.openItems.indexOf(target);\n\n            if (index > -1) {\n              _this4.openItems.splice(index, 1);\n            }\n          }\n        }; // If we are using on click, we can directly close, otherwise we apply a slight delay before closing the menu,\n        // so that the deactivation could be cancelled if the mouse is back to the dropdown (which can happen when doing\n        // horizontal movement)\n\n\n        if (this.openTrigger === 'click') {\n          callback();\n        } else {\n          this.dropdownDeactivationTimeouts[menuToClose.id] = setTimeout(function () {\n            callback();\n            delete _this4.dropdownDeactivationTimeouts[menuToClose.id];\n          }, this.DROPDOWN_TIMEOUT);\n        }\n      }\n      /**\n       * This method allows to block the dropdown deactivation if the mouse is back on the element. This may happen for\n       * instance when the customer does a kind of diagonal movement to the menu. While the mouse may leave the opening\n       * item, we want the item to stay open\n       */\n\n    }, {\n      key: \"_blockDropdownDeactivation\",\n      value: function _blockDropdownDeactivation(event, target) {\n        if (this.dropdownDeactivationTimeouts[target.id] !== undefined) {\n          clearTimeout(this.dropdownDeactivationTimeouts[target.id]);\n          delete this.dropdownDeactivationTimeouts[target.id]; // If we blocked the deactivation, then we must also remove any pending menu that could have been scheduled to open\n\n          for (var toDeactivate in this.dropdownActivationTimeouts) {\n            if (this.dropdownActivationTimeouts.hasOwnProperty(toDeactivate)) {\n              clearTimeout(this.dropdownActivationTimeouts[toDeactivate]);\n              delete this.dropdownActivationTimeouts[toDeactivate];\n            }\n          }\n        }\n      }\n      /**\n       * Set the maximum width allowed for the given mega-menu. For the inline style, it is always full width so nothing to do\n       */\n\n    }, {\n      key: \"_setupMegaMenu\",\n      value: function _setupMegaMenu(megaMenu) {\n        if (!this.useInlineNavigation) {\n          var navDropdownWidth = megaMenu.closest('.nav-dropdown').clientWidth;\n          megaMenu.style.maxWidth = Math.min(1400 - navDropdownWidth, parseInt(window.innerWidth - navDropdownWidth - 80)) + 'px';\n        }\n      }\n      /**\n       * Fix inline navigation\n       */\n\n    }, {\n      key: \"_setupInlineNavigation\",\n      value: function _setupInlineNavigation() {\n        var _this5 = this;\n\n        this.element.querySelectorAll('.mega-menu').forEach(function (megaMenu) {\n          megaMenu.closest('.nav-bar__item').classList.add('nav-bar__item--static');\n        }); // If using the inline navigation, we also set up a mutation observer whenever a sub-sub-dropdown is open, in order\n        // to calculate their distance from the top of the screen, so we can apply a max-height properly\n\n        if ('MutationObserver' in window) {\n          this.dropdownMenuObserver = new MutationObserver(function (mutationList) {\n            mutationList.forEach(function (mutation) {\n              if (mutation.target.getAttribute('aria-hidden') === 'false') {\n                // We set a CSS variable, so we can do various calculation in CSS\n                mutation.target.style.setProperty('--distance-to-top', \"\".concat(mutation.target.getBoundingClientRect().top, \"px\"));\n              }\n            });\n          });\n          this.element.querySelectorAll('.nav-dropdown .nav-dropdown').forEach(function (item) {\n            _this5.dropdownMenuObserver.observe(item, {\n              attributes: true,\n              attributeFilter: ['aria-hidden']\n            });\n          });\n        }\n      }\n    }]);\n\n    return DesktopNavigation;\n  }();\n\n  var CollectionFilterDrawer = /*#__PURE__*/function () {\n    function CollectionFilterDrawer(options) {\n      _classCallCheck(this, CollectionFilterDrawer);\n\n      this.element = document.getElementById('mobile-collection-filters');\n      this.delegateRoot = new Delegate(document.documentElement);\n      this.options = options;\n      this.isOpen = false;\n\n      if (this.element) {\n        this._attachListeners();\n      }\n    }\n\n    _createClass(CollectionFilterDrawer, [{\n      key: \"destroy\",\n      value: function destroy() {\n        this.delegateRoot.off();\n      }\n    }, {\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        this.delegateRoot.on('click', '[aria-controls=\"mobile-collection-filters\"][data-action=\"open-drawer\"]', this.open.bind(this));\n        this.delegateRoot.on('click', \"#mobile-collection-filters [data-action=\\\"close-drawer\\\"]\", this.close.bind(this));\n        document.addEventListener('collection-filter:close', this.close.bind(this));\n        document.addEventListener('click', this._detectOutsideClick.bind(this));\n        window.addEventListener('resize', this._computeDrawerHeight.bind(this));\n      }\n    }, {\n      key: \"open\",\n      value: function open(event) {\n        if (event) {\n          event.stopPropagation();\n        }\n\n        this._computeDrawerHeight();\n\n        this.isOpen = true;\n        document.querySelector('[aria-controls=\"mobile-collection-filters\"]').setAttribute('aria-expanded', 'true');\n        document.getElementById('mobile-collection-filters').setAttribute('aria-hidden', 'false');\n        document.body.classList.add('no-mobile-scroll');\n      }\n    }, {\n      key: \"close\",\n      value: function close(event) {\n        if (event) {\n          event.stopPropagation();\n        }\n\n        this.isOpen = false;\n        document.querySelector('[aria-controls=\"mobile-collection-filters\"]').setAttribute('aria-expanded', 'false');\n        document.getElementById('mobile-collection-filters').setAttribute('aria-hidden', 'true');\n        document.body.classList.remove('no-mobile-scroll');\n      }\n    }, {\n      key: \"_computeDrawerHeight\",\n      value: function _computeDrawerHeight() {\n        document.getElementById('mobile-collection-filters').querySelector('.collection-drawer').style.maxHeight = \"\".concat(window.innerHeight, \"px\");\n      }\n    }, {\n      key: \"_detectOutsideClick\",\n      value: function _detectOutsideClick(event) {\n        if (this.isOpen && !event.target.closest('.collection-drawer__inner')) {\n          this.close();\n        }\n      }\n    }]);\n\n    return CollectionFilterDrawer;\n  }();\n\n  var ExitPopup = /*#__PURE__*/function () {\n    function ExitPopup(element) {\n      _classCallCheck(this, ExitPopup);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.rootDelegateElement = new Delegate(document.body);\n      this.options = JSON.parse(element.getAttribute('data-popup-settings'));\n      this.hasOpenOnceInCurrentPage = false; // If the popup has been already displayed, we do not display it\n\n      try {\n        if (window.location.hash === '#exit-popup' && window.theme.pageType !== 'captcha') {\n          this._openPopup();\n        }\n      } catch (error) {// Some browsers (especially in private mode) throw an exception when trying to access local storage, so we protect ourselves here\n      }\n\n      this._attachListeners();\n    }\n\n    _createClass(ExitPopup, [{\n      key: \"destroy\",\n      value: function destroy() {\n        this.delegateElement.off();\n      }\n    }, {\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        var _this = this;\n\n        this._onKeyPressedListener = this._onKeyPressed.bind(this);\n        /* Some browsers like Android emit a mouseleave event when opening keyboard. This is too unreliable for touch devices */\n\n        if (!Responsive.matchesBreakpoint('supports-hover')) {\n          return;\n        }\n\n        this.delegateElement.on('click', '[data-action=\"close-popup\"]', this._closePopup.bind(this));\n        document.body.addEventListener('mouseleave', function () {\n          if (!_this.hasOpenOnceInCurrentPage) {\n            if (!_this.options['showOnlyOnce'] || _this.options['showOnlyOnce'] && localStorage.getItem('themeExitPopup') === null) {\n              _this._openPopup();\n            }\n          }\n        });\n        this._clickOutsideListener = this._checkClickOutside.bind(this);\n      }\n    }, {\n      key: \"_openPopup\",\n      value: function _openPopup() {\n        if (!window.theme.isNewsletterPopupOpen) {\n          this.element.setAttribute('aria-hidden', 'false');\n          localStorage.setItem('themeExitPopup', 'true');\n          this.hasOpenOnceInCurrentPage = true;\n          window.theme.isExitPopupOpen = true;\n          this.delegateElement.on('click', this._clickOutsideListener);\n          this.rootDelegateElement.on('keyup', this._onKeyPressedListener);\n        }\n      }\n    }, {\n      key: \"_closePopup\",\n      value: function _closePopup() {\n        this.element.setAttribute('aria-hidden', 'true');\n        window.theme.isExitPopupOpen = false;\n        this.delegateElement.off('click', this._clickOutsideListener);\n        this.rootDelegateElement.off('keyup', this._onKeyPressedListener);\n      }\n    }, {\n      key: \"_checkClickOutside\",\n      value: function _checkClickOutside(event) {\n        if (!this.element.contains(event.target) || this.element === event.target) {\n          this._closePopup();\n        }\n      }\n    }, {\n      key: \"_onKeyPressed\",\n      value: function _onKeyPressed(event) {\n        if (event.key === 'Escape') {\n          this._closePopup();\n        }\n      }\n    }]);\n\n    return ExitPopup;\n  }();\n\n  /**\n   * Simple plugin that handles the loading bar actions\n   *\n   * This plugin uses delegate events so it's independent of the sections.\n   */\n  var LoadingBar = /*#__PURE__*/function () {\n    function LoadingBar() {\n      _classCallCheck(this, LoadingBar);\n\n      this.element = document.querySelector('.loading-bar');\n\n      if (this.element) {\n        document.addEventListener('theme:loading:start', this._onLoadingStart.bind(this));\n        document.addEventListener('theme:loading:end', this._onLoadingEnd.bind(this));\n        this.element.addEventListener('transitionend', this._onTransitionEnd.bind(this));\n      }\n    }\n\n    _createClass(LoadingBar, [{\n      key: \"_onLoadingStart\",\n      value: function _onLoadingStart() {\n        this.element.classList.add('is-visible');\n        this.element.style.transform = 'scaleX(0.4)';\n      }\n    }, {\n      key: \"_onLoadingEnd\",\n      value: function _onLoadingEnd() {\n        this.element.style.transform = 'scaleX(1)';\n        this.element.classList.add('is-finished');\n      }\n    }, {\n      key: \"_onTransitionEnd\",\n      value: function _onTransitionEnd(event) {\n        if (event.propertyName === 'transform' && this.element.classList.contains('is-finished')) {\n          this.element.classList.remove('is-visible');\n          this.element.classList.remove('is-finished');\n          this.element.style.transform = 'scaleX(0)';\n        }\n      }\n    }]);\n\n    return LoadingBar;\n  }();\n\n  var Accessibility = /*#__PURE__*/function () {\n    function Accessibility() {\n      _classCallCheck(this, Accessibility);\n    }\n\n    _createClass(Accessibility, null, [{\n      key: \"trapFocus\",\n\n      /**\n       * Traps the focus in a particular container\n       */\n      value: function trapFocus(container, namespace) {\n        this.listeners = this.listeners || {}; // We check if there is an element with the attribute \"autofocus\"\n\n        var elementToFocus = container.querySelector('[autofocus]') || container;\n        container.setAttribute('tabindex', '-1');\n        elementToFocus.focus();\n\n        this.listeners[namespace] = function (event) {\n          if (container !== event.target && !container.contains(event.target)) {\n            elementToFocus.focus();\n          }\n        };\n\n        document.addEventListener('focusin', this.listeners[namespace]);\n      }\n      /**\n       * Removes the trap of focus in a particular container\n       */\n\n    }, {\n      key: \"removeTrapFocus\",\n      value: function removeTrapFocus(container, namespace) {\n        if (container) {\n          container.removeAttribute('tabindex');\n        }\n\n        document.removeEventListener('focusin', this.listeners[namespace]);\n      }\n      /**\n       * Reset any previous trap focus\n       */\n\n    }, {\n      key: \"clearTrapFocus\",\n      value: function clearTrapFocus() {\n        for (var key in this.listeners) {\n          if (this.listeners.hasOwnProperty(key)) {\n            document.removeEventListener('focusin', this.listeners[key]);\n          }\n        }\n\n        this.listeners = {};\n      }\n    }]);\n\n    return Accessibility;\n  }();\n\n  /**\n   * This class handles both the mini cart and the dedicated cart page. It's not the cleanest code on earth but works well :)\n   */\n\n  var Cart = /*#__PURE__*/function () {\n    function Cart(element, options) {\n      _classCallCheck(this, Cart);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.delegateRoot = new Delegate(document.documentElement);\n      this.options = options; // Some developers blindly remove the DOM code for the cart, so we have to do a check here to make sure it is here\n\n      if (!this.element) {\n        return;\n      }\n\n      this.miniCartElement = this.element.querySelector('.mini-cart');\n      this.isMiniCartOpen = false;\n\n      if (window.theme.pageType !== 'cart' && this.miniCartElement) {\n        this.miniCartToggleElement = this.element.querySelector(\"[aria-controls=\\\"\".concat(this.miniCartElement.id, \"\\\"]\"));\n\n        this._checkMiniCartScrollability();\n      }\n\n      this.itemCount = window.theme.cartCount;\n\n      this._attachListeners();\n    }\n\n    _createClass(Cart, [{\n      key: \"destroy\",\n      value: function destroy() {\n        this.delegateElement.off();\n        this.delegateRoot.off();\n        window.removeEventListener('resize', this._calculateMiniCartHeightListener);\n      }\n    }, {\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        this._calculateMiniCartHeightListener = this._calculateMiniCartHeight.bind(this);\n\n        if (window.theme.pageType !== 'cart' && window.theme.cartType !== 'page') {\n          this.delegateElement.on('click', '[data-action=\"toggle-mini-cart\"]', this._toggleMiniCart.bind(this));\n          this.delegateElement.on('keyup', this._checkMiniCartClose.bind(this));\n          this.delegateRoot.on('click', this._onWindowClick.bind(this));\n          window.addEventListener('resize', this._calculateMiniCartHeightListener);\n        }\n\n        this.delegateRoot.on('click', '[data-action=\"decrease-quantity\"]', this._updateQuantity.bind(this));\n        this.delegateRoot.on('click', '[data-action=\"increase-quantity\"]', this._updateQuantity.bind(this));\n        this.delegateRoot.on('change', '.quantity-selector:not(.quantity-selector--product) .quantity-selector__value', this._updateQuantity.bind(this));\n        this.delegateRoot.on('keyup', '.quantity-selector:not(.quantity-selector--product) .quantity-selector__value', this._updateQuantitySize.bind(this));\n        this.delegateRoot.on('keydown', '.quantity-selector__value', this._blockEnterKey.bind(this));\n        this.delegateRoot.on('product:added', this._onProductAdded.bind(this));\n        this.delegateRoot.on('cart:refresh', this._onCartRefresh.bind(this));\n      }\n    }, {\n      key: \"_toggleMiniCart\",\n      value: function _toggleMiniCart(event) {\n        if (event) {\n          event.preventDefault();\n        }\n\n        if (this.isMiniCartOpen) {\n          this._closeMiniCart();\n        } else {\n          this._openMiniCart();\n        }\n      }\n    }, {\n      key: \"_openMiniCart\",\n      value: function _openMiniCart() {\n        this.miniCartToggleElement.setAttribute('aria-expanded', 'true'); // If we are on mobile phone we also set the aria-expanded attribute to true on the icon state holder\n\n        if (Responsive.getCurrentBreakpoint() === 'phone') {\n          this.miniCartToggleElement.querySelector('.header__cart-icon').setAttribute('aria-expanded', 'true');\n        } // Finally also set aria-hidden to false on controlled element\n\n\n        this.miniCartElement.setAttribute('aria-hidden', 'false');\n        this.isMiniCartOpen = true;\n\n        this._calculateMiniCartHeight(); // Trap the focus\n\n\n        Accessibility.trapFocus(this.miniCartElement, 'mini-cart');\n        document.body.classList.add('no-mobile-scroll');\n      }\n    }, {\n      key: \"_closeMiniCart\",\n      value: function _closeMiniCart() {\n        this.miniCartToggleElement.setAttribute('aria-expanded', 'false'); // If we are on mobile phone we also set the aria-expanded attribute to true on the icon state holder\n\n        if (Responsive.getCurrentBreakpoint() === 'phone') {\n          this.miniCartToggleElement.querySelector('.header__cart-icon').setAttribute('aria-expanded', 'false');\n          this.miniCartElement.style.maxHeight = '';\n        } // Finally also set aria-hidden to false on controlled element\n\n\n        this.miniCartElement.setAttribute('aria-hidden', 'true');\n        this.isMiniCartOpen = false;\n        document.body.classList.remove('no-mobile-scroll');\n      }\n    }, {\n      key: \"_checkMiniCartClose\",\n      value: function _checkMiniCartClose(event) {\n        if (!this.isMiniCartOpen) {\n          return;\n        }\n\n        if (event.key === 'Escape') {\n          this._closeMiniCart();\n        }\n      }\n    }, {\n      key: \"_calculateMiniCartHeight\",\n      value: function _calculateMiniCartHeight() {\n        if (Responsive.getCurrentBreakpoint() === 'phone') {\n          if (this.isMiniCartOpen) {\n            var maxHeight = window.innerHeight - document.querySelector('.header').getBoundingClientRect().bottom;\n            this.miniCartElement.style.maxHeight = \"\".concat(maxHeight, \"px\"); // We also need to calculate the content part height to avoid any issue on Chrome\n\n            var miniCartContentElement = this.miniCartElement.querySelector('.mini-cart__content'),\n                miniCartRecapElement = this.miniCartElement.querySelector('.mini-cart__recap');\n\n            if (miniCartRecapElement) {\n              miniCartContentElement.style.maxHeight = \"\".concat(maxHeight - miniCartRecapElement.clientHeight, \"px\");\n            }\n          } else {\n            this.miniCartElement.style.maxHeight = '';\n            this.miniCartElement.querySelector('.mini-cart__content').style.maxHeight = '';\n          }\n        } else {\n          this.miniCartElement.style.maxHeight = '';\n          this.miniCartElement.querySelector('.mini-cart__content').style.maxHeight = '';\n        }\n      }\n      /**\n       * Change the quantity of the cart\n       */\n\n    }, {\n      key: \"_updateQuantity\",\n      value: function _updateQuantity(event, target) {\n        var _this = this;\n\n        var parsedQuantity = 1;\n\n        if (target.tagName === 'INPUT') {\n          parsedQuantity = parseInt(target.value);\n        } else {\n          parsedQuantity = parseInt(target.getAttribute('data-quantity'));\n        } // If we are in \"page\" mode, we reload the page instead of doing that in Ajax to have a better compatibility with apps\n\n\n        if (window.theme.cartType === 'page') {\n          if (target.hasAttribute('data-href')) {\n            window.location.href = target.getAttribute('data-href');\n          } else {\n            window.location.href = \"\".concat(window.routes.cartChangeUrl, \"?line=\").concat(target.getAttribute('data-line'), \"&quantity=\").concat(parsedQuantity);\n          }\n\n          return;\n        }\n\n        document.dispatchEvent(new CustomEvent('theme:loading:start'));\n        fetch(\"\".concat(window.routes.cartChangeUrl, \".js\"), {\n          body: JSON.stringify({\n            line: target.getAttribute('data-line'),\n            quantity: parsedQuantity\n          }),\n          credentials: 'same-origin',\n          method: 'POST',\n          headers: {\n            'Content-Type': 'application/json',\n            'X-Requested-With': 'XMLHttpRequest' // This is needed as currently there is a bug in Shopify that assumes this header\n\n          }\n        }).then(function (cart) {\n          cart.json().then(function (content) {\n            _this.itemCount = content['item_count'];\n\n            _this._rerender(false).then(function () {\n              document.dispatchEvent(new CustomEvent('theme:loading:end'));\n            });\n          });\n        });\n        event.preventDefault();\n      }\n    }, {\n      key: \"_updateQuantitySize\",\n      value: function _updateQuantitySize(event, target) {\n        target.setAttribute('size', Math.max(target.value.length, 2));\n      }\n    }, {\n      key: \"_blockEnterKey\",\n      value: function _blockEnterKey(event) {\n        if (event.key === 'Enter') {\n          return false;\n        }\n      }\n      /**\n       * This method is called internally to rerender the cart, based on the content returned by Shopify Ajax API.\n       * We could save some performance by updating directly in JavaScript instead of doing a GET call to get the HTML\n       * from Shopify, but by experience, this allows for easier app integration as it allows the Liquid to re-run\n       * all the time and hence having easier logic.\n       */\n\n    }, {\n      key: \"_rerender\",\n      value: function _rerender() {\n        var _this2 = this;\n\n        var scrollToTop = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n        // Note: appending a timestamp is necessary as the polyfill on IE11 and lower does not support the \"cache\" property\n        var url = '';\n\n        if (window.theme.pageType !== 'cart') {\n          url = \"\".concat(window.routes.cartUrl, \"?section_id=mini-cart\");\n        } else {\n          var cartSection = document.querySelector('[data-section-type=\"cart\"]');\n          url = \"\".concat(window.routes.cartUrl, \"?section_id=\").concat(cartSection.getAttribute('data-section-id'));\n        }\n\n        return fetch(url, {\n          credentials: 'same-origin',\n          method: 'GET',\n          headers: {\n            'Cache-Control': 'no-cache'\n          }\n        }).then(function (content) {\n          content.text().then(function (html) {\n            // We extract the data-item-count from the returned element\n            var myDiv = document.createElement('div');\n            myDiv.innerHTML = html;\n            myDiv = myDiv.firstElementChild;\n\n            if (myDiv.firstElementChild && myDiv.firstElementChild.hasAttribute('data-item-count')) {\n              _this2.itemCount = parseInt(myDiv.firstElementChild.getAttribute('data-item-count'));\n            }\n\n            _this2.element.querySelector('.header__cart-count').textContent = _this2.itemCount;\n\n            if (window.theme.cartType !== 'page') {\n              if (window.theme.pageType !== 'cart') {\n                // Note: we could use outerHTML here but outerHTML does not update the reference to new object\n                var tempElement = document.createElement('div');\n                tempElement.innerHTML = html; // When we re-render, we need to preserve the scroll position when content changes\n\n                var miniCartItemListElement = _this2.miniCartElement.querySelector('.mini-cart__line-item-list'),\n                    scrollPosition = null;\n\n                if (miniCartItemListElement) {\n                  scrollPosition = miniCartItemListElement.scrollTop;\n                }\n\n                _this2.miniCartElement.innerHTML = tempElement.querySelector('.mini-cart').innerHTML;\n\n                var newMiniCartItemListElement = _this2.miniCartElement.querySelector('.mini-cart__line-item-list');\n\n                if (newMiniCartItemListElement && scrollPosition !== null) {\n                  newMiniCartItemListElement.scrollTop = scrollPosition;\n                }\n\n                _this2._checkMiniCartScrollability();\n\n                _this2._calculateMiniCartHeight();\n\n                _this2.element.dispatchEvent(new CustomEvent('cart:rerendered'));\n              } else {\n                // The replacement of the DOM here could be made better and more resilient (maybe exploring using a virtual DOM approach in future?)\n                var _tempElement = document.createElement('div');\n\n                _tempElement.innerHTML = html;\n                var originalCart = document.querySelector('[data-section-type=\"cart\"]');\n                originalCart.innerHTML = _tempElement.querySelector('[data-section-type=\"cart\"]').innerHTML;\n\n                if (scrollToTop) {\n                  window.scrollTo({\n                    top: 0,\n                    behavior: 'smooth'\n                  });\n                }\n\n                _this2.element.dispatchEvent(new CustomEvent('cart:rerendered', {\n                  bubbles: true\n                }));\n              }\n            }\n          });\n        });\n      }\n      /**\n       * Check if the mini-cart is scrollable\n       */\n\n    }, {\n      key: \"_checkMiniCartScrollability\",\n      value: function _checkMiniCartScrollability() {\n        var miniCartItemList = this.miniCartElement.querySelector('.mini-cart__line-item-list');\n\n        if (miniCartItemList && miniCartItemList.scrollHeight > miniCartItemList.clientHeight) {\n          miniCartItemList.classList.add('is-scrollable');\n        }\n      }\n      /**\n       * This callback is automatically called when a variant has been added, which allows us to open it and re-render\n       */\n\n    }, {\n      key: \"_onProductAdded\",\n      value: function _onProductAdded(event) {\n        var _this3 = this;\n\n        this.itemCount += event.detail.quantity;\n        /* Add the quantity added */\n\n        this._onCartRefresh().then(function () {\n          if (window.theme.pageType !== 'cart') {\n            // If we don't have the sticky header enabled, we scroll to top to make sure it is visible\n            if (window.theme.cartType === 'drawer' && !_this3.options['useStickyHeader']) {\n              window.scrollTo({\n                top: 0,\n                behavior: 'smooth'\n              });\n            }\n\n            if (window.theme.cartType === 'message' && event.detail.button) {\n              var originalMessage = event.detail.button.innerHTML;\n              event.detail.button.innerHTML = window.languages.productAddedShort;\n              setTimeout(function () {\n                event.detail.button.innerHTML = originalMessage;\n              }, 1500);\n            }\n\n            if (window.theme.pageType !== 'cart' && window.theme.cartType === 'drawer') {\n              _this3._openMiniCart();\n            }\n          }\n        });\n      }\n      /**\n       * Allows to refresh the mini-cart\n       */\n\n    }, {\n      key: \"_onCartRefresh\",\n      value: function _onCartRefresh(event) {\n        var scrollToTop = true;\n\n        if (event && event.detail) {\n          scrollToTop = event.detail.scrollToTop;\n        }\n\n        return this._rerender(scrollToTop).then(function () {\n          document.dispatchEvent(new CustomEvent('theme:loading:end'));\n        });\n      }\n      /**\n       * We need to catch click outside the element to automatically close mini-cart\n       */\n\n    }, {\n      key: \"_onWindowClick\",\n      value: function _onWindowClick(event) {\n        if (this.miniCartElement && this.isMiniCartOpen && !this.element.contains(event.target)) {\n          this._closeMiniCart();\n        }\n      }\n    }]);\n\n    return Cart;\n  }();\n\n  var MobileNavigation = /*#__PURE__*/function () {\n    function MobileNavigation(element) {\n      _classCallCheck(this, MobileNavigation);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.delegateRoot = new Delegate(document.documentElement);\n      this.mobileMenuElement = this.element.querySelector('.mobile-menu');\n      this.mobileMenuToggleElement = this.element.querySelector(\"[aria-controls=\\\"\".concat(this.mobileMenuElement.id, \"\\\"]\"));\n      this.isOpen = false;\n\n      this._attachListeners();\n    }\n\n    _createClass(MobileNavigation, [{\n      key: \"destroy\",\n      value: function destroy() {\n        this.delegateElement.off();\n        this.delegateRoot.off();\n        window.removeEventListener('resize', this._calculatMaxHeightListener);\n      }\n    }, {\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        this._calculatMaxHeightListener = this._calculateMaxHeight.bind(this);\n        this.delegateElement.on('click', '[data-action=\"toggle-menu\"]', this._toggleMenu.bind(this));\n        this.delegateElement.on('click', '[data-action=\"open-panel\"]', this._openPanel.bind(this));\n        this.delegateElement.on('click', '[data-action=\"close-panel\"]', this._closePanel.bind(this));\n        this.delegateRoot.on('click', this._onWindowClick.bind(this));\n        window.addEventListener('resize', this._calculatMaxHeightListener);\n      }\n    }, {\n      key: \"_toggleMenu\",\n      value: function _toggleMenu() {\n        this.isOpen = !this.isOpen;\n        this.mobileMenuToggleElement.setAttribute('aria-expanded', this.isOpen ? 'true' : 'false');\n        this.mobileMenuElement.setAttribute('aria-hidden', this.isOpen ? 'false' : 'true');\n\n        if (!this.isOpen) {\n          this.mobileMenuElement.style.maxHeight = ''; // If closed, we need to close all sub-menus\n\n          this.element.querySelectorAll('.mobile-menu__panel.is-open').forEach(function (item) {\n            item.classList.remove('is-open');\n          });\n          document.body.classList.remove('no-mobile-scroll');\n        } else {\n          // We need to restrict the height\n          this._calculateMaxHeight();\n\n          document.body.classList.add('no-mobile-scroll');\n        }\n      }\n    }, {\n      key: \"_openPanel\",\n      value: function _openPanel(event, target) {\n        target.setAttribute('aria-expanded', 'true');\n        this.element.querySelector(\"#\".concat(target.getAttribute('aria-controls'))).classList.add('is-open');\n      }\n    }, {\n      key: \"_closePanel\",\n      value: function _closePanel(event, target) {\n        // We first get the panel to be closed\n        var panelToClose = target.closest('.mobile-menu__panel.is-open');\n        panelToClose.classList.remove('is-open'); // Then update the ARIA attributes for button that control it\n\n        this.element.querySelector(\"[aria-controls=\\\"\".concat(panelToClose.id, \"\\\"]\")).setAttribute('aria-expanded', 'false');\n      }\n    }, {\n      key: \"_calculateMaxHeight\",\n      value: function _calculateMaxHeight() {\n        if (this.isOpen) {\n          this.mobileMenuElement.style.maxHeight = \"\".concat(window.innerHeight - document.querySelector('.header').getBoundingClientRect().bottom, \"px\");\n        }\n      }\n    }, {\n      key: \"_onWindowClick\",\n      value: function _onWindowClick(event) {\n        if (this.isOpen && !this.element.contains(event.target)) {\n          this._toggleMenu();\n        }\n      }\n    }]);\n\n    return MobileNavigation;\n  }();\n\n  var ModalManager = /*#__PURE__*/function () {\n    function ModalManager() {\n      _classCallCheck(this, ModalManager);\n\n      this.domDelegate = new Delegate(document.body);\n      this.activeModalsQueue = [];\n      var activeModal = document.querySelector('.modal[aria-hidden=\"false\"]');\n\n      if (activeModal) {\n        this.activeModalsQueue.push(activeModal);\n      }\n\n      this._attachListeners();\n    }\n\n    _createClass(ModalManager, [{\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        this._onKeyPressedListener = this._onKeyPressed.bind(this);\n        this.domDelegate.on('click', '[data-action=\"open-modal\"]', this._openModal.bind(this));\n        this.domDelegate.on('click', '[data-action=\"close-modal\"]', this._closeModal.bind(this)); // We allow any other code to force closing a modal by listening to the \"modal:close\" event\n\n        document.addEventListener('modal:close', this._closeModal.bind(this));\n        this._clickOutsideListener = this._checkClickOutside.bind(this); // If there is already an active modal when the page is loaded, we directly attach the listener on outside click\n\n        if (this.activeModalsQueue.length > 0) {\n          document.documentElement.classList.add('is-locked');\n          this.domDelegate.on('click', this._clickOutsideListener);\n        }\n      }\n    }, {\n      key: \"_openModal\",\n      value: function _openModal(event, target) {\n        var _this = this;\n\n        var modal = document.querySelector(\"#\".concat(target.getAttribute('aria-controls')));\n\n        if (modal) {\n          var onOpen = function onOpen(event) {\n            if (event.propertyName === 'visibility') {\n              modal.removeEventListener('transitionend', onOpen);\n              Accessibility.trapFocus(modal, 'modal' + modal.id);\n\n              _this.activeModalsQueue.push(modal);\n            }\n          };\n\n          modal.addEventListener('transitionend', onOpen);\n          modal.setAttribute('aria-hidden', 'false');\n          document.documentElement.classList.add('is-locked');\n          this.domDelegate.on('click', this._clickOutsideListener);\n          this.domDelegate.on('keyup', this._onKeyPressedListener);\n          return false; // Prevent the event to be propagated to the clickOutsideListener immediately\n        }\n      }\n    }, {\n      key: \"_closeModal\",\n      value: function _closeModal() {\n        if (this.activeModalsQueue.length > 0) {\n          var modalToClose = this.activeModalsQueue.pop();\n\n          var onClose = function onClose(event) {\n            if (event.propertyName === 'visibility') {\n              modalToClose.removeEventListener('transitionend', onClose);\n              Accessibility.removeTrapFocus(modalToClose, 'modal' + modalToClose.id); // We emit an event saying it has closed, which can give the option to do cleanup\n\n              modalToClose.dispatchEvent(new CustomEvent('modal:closed'));\n            }\n          };\n\n          modalToClose.addEventListener('transitionend', onClose);\n          modalToClose.setAttribute('aria-hidden', 'true');\n          document.documentElement.classList.remove('is-locked');\n          this.domDelegate.off('click', this._clickOutsideListener);\n          this.domDelegate.off('keyup', this._onKeyPressedListener);\n        }\n      }\n    }, {\n      key: \"_checkClickOutside\",\n      value: function _checkClickOutside(event) {\n        if (this.activeModalsQueue.length === 0) {\n          return;\n        }\n\n        var modalToClose = this.activeModalsQueue[this.activeModalsQueue.length - 1];\n\n        if (modalToClose && (!modalToClose.contains(event.target) || modalToClose === event.target)) {\n          this._closeModal();\n        }\n      }\n    }, {\n      key: \"_onKeyPressed\",\n      value: function _onKeyPressed(event) {\n        if (event.key === 'Escape') {\n          this._closeModal();\n        }\n      }\n    }]);\n\n    return ModalManager;\n  }();\n\n  var NewsletterPopup = /*#__PURE__*/function () {\n    function NewsletterPopup(element) {\n      _classCallCheck(this, NewsletterPopup);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.rootDelegateElement = new Delegate(document.body);\n      this.options = JSON.parse(element.getAttribute('data-popup-settings')); // If the popup has been already displayed, we do not display it\n\n      try {\n        if (window.location.hash === '#newsletter-popup' && window.theme.pageType !== 'captcha') {\n          this._openPopup();\n        } else if (!this.options['showOnlyOnce'] || this.options['showOnlyOnce'] && localStorage.getItem('themePopup') === null) {\n          setTimeout(this._openPopup.bind(this), this.options['apparitionDelay'] * 1000);\n        }\n      } catch (error) {// Some browsers (especially in private mode) throw an exception when trying to access local storage, so we protect ourselves here\n      }\n\n      this._attachListeners();\n    }\n\n    _createClass(NewsletterPopup, [{\n      key: \"destroy\",\n      value: function destroy() {\n        this.delegateElement.off();\n      }\n    }, {\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        this._onKeyPressedListener = this._onKeyPressed.bind(this);\n        this.delegateElement.on('click', '[data-action=\"close-popup\"]', this._closePopup.bind(this));\n        this._clickOutsideListener = this._checkClickOutside.bind(this);\n      }\n    }, {\n      key: \"_openPopup\",\n      value: function _openPopup() {\n        if (!window.theme.isExitPopupOpen) {\n          this.element.setAttribute('aria-hidden', 'false');\n          localStorage.setItem('themePopup', 'true');\n          window.theme.isNewsletterPopupOpen = true;\n          this.delegateElement.on('click', this._clickOutsideListener);\n          this.rootDelegateElement.on('keyup', this._onKeyPressedListener);\n        }\n      }\n    }, {\n      key: \"_closePopup\",\n      value: function _closePopup() {\n        this.element.setAttribute('aria-hidden', 'true');\n        window.theme.isNewsletterPopupOpen = false;\n        this.delegateElement.off('click');\n        this.rootDelegateElement.off('keyup', this._onKeyPressedListener);\n      }\n    }, {\n      key: \"_checkClickOutside\",\n      value: function _checkClickOutside(event) {\n        if (!this.element.contains(event.target) || this.element === event.target) {\n          this._closePopup();\n        }\n      }\n    }, {\n      key: \"_onKeyPressed\",\n      value: function _onKeyPressed(event) {\n        if (event.key === 'Escape') {\n          this._closePopup();\n        }\n      }\n    }]);\n\n    return NewsletterPopup;\n  }();\n\n  var fastdom = createCommonjsModule(function (module) {\n    !function (win) {\n      /**\n       * Mini logger\n       *\n       * @return {Function}\n       */\n\n      var debug =  function () {};\n      /**\n       * Normalized rAF\n       *\n       * @type {Function}\n       */\n\n      var raf = win.requestAnimationFrame || win.webkitRequestAnimationFrame || win.mozRequestAnimationFrame || win.msRequestAnimationFrame || function (cb) {\n        return setTimeout(cb, 16);\n      };\n      /**\n       * Initialize a `FastDom`.\n       *\n       * @constructor\n       */\n\n\n      function FastDom() {\n        var self = this;\n        self.reads = [];\n        self.writes = [];\n        self.raf = raf.bind(win); // test hook\n      }\n\n      FastDom.prototype = {\n        constructor: FastDom,\n\n        /**\n         * Adds a job to the read batch and\n         * schedules a new frame if need be.\n         *\n         * @param  {Function} fn\n         * @param  {Object} ctx the context to be bound to `fn` (optional).\n         * @public\n         */\n        measure: function measure(fn, ctx) {\n          var task = !ctx ? fn : fn.bind(ctx);\n          this.reads.push(task);\n          scheduleFlush(this);\n          return task;\n        },\n\n        /**\n         * Adds a job to the\n         * write batch and schedules\n         * a new frame if need be.\n         *\n         * @param  {Function} fn\n         * @param  {Object} ctx the context to be bound to `fn` (optional).\n         * @public\n         */\n        mutate: function mutate(fn, ctx) {\n          var task = !ctx ? fn : fn.bind(ctx);\n          this.writes.push(task);\n          scheduleFlush(this);\n          return task;\n        },\n\n        /**\n         * Clears a scheduled 'read' or 'write' task.\n         *\n         * @param {Object} task\n         * @return {Boolean} success\n         * @public\n         */\n        clear: function clear(task) {\n          return remove(this.reads, task) || remove(this.writes, task);\n        },\n\n        /**\n         * Extend this FastDom with some\n         * custom functionality.\n         *\n         * Because fastdom must *always* be a\n         * singleton, we're actually extending\n         * the fastdom instance. This means tasks\n         * scheduled by an extension still enter\n         * fastdom's global task queue.\n         *\n         * The 'super' instance can be accessed\n         * from `this.fastdom`.\n         *\n         * @example\n         *\n         * var myFastdom = fastdom.extend({\n         *   initialize: function() {\n         *     // runs on creation\n         *   },\n         *\n         *   // override a method\n         *   measure: function(fn) {\n         *     // do extra stuff ...\n         *\n         *     // then call the original\n         *     return this.fastdom.measure(fn);\n         *   },\n         *\n         *   ...\n         * });\n         *\n         * @param  {Object} props  properties to mixin\n         * @return {FastDom}\n         */\n        extend: function extend(props) {\n          if (_typeof(props) != 'object') throw new Error('expected object');\n          var child = Object.create(this);\n          mixin(child, props);\n          child.fastdom = this; // run optional creation hook\n\n          if (child.initialize) child.initialize();\n          return child;\n        },\n        // override this with a function\n        // to prevent Errors in console\n        // when tasks throw\n        \"catch\": null\n      };\n      /**\n       * Schedules a new read/write\n       * batch if one isn't pending.\n       *\n       * @private\n       */\n\n      function scheduleFlush(fastdom) {\n        if (!fastdom.scheduled) {\n          fastdom.scheduled = true;\n          fastdom.raf(flush.bind(null, fastdom));\n        }\n      }\n      /**\n       * Runs queued `read` and `write` tasks.\n       *\n       * Errors are caught and thrown by default.\n       * If a `.catch` function has been defined\n       * it is called instead.\n       *\n       * @private\n       */\n\n\n      function flush(fastdom) {\n        var writes = fastdom.writes;\n        var reads = fastdom.reads;\n        var error;\n\n        try {\n          debug('flushing reads', reads.length);\n          runTasks(reads);\n          debug('flushing writes', writes.length);\n          runTasks(writes);\n        } catch (e) {\n          error = e;\n        }\n\n        fastdom.scheduled = false; // If the batch errored we may still have tasks queued\n\n        if (reads.length || writes.length) scheduleFlush(fastdom);\n\n        if (error) {\n          debug('task errored', error.message);\n          if (fastdom[\"catch\"]) fastdom[\"catch\"](error);else throw error;\n        }\n      }\n      /**\n       * We run this inside a try catch\n       * so that if any jobs error, we\n       * are able to recover and continue\n       * to flush the batch until it's empty.\n       *\n       * @private\n       */\n\n\n      function runTasks(tasks) {\n        var task;\n\n        while (task = tasks.shift()) {\n          task();\n        }\n      }\n      /**\n       * Remove an item from an Array.\n       *\n       * @param  {Array} array\n       * @param  {*} item\n       * @return {Boolean}\n       */\n\n\n      function remove(array, item) {\n        var index = array.indexOf(item);\n        return !!~index && !!array.splice(index, 1);\n      }\n      /**\n       * Mixin own properties of source\n       * object into the target.\n       *\n       * @param  {Object} target\n       * @param  {Object} source\n       */\n\n\n      function mixin(target, source) {\n        for (var key in source) {\n          if (source.hasOwnProperty(key)) target[key] = source[key];\n        }\n      } // There should never be more than\n      // one instance of `FastDom` in an app\n\n\n      var exports = win.fastdom = win.fastdom || new FastDom(); // jshint ignore:line\n      // Expose to CJS & AMD\n\n      module.exports = exports;\n    }(typeof window !== 'undefined' ? window : commonjsGlobal);\n  });\n\n  var OverflowScroller = /*#__PURE__*/function () {\n    function OverflowScroller(element, options) {\n      _classCallCheck(this, OverflowScroller);\n\n      if (!element) {\n        return;\n      }\n\n      this.element = element;\n      this.options = options;\n      this.lastKnownY = window.scrollY;\n      this.currentTop = 0;\n      this.initialTopOffset = options['offsetTop'] || parseInt(window.getComputedStyle(this.element).top);\n\n      this._attachListeners();\n    }\n\n    _createClass(OverflowScroller, [{\n      key: \"destroy\",\n      value: function destroy() {\n        window.removeEventListener('scroll', this._checkPositionListener);\n      }\n    }, {\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        this._checkPositionListener = this._checkPosition.bind(this);\n        window.addEventListener('scroll', this._checkPositionListener);\n      }\n    }, {\n      key: \"_checkPosition\",\n      value: function _checkPosition() {\n        var _this = this;\n\n        fastdom.measure(function () {\n          var bounds = _this.element.getBoundingClientRect(),\n              maxTop = bounds.top + window.scrollY - _this.element.offsetTop + _this.initialTopOffset,\n              minTop = _this.element.clientHeight - window.innerHeight + (_this.options['offsetBottom'] || 0);\n\n          if (window.scrollY < _this.lastKnownY) {\n            _this.currentTop -= window.scrollY - _this.lastKnownY;\n          } else {\n            _this.currentTop += _this.lastKnownY - window.scrollY;\n          }\n\n          _this.currentTop = Math.min(Math.max(_this.currentTop, -minTop), maxTop, _this.initialTopOffset);\n          _this.lastKnownY = window.scrollY;\n        });\n        fastdom.mutate(function () {\n          _this.element.style.top = \"\".concat(_this.currentTop, \"px\");\n        });\n      }\n    }]);\n\n    return OverflowScroller;\n  }();\n\n  var PopoverManager = /*#__PURE__*/function () {\n    function PopoverManager() {\n      _classCallCheck(this, PopoverManager);\n\n      this.delegateElement = new Delegate(document.body);\n      this.delegateRoot = new Delegate(document.documentElement);\n      this.activePopover = null;\n\n      this._attachListeners();\n    }\n\n    _createClass(PopoverManager, [{\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        this._onLooseFocusListener = this._onLooseFocus.bind(this);\n        this.delegateElement.on('click', '[data-action=\"toggle-popover\"]', this._togglePopover.bind(this));\n        this.delegateElement.on('click', '[data-action=\"show-popover-panel\"]', this._showPanel.bind(this));\n        this.delegateRoot.on('click', this._onWindowClick.bind(this));\n        document.addEventListener('popover:close', this._closeActivePopover.bind(this));\n        window.addEventListener('resize', this._windowResized.bind(this));\n      }\n    }, {\n      key: \"_togglePopover\",\n      value: function _togglePopover(event, target) {\n        var hasActivePopover = this.activePopover !== null,\n            previousActivePopoverId = this.activePopover ? this.activePopover.id : null; // If the toggler has a \"data-follow-link\" attribute, we match against the breakpoint and redirect to the page\n\n        if (target.hasAttribute('data-follow-link') && Responsive.matchesBreakpoint(target.getAttribute('data-follow-link'))) {\n          return;\n        }\n\n        if (hasActivePopover) {\n          this._closeActivePopover();\n        }\n\n        if (!hasActivePopover || hasActivePopover && target.getAttribute('aria-controls') !== previousActivePopoverId) {\n          this._openPopover(target);\n        }\n\n        event.preventDefault();\n      }\n    }, {\n      key: \"_closeActivePopover\",\n      value: function _closeActivePopover() {\n        this.activePopover.setAttribute('aria-hidden', 'true');\n        document.querySelector(\"[aria-controls=\\\"\".concat(this.activePopover.id, \"\\\"]\")).setAttribute('aria-expanded', 'false');\n        this.activePopover.removeEventListener('focusout', this._onLooseFocusListener);\n        this.activePopover = null;\n      }\n    }, {\n      key: \"_openPopover\",\n      value: function _openPopover(target) {\n        var element = document.getElementById(target.getAttribute('aria-controls'));\n        target.setAttribute('aria-expanded', 'true');\n        element.setAttribute('aria-hidden', 'false'); // If we are on mobile phone we also set the aria-expanded attribute to true on the icon state holder\n\n        if (Responsive.getCurrentBreakpoint() === 'phone') {\n          element.style.height = \"\".concat(window.innerHeight - document.querySelector('.header').getBoundingClientRect().bottom, \"px\");\n        } else {\n          element.style.height = ''; // If the popover contains a \"panel-list\", we set the height to the active panel\n\n          var panelList = element.querySelector('.popover__panel-list');\n\n          if (panelList) {\n            panelList.style.height = \"\".concat(panelList.clientHeight, \"px\");\n          }\n        }\n\n        this.activePopover = element;\n        this.activePopover.addEventListener('focusout', this._onLooseFocusListener);\n      }\n    }, {\n      key: \"_showPanel\",\n      value: function _showPanel(event, target) {\n        // If no active popover, we do nothing\n        if (!this.activePopover) {\n          return;\n        } // Otherwise we get all the panels within the popover\n\n\n        var panels = this.activePopover.querySelectorAll('.popover__panel');\n        panels.forEach(function (panel) {\n          if (panel.id === target.getAttribute('aria-controls')) {\n            panel.classList.add('is-selected');\n            panel.closest('.popover__panel-list').style.height = \"\".concat(panel.clientHeight, \"px\");\n          } else {\n            panel.classList.remove('is-selected');\n          }\n        });\n      }\n    }, {\n      key: \"_onWindowClick\",\n      value: function _onWindowClick(event) {\n        if (event.target.getAttribute('data-action') === 'toggle-popover' || event.target.closest('[data-action=\"toggle-popover\"]')) {\n          return;\n        }\n\n        if (this.activePopover && !this.activePopover.contains(event.target)) {\n          this._closeActivePopover();\n        }\n      }\n    }, {\n      key: \"_onLooseFocus\",\n      value: function _onLooseFocus(event) {\n        if (this.activePopover && event.relatedTarget !== null && !this.activePopover.contains(event.relatedTarget)) {\n          this._closeActivePopover();\n        }\n      }\n    }, {\n      key: \"_windowResized\",\n      value: function _windowResized() {\n        if (Responsive.getCurrentBreakpoint() === 'phone' && this.activePopover) {\n          this.activePopover.style.height = \"\".concat(window.innerHeight - document.querySelector('.header').getBoundingClientRect().bottom, \"px\");\n        }\n      }\n    }]);\n\n    return PopoverManager;\n  }();\n\n  var ProductItemColorSwatch = /*#__PURE__*/function () {\n    function ProductItemColorSwatch(element) {\n      _classCallCheck(this, ProductItemColorSwatch);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n\n      this._attachListeners();\n\n      this.recalculateSwatches();\n    }\n\n    _createClass(ProductItemColorSwatch, [{\n      key: \"destroy\",\n      value: function destroy() {\n        this.delegateElement.off();\n        window.removeEventListener('resize', this._recalculateSwatchesListener);\n      }\n    }, {\n      key: \"recalculateSwatches\",\n      value: function recalculateSwatches() {\n        var _this = this;\n\n        // If you have too many swatches, it will grow into more than one lines, which is not desirable. Instead,\n        // we'd like to only show one line only, and show a \"+X\" if there are too many swatches\n        fastdom.measure(function () {\n          // For each swatch list we get the number of swatches, and make sure that we don't display more than 100% of\n          // the width\n          _this.element.querySelectorAll('.product-item__swatch-list').forEach(function (swatchList) {\n            // Get the width of the swatch list (this is 100%)\n            var currentWidth = swatchList.clientWidth,\n                maxAllowedWidth = parseInt(Math.min(currentWidth, 200)); // A single swatch takes 30px, so let's figure out how many we can fit completely\n\n            var maxFit = Math.floor(maxAllowedWidth / 30); // Now, we add a special class to the one after \"maxFit\"\n\n            fastdom.mutate(function () {\n              var colorSwatches = swatchList.querySelectorAll('.color-swatch'); // For each, we reset the attributes if needed\n\n              colorSwatches.forEach(function (colorSwatch, index) {\n                colorSwatch.classList.remove('color-swatch--view-more');\n\n                if (maxFit === index + 1 && maxFit !== colorSwatches.length) {\n                  colorSwatch.classList.add('color-swatch--view-more');\n                }\n              });\n            });\n          });\n        });\n      }\n    }, {\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        this._recalculateSwatchesListener = this.recalculateSwatches.bind(this);\n        this.delegateElement.on('change', '.product-item__swatch-list .color-swatch__radio', this._colorChanged.bind(this));\n        window.addEventListener('resize', this._recalculateSwatchesListener);\n      }\n    }, {\n      key: \"_colorChanged\",\n      value: function _colorChanged(event, target) {\n        // We need to change the URL of the various links\n        var productItem = target.closest('.product-item'),\n            variantUrl = target.getAttribute('data-variant-url');\n        productItem.querySelector('.product-item__image-wrapper').setAttribute('href', variantUrl);\n        productItem.querySelector('.product-item__title').setAttribute('href', variantUrl); // If we have a custom image for the variant, we change it\n\n        var originalImageElement = productItem.querySelector('.product-item__primary-image');\n\n        if (target.hasAttribute('data-image-url') && target.getAttribute('data-media-id') !== originalImageElement.getAttribute('data-media-id')) {\n          var newImageElement = document.createElement('img');\n          newImageElement.className = 'product-item__primary-image';\n          newImageElement.setAttribute('data-media-id', target.getAttribute('data-media-id'));\n          newImageElement.setAttribute('src', target.getAttribute('data-image-url')); // Replace the original node\n\n          originalImageElement.parentNode.style.paddingBottom = \"\".concat(100.0 / newImageElement.getAttribute('data-image-aspect-ratio'), \"%\");\n          originalImageElement.parentNode.replaceChild(newImageElement, originalImageElement);\n        }\n      }\n    }]);\n\n    return ProductItemColorSwatch;\n  }();\n\n  var Currency = /*#__PURE__*/function () {\n    function Currency() {\n      _classCallCheck(this, Currency);\n    }\n\n    _createClass(Currency, null, [{\n      key: \"formatMoney\",\n\n      /**\n       * Format money values based on your shop currency settings\n       *\n       * @param  {Number|string} cents - value in cents or dollar amount e.g. 300 cents or 3.00 dollars\n       * @param  {String} format - shop money_format setting\n       * @return {String} value - formatted value\n       */\n      value: function formatMoney(cents, format) {\n        if (typeof cents === 'string') {\n          cents = cents.replace('.', '');\n        }\n\n        var placeholderRegex = /\\{\\{\\s*(\\w+)\\s*\\}\\}/,\n            formatString = format || '${{amount}}';\n\n        function defaultTo(value, defaultValue) {\n          return value == null || value !== value ? defaultValue : value;\n        }\n\n        function formatWithDelimiters(number, precision, thousands, decimal) {\n          precision = defaultTo(precision, 2);\n          thousands = defaultTo(thousands, ',');\n          decimal = defaultTo(decimal, '.');\n\n          if (isNaN(number) || number == null) {\n            return 0;\n          }\n\n          number = (number / 100.0).toFixed(precision);\n          var parts = number.split('.'),\n              dollarsAmount = parts[0].replace(/(\\d)(?=(\\d\\d\\d)+(?!\\d))/g, '$1' + thousands),\n              centsAmount = parts[1] ? decimal + parts[1] : '';\n          return dollarsAmount + centsAmount;\n        }\n\n        var value = '';\n\n        switch (formatString.match(placeholderRegex)[1]) {\n          case 'amount':\n            value = formatWithDelimiters(cents, 2);\n            break;\n\n          case 'amount_no_decimals':\n            value = formatWithDelimiters(cents, 0);\n            break;\n\n          case 'amount_with_space_separator':\n            value = formatWithDelimiters(cents, 2, ' ', '.');\n            break;\n\n          case 'amount_with_comma_separator':\n            value = formatWithDelimiters(cents, 2, '.', ',');\n            break;\n\n          case 'amount_with_apostrophe_separator':\n            value = formatWithDelimiters(cents, 2, '\\'', '.');\n            break;\n\n          case 'amount_no_decimals_with_comma_separator':\n            value = formatWithDelimiters(cents, 0, '.', ',');\n            break;\n\n          case 'amount_no_decimals_with_space_separator':\n            value = formatWithDelimiters(cents, 0, ' ');\n            break;\n\n          case 'amount_no_decimals_with_apostrophe_separator':\n            value = formatWithDelimiters(cents, 0, '\\'');\n            break;\n        }\n\n        if (formatString.indexOf('with_comma_separator') !== -1) {\n          return formatString.replace(placeholderRegex, value);\n        } else {\n          return formatString.replace(placeholderRegex, value);\n        }\n      }\n    }]);\n\n    return Currency;\n  }();\n\n  /**\n   * This implementation allows to serialize a form\n   */\n  var Form = /*#__PURE__*/function () {\n    function Form() {\n      _classCallCheck(this, Form);\n    }\n\n    _createClass(Form, null, [{\n      key: \"serialize\",\n      value: function serialize(form) {\n        function stringKey(key, value) {\n          var beginBracket = key.lastIndexOf('[');\n\n          if (beginBracket === -1) {\n            var _hash = {};\n            _hash[key] = value;\n            return _hash;\n          }\n\n          var newKey = key.substr(0, beginBracket);\n          var newValue = {};\n          newValue[key.substring(beginBracket + 1, key.length - 1)] = value;\n          return stringKey(newKey, newValue);\n        }\n\n        var hash = {};\n\n        for (var i = 0, len = form.elements.length; i < len; i++) {\n          var formElement = form.elements[i];\n\n          if (formElement.name === '' || formElement.disabled) {\n            continue;\n          }\n\n          if (formElement.name && !formElement.disabled && (formElement.checked || /select|textarea/i.test(formElement.nodeName) || /hidden|text|search|tel|url|email|password|datetime|date|month|week|time|datetime-local|number|range|color/i.test(formElement.type))) {\n            var stringKeys = stringKey(formElement.name, formElement.value);\n            hash = Form.extend(hash, stringKeys);\n          }\n        }\n\n        return hash;\n      }\n    }, {\n      key: \"extend\",\n      value: function extend() {\n        var extended = {};\n        var i = 0; // Merge the object into the extended object\n\n        var merge = function merge(obj) {\n          for (var prop in obj) {\n            if (obj.hasOwnProperty(prop)) {\n              // If property is an object, merge properties\n              if (Object.prototype.toString.call(obj[prop]) === '[object Object]') {\n                extended[prop] = Form.extend(extended[prop], obj[prop]);\n              } else {\n                extended[prop] = obj[prop];\n              }\n            }\n          }\n        }; // Loop through each object and conduct a merge\n\n\n        for (; i < arguments.length; i++) {\n          merge(arguments[i]);\n        }\n\n        return extended;\n      }\n    }]);\n\n    return Form;\n  }();\n\n  /**\n   * Handle the store availability management. The parameter is the div that will hold the content. The function\n   * \"updateWithVariant\" must be called whenever the variant is changed.\n   */\n  var StoreAvailability = /*#__PURE__*/function () {\n    function StoreAvailability(element) {\n      _classCallCheck(this, StoreAvailability);\n\n      this.element = element;\n\n      if (!this.element) {\n        return;\n      } // We move the modal outside\n\n\n      var modal = this.element.querySelector('.store-availabilities-modal');\n\n      if (modal) {\n        document.body.appendChild(modal);\n      }\n    }\n\n    _createClass(StoreAvailability, [{\n      key: \"updateWithVariant\",\n      value: function updateWithVariant(variant) {\n        if (!this.element) {\n          return; // If the element to inject the store availability does not exist, we return immediately\n        } // If the variant is null (for instance unavailable variant), we clear the container\n\n\n        if (!variant) {\n          this.element.textContent = '';\n          return;\n        } // If we have a new variant we render the section\n\n\n        this._renderAvailabilitySection(variant['id']);\n      }\n    }, {\n      key: \"_renderAvailabilitySection\",\n      value: function _renderAvailabilitySection(id) {\n        var _this = this;\n\n        // First we clear the previous content\n        this.element.innerHTML = ''; // If there is already an element with the given modal we remove it first\n\n        var availabilityModal = document.getElementById(\"StoreAvailabilityModal-\".concat(id));\n\n        if (availabilityModal) {\n          availabilityModal.remove();\n        }\n\n        return fetch(\"\".concat(window.routes.rootUrlWithoutSlash, \"/variants/\").concat(id, \"?section_id=store-availability\")).then(function (response) {\n          return response.text().then(function (content) {\n            var fakeDiv = document.createElement('div');\n            fakeDiv.innerHTML = content;\n            fakeDiv.innerHTML = fakeDiv.firstElementChild.innerHTML;\n\n            if (fakeDiv.firstElementChild.getAttribute('data-count') === '0') {\n              return; // Nothing to show\n            }\n\n            _this.element.innerHTML = fakeDiv.innerHTML; // In order for our modal system to work we have to append the modal to the body instead\n\n            var availabilityModal = document.getElementById(\"StoreAvailabilityModal-\".concat(id));\n            document.body.appendChild(availabilityModal);\n          });\n        });\n      }\n    }]);\n\n    return StoreAvailability;\n  }();\n\n  var ProductVariants = /*#__PURE__*/function () {\n    function ProductVariants(element, options) {\n      var _this = this;\n\n      _classCallCheck(this, ProductVariants);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.options = options;\n      var productJsonElement = this.element.querySelector('[data-product-json]'); // If we are using placeholder, there is no JSON so we wrap here!\n\n      if (productJsonElement) {\n        var jsonData = JSON.parse(productJsonElement.innerHTML);\n        this.productData = jsonData['product'];\n        this.productOptionsWithValues = jsonData['options_with_values'];\n        this.productTemplate = jsonData['template'];\n        this.variantsInventories = jsonData['inventories'] || {};\n        this.variantSelectors = this.element.querySelectorAll('.product-form__option[data-selector-type]');\n        this.masterSelector = this.element.querySelector(\"#product-select-\".concat(this.productData['id'])); // We init value with the first selected variant\n\n        this.productData['variants'].forEach(function (variant) {\n          if (variant['id'] === jsonData['selected_variant_id']) {\n            _this.currentVariant = variant;\n            _this.option1 = variant['option1'];\n            _this.option2 = variant['option2'];\n            _this.option3 = variant['option3'];\n          }\n        });\n        this.storeAvailability = new StoreAvailability(this.element.querySelector('.product-meta__store-availability-container'));\n      }\n\n      this._updateSelectors(this.currentVariant); // We update the selectors on initial load to disable the sold out variants\n\n\n      this._setupStockCountdown();\n\n      this._attachListeners();\n    }\n\n    _createClass(ProductVariants, [{\n      key: \"destroy\",\n      value: function destroy() {\n        this.delegateElement.off('click');\n      }\n    }, {\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        this.delegateElement.on('change', '.product-form__single-selector', this._onOptionChanged.bind(this));\n        this.delegateElement.on('click', '[data-action=\"add-to-cart\"]', this._addToCart.bind(this));\n      }\n      /**\n       * ---------------------------------------------------------------------------------------------------\n       * CODE THAT HANDLE VARIANT CHANGES IN THE FRONT\n       *\n       * Please note that this code is highly dependant on the markup and classes, so make sure to NOT\n       * edit this code\n       * ---------------------------------------------------------------------------------------------------\n       */\n\n      /**\n       * This callback is called whenever the variant changes and allows to update data about the active variant\n       */\n\n    }, {\n      key: \"_onVariantChanged\",\n      value: function _onVariantChanged(previousVariant, newVariant) {\n        // 1st: the prices\n        this._updateProductPrices(newVariant, previousVariant); // 2th: update inventory\n\n\n        this._updateInventory(newVariant, previousVariant); // 3th: update SKU\n\n\n        this._updateSku(newVariant, previousVariant); // 4th: update the discount label (if necessary)\n\n\n        this._updateDiscountLabel(newVariant, previousVariant); // 5th: update the unit price (if necessary)\n\n\n        this._updateUnitPrice(newVariant, previousVariant); // 6th: update selectors\n\n\n        this._updateSelectors(newVariant, previousVariant); // 7th: the add to cart button\n\n\n        this._updateAddToCartButton(newVariant, previousVariant); // 8th: store availability\n\n\n        this.storeAvailability.updateWithVariant(newVariant); // Finally, we send an event so that other system could hook and do their own logic\n\n        this.element.dispatchEvent(new CustomEvent('variant:changed', {\n          bubbles: true,\n          detail: {\n            variant: newVariant,\n            previousVariant: previousVariant\n          }\n        })); // Allow system monitoring the name attribute to work\n\n        this.masterSelector.dispatchEvent(new Event('change', {\n          bubbles: true\n        }));\n      }\n      /**\n       * Update the prices (optionally showing compare at price)\n       */\n\n    }, {\n      key: \"_updateProductPrices\",\n      value: function _updateProductPrices(newVariant, previousVariant) {\n        var productPrices = this.element.querySelector('.price-list'),\n            currencyFormat = window.theme.currencyCodeEnabled ? window.theme.moneyWithCurrencyFormat : window.theme.moneyFormat;\n\n        if (!productPrices) {\n          return; // Sometimes merchant remove element from the code without taking care of JS... so let's be defensive\n        }\n\n        if (!newVariant) {\n          productPrices.style.display = 'none';\n        } else {\n          if (previousVariant && previousVariant['price'] === newVariant['price'] && previousVariant['compare_at_price'] === newVariant['compare_at_price']) {\n            return; // The price do not have changed so let's return to avoid changing the DOM for nothing\n          }\n\n          productPrices.innerHTML = '';\n\n          if (newVariant['compare_at_price'] > newVariant['price']) {\n            productPrices.innerHTML += \"<span class=\\\"price price--highlight\\\"><span class=\\\"visually-hidden\\\">\".concat(window.languages.productSalePrice, \"</span>\").concat(Currency.formatMoney(newVariant['price'], currencyFormat), \"</span>\");\n            productPrices.innerHTML += \"<span class=\\\"price price--compare\\\"><span class=\\\"visually-hidden\\\">\".concat(window.languages.productRegularPrice, \"</span>\").concat(Currency.formatMoney(newVariant['compare_at_price'], currencyFormat), \"</span>\");\n          } else {\n            productPrices.innerHTML += \"<span class=\\\"price\\\"><span class=\\\"visually-hidden\\\">\".concat(window.languages.productSalePrice, \"</span>\").concat(Currency.formatMoney(newVariant['price'], currencyFormat), \"</span>\");\n          }\n\n          productPrices.style.display = '';\n        }\n      }\n      /**\n       * Update the inventory (if needed)\n       */\n\n    }, {\n      key: \"_updateInventory\",\n      value: function _updateInventory(newVariant) {\n        if (!this.options['showInventoryQuantity'] || !newVariant) {\n          return;\n        }\n\n        var productFormInventoryElement = this.element.querySelector('.product-form__inventory'),\n            variantInventoryManagement = this.variantsInventories[newVariant['id']]['inventory_management'],\n            variantInventoryPolicy = this.variantsInventories[newVariant['id']]['inventory_policy'],\n            variantInventoryQuantity = this.variantsInventories[newVariant['id']]['inventory_quantity'],\n            variantInventoryMessage = this.variantsInventories[newVariant['id']]['inventory_message'];\n\n        if (!productFormInventoryElement) {\n          return; // Sometimes merchant remove element from the code without taking care of JS... so let's be defensive\n        }\n\n        productFormInventoryElement.classList.remove('inventory--high');\n        productFormInventoryElement.classList.remove('inventory--low');\n\n        if (newVariant['available']) {\n          if (null !== variantInventoryManagement && variantInventoryPolicy === 'deny' && this.options['lowInventoryThreshold'] > 0) {\n            if (variantInventoryQuantity <= this.options['lowInventoryThreshold']) {\n              productFormInventoryElement.classList.add('inventory--low');\n            } else {\n              productFormInventoryElement.classList.add('inventory--high');\n            }\n          } else {\n            productFormInventoryElement.classList.add('inventory--high');\n          }\n        } // We also need to update the stock countdown if setup\n\n\n        var stockCountdown = this.element.querySelector('.inventory-bar');\n\n        if (stockCountdown) {\n          var stockCountdownProgress = Math.min(Math.max(variantInventoryQuantity / parseInt(stockCountdown.getAttribute('data-stock-countdown-max')) * 100.0, 0), 100);\n          stockCountdown.classList.toggle('inventory-bar--hidden', stockCountdownProgress === 0);\n          stockCountdown.firstElementChild.style.width = \"\".concat(stockCountdownProgress, \"%\");\n        }\n\n        productFormInventoryElement.innerHTML = variantInventoryMessage;\n      }\n      /**\n       * Update SKU\n       */\n\n    }, {\n      key: \"_updateSku\",\n      value: function _updateSku(newVariant, previousVariant) {\n        var productSku = this.element.querySelector('.product-meta__sku');\n\n        if (!productSku) {\n          return;\n        }\n\n        var productSkuNumber = productSku.querySelector('.product-meta__sku-number');\n\n        if (!newVariant || newVariant['sku'] === '') {\n          productSku.style.display = 'none';\n        } else {\n          if (previousVariant && previousVariant['sku'] === newVariant['sku']) {\n            return; // The SKU do not have changed so let's return to avoid changing the DOM for nothing\n          }\n\n          productSkuNumber.innerHTML = newVariant['sku'];\n          productSku.style.display = '';\n        }\n      }\n      /**\n       * Update the discount label\n       */\n\n    }, {\n      key: \"_updateDiscountLabel\",\n      value: function _updateDiscountLabel(newVariant, previousVariant) {\n        if (!window.theme.showDiscount) {\n          return; // Nothing to do if discount label is configured to be hidden\n        }\n\n        var discountLabel = this.element.querySelector('.product-meta .product-label--on-sale'); // Some merchants have removed it from the code so we have to act defensive\n\n        if (!discountLabel) {\n          return;\n        }\n\n        if (!newVariant || !(newVariant['price'] < newVariant['compare_at_price'])) {\n          discountLabel.style.display = 'none';\n        } else {\n          // We compute the savings based on the setting\n          var savings = null;\n\n          if (window.theme.discountMode === 'percentage') {\n            savings = \"\".concat(Math.round((newVariant['compare_at_price'] - newVariant['price']) * 100 / newVariant['compare_at_price']), \"%\");\n          } else {\n            savings = \"<span>\".concat(Currency.formatMoney(newVariant['compare_at_price'] - newVariant['price'], window.theme.moneyFormat), \"</span>\");\n          }\n\n          discountLabel.innerHTML = \"\".concat(window.languages.collectionOnSaleLabel.replace('{{savings}}', savings));\n          discountLabel.style.display = 'inline-block';\n        }\n      }\n    }, {\n      key: \"_updateUnitPrice\",\n      value: function _updateUnitPrice(newVariant, previousVariant) {\n        var unitPriceMeasurement = this.element.querySelector('.unit-price-measurement');\n\n        if (!unitPriceMeasurement) {\n          return; // Sometimes merchant remove element from the code without taking care of JS... so let's be defensive\n        }\n\n        if (!newVariant || !newVariant['unit_price_measurement']) {\n          unitPriceMeasurement.parentNode.style.display = 'none';\n        } else {\n          unitPriceMeasurement.parentNode.style.display = 'block';\n          unitPriceMeasurement.querySelector('.unit-price-measurement__price').innerHTML = Currency.formatMoney(newVariant['unit_price'], window.theme.moneyFormat);\n          unitPriceMeasurement.querySelector('.unit-price-measurement__reference-unit').innerHTML = newVariant['unit_price_measurement']['reference_unit'];\n          var unitPriceReferenceValue = unitPriceMeasurement.querySelector('.unit-price-measurement__reference-value');\n          unitPriceReferenceValue.innerHTML = newVariant['unit_price_measurement']['reference_value'];\n          unitPriceReferenceValue.style.display = newVariant['unit_price_measurement']['reference_value'] === 1 ? 'none' : 'inline';\n        }\n      }\n      /**\n       * Warehouse automatically adds a \"disabled\" state to sold out/unavailable variant. When we change the variant we have to recompute\n       * all the selectors\n       */\n\n    }, {\n      key: \"_updateSelectors\",\n      value: function _updateSelectors(newVariant) {\n        var _this2 = this;\n\n        // We apply a top-down approach where we first check the first option, second option and third option. If there is\n        // more than one option, the value is considered \"available\" if there is at least one variant with this value\n        // available (independently of the selected variant)\n        var applyClassToSelector = function applyClassToSelector(selector, valueIndex, available) {\n          var selectorType = selector.getAttribute('data-selector-type');\n\n          switch (selectorType) {\n            case 'color':\n              selector.querySelector(\".color-swatch:nth-child(\".concat(valueIndex + 1, \")\")).classList.toggle('color-swatch--disabled', !available);\n              break;\n\n            case 'variant':\n              selector.querySelector(\".variant-swatch:nth-child(\".concat(valueIndex + 1, \")\")).classList.toggle('variant-swatch--disabled', !available);\n              break;\n\n            case 'block':\n              selector.querySelector(\".block-swatch:nth-child(\".concat(valueIndex + 1, \")\")).classList.toggle('block-swatch--disabled', !available);\n              break;\n          }\n        };\n\n        if (this.variantSelectors && this.variantSelectors[0]) {\n          // For the first option, the value is considered available if there is at least one variant available\n          this.productOptionsWithValues[0]['values'].forEach(function (value, valueIndex) {\n            applyClassToSelector(_this2.variantSelectors[0], valueIndex, _this2.productData['variants'].some(function (variant) {\n              return variant['option1'] === value && variant['available'];\n            })); // We now do the second level\n\n            if (_this2.variantSelectors[1]) {\n              _this2.productOptionsWithValues[1]['values'].forEach(function (value, valueIndex) {\n                applyClassToSelector(_this2.variantSelectors[1], valueIndex, _this2.productData['variants'].some(function (variant) {\n                  return variant['option2'] === value && variant['option1'] === _this2.option1 && variant['available'];\n                })); // And finally the third level\n\n                if (_this2.variantSelectors[2]) {\n                  _this2.productOptionsWithValues[2]['values'].forEach(function (value, valueIndex) {\n                    applyClassToSelector(_this2.variantSelectors[2], valueIndex, _this2.productData['variants'].some(function (variant) {\n                      return variant['option3'] === value && variant['option1'] === _this2.option1 && variant['option2'] === _this2.option2 && variant['available'];\n                    }));\n                  });\n                }\n              });\n            }\n          });\n        }\n      }\n      /**\n       * Update the add to cart\n       */\n\n    }, {\n      key: \"_updateAddToCartButton\",\n      value: function _updateAddToCartButton(newVariant) {\n        var addToCartButtonElement = this.element.querySelector('.product-form__add-button'),\n            infoListElement = this.element.querySelector('.product-form__info-list');\n\n        if (!addToCartButtonElement) {\n          return; // Sometimes merchant remove element from the code without taking care of JS... so let's be defensive\n        }\n\n        if (!newVariant) {\n          addToCartButtonElement.setAttribute('disabled', 'disabled');\n          addToCartButtonElement.classList.add('button--disabled');\n          addToCartButtonElement.classList.remove('button--primary');\n          addToCartButtonElement.removeAttribute('data-action');\n          addToCartButtonElement.innerHTML = window.languages.productFormUnavailable;\n          infoListElement.style.display = 'none';\n        } else {\n          infoListElement.style.display = 'block';\n\n          if (newVariant['available']) {\n            addToCartButtonElement.removeAttribute('disabled');\n            addToCartButtonElement.classList.remove('button--disabled');\n            addToCartButtonElement.classList.add('button--primary');\n            addToCartButtonElement.setAttribute('data-action', 'add-to-cart');\n            addToCartButtonElement.innerHTML = this.productTemplate === 'pre-order' ? window.languages.productFormPreOrder : window.languages.productFormAddToCart;\n          } else {\n            addToCartButtonElement.setAttribute('disabled', 'disabled');\n            addToCartButtonElement.classList.add('button--disabled');\n            addToCartButtonElement.classList.remove('button--primary');\n            addToCartButtonElement.removeAttribute('data-action');\n            addToCartButtonElement.innerHTML = window.languages.productFormSoldOut;\n          }\n        } // We handle the smart payment button\n\n\n        if (this.options['showPaymentButton']) {\n          var paymentButtonElement = this.element.querySelector('.shopify-payment-button');\n\n          if (!paymentButtonElement) {\n            return; // Some apps dynamically remove the dynamic checkout button from the code, so we add a guard here\n          }\n\n          if (!newVariant || !newVariant['available']) {\n            paymentButtonElement.style.display = 'none';\n          } else {\n            paymentButtonElement.style.display = 'block';\n          }\n        }\n      }\n      /**\n       * ---------------------------------------------------------------------------------------------------\n       * INTERNAL CODE THAT HANDLE VARIANT CHANGES\n       * ---------------------------------------------------------------------------------------------------\n       */\n\n      /**\n       * Whenever an option is changed, this code fetch the corresponding active variant\n       */\n\n    }, {\n      key: \"_onOptionChanged\",\n      value: function _onOptionChanged(event, target) {\n        this['option' + target.getAttribute('data-option-position')] = target.value; // We update the selected value\n\n        var selectedValueElement = target.closest('.product-form__option').querySelector('.product-form__selected-value');\n\n        if (selectedValueElement) {\n          selectedValueElement.innerHTML = target.value;\n        } // Finally, we get the new variant\n\n\n        var previousVariant = this.currentVariant;\n        this.currentVariant = this._getCurrentVariantFromOptions();\n\n        this._onVariantChanged(previousVariant, this.currentVariant);\n\n        if (this.currentVariant) {\n          if (this.options['enableHistoryState'] && history.replaceState) {\n            var newUrl = \"\".concat(window.location.protocol, \"//\").concat(window.location.host).concat(window.location.pathname, \"?variant=\").concat(this.currentVariant.id);\n            window.history.replaceState({\n              path: newUrl\n            }, '', newUrl);\n          } // We need to modify the hidden select that contain the id attribute as well\n\n\n          this.masterSelector.querySelector('[selected]').removeAttribute('selected');\n          this.masterSelector.querySelector(\"[value=\\\"\".concat(this.currentVariant['id'], \"\\\"]\")).setAttribute('selected', 'selected');\n        }\n      }\n      /**\n       * Get the active variant based on the options\n       */\n\n    }, {\n      key: \"_getCurrentVariantFromOptions\",\n      value: function _getCurrentVariantFromOptions() {\n        var _this3 = this;\n\n        var found = false;\n        this.productData['variants'].forEach(function (variant) {\n          if (variant['option1'] === _this3.option1 && variant['option2'] === _this3.option2 && variant['option3'] === _this3.option3) {\n            found = variant;\n          }\n        });\n        return found || null;\n      }\n      /**\n       * ---------------------------------------------------------------------------------------------------\n       * INTERNAL CODE THAT HANDLE PRODUCT ADD TO CART\n       * ---------------------------------------------------------------------------------------------------\n       */\n\n    }, {\n      key: \"_addToCart\",\n      value: function _addToCart(event, target) {\n        var _this4 = this;\n\n        if (window.theme.cartType === 'page') {\n          return; // When using a cart type of page, we just simply redirect to the cart page\n        }\n\n        event.preventDefault(); // Prevent form to be submitted\n\n        event.stopPropagation(); // First, we switch the status of the button\n\n        target.setAttribute('disabled', 'disabled');\n        document.dispatchEvent(new CustomEvent('theme:loading:start')); // Then we add the product in Ajax\n\n        var formElement = this.element.querySelector('form[action*=\"/cart/add\"]');\n        fetch(\"\".concat(window.routes.cartAddUrl, \".js\"), {\n          body: JSON.stringify(Form.serialize(formElement)),\n          credentials: 'same-origin',\n          method: 'POST',\n          headers: {\n            'Content-Type': 'application/json',\n            'X-Requested-With': 'XMLHttpRequest' // This is needed as currently there is a bug in Shopify that assumes this header\n\n          }\n        }).then(function (response) {\n          document.dispatchEvent(new CustomEvent('theme:loading:end'));\n\n          if (response.ok) {\n            target.removeAttribute('disabled'); // We simply trigger an event so the mini-cart can re-render\n\n            _this4.element.dispatchEvent(new CustomEvent('product:added', {\n              bubbles: true,\n              detail: {\n                variant: _this4.currentVariant,\n                button: target,\n                quantity: parseInt(formElement.querySelector('[name=\"quantity\"]').value)\n              }\n            })); // If we are in the context of quick view, we also force closing the modal\n\n\n            if (_this4.options['isQuickView'] && window.theme.cartType === 'drawer') {\n              document.dispatchEvent(new CustomEvent('modal:close'));\n            }\n\n            if (window.theme.cartType === 'message') {\n              _this4._showAlert(window.languages.productAdded, 'success', target);\n            }\n          } else {\n            response.json().then(function (content) {\n              _this4._showAlert(content['description'], 'error', target);\n            });\n          }\n        });\n        event.preventDefault();\n      }\n      /**\n       * ---------------------------------------------------------------------------------------------------\n       * INTERNAL CODE THAT HANDLE PRODUCT ADD TO CART\n       * ---------------------------------------------------------------------------------------------------\n       */\n\n      /**\n       * In order to have a small animation when the inventory bar is visible, we setup an intersection observer\n       */\n\n    }, {\n      key: \"_setupStockCountdown\",\n      value: function _setupStockCountdown() {\n        var _this5 = this;\n\n        // If there is an inventory bar, we trigger an intersection observer to add an animation\n        var stockCountdown = this.element.querySelector('.inventory-bar');\n\n        if (stockCountdown) {\n          var onStockCountdownVisible = function onStockCountdownVisible() {\n            var variantInventoryQuantity = _this5.variantsInventories[_this5.currentVariant['id']]['inventory_quantity'];\n            var stockCountdownProgress = Math.min(Math.max(variantInventoryQuantity / parseInt(stockCountdown.getAttribute('data-stock-countdown-max')) * 100.0, 0), 100);\n            stockCountdown.classList.toggle('inventory-bar--hidden', stockCountdownProgress === 0);\n            stockCountdown.firstElementChild.style.width = \"\".concat(stockCountdownProgress, \"%\");\n          };\n\n          if (window.IntersectionObserver) {\n            var stockCountdownIntersectionObserver = new IntersectionObserver(function (entries) {\n              entries.forEach(function (item) {\n                if (item.isIntersecting) {\n                  onStockCountdownVisible();\n                  stockCountdownIntersectionObserver.disconnect();\n                }\n              });\n            });\n            stockCountdownIntersectionObserver.observe(stockCountdown);\n          } else {\n            onStockCountdownVisible();\n          }\n        }\n      }\n    }, {\n      key: \"_showAlert\",\n      value: function _showAlert(message, type, afterElement) {\n        var messageElement = document.createElement('div');\n        messageElement.className = 'product-form__status-message';\n        messageElement.innerHTML = \"<p class=\\\"alert \".concat(type === 'success' ? 'alert--success' : 'alert--error', \"\\\">\").concat(message, \"</p>\");\n        afterElement.removeAttribute('disabled');\n        afterElement.parentNode.insertAdjacentElement('afterend', messageElement);\n        Animation.slideDown(messageElement);\n        setTimeout(function () {\n          Animation.slideUp(messageElement, function () {\n            messageElement.remove();\n          });\n        }, 5500);\n      }\n    }]);\n\n    return ProductVariants;\n  }();\n\n  var ProductModel = /*#__PURE__*/function () {\n    function ProductModel(element) {\n      _classCallCheck(this, ProductModel);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.delegateRoot = new Delegate(document.documentElement);\n\n      this._attachListeners();\n\n      var stylesheet = document.createElement('link');\n      stylesheet.rel = 'stylesheet';\n      stylesheet.href = 'https://cdn.shopify.com/shopifycloud/model-viewer-ui/assets/v1.0/model-viewer-ui.css';\n      document.head.appendChild(stylesheet);\n      window.Shopify.loadFeatures([{\n        name: 'model-viewer-ui',\n        version: '1.0',\n        onLoad: this._setupModelViewerUI.bind(this)\n      }, {\n        name: 'shopify-xr',\n        version: '1.0'\n      }]);\n    }\n\n    _createClass(ProductModel, [{\n      key: \"destroy\",\n      value: function destroy() {}\n    }, {\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        var _this = this;\n\n        this.element.querySelector('model-viewer').addEventListener('shopify_model_viewer_ui_toggle_play', function () {\n          _this.element.dispatchEvent(new CustomEvent('model:played', {\n            bubbles: true\n          }));\n        });\n        this.element.querySelector('model-viewer').addEventListener('shopify_model_viewer_ui_toggle_pause', function () {\n          _this.element.dispatchEvent(new CustomEvent('model:paused', {\n            bubbles: true\n          }));\n        });\n      }\n    }, {\n      key: \"hasBeenSelected\",\n      value: function hasBeenSelected(isInitialLoading) {\n        // As per guidelines, we only need to autoplay when it's not a touch device, and on desktop only if it's not the\n        // initial loading\n        if (Responsive.matchesBreakpoint('supports-hover') && !isInitialLoading) {\n          this.modelUi.play();\n        }\n      }\n    }, {\n      key: \"hasBeenDeselected\",\n      value: function hasBeenDeselected() {\n        // In all cases, we just turn it off\n        this.modelUi.pause();\n      }\n    }, {\n      key: \"_setupModelViewerUI\",\n      value: function _setupModelViewerUI() {\n        this.modelElement = this.element.querySelector('model-viewer');\n        this.modelUi = new window.Shopify.ModelViewerUI(this.modelElement);\n      }\n    }]);\n\n    return ProductModel;\n  }();\n\n  var ProductVideo = /*#__PURE__*/function () {\n    function ProductVideo(element, enableVideoLooping) {\n      _classCallCheck(this, ProductVideo);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.enableVideoLooping = enableVideoLooping;\n      this.player = null;\n\n      switch (this.element.getAttribute('data-media-type')) {\n        case 'video':\n          var stylesheet = document.createElement('link');\n          stylesheet.rel = 'stylesheet';\n          stylesheet.href = 'https://cdn.shopify.com/shopifycloud/shopify-plyr/v1.0/shopify-plyr.css';\n          document.head.appendChild(stylesheet);\n          window.Shopify.loadFeatures([{\n            name: 'video-ui',\n            version: '1.0',\n            onLoad: this._setupHtml5Video.bind(this)\n          }]);\n          break;\n\n        case 'external_video':\n          this._setupExternalVideo();\n\n          break;\n      }\n    }\n\n    _createClass(ProductVideo, [{\n      key: \"destroy\",\n      value: function destroy() {\n        if (this.player) {\n          this.player.destroy(); // Both Plyr and YouTube API use the same name\n        }\n      }\n    }, {\n      key: \"hasBeenSelected\",\n      value: function hasBeenSelected(isInitialLoading) {\n        // As per guidelines, we only need to autoplay when it's not a touch device, and on desktop only if it's not the\n        // initial loading\n        if (Responsive.matchesBreakpoint('supports-hover') && !isInitialLoading) {\n          this.play();\n        }\n      }\n    }, {\n      key: \"hasBeenDeselected\",\n      value: function hasBeenDeselected() {\n        this.pause();\n      }\n    }, {\n      key: \"play\",\n      value: function play() {\n        switch (this.element.getAttribute('data-media-type')) {\n          case 'video':\n            this.player.play();\n            break;\n\n          case 'external_video':\n            if (this.element.getAttribute('data-media-host') === 'youtube') {\n              this.player.playVideo();\n            } else {\n              this.player.player();\n            } // If we're using YouTube, we have to focus the parent div (as it's not possible to directly focus an iframe)\n\n\n            this.element.focus();\n            break;\n        }\n      }\n    }, {\n      key: \"pause\",\n      value: function pause() {\n        switch (this.element.getAttribute('data-media-type')) {\n          case 'video':\n            this.player.pause();\n            break;\n\n          case 'external_video':\n            if (this.element.getAttribute('data-media-host') === 'youtube') {\n              this.player.pauseVideo();\n            } else {\n              this.player.pause();\n            }\n\n            break;\n        }\n      }\n    }, {\n      key: \"_setupHtml5Video\",\n      value: function _setupHtml5Video() {\n        var _this = this;\n\n        this.player = new Shopify.Plyr(this.element.querySelector('video'), {\n          controls: ['play', 'progress', 'mute', 'volume', 'play-large', 'fullscreen'],\n          loop: {\n            active: this.enableVideoLooping\n          },\n          hideControlsOnPause: true,\n          clickToPlay: true,\n          iconUrl: '//cdn.shopify.com/shopifycloud/shopify-plyr/v1.0/shopify-plyr.svg',\n          tooltips: {\n            controls: false,\n            seek: true\n          }\n        });\n        this.player.on('play', function () {\n          _this.element.dispatchEvent(new CustomEvent('video:played', {\n            bubbles: true\n          }));\n        });\n        this.player.on('pause', function () {\n          _this.element.dispatchEvent(new CustomEvent('video:paused', {\n            bubbles: true\n          }));\n        });\n      }\n    }, {\n      key: \"_setupExternalVideo\",\n      value: function _setupExternalVideo() {\n        if (this.element.getAttribute('data-media-host') === 'youtube') {\n          this._loadYouTubeScript().then(this._setupYouTubePlayer.bind(this));\n        } else if (this.element.getAttribute('data-media-host') === 'vimeo') {\n          this._loadVimeoScript().then(this._setupVimeoPlayer.bind(this));\n        }\n      }\n    }, {\n      key: \"_setupYouTubePlayer\",\n      value: function _setupYouTubePlayer() {\n        var _this2 = this;\n\n        var playerLoadingInterval = setInterval(function () {\n          if (window.YT !== undefined && window.YT.Player !== undefined) {\n            _this2.player = new YT.Player(_this2.element.querySelector('iframe'), {\n              videoId: _this2.element.getAttribute('data-video-id'),\n              events: {\n                onStateChange: function onStateChange(event) {\n                  if (event.data === 0 && _this2.enableVideoLooping) {\n                    event.target.seekTo(0);\n                  }\n                }\n              }\n            });\n            clearInterval(playerLoadingInterval);\n          }\n        }, 50);\n      }\n    }, {\n      key: \"_loadYouTubeScript\",\n      value: function _loadYouTubeScript() {\n        return new Promise(function (resolve, reject) {\n          var script = document.createElement('script');\n          document.body.appendChild(script);\n          script.onload = resolve;\n          script.onerror = reject;\n          script.async = true;\n          script.src = '//www.youtube.com/iframe_api';\n        });\n      }\n    }, {\n      key: \"_setupVimeoPlayer\",\n      value: function _setupVimeoPlayer() {\n        var _this3 = this;\n\n        var playerLoadingInterval = setInterval(function () {\n          if (window.Vimeo !== undefined && window.Vimeo.Player !== undefined) {\n            _this3.player = new Vimeo.Player(_this3.element.querySelector('iframe'));\n            clearInterval(playerLoadingInterval);\n          }\n        }, 50);\n      }\n    }, {\n      key: \"_loadVimeoScript\",\n      value: function _loadVimeoScript() {\n        return new Promise(function (resolve, reject) {\n          var script = document.createElement('script');\n          document.body.appendChild(script);\n          script.onload = resolve;\n          script.onerror = reject;\n          script.async = true;\n          script.src = '//player.vimeo.com/api/player.js';\n        });\n      }\n    }]);\n\n    return ProductVideo;\n  }();\n\n  var evEmitter = createCommonjsModule(function (module) {\n    /**\n     * EvEmitter v1.1.0\n     * Lil' event emitter\n     * MIT License\n     */\n\n    /* jshint unused: true, undef: true, strict: true */\n    (function (global, factory) {\n      // universal module definition\n\n      /* jshint strict: false */\n\n      /* globals define, module, window */\n      if ( module.exports) {\n        // CommonJS - Browserify, Webpack\n        module.exports = factory();\n      } else {\n        // Browser globals\n        global.EvEmitter = factory();\n      }\n    })(typeof window != 'undefined' ? window : commonjsGlobal, function () {\n\n      function EvEmitter() {}\n\n      var proto = EvEmitter.prototype;\n\n      proto.on = function (eventName, listener) {\n        if (!eventName || !listener) {\n          return;\n        } // set events hash\n\n\n        var events = this._events = this._events || {}; // set listeners array\n\n        var listeners = events[eventName] = events[eventName] || []; // only add once\n\n        if (listeners.indexOf(listener) == -1) {\n          listeners.push(listener);\n        }\n\n        return this;\n      };\n\n      proto.once = function (eventName, listener) {\n        if (!eventName || !listener) {\n          return;\n        } // add event\n\n\n        this.on(eventName, listener); // set once flag\n        // set onceEvents hash\n\n        var onceEvents = this._onceEvents = this._onceEvents || {}; // set onceListeners object\n\n        var onceListeners = onceEvents[eventName] = onceEvents[eventName] || {}; // set flag\n\n        onceListeners[listener] = true;\n        return this;\n      };\n\n      proto.off = function (eventName, listener) {\n        var listeners = this._events && this._events[eventName];\n\n        if (!listeners || !listeners.length) {\n          return;\n        }\n\n        var index = listeners.indexOf(listener);\n\n        if (index != -1) {\n          listeners.splice(index, 1);\n        }\n\n        return this;\n      };\n\n      proto.emitEvent = function (eventName, args) {\n        var listeners = this._events && this._events[eventName];\n\n        if (!listeners || !listeners.length) {\n          return;\n        } // copy over to avoid interference if .off() in listener\n\n\n        listeners = listeners.slice(0);\n        args = args || []; // once stuff\n\n        var onceListeners = this._onceEvents && this._onceEvents[eventName];\n\n        for (var i = 0; i < listeners.length; i++) {\n          var listener = listeners[i];\n          var isOnce = onceListeners && onceListeners[listener];\n\n          if (isOnce) {\n            // remove listener\n            // remove before trigger to prevent recursion\n            this.off(eventName, listener); // unset once flag\n\n            delete onceListeners[listener];\n          } // trigger listener\n\n\n          listener.apply(this, args);\n        }\n\n        return this;\n      };\n\n      proto.allOff = function () {\n        delete this._events;\n        delete this._onceEvents;\n      };\n\n      return EvEmitter;\n    });\n  });\n\n  var getSize = createCommonjsModule(function (module) {\n    /*!\n     * getSize v2.0.3\n     * measure size of elements\n     * MIT license\n     */\n\n    /* jshint browser: true, strict: true, undef: true, unused: true */\n\n    /* globals console: false */\n    (function (window, factory) {\n      /* jshint strict: false */\n\n      /* globals define, module */\n      if ( module.exports) {\n        // CommonJS\n        module.exports = factory();\n      } else {\n        // browser global\n        window.getSize = factory();\n      }\n    })(window, function factory() {\n      // get a number from a string, not a percentage\n\n      function getStyleSize(value) {\n        var num = parseFloat(value); // not a percent like '100%', and a number\n\n        var isValid = value.indexOf('%') == -1 && !isNaN(num);\n        return isValid && num;\n      }\n\n      function noop() {}\n\n      var logError = typeof console == 'undefined' ? noop : function (message) {\n        console.error(message);\n      }; // -------------------------- measurements -------------------------- //\n\n      var measurements = ['paddingLeft', 'paddingRight', 'paddingTop', 'paddingBottom', 'marginLeft', 'marginRight', 'marginTop', 'marginBottom', 'borderLeftWidth', 'borderRightWidth', 'borderTopWidth', 'borderBottomWidth'];\n      var measurementsLength = measurements.length;\n\n      function getZeroSize() {\n        var size = {\n          width: 0,\n          height: 0,\n          innerWidth: 0,\n          innerHeight: 0,\n          outerWidth: 0,\n          outerHeight: 0\n        };\n\n        for (var i = 0; i < measurementsLength; i++) {\n          var measurement = measurements[i];\n          size[measurement] = 0;\n        }\n\n        return size;\n      } // -------------------------- getStyle -------------------------- //\n\n      /**\n       * getStyle, get style of element, check for Firefox bug\n       * https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n       */\n\n\n      function getStyle(elem) {\n        var style = getComputedStyle(elem);\n\n        if (!style) {\n          logError('Style returned ' + style + '. Are you running this code in a hidden iframe on Firefox? ' + 'See https://bit.ly/getsizebug1');\n        }\n\n        return style;\n      } // -------------------------- setup -------------------------- //\n\n\n      var isSetup = false;\n      var isBoxSizeOuter;\n      /**\n       * setup\n       * check isBoxSizerOuter\n       * do on first getSize() rather than on page load for Firefox bug\n       */\n\n      function setup() {\n        // setup once\n        if (isSetup) {\n          return;\n        }\n\n        isSetup = true; // -------------------------- box sizing -------------------------- //\n\n        /**\n         * Chrome & Safari measure the outer-width on style.width on border-box elems\n         * IE11 & Firefox<29 measures the inner-width\n         */\n\n        var div = document.createElement('div');\n        div.style.width = '200px';\n        div.style.padding = '1px 2px 3px 4px';\n        div.style.borderStyle = 'solid';\n        div.style.borderWidth = '1px 2px 3px 4px';\n        div.style.boxSizing = 'border-box';\n        var body = document.body || document.documentElement;\n        body.appendChild(div);\n        var style = getStyle(div); // round value for browser zoom. desandro/masonry#928\n\n        isBoxSizeOuter = Math.round(getStyleSize(style.width)) == 200;\n        getSize.isBoxSizeOuter = isBoxSizeOuter;\n        body.removeChild(div);\n      } // -------------------------- getSize -------------------------- //\n\n\n      function getSize(elem) {\n        setup(); // use querySeletor if elem is string\n\n        if (typeof elem == 'string') {\n          elem = document.querySelector(elem);\n        } // do not proceed on non-objects\n\n\n        if (!elem || _typeof(elem) != 'object' || !elem.nodeType) {\n          return;\n        }\n\n        var style = getStyle(elem); // if hidden, everything is 0\n\n        if (style.display == 'none') {\n          return getZeroSize();\n        }\n\n        var size = {};\n        size.width = elem.offsetWidth;\n        size.height = elem.offsetHeight;\n        var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box'; // get all measurements\n\n        for (var i = 0; i < measurementsLength; i++) {\n          var measurement = measurements[i];\n          var value = style[measurement];\n          var num = parseFloat(value); // any 'auto', 'medium' value will be 0\n\n          size[measurement] = !isNaN(num) ? num : 0;\n        }\n\n        var paddingWidth = size.paddingLeft + size.paddingRight;\n        var paddingHeight = size.paddingTop + size.paddingBottom;\n        var marginWidth = size.marginLeft + size.marginRight;\n        var marginHeight = size.marginTop + size.marginBottom;\n        var borderWidth = size.borderLeftWidth + size.borderRightWidth;\n        var borderHeight = size.borderTopWidth + size.borderBottomWidth;\n        var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter; // overwrite width and height if we can get it from style\n\n        var styleWidth = getStyleSize(style.width);\n\n        if (styleWidth !== false) {\n          size.width = styleWidth + ( // add padding and border unless it's already including it\n          isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth);\n        }\n\n        var styleHeight = getStyleSize(style.height);\n\n        if (styleHeight !== false) {\n          size.height = styleHeight + ( // add padding and border unless it's already including it\n          isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight);\n        }\n\n        size.innerWidth = size.width - (paddingWidth + borderWidth);\n        size.innerHeight = size.height - (paddingHeight + borderHeight);\n        size.outerWidth = size.width + marginWidth;\n        size.outerHeight = size.height + marginHeight;\n        return size;\n      }\n\n      return getSize;\n    });\n  });\n\n  var matchesSelector = createCommonjsModule(function (module) {\n    /**\n     * matchesSelector v2.0.2\n     * matchesSelector( element, '.selector' )\n     * MIT license\n     */\n\n    /*jshint browser: true, strict: true, undef: true, unused: true */\n    (function (window, factory) {\n\n      if ( module.exports) {\n        // CommonJS\n        module.exports = factory();\n      } else {\n        // browser global\n        window.matchesSelector = factory();\n      }\n    })(window, function factory() {\n\n      var matchesMethod = function () {\n        var ElemProto = window.Element.prototype; // check for the standard method name first\n\n        if (ElemProto.matches) {\n          return 'matches';\n        } // check un-prefixed\n\n\n        if (ElemProto.matchesSelector) {\n          return 'matchesSelector';\n        } // check vendor prefixes\n\n\n        var prefixes = ['webkit', 'moz', 'ms', 'o'];\n\n        for (var i = 0; i < prefixes.length; i++) {\n          var prefix = prefixes[i];\n          var method = prefix + 'MatchesSelector';\n\n          if (ElemProto[method]) {\n            return method;\n          }\n        }\n      }();\n\n      return function matchesSelector(elem, selector) {\n        return elem[matchesMethod](selector);\n      };\n    });\n  });\n\n  var utils = createCommonjsModule(function (module) {\n    /**\n     * Fizzy UI utils v2.0.7\n     * MIT license\n     */\n\n    /*jshint browser: true, undef: true, unused: true, strict: true */\n    (function (window, factory) {\n      // universal module definition\n\n      /*jshint strict: false */\n\n      /*globals define, module, require */\n      if ( module.exports) {\n        // CommonJS\n        module.exports = factory(window, matchesSelector);\n      } else {\n        // browser global\n        window.fizzyUIUtils = factory(window, window.matchesSelector);\n      }\n    })(window, function factory(window, matchesSelector) {\n\n      var utils = {}; // ----- extend ----- //\n      // extends objects\n\n      utils.extend = function (a, b) {\n        for (var prop in b) {\n          a[prop] = b[prop];\n        }\n\n        return a;\n      }; // ----- modulo ----- //\n\n\n      utils.modulo = function (num, div) {\n        return (num % div + div) % div;\n      }; // ----- makeArray ----- //\n\n\n      var arraySlice = Array.prototype.slice; // turn element or nodeList into an array\n\n      utils.makeArray = function (obj) {\n        if (Array.isArray(obj)) {\n          // use object if already an array\n          return obj;\n        } // return empty array if undefined or null. #6\n\n\n        if (obj === null || obj === undefined) {\n          return [];\n        }\n\n        var isArrayLike = _typeof(obj) == 'object' && typeof obj.length == 'number';\n\n        if (isArrayLike) {\n          // convert nodeList to array\n          return arraySlice.call(obj);\n        } // array of single index\n\n\n        return [obj];\n      }; // ----- removeFrom ----- //\n\n\n      utils.removeFrom = function (ary, obj) {\n        var index = ary.indexOf(obj);\n\n        if (index != -1) {\n          ary.splice(index, 1);\n        }\n      }; // ----- getParent ----- //\n\n\n      utils.getParent = function (elem, selector) {\n        while (elem.parentNode && elem != document.body) {\n          elem = elem.parentNode;\n\n          if (matchesSelector(elem, selector)) {\n            return elem;\n          }\n        }\n      }; // ----- getQueryElement ----- //\n      // use element as selector string\n\n\n      utils.getQueryElement = function (elem) {\n        if (typeof elem == 'string') {\n          return document.querySelector(elem);\n        }\n\n        return elem;\n      }; // ----- handleEvent ----- //\n      // enable .ontype to trigger from .addEventListener( elem, 'type' )\n\n\n      utils.handleEvent = function (event) {\n        var method = 'on' + event.type;\n\n        if (this[method]) {\n          this[method](event);\n        }\n      }; // ----- filterFindElements ----- //\n\n\n      utils.filterFindElements = function (elems, selector) {\n        // make array of elems\n        elems = utils.makeArray(elems);\n        var ffElems = [];\n        elems.forEach(function (elem) {\n          // check that elem is an actual element\n          if (!(elem instanceof HTMLElement)) {\n            return;\n          } // add elem if no selector\n\n\n          if (!selector) {\n            ffElems.push(elem);\n            return;\n          } // filter & find items if we have a selector\n          // filter\n\n\n          if (matchesSelector(elem, selector)) {\n            ffElems.push(elem);\n          } // find children\n\n\n          var childElems = elem.querySelectorAll(selector); // concat childElems to filterFound array\n\n          for (var i = 0; i < childElems.length; i++) {\n            ffElems.push(childElems[i]);\n          }\n        });\n        return ffElems;\n      }; // ----- debounceMethod ----- //\n\n\n      utils.debounceMethod = function (_class, methodName, threshold) {\n        threshold = threshold || 100; // original method\n\n        var method = _class.prototype[methodName];\n        var timeoutName = methodName + 'Timeout';\n\n        _class.prototype[methodName] = function () {\n          var timeout = this[timeoutName];\n          clearTimeout(timeout);\n          var args = arguments;\n\n          var _this = this;\n\n          this[timeoutName] = setTimeout(function () {\n            method.apply(_this, args);\n            delete _this[timeoutName];\n          }, threshold);\n        };\n      }; // ----- docReady ----- //\n\n\n      utils.docReady = function (callback) {\n        var readyState = document.readyState;\n\n        if (readyState == 'complete' || readyState == 'interactive') {\n          // do async to allow for other scripts to run. metafizzy/flickity#441\n          setTimeout(callback);\n        } else {\n          document.addEventListener('DOMContentLoaded', callback);\n        }\n      }; // ----- htmlInit ----- //\n      // http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/\n\n\n      utils.toDashed = function (str) {\n        return str.replace(/(.)([A-Z])/g, function (match, $1, $2) {\n          return $1 + '-' + $2;\n        }).toLowerCase();\n      };\n\n      var console = window.console;\n      /**\n       * allow user to initialize classes via [data-namespace] or .js-namespace class\n       * htmlInit( Widget, 'widgetName' )\n       * options are parsed from data-namespace-options\n       */\n\n      utils.htmlInit = function (WidgetClass, namespace) {\n        utils.docReady(function () {\n          var dashedNamespace = utils.toDashed(namespace);\n          var dataAttr = 'data-' + dashedNamespace;\n          var dataAttrElems = document.querySelectorAll('[' + dataAttr + ']');\n          var jsDashElems = document.querySelectorAll('.js-' + dashedNamespace);\n          var elems = utils.makeArray(dataAttrElems).concat(utils.makeArray(jsDashElems));\n          var dataOptionsAttr = dataAttr + '-options';\n          var jQuery = window.jQuery;\n          elems.forEach(function (elem) {\n            var attr = elem.getAttribute(dataAttr) || elem.getAttribute(dataOptionsAttr);\n            var options;\n\n            try {\n              options = attr && JSON.parse(attr);\n            } catch (error) {\n              // log error, do not initialize\n              if (console) {\n                console.error('Error parsing ' + dataAttr + ' on ' + elem.className + ': ' + error);\n              }\n\n              return;\n            } // initialize\n\n\n            var instance = new WidgetClass(elem, options); // make available via $().data('namespace')\n\n            if (jQuery) {\n              jQuery.data(elem, namespace, instance);\n            }\n          });\n        });\n      }; // -----  ----- //\n\n\n      return utils;\n    });\n  });\n\n  var cell = createCommonjsModule(function (module) {\n    // Flickity.Cell\n    (function (window, factory) {\n      // universal module definition\n\n      /* jshint strict: false */\n      if ( module.exports) {\n        // CommonJS\n        module.exports = factory(window, getSize);\n      } else {\n        // browser global\n        window.Flickity = window.Flickity || {};\n        window.Flickity.Cell = factory(window, window.getSize);\n      }\n    })(window, function factory(window, getSize) {\n\n      function Cell(elem, parent) {\n        this.element = elem;\n        this.parent = parent;\n        this.create();\n      }\n\n      var proto = Cell.prototype;\n\n      proto.create = function () {\n        this.element.style.position = 'absolute';\n        this.element.setAttribute('aria-hidden', 'true');\n        this.x = 0;\n        this.shift = 0;\n      };\n\n      proto.destroy = function () {\n        // reset style\n        this.unselect();\n        this.element.style.position = '';\n        var side = this.parent.originSide;\n        this.element.style[side] = '';\n      };\n\n      proto.getSize = function () {\n        this.size = getSize(this.element);\n      };\n\n      proto.setPosition = function (x) {\n        this.x = x;\n        this.updateTarget();\n        this.renderPosition(x);\n      }; // setDefaultTarget v1 method, backwards compatibility, remove in v3\n\n\n      proto.updateTarget = proto.setDefaultTarget = function () {\n        var marginProperty = this.parent.originSide == 'left' ? 'marginLeft' : 'marginRight';\n        this.target = this.x + this.size[marginProperty] + this.size.width * this.parent.cellAlign;\n      };\n\n      proto.renderPosition = function (x) {\n        // render position of cell with in slider\n        var side = this.parent.originSide;\n        this.element.style[side] = this.parent.getPositionValue(x);\n      };\n\n      proto.select = function () {\n        this.element.classList.add('is-selected');\n        this.element.removeAttribute('aria-hidden');\n      };\n\n      proto.unselect = function () {\n        this.element.classList.remove('is-selected');\n        this.element.setAttribute('aria-hidden', 'true');\n      };\n      /**\n       * @param {Integer} factor - 0, 1, or -1\n      **/\n\n\n      proto.wrapShift = function (shift) {\n        this.shift = shift;\n        this.renderPosition(this.x + this.parent.slideableWidth * shift);\n      };\n\n      proto.remove = function () {\n        this.element.parentNode.removeChild(this.element);\n      };\n\n      return Cell;\n    });\n  });\n\n  var slide = createCommonjsModule(function (module) {\n    // slide\n    (function (window, factory) {\n      // universal module definition\n\n      /* jshint strict: false */\n      if ( module.exports) {\n        // CommonJS\n        module.exports = factory();\n      } else {\n        // browser global\n        window.Flickity = window.Flickity || {};\n        window.Flickity.Slide = factory();\n      }\n    })(window, function factory() {\n\n      function Slide(parent) {\n        this.parent = parent;\n        this.isOriginLeft = parent.originSide == 'left';\n        this.cells = [];\n        this.outerWidth = 0;\n        this.height = 0;\n      }\n\n      var proto = Slide.prototype;\n\n      proto.addCell = function (cell) {\n        this.cells.push(cell);\n        this.outerWidth += cell.size.outerWidth;\n        this.height = Math.max(cell.size.outerHeight, this.height); // first cell stuff\n\n        if (this.cells.length == 1) {\n          this.x = cell.x; // x comes from first cell\n\n          var beginMargin = this.isOriginLeft ? 'marginLeft' : 'marginRight';\n          this.firstMargin = cell.size[beginMargin];\n        }\n      };\n\n      proto.updateTarget = function () {\n        var endMargin = this.isOriginLeft ? 'marginRight' : 'marginLeft';\n        var lastCell = this.getLastCell();\n        var lastMargin = lastCell ? lastCell.size[endMargin] : 0;\n        var slideWidth = this.outerWidth - (this.firstMargin + lastMargin);\n        this.target = this.x + this.firstMargin + slideWidth * this.parent.cellAlign;\n      };\n\n      proto.getLastCell = function () {\n        return this.cells[this.cells.length - 1];\n      };\n\n      proto.select = function () {\n        this.cells.forEach(function (cell) {\n          cell.select();\n        });\n      };\n\n      proto.unselect = function () {\n        this.cells.forEach(function (cell) {\n          cell.unselect();\n        });\n      };\n\n      proto.getCellElements = function () {\n        return this.cells.map(function (cell) {\n          return cell.element;\n        });\n      };\n\n      return Slide;\n    });\n  });\n\n  var animate = createCommonjsModule(function (module) {\n    // animate\n    (function (window, factory) {\n      // universal module definition\n\n      /* jshint strict: false */\n      if ( module.exports) {\n        // CommonJS\n        module.exports = factory(window, utils);\n      } else {\n        // browser global\n        window.Flickity = window.Flickity || {};\n        window.Flickity.animatePrototype = factory(window, window.fizzyUIUtils);\n      }\n    })(window, function factory(window, utils) {\n\n      var proto = {};\n\n      proto.startAnimation = function () {\n        if (this.isAnimating) {\n          return;\n        }\n\n        this.isAnimating = true;\n        this.restingFrames = 0;\n        this.animate();\n      };\n\n      proto.animate = function () {\n        this.applyDragForce();\n        this.applySelectedAttraction();\n        var previousX = this.x;\n        this.integratePhysics();\n        this.positionSlider();\n        this.settle(previousX); // animate next frame\n\n        if (this.isAnimating) {\n          var _this = this;\n\n          requestAnimationFrame(function animateFrame() {\n            _this.animate();\n          });\n        }\n      };\n\n      proto.positionSlider = function () {\n        var x = this.x; // wrap position around\n\n        if (this.options.wrapAround && this.cells.length > 1) {\n          x = utils.modulo(x, this.slideableWidth);\n          x = x - this.slideableWidth;\n          this.shiftWrapCells(x);\n        }\n\n        this.setTranslateX(x, this.isAnimating);\n        this.dispatchScrollEvent();\n      };\n\n      proto.setTranslateX = function (x, is3d) {\n        x += this.cursorPosition; // reverse if right-to-left and using transform\n\n        x = this.options.rightToLeft ? -x : x;\n        var translateX = this.getPositionValue(x); // use 3D tranforms for hardware acceleration on iOS\n        // but use 2D when settled, for better font-rendering\n\n        this.slider.style.transform = is3d ? 'translate3d(' + translateX + ',0,0)' : 'translateX(' + translateX + ')';\n      };\n\n      proto.dispatchScrollEvent = function () {\n        var firstSlide = this.slides[0];\n\n        if (!firstSlide) {\n          return;\n        }\n\n        var positionX = -this.x - firstSlide.target;\n        var progress = positionX / this.slidesWidth;\n        this.dispatchEvent('scroll', null, [progress, positionX]);\n      };\n\n      proto.positionSliderAtSelected = function () {\n        if (!this.cells.length) {\n          return;\n        }\n\n        this.x = -this.selectedSlide.target;\n        this.velocity = 0; // stop wobble\n\n        this.positionSlider();\n      };\n\n      proto.getPositionValue = function (position) {\n        if (this.options.percentPosition) {\n          // percent position, round to 2 digits, like 12.34%\n          return Math.round(position / this.size.innerWidth * 10000) * 0.01 + '%';\n        } else {\n          // pixel positioning\n          return Math.round(position) + 'px';\n        }\n      };\n\n      proto.settle = function (previousX) {\n        // keep track of frames where x hasn't moved\n        if (!this.isPointerDown && Math.round(this.x * 100) == Math.round(previousX * 100)) {\n          this.restingFrames++;\n        } // stop animating if resting for 3 or more frames\n\n\n        if (this.restingFrames > 2) {\n          this.isAnimating = false;\n          delete this.isFreeScrolling; // render position with translateX when settled\n\n          this.positionSlider();\n          this.dispatchEvent('settle', null, [this.selectedIndex]);\n        }\n      };\n\n      proto.shiftWrapCells = function (x) {\n        // shift before cells\n        var beforeGap = this.cursorPosition + x;\n\n        this._shiftCells(this.beforeShiftCells, beforeGap, -1); // shift after cells\n\n\n        var afterGap = this.size.innerWidth - (x + this.slideableWidth + this.cursorPosition);\n\n        this._shiftCells(this.afterShiftCells, afterGap, 1);\n      };\n\n      proto._shiftCells = function (cells, gap, shift) {\n        for (var i = 0; i < cells.length; i++) {\n          var cell = cells[i];\n          var cellShift = gap > 0 ? shift : 0;\n          cell.wrapShift(cellShift);\n          gap -= cell.size.outerWidth;\n        }\n      };\n\n      proto._unshiftCells = function (cells) {\n        if (!cells || !cells.length) {\n          return;\n        }\n\n        for (var i = 0; i < cells.length; i++) {\n          cells[i].wrapShift(0);\n        }\n      }; // -------------------------- physics -------------------------- //\n\n\n      proto.integratePhysics = function () {\n        this.x += this.velocity;\n        this.velocity *= this.getFrictionFactor();\n      };\n\n      proto.applyForce = function (force) {\n        this.velocity += force;\n      };\n\n      proto.getFrictionFactor = function () {\n        return 1 - this.options[this.isFreeScrolling ? 'freeScrollFriction' : 'friction'];\n      };\n\n      proto.getRestingPosition = function () {\n        // my thanks to Steven Wittens, who simplified this math greatly\n        return this.x + this.velocity / (1 - this.getFrictionFactor());\n      };\n\n      proto.applyDragForce = function () {\n        if (!this.isDraggable || !this.isPointerDown) {\n          return;\n        } // change the position to drag position by applying force\n\n\n        var dragVelocity = this.dragX - this.x;\n        var dragForce = dragVelocity - this.velocity;\n        this.applyForce(dragForce);\n      };\n\n      proto.applySelectedAttraction = function () {\n        // do not attract if pointer down or no slides\n        var dragDown = this.isDraggable && this.isPointerDown;\n\n        if (dragDown || this.isFreeScrolling || !this.slides.length) {\n          return;\n        }\n\n        var distance = this.selectedSlide.target * -1 - this.x;\n        var force = distance * this.options.selectedAttraction;\n        this.applyForce(force);\n      };\n\n      return proto;\n    });\n  });\n\n  var flickity = createCommonjsModule(function (module) {\n    // Flickity main\n    (function (window, factory) {\n      // universal module definition\n\n      /* jshint strict: false */\n      if ( module.exports) {\n        // CommonJS\n        module.exports = factory(window, evEmitter, getSize, utils, cell, slide, animate);\n      } else {\n        // browser global\n        var _Flickity = window.Flickity;\n        window.Flickity = factory(window, window.EvEmitter, window.getSize, window.fizzyUIUtils, _Flickity.Cell, _Flickity.Slide, _Flickity.animatePrototype);\n      }\n    })(window, function factory(window, EvEmitter, getSize, utils, Cell, Slide, animatePrototype) {\n\n      var jQuery = window.jQuery;\n      var getComputedStyle = window.getComputedStyle;\n      var console = window.console;\n\n      function moveElements(elems, toElem) {\n        elems = utils.makeArray(elems);\n\n        while (elems.length) {\n          toElem.appendChild(elems.shift());\n        }\n      } // -------------------------- Flickity -------------------------- //\n      // globally unique identifiers\n\n\n      var GUID = 0; // internal store of all Flickity intances\n\n      var instances = {};\n\n      function Flickity(element, options) {\n        var queryElement = utils.getQueryElement(element);\n\n        if (!queryElement) {\n          if (console) {\n            console.error('Bad element for Flickity: ' + (queryElement || element));\n          }\n\n          return;\n        }\n\n        this.element = queryElement; // do not initialize twice on same element\n\n        if (this.element.flickityGUID) {\n          var instance = instances[this.element.flickityGUID];\n          instance.option(options);\n          return instance;\n        } // add jQuery\n\n\n        if (jQuery) {\n          this.$element = jQuery(this.element);\n        } // options\n\n\n        this.options = utils.extend({}, this.constructor.defaults);\n        this.option(options); // kick things off\n\n        this._create();\n      }\n\n      Flickity.defaults = {\n        accessibility: true,\n        // adaptiveHeight: false,\n        cellAlign: 'center',\n        // cellSelector: undefined,\n        // contain: false,\n        freeScrollFriction: 0.075,\n        // friction when free-scrolling\n        friction: 0.28,\n        // friction when selecting\n        namespaceJQueryEvents: true,\n        // initialIndex: 0,\n        percentPosition: true,\n        resize: true,\n        selectedAttraction: 0.025,\n        setGallerySize: true // watchCSS: false,\n        // wrapAround: false\n\n      }; // hash of methods triggered on _create()\n\n      Flickity.createMethods = [];\n      var proto = Flickity.prototype; // inherit EventEmitter\n\n      utils.extend(proto, EvEmitter.prototype);\n\n      proto._create = function () {\n        // add id for Flickity.data\n        var id = this.guid = ++GUID;\n        this.element.flickityGUID = id; // expando\n\n        instances[id] = this; // associate via id\n        // initial properties\n\n        this.selectedIndex = 0; // how many frames slider has been in same position\n\n        this.restingFrames = 0; // initial physics properties\n\n        this.x = 0;\n        this.velocity = 0;\n        this.originSide = this.options.rightToLeft ? 'right' : 'left'; // create viewport & slider\n\n        this.viewport = document.createElement('div');\n        this.viewport.className = 'flickity-viewport';\n\n        this._createSlider();\n\n        if (this.options.resize || this.options.watchCSS) {\n          window.addEventListener('resize', this);\n        } // add listeners from on option\n\n\n        for (var eventName in this.options.on) {\n          var listener = this.options.on[eventName];\n          this.on(eventName, listener);\n        }\n\n        Flickity.createMethods.forEach(function (method) {\n          this[method]();\n        }, this);\n\n        if (this.options.watchCSS) {\n          this.watchCSS();\n        } else {\n          this.activate();\n        }\n      };\n      /**\n       * set options\n       * @param {Object} opts\n       */\n\n\n      proto.option = function (opts) {\n        utils.extend(this.options, opts);\n      };\n\n      proto.activate = function () {\n        if (this.isActive) {\n          return;\n        }\n\n        this.isActive = true;\n        this.element.classList.add('flickity-enabled');\n\n        if (this.options.rightToLeft) {\n          this.element.classList.add('flickity-rtl');\n        }\n\n        this.getSize(); // move initial cell elements so they can be loaded as cells\n\n        var cellElems = this._filterFindCellElements(this.element.children);\n\n        moveElements(cellElems, this.slider);\n        this.viewport.appendChild(this.slider);\n        this.element.appendChild(this.viewport); // get cells from children\n\n        this.reloadCells();\n\n        if (this.options.accessibility) {\n          // allow element to focusable\n          this.element.tabIndex = 0; // listen for key presses\n\n          this.element.addEventListener('keydown', this);\n        }\n\n        this.emitEvent('activate');\n        this.selectInitialIndex(); // flag for initial activation, for using initialIndex\n\n        this.isInitActivated = true; // ready event. #493\n\n        this.dispatchEvent('ready');\n      }; // slider positions the cells\n\n\n      proto._createSlider = function () {\n        // slider element does all the positioning\n        var slider = document.createElement('div');\n        slider.className = 'flickity-slider';\n        slider.style[this.originSide] = 0;\n        this.slider = slider;\n      };\n\n      proto._filterFindCellElements = function (elems) {\n        return utils.filterFindElements(elems, this.options.cellSelector);\n      }; // goes through all children\n\n\n      proto.reloadCells = function () {\n        // collection of item elements\n        this.cells = this._makeCells(this.slider.children);\n        this.positionCells();\n\n        this._getWrapShiftCells();\n\n        this.setGallerySize();\n      };\n      /**\n       * turn elements into Flickity.Cells\n       * @param {Array or NodeList or HTMLElement} elems\n       * @returns {Array} items - collection of new Flickity Cells\n       */\n\n\n      proto._makeCells = function (elems) {\n        var cellElems = this._filterFindCellElements(elems); // create new Flickity for collection\n\n\n        var cells = cellElems.map(function (cellElem) {\n          return new Cell(cellElem, this);\n        }, this);\n        return cells;\n      };\n\n      proto.getLastCell = function () {\n        return this.cells[this.cells.length - 1];\n      };\n\n      proto.getLastSlide = function () {\n        return this.slides[this.slides.length - 1];\n      }; // positions all cells\n\n\n      proto.positionCells = function () {\n        // size all cells\n        this._sizeCells(this.cells); // position all cells\n\n\n        this._positionCells(0);\n      };\n      /**\n       * position certain cells\n       * @param {Integer} index - which cell to start with\n       */\n\n\n      proto._positionCells = function (index) {\n        index = index || 0; // also measure maxCellHeight\n        // start 0 if positioning all cells\n\n        this.maxCellHeight = index ? this.maxCellHeight || 0 : 0;\n        var cellX = 0; // get cellX\n\n        if (index > 0) {\n          var startCell = this.cells[index - 1];\n          cellX = startCell.x + startCell.size.outerWidth;\n        }\n\n        var len = this.cells.length;\n\n        for (var i = index; i < len; i++) {\n          var cell = this.cells[i];\n          cell.setPosition(cellX);\n          cellX += cell.size.outerWidth;\n          this.maxCellHeight = Math.max(cell.size.outerHeight, this.maxCellHeight);\n        } // keep track of cellX for wrap-around\n\n\n        this.slideableWidth = cellX; // slides\n\n        this.updateSlides(); // contain slides target\n\n        this._containSlides(); // update slidesWidth\n\n\n        this.slidesWidth = len ? this.getLastSlide().target - this.slides[0].target : 0;\n      };\n      /**\n       * cell.getSize() on multiple cells\n       * @param {Array} cells\n       */\n\n\n      proto._sizeCells = function (cells) {\n        cells.forEach(function (cell) {\n          cell.getSize();\n        });\n      }; // --------------------------  -------------------------- //\n\n\n      proto.updateSlides = function () {\n        this.slides = [];\n\n        if (!this.cells.length) {\n          return;\n        }\n\n        var slide = new Slide(this);\n        this.slides.push(slide);\n        var isOriginLeft = this.originSide == 'left';\n        var nextMargin = isOriginLeft ? 'marginRight' : 'marginLeft';\n\n        var canCellFit = this._getCanCellFit();\n\n        this.cells.forEach(function (cell, i) {\n          // just add cell if first cell in slide\n          if (!slide.cells.length) {\n            slide.addCell(cell);\n            return;\n          }\n\n          var slideWidth = slide.outerWidth - slide.firstMargin + (cell.size.outerWidth - cell.size[nextMargin]);\n\n          if (canCellFit.call(this, i, slideWidth)) {\n            slide.addCell(cell);\n          } else {\n            // doesn't fit, new slide\n            slide.updateTarget();\n            slide = new Slide(this);\n            this.slides.push(slide);\n            slide.addCell(cell);\n          }\n        }, this); // last slide\n\n        slide.updateTarget(); // update .selectedSlide\n\n        this.updateSelectedSlide();\n      };\n\n      proto._getCanCellFit = function () {\n        var groupCells = this.options.groupCells;\n\n        if (!groupCells) {\n          return function () {\n            return false;\n          };\n        } else if (typeof groupCells == 'number') {\n          // group by number. 3 -> [0,1,2], [3,4,5], ...\n          var number = parseInt(groupCells, 10);\n          return function (i) {\n            return i % number !== 0;\n          };\n        } // default, group by width of slide\n        // parse '75%\n\n\n        var percentMatch = typeof groupCells == 'string' && groupCells.match(/^(\\d+)%$/);\n        var percent = percentMatch ? parseInt(percentMatch[1], 10) / 100 : 1;\n        return function (i, slideWidth) {\n          return slideWidth <= (this.size.innerWidth + 1) * percent;\n        };\n      }; // alias _init for jQuery plugin .flickity()\n\n\n      proto._init = proto.reposition = function () {\n        this.positionCells();\n        this.positionSliderAtSelected();\n      };\n\n      proto.getSize = function () {\n        this.size = getSize(this.element);\n        this.setCellAlign();\n        this.cursorPosition = this.size.innerWidth * this.cellAlign;\n      };\n\n      var cellAlignShorthands = {\n        // cell align, then based on origin side\n        center: {\n          left: 0.5,\n          right: 0.5\n        },\n        left: {\n          left: 0,\n          right: 1\n        },\n        right: {\n          right: 0,\n          left: 1\n        }\n      };\n\n      proto.setCellAlign = function () {\n        var shorthand = cellAlignShorthands[this.options.cellAlign];\n        this.cellAlign = shorthand ? shorthand[this.originSide] : this.options.cellAlign;\n      };\n\n      proto.setGallerySize = function () {\n        if (this.options.setGallerySize) {\n          var height = this.options.adaptiveHeight && this.selectedSlide ? this.selectedSlide.height : this.maxCellHeight;\n          this.viewport.style.height = height + 'px';\n        }\n      };\n\n      proto._getWrapShiftCells = function () {\n        // only for wrap-around\n        if (!this.options.wrapAround) {\n          return;\n        } // unshift previous cells\n\n\n        this._unshiftCells(this.beforeShiftCells);\n\n        this._unshiftCells(this.afterShiftCells); // get before cells\n        // initial gap\n\n\n        var gapX = this.cursorPosition;\n        var cellIndex = this.cells.length - 1;\n        this.beforeShiftCells = this._getGapCells(gapX, cellIndex, -1); // get after cells\n        // ending gap between last cell and end of gallery viewport\n\n        gapX = this.size.innerWidth - this.cursorPosition; // start cloning at first cell, working forwards\n\n        this.afterShiftCells = this._getGapCells(gapX, 0, 1);\n      };\n\n      proto._getGapCells = function (gapX, cellIndex, increment) {\n        // keep adding cells until the cover the initial gap\n        var cells = [];\n\n        while (gapX > 0) {\n          var cell = this.cells[cellIndex];\n\n          if (!cell) {\n            break;\n          }\n\n          cells.push(cell);\n          cellIndex += increment;\n          gapX -= cell.size.outerWidth;\n        }\n\n        return cells;\n      }; // ----- contain ----- //\n      // contain cell targets so no excess sliding\n\n\n      proto._containSlides = function () {\n        if (!this.options.contain || this.options.wrapAround || !this.cells.length) {\n          return;\n        }\n\n        var isRightToLeft = this.options.rightToLeft;\n        var beginMargin = isRightToLeft ? 'marginRight' : 'marginLeft';\n        var endMargin = isRightToLeft ? 'marginLeft' : 'marginRight';\n        var contentWidth = this.slideableWidth - this.getLastCell().size[endMargin]; // content is less than gallery size\n\n        var isContentSmaller = contentWidth < this.size.innerWidth; // bounds\n\n        var beginBound = this.cursorPosition + this.cells[0].size[beginMargin];\n        var endBound = contentWidth - this.size.innerWidth * (1 - this.cellAlign); // contain each cell target\n\n        this.slides.forEach(function (slide) {\n          if (isContentSmaller) {\n            // all cells fit inside gallery\n            slide.target = contentWidth * this.cellAlign;\n          } else {\n            // contain to bounds\n            slide.target = Math.max(slide.target, beginBound);\n            slide.target = Math.min(slide.target, endBound);\n          }\n        }, this);\n      }; // -----  ----- //\n\n      /**\n       * emits events via eventEmitter and jQuery events\n       * @param {String} type - name of event\n       * @param {Event} event - original event\n       * @param {Array} args - extra arguments\n       */\n\n\n      proto.dispatchEvent = function (type, event, args) {\n        var emitArgs = event ? [event].concat(args) : args;\n        this.emitEvent(type, emitArgs);\n\n        if (jQuery && this.$element) {\n          // default trigger with type if no event\n          type += this.options.namespaceJQueryEvents ? '.flickity' : '';\n          var $event = type;\n\n          if (event) {\n            // create jQuery event\n            var jQEvent = jQuery.Event(event);\n            jQEvent.type = type;\n            $event = jQEvent;\n          }\n\n          this.$element.trigger($event, args);\n        }\n      }; // -------------------------- select -------------------------- //\n\n      /**\n       * @param {Integer} index - index of the slide\n       * @param {Boolean} isWrap - will wrap-around to last/first if at the end\n       * @param {Boolean} isInstant - will immediately set position at selected cell\n       */\n\n\n      proto.select = function (index, isWrap, isInstant) {\n        if (!this.isActive) {\n          return;\n        }\n\n        index = parseInt(index, 10);\n\n        this._wrapSelect(index);\n\n        if (this.options.wrapAround || isWrap) {\n          index = utils.modulo(index, this.slides.length);\n        } // bail if invalid index\n\n\n        if (!this.slides[index]) {\n          return;\n        }\n\n        var prevIndex = this.selectedIndex;\n        this.selectedIndex = index;\n        this.updateSelectedSlide();\n\n        if (isInstant) {\n          this.positionSliderAtSelected();\n        } else {\n          this.startAnimation();\n        }\n\n        if (this.options.adaptiveHeight) {\n          this.setGallerySize();\n        } // events\n\n\n        this.dispatchEvent('select', null, [index]); // change event if new index\n\n        if (index != prevIndex) {\n          this.dispatchEvent('change', null, [index]);\n        } // old v1 event name, remove in v3\n\n\n        this.dispatchEvent('cellSelect');\n      }; // wraps position for wrapAround, to move to closest slide. #113\n\n\n      proto._wrapSelect = function (index) {\n        var len = this.slides.length;\n        var isWrapping = this.options.wrapAround && len > 1;\n\n        if (!isWrapping) {\n          return index;\n        }\n\n        var wrapIndex = utils.modulo(index, len); // go to shortest\n\n        var delta = Math.abs(wrapIndex - this.selectedIndex);\n        var backWrapDelta = Math.abs(wrapIndex + len - this.selectedIndex);\n        var forewardWrapDelta = Math.abs(wrapIndex - len - this.selectedIndex);\n\n        if (!this.isDragSelect && backWrapDelta < delta) {\n          index += len;\n        } else if (!this.isDragSelect && forewardWrapDelta < delta) {\n          index -= len;\n        } // wrap position so slider is within normal area\n\n\n        if (index < 0) {\n          this.x -= this.slideableWidth;\n        } else if (index >= len) {\n          this.x += this.slideableWidth;\n        }\n      };\n\n      proto.previous = function (isWrap, isInstant) {\n        this.select(this.selectedIndex - 1, isWrap, isInstant);\n      };\n\n      proto.next = function (isWrap, isInstant) {\n        this.select(this.selectedIndex + 1, isWrap, isInstant);\n      };\n\n      proto.updateSelectedSlide = function () {\n        var slide = this.slides[this.selectedIndex]; // selectedIndex could be outside of slides, if triggered before resize()\n\n        if (!slide) {\n          return;\n        } // unselect previous selected slide\n\n\n        this.unselectSelectedSlide(); // update new selected slide\n\n        this.selectedSlide = slide;\n        slide.select();\n        this.selectedCells = slide.cells;\n        this.selectedElements = slide.getCellElements(); // HACK: selectedCell & selectedElement is first cell in slide, backwards compatibility\n        // Remove in v3?\n\n        this.selectedCell = slide.cells[0];\n        this.selectedElement = this.selectedElements[0];\n      };\n\n      proto.unselectSelectedSlide = function () {\n        if (this.selectedSlide) {\n          this.selectedSlide.unselect();\n        }\n      };\n\n      proto.selectInitialIndex = function () {\n        var initialIndex = this.options.initialIndex; // already activated, select previous selectedIndex\n\n        if (this.isInitActivated) {\n          this.select(this.selectedIndex, false, true);\n          return;\n        } // select with selector string\n\n\n        if (initialIndex && typeof initialIndex == 'string') {\n          var cell = this.queryCell(initialIndex);\n\n          if (cell) {\n            this.selectCell(initialIndex, false, true);\n            return;\n          }\n        }\n\n        var index = 0; // select with number\n\n        if (initialIndex && this.slides[initialIndex]) {\n          index = initialIndex;\n        } // select instantly\n\n\n        this.select(index, false, true);\n      };\n      /**\n       * select slide from number or cell element\n       * @param {Element or Number} elem\n       */\n\n\n      proto.selectCell = function (value, isWrap, isInstant) {\n        // get cell\n        var cell = this.queryCell(value);\n\n        if (!cell) {\n          return;\n        }\n\n        var index = this.getCellSlideIndex(cell);\n        this.select(index, isWrap, isInstant);\n      };\n\n      proto.getCellSlideIndex = function (cell) {\n        // get index of slides that has cell\n        for (var i = 0; i < this.slides.length; i++) {\n          var slide = this.slides[i];\n          var index = slide.cells.indexOf(cell);\n\n          if (index != -1) {\n            return i;\n          }\n        }\n      }; // -------------------------- get cells -------------------------- //\n\n      /**\n       * get Flickity.Cell, given an Element\n       * @param {Element} elem\n       * @returns {Flickity.Cell} item\n       */\n\n\n      proto.getCell = function (elem) {\n        // loop through cells to get the one that matches\n        for (var i = 0; i < this.cells.length; i++) {\n          var cell = this.cells[i];\n\n          if (cell.element == elem) {\n            return cell;\n          }\n        }\n      };\n      /**\n       * get collection of Flickity.Cells, given Elements\n       * @param {Element, Array, NodeList} elems\n       * @returns {Array} cells - Flickity.Cells\n       */\n\n\n      proto.getCells = function (elems) {\n        elems = utils.makeArray(elems);\n        var cells = [];\n        elems.forEach(function (elem) {\n          var cell = this.getCell(elem);\n\n          if (cell) {\n            cells.push(cell);\n          }\n        }, this);\n        return cells;\n      };\n      /**\n       * get cell elements\n       * @returns {Array} cellElems\n       */\n\n\n      proto.getCellElements = function () {\n        return this.cells.map(function (cell) {\n          return cell.element;\n        });\n      };\n      /**\n       * get parent cell from an element\n       * @param {Element} elem\n       * @returns {Flickit.Cell} cell\n       */\n\n\n      proto.getParentCell = function (elem) {\n        // first check if elem is cell\n        var cell = this.getCell(elem);\n\n        if (cell) {\n          return cell;\n        } // try to get parent cell elem\n\n\n        elem = utils.getParent(elem, '.flickity-slider > *');\n        return this.getCell(elem);\n      };\n      /**\n       * get cells adjacent to a slide\n       * @param {Integer} adjCount - number of adjacent slides\n       * @param {Integer} index - index of slide to start\n       * @returns {Array} cells - array of Flickity.Cells\n       */\n\n\n      proto.getAdjacentCellElements = function (adjCount, index) {\n        if (!adjCount) {\n          return this.selectedSlide.getCellElements();\n        }\n\n        index = index === undefined ? this.selectedIndex : index;\n        var len = this.slides.length;\n\n        if (1 + adjCount * 2 >= len) {\n          return this.getCellElements();\n        }\n\n        var cellElems = [];\n\n        for (var i = index - adjCount; i <= index + adjCount; i++) {\n          var slideIndex = this.options.wrapAround ? utils.modulo(i, len) : i;\n          var slide = this.slides[slideIndex];\n\n          if (slide) {\n            cellElems = cellElems.concat(slide.getCellElements());\n          }\n        }\n\n        return cellElems;\n      };\n      /**\n       * select slide from number or cell element\n       * @param {Element, Selector String, or Number} selector\n       */\n\n\n      proto.queryCell = function (selector) {\n        if (typeof selector == 'number') {\n          // use number as index\n          return this.cells[selector];\n        }\n\n        if (typeof selector == 'string') {\n          // do not select invalid selectors from hash: #123, #/. #791\n          if (selector.match(/^[#\\.]?[\\d\\/]/)) {\n            return;\n          } // use string as selector, get element\n\n\n          selector = this.element.querySelector(selector);\n        } // get cell from element\n\n\n        return this.getCell(selector);\n      }; // -------------------------- events -------------------------- //\n\n\n      proto.uiChange = function () {\n        this.emitEvent('uiChange');\n      }; // keep focus on element when child UI elements are clicked\n\n\n      proto.childUIPointerDown = function (event) {\n        // HACK iOS does not allow touch events to bubble up?!\n        if (event.type != 'touchstart') {\n          event.preventDefault();\n        }\n\n        this.focus();\n      }; // ----- resize ----- //\n\n\n      proto.onresize = function () {\n        this.watchCSS();\n        this.resize();\n      };\n\n      utils.debounceMethod(Flickity, 'onresize', 150);\n\n      proto.resize = function () {\n        if (!this.isActive) {\n          return;\n        }\n\n        this.getSize(); // wrap values\n\n        if (this.options.wrapAround) {\n          this.x = utils.modulo(this.x, this.slideableWidth);\n        }\n\n        this.positionCells();\n\n        this._getWrapShiftCells();\n\n        this.setGallerySize();\n        this.emitEvent('resize'); // update selected index for group slides, instant\n        // TODO: position can be lost between groups of various numbers\n\n        var selectedElement = this.selectedElements && this.selectedElements[0];\n        this.selectCell(selectedElement, false, true);\n      }; // watches the :after property, activates/deactivates\n\n\n      proto.watchCSS = function () {\n        var watchOption = this.options.watchCSS;\n\n        if (!watchOption) {\n          return;\n        }\n\n        var afterContent = getComputedStyle(this.element, ':after').content; // activate if :after { content: 'flickity' }\n\n        if (afterContent.indexOf('flickity') != -1) {\n          this.activate();\n        } else {\n          this.deactivate();\n        }\n      }; // ----- keydown ----- //\n      // go previous/next if left/right keys pressed\n\n\n      proto.onkeydown = function (event) {\n        // only work if element is in focus\n        var isNotFocused = document.activeElement && document.activeElement != this.element;\n\n        if (!this.options.accessibility || isNotFocused) {\n          return;\n        }\n\n        var handler = Flickity.keyboardHandlers[event.keyCode];\n\n        if (handler) {\n          handler.call(this);\n        }\n      };\n\n      Flickity.keyboardHandlers = {\n        // left arrow\n        37: function _() {\n          var leftMethod = this.options.rightToLeft ? 'next' : 'previous';\n          this.uiChange();\n          this[leftMethod]();\n        },\n        // right arrow\n        39: function _() {\n          var rightMethod = this.options.rightToLeft ? 'previous' : 'next';\n          this.uiChange();\n          this[rightMethod]();\n        }\n      }; // ----- focus ----- //\n\n      proto.focus = function () {\n        // TODO remove scrollTo once focus options gets more support\n        // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus#Browser_compatibility\n        var prevScrollY = window.pageYOffset;\n        this.element.focus({\n          preventScroll: true\n        }); // hack to fix scroll jump after focus, #76\n\n        if (window.pageYOffset != prevScrollY) {\n          window.scrollTo(window.pageXOffset, prevScrollY);\n        }\n      }; // -------------------------- destroy -------------------------- //\n      // deactivate all Flickity functionality, but keep stuff available\n\n\n      proto.deactivate = function () {\n        if (!this.isActive) {\n          return;\n        }\n\n        this.element.classList.remove('flickity-enabled');\n        this.element.classList.remove('flickity-rtl');\n        this.unselectSelectedSlide(); // destroy cells\n\n        this.cells.forEach(function (cell) {\n          cell.destroy();\n        });\n        this.element.removeChild(this.viewport); // move child elements back into element\n\n        moveElements(this.slider.children, this.element);\n\n        if (this.options.accessibility) {\n          this.element.removeAttribute('tabIndex');\n          this.element.removeEventListener('keydown', this);\n        } // set flags\n\n\n        this.isActive = false;\n        this.emitEvent('deactivate');\n      };\n\n      proto.destroy = function () {\n        this.deactivate();\n        window.removeEventListener('resize', this);\n        this.allOff();\n        this.emitEvent('destroy');\n\n        if (jQuery && this.$element) {\n          jQuery.removeData(this.element, 'flickity');\n        }\n\n        delete this.element.flickityGUID;\n        delete instances[this.guid];\n      }; // -------------------------- prototype -------------------------- //\n\n\n      utils.extend(proto, animatePrototype); // -------------------------- extras -------------------------- //\n\n      /**\n       * get Flickity instance from element\n       * @param {Element} elem\n       * @returns {Flickity}\n       */\n\n      Flickity.data = function (elem) {\n        elem = utils.getQueryElement(elem);\n        var id = elem && elem.flickityGUID;\n        return id && instances[id];\n      };\n\n      utils.htmlInit(Flickity, 'flickity');\n\n      if (jQuery && jQuery.bridget) {\n        jQuery.bridget('flickity', Flickity);\n      } // set internal jQuery, for Webpack + jQuery v3, #478\n\n\n      Flickity.setJQuery = function (jq) {\n        jQuery = jq;\n      };\n\n      Flickity.Cell = Cell;\n      Flickity.Slide = Slide;\n      return Flickity;\n    });\n  });\n\n  var unipointer = createCommonjsModule(function (module) {\n    /*!\n     * Unipointer v2.3.0\n     * base class for doing one thing with pointer event\n     * MIT license\n     */\n\n    /*jshint browser: true, undef: true, unused: true, strict: true */\n    (function (window, factory) {\n      // universal module definition\n\n      /* jshint strict: false */\n\n      /*global define, module, require */\n      if ( module.exports) {\n        // CommonJS\n        module.exports = factory(window, evEmitter);\n      } else {\n        // browser global\n        window.Unipointer = factory(window, window.EvEmitter);\n      }\n    })(window, function factory(window, EvEmitter) {\n\n      function noop() {}\n\n      function Unipointer() {} // inherit EvEmitter\n\n\n      var proto = Unipointer.prototype = Object.create(EvEmitter.prototype);\n\n      proto.bindStartEvent = function (elem) {\n        this._bindStartEvent(elem, true);\n      };\n\n      proto.unbindStartEvent = function (elem) {\n        this._bindStartEvent(elem, false);\n      };\n      /**\n       * Add or remove start event\n       * @param {Boolean} isAdd - remove if falsey\n       */\n\n\n      proto._bindStartEvent = function (elem, isAdd) {\n        // munge isAdd, default to true\n        isAdd = isAdd === undefined ? true : isAdd;\n        var bindMethod = isAdd ? 'addEventListener' : 'removeEventListener'; // default to mouse events\n\n        var startEvent = 'mousedown';\n\n        if (window.PointerEvent) {\n          // Pointer Events\n          startEvent = 'pointerdown';\n        } else if ('ontouchstart' in window) {\n          // Touch Events. iOS Safari\n          startEvent = 'touchstart';\n        }\n\n        elem[bindMethod](startEvent, this);\n      }; // trigger handler methods for events\n\n\n      proto.handleEvent = function (event) {\n        var method = 'on' + event.type;\n\n        if (this[method]) {\n          this[method](event);\n        }\n      }; // returns the touch that we're keeping track of\n\n\n      proto.getTouch = function (touches) {\n        for (var i = 0; i < touches.length; i++) {\n          var touch = touches[i];\n\n          if (touch.identifier == this.pointerIdentifier) {\n            return touch;\n          }\n        }\n      }; // ----- start event ----- //\n\n\n      proto.onmousedown = function (event) {\n        // dismiss clicks from right or middle buttons\n        var button = event.button;\n\n        if (button && button !== 0 && button !== 1) {\n          return;\n        }\n\n        this._pointerDown(event, event);\n      };\n\n      proto.ontouchstart = function (event) {\n        this._pointerDown(event, event.changedTouches[0]);\n      };\n\n      proto.onpointerdown = function (event) {\n        this._pointerDown(event, event);\n      };\n      /**\n       * pointer start\n       * @param {Event} event\n       * @param {Event or Touch} pointer\n       */\n\n\n      proto._pointerDown = function (event, pointer) {\n        // dismiss right click and other pointers\n        // button = 0 is okay, 1-4 not\n        if (event.button || this.isPointerDown) {\n          return;\n        }\n\n        this.isPointerDown = true; // save pointer identifier to match up touch events\n\n        this.pointerIdentifier = pointer.pointerId !== undefined ? // pointerId for pointer events, touch.indentifier for touch events\n        pointer.pointerId : pointer.identifier;\n        this.pointerDown(event, pointer);\n      };\n\n      proto.pointerDown = function (event, pointer) {\n        this._bindPostStartEvents(event);\n\n        this.emitEvent('pointerDown', [event, pointer]);\n      }; // hash of events to be bound after start event\n\n\n      var postStartEvents = {\n        mousedown: ['mousemove', 'mouseup'],\n        touchstart: ['touchmove', 'touchend', 'touchcancel'],\n        pointerdown: ['pointermove', 'pointerup', 'pointercancel']\n      };\n\n      proto._bindPostStartEvents = function (event) {\n        if (!event) {\n          return;\n        } // get proper events to match start event\n\n\n        var events = postStartEvents[event.type]; // bind events to node\n\n        events.forEach(function (eventName) {\n          window.addEventListener(eventName, this);\n        }, this); // save these arguments\n\n        this._boundPointerEvents = events;\n      };\n\n      proto._unbindPostStartEvents = function () {\n        // check for _boundEvents, in case dragEnd triggered twice (old IE8 bug)\n        if (!this._boundPointerEvents) {\n          return;\n        }\n\n        this._boundPointerEvents.forEach(function (eventName) {\n          window.removeEventListener(eventName, this);\n        }, this);\n\n        delete this._boundPointerEvents;\n      }; // ----- move event ----- //\n\n\n      proto.onmousemove = function (event) {\n        this._pointerMove(event, event);\n      };\n\n      proto.onpointermove = function (event) {\n        if (event.pointerId == this.pointerIdentifier) {\n          this._pointerMove(event, event);\n        }\n      };\n\n      proto.ontouchmove = function (event) {\n        var touch = this.getTouch(event.changedTouches);\n\n        if (touch) {\n          this._pointerMove(event, touch);\n        }\n      };\n      /**\n       * pointer move\n       * @param {Event} event\n       * @param {Event or Touch} pointer\n       * @private\n       */\n\n\n      proto._pointerMove = function (event, pointer) {\n        this.pointerMove(event, pointer);\n      }; // public\n\n\n      proto.pointerMove = function (event, pointer) {\n        this.emitEvent('pointerMove', [event, pointer]);\n      }; // ----- end event ----- //\n\n\n      proto.onmouseup = function (event) {\n        this._pointerUp(event, event);\n      };\n\n      proto.onpointerup = function (event) {\n        if (event.pointerId == this.pointerIdentifier) {\n          this._pointerUp(event, event);\n        }\n      };\n\n      proto.ontouchend = function (event) {\n        var touch = this.getTouch(event.changedTouches);\n\n        if (touch) {\n          this._pointerUp(event, touch);\n        }\n      };\n      /**\n       * pointer up\n       * @param {Event} event\n       * @param {Event or Touch} pointer\n       * @private\n       */\n\n\n      proto._pointerUp = function (event, pointer) {\n        this._pointerDone();\n\n        this.pointerUp(event, pointer);\n      }; // public\n\n\n      proto.pointerUp = function (event, pointer) {\n        this.emitEvent('pointerUp', [event, pointer]);\n      }; // ----- pointer done ----- //\n      // triggered on pointer up & pointer cancel\n\n\n      proto._pointerDone = function () {\n        this._pointerReset();\n\n        this._unbindPostStartEvents();\n\n        this.pointerDone();\n      };\n\n      proto._pointerReset = function () {\n        // reset properties\n        this.isPointerDown = false;\n        delete this.pointerIdentifier;\n      };\n\n      proto.pointerDone = noop; // ----- pointer cancel ----- //\n\n      proto.onpointercancel = function (event) {\n        if (event.pointerId == this.pointerIdentifier) {\n          this._pointerCancel(event, event);\n        }\n      };\n\n      proto.ontouchcancel = function (event) {\n        var touch = this.getTouch(event.changedTouches);\n\n        if (touch) {\n          this._pointerCancel(event, touch);\n        }\n      };\n      /**\n       * pointer cancel\n       * @param {Event} event\n       * @param {Event or Touch} pointer\n       * @private\n       */\n\n\n      proto._pointerCancel = function (event, pointer) {\n        this._pointerDone();\n\n        this.pointerCancel(event, pointer);\n      }; // public\n\n\n      proto.pointerCancel = function (event, pointer) {\n        this.emitEvent('pointerCancel', [event, pointer]);\n      }; // -----  ----- //\n      // utility function for getting x/y coords from event\n\n\n      Unipointer.getPointerPoint = function (pointer) {\n        return {\n          x: pointer.pageX,\n          y: pointer.pageY\n        };\n      }; // -----  ----- //\n\n\n      return Unipointer;\n    });\n  });\n\n  var unidragger = createCommonjsModule(function (module) {\n    /*!\n     * Unidragger v2.3.1\n     * Draggable base class\n     * MIT license\n     */\n\n    /*jshint browser: true, unused: true, undef: true, strict: true */\n    (function (window, factory) {\n      // universal module definition\n\n      /*jshint strict: false */\n\n      /*globals define, module, require */\n      if ( module.exports) {\n        // CommonJS\n        module.exports = factory(window, unipointer);\n      } else {\n        // browser global\n        window.Unidragger = factory(window, window.Unipointer);\n      }\n    })(window, function factory(window, Unipointer) {\n\n      function Unidragger() {} // inherit Unipointer & EvEmitter\n\n\n      var proto = Unidragger.prototype = Object.create(Unipointer.prototype); // ----- bind start ----- //\n\n      proto.bindHandles = function () {\n        this._bindHandles(true);\n      };\n\n      proto.unbindHandles = function () {\n        this._bindHandles(false);\n      };\n      /**\n       * Add or remove start event\n       * @param {Boolean} isAdd\n       */\n\n\n      proto._bindHandles = function (isAdd) {\n        // munge isAdd, default to true\n        isAdd = isAdd === undefined ? true : isAdd; // bind each handle\n\n        var bindMethod = isAdd ? 'addEventListener' : 'removeEventListener';\n        var touchAction = isAdd ? this._touchActionValue : '';\n\n        for (var i = 0; i < this.handles.length; i++) {\n          var handle = this.handles[i];\n\n          this._bindStartEvent(handle, isAdd);\n\n          handle[bindMethod]('click', this); // touch-action: none to override browser touch gestures. metafizzy/flickity#540\n\n          if (window.PointerEvent) {\n            handle.style.touchAction = touchAction;\n          }\n        }\n      }; // prototype so it can be overwriteable by Flickity\n\n\n      proto._touchActionValue = 'none'; // ----- start event ----- //\n\n      /**\n       * pointer start\n       * @param {Event} event\n       * @param {Event or Touch} pointer\n       */\n\n      proto.pointerDown = function (event, pointer) {\n        var isOkay = this.okayPointerDown(event);\n\n        if (!isOkay) {\n          return;\n        } // track start event position\n        // Safari 9 overrides pageX and pageY. These values needs to be copied. flickity#842\n\n\n        this.pointerDownPointer = {\n          pageX: pointer.pageX,\n          pageY: pointer.pageY\n        };\n        event.preventDefault();\n        this.pointerDownBlur(); // bind move and end events\n\n        this._bindPostStartEvents(event);\n\n        this.emitEvent('pointerDown', [event, pointer]);\n      }; // nodes that have text fields\n\n\n      var cursorNodes = {\n        TEXTAREA: true,\n        INPUT: true,\n        SELECT: true,\n        OPTION: true\n      }; // input types that do not have text fields\n\n      var clickTypes = {\n        radio: true,\n        checkbox: true,\n        button: true,\n        submit: true,\n        image: true,\n        file: true\n      }; // dismiss inputs with text fields. flickity#403, flickity#404\n\n      proto.okayPointerDown = function (event) {\n        var isCursorNode = cursorNodes[event.target.nodeName];\n        var isClickType = clickTypes[event.target.type];\n        var isOkay = !isCursorNode || isClickType;\n\n        if (!isOkay) {\n          this._pointerReset();\n        }\n\n        return isOkay;\n      }; // kludge to blur previously focused input\n\n\n      proto.pointerDownBlur = function () {\n        var focused = document.activeElement; // do not blur body for IE10, metafizzy/flickity#117\n\n        var canBlur = focused && focused.blur && focused != document.body;\n\n        if (canBlur) {\n          focused.blur();\n        }\n      }; // ----- move event ----- //\n\n      /**\n       * drag move\n       * @param {Event} event\n       * @param {Event or Touch} pointer\n       */\n\n\n      proto.pointerMove = function (event, pointer) {\n        var moveVector = this._dragPointerMove(event, pointer);\n\n        this.emitEvent('pointerMove', [event, pointer, moveVector]);\n\n        this._dragMove(event, pointer, moveVector);\n      }; // base pointer move logic\n\n\n      proto._dragPointerMove = function (event, pointer) {\n        var moveVector = {\n          x: pointer.pageX - this.pointerDownPointer.pageX,\n          y: pointer.pageY - this.pointerDownPointer.pageY\n        }; // start drag if pointer has moved far enough to start drag\n\n        if (!this.isDragging && this.hasDragStarted(moveVector)) {\n          this._dragStart(event, pointer);\n        }\n\n        return moveVector;\n      }; // condition if pointer has moved far enough to start drag\n\n\n      proto.hasDragStarted = function (moveVector) {\n        return Math.abs(moveVector.x) > 3 || Math.abs(moveVector.y) > 3;\n      }; // ----- end event ----- //\n\n      /**\n       * pointer up\n       * @param {Event} event\n       * @param {Event or Touch} pointer\n       */\n\n\n      proto.pointerUp = function (event, pointer) {\n        this.emitEvent('pointerUp', [event, pointer]);\n\n        this._dragPointerUp(event, pointer);\n      };\n\n      proto._dragPointerUp = function (event, pointer) {\n        if (this.isDragging) {\n          this._dragEnd(event, pointer);\n        } else {\n          // pointer didn't move enough for drag to start\n          this._staticClick(event, pointer);\n        }\n      }; // -------------------------- drag -------------------------- //\n      // dragStart\n\n\n      proto._dragStart = function (event, pointer) {\n        this.isDragging = true; // prevent clicks\n\n        this.isPreventingClicks = true;\n        this.dragStart(event, pointer);\n      };\n\n      proto.dragStart = function (event, pointer) {\n        this.emitEvent('dragStart', [event, pointer]);\n      }; // dragMove\n\n\n      proto._dragMove = function (event, pointer, moveVector) {\n        // do not drag if not dragging yet\n        if (!this.isDragging) {\n          return;\n        }\n\n        this.dragMove(event, pointer, moveVector);\n      };\n\n      proto.dragMove = function (event, pointer, moveVector) {\n        event.preventDefault();\n        this.emitEvent('dragMove', [event, pointer, moveVector]);\n      }; // dragEnd\n\n\n      proto._dragEnd = function (event, pointer) {\n        // set flags\n        this.isDragging = false; // re-enable clicking async\n\n        setTimeout(function () {\n          delete this.isPreventingClicks;\n        }.bind(this));\n        this.dragEnd(event, pointer);\n      };\n\n      proto.dragEnd = function (event, pointer) {\n        this.emitEvent('dragEnd', [event, pointer]);\n      }; // ----- onclick ----- //\n      // handle all clicks and prevent clicks when dragging\n\n\n      proto.onclick = function (event) {\n        if (this.isPreventingClicks) {\n          event.preventDefault();\n        }\n      }; // ----- staticClick ----- //\n      // triggered after pointer down & up with no/tiny movement\n\n\n      proto._staticClick = function (event, pointer) {\n        // ignore emulated mouse up clicks\n        if (this.isIgnoringMouseUp && event.type == 'mouseup') {\n          return;\n        }\n\n        this.staticClick(event, pointer); // set flag for emulated clicks 300ms after touchend\n\n        if (event.type != 'mouseup') {\n          this.isIgnoringMouseUp = true; // reset flag after 300ms\n\n          setTimeout(function () {\n            delete this.isIgnoringMouseUp;\n          }.bind(this), 400);\n        }\n      };\n\n      proto.staticClick = function (event, pointer) {\n        this.emitEvent('staticClick', [event, pointer]);\n      }; // ----- utils ----- //\n\n\n      Unidragger.getPointerPoint = Unipointer.getPointerPoint; // -----  ----- //\n\n      return Unidragger;\n    });\n  });\n\n  var drag = createCommonjsModule(function (module) {\n    // drag\n    (function (window, factory) {\n      // universal module definition\n\n      /* jshint strict: false */\n      if ( module.exports) {\n        // CommonJS\n        module.exports = factory(window, flickity, unidragger, utils);\n      } else {\n        // browser global\n        window.Flickity = factory(window, window.Flickity, window.Unidragger, window.fizzyUIUtils);\n      }\n    })(window, function factory(window, Flickity, Unidragger, utils) {\n\n      utils.extend(Flickity.defaults, {\n        draggable: '>1',\n        dragThreshold: 3\n      }); // ----- create ----- //\n\n      Flickity.createMethods.push('_createDrag'); // -------------------------- drag prototype -------------------------- //\n\n      var proto = Flickity.prototype;\n      utils.extend(proto, Unidragger.prototype);\n      proto._touchActionValue = 'pan-y'; // --------------------------  -------------------------- //\n\n      var isTouch = ('createTouch' in document);\n      var isTouchmoveScrollCanceled = false;\n\n      proto._createDrag = function () {\n        this.on('activate', this.onActivateDrag);\n        this.on('uiChange', this._uiChangeDrag);\n        this.on('deactivate', this.onDeactivateDrag);\n        this.on('cellChange', this.updateDraggable); // TODO updateDraggable on resize? if groupCells & slides change\n        // HACK - add seemingly innocuous handler to fix iOS 10 scroll behavior\n        // #457, RubaXa/Sortable#973\n\n        if (isTouch && !isTouchmoveScrollCanceled) {\n          window.addEventListener('touchmove', function () {});\n          isTouchmoveScrollCanceled = true;\n        }\n      };\n\n      proto.onActivateDrag = function () {\n        this.handles = [this.viewport];\n        this.bindHandles();\n        this.updateDraggable();\n      };\n\n      proto.onDeactivateDrag = function () {\n        this.unbindHandles();\n        this.element.classList.remove('is-draggable');\n      };\n\n      proto.updateDraggable = function () {\n        // disable dragging if less than 2 slides. #278\n        if (this.options.draggable == '>1') {\n          this.isDraggable = this.slides.length > 1;\n        } else {\n          this.isDraggable = this.options.draggable;\n        }\n\n        if (this.isDraggable) {\n          this.element.classList.add('is-draggable');\n        } else {\n          this.element.classList.remove('is-draggable');\n        }\n      }; // backwards compatibility\n\n\n      proto.bindDrag = function () {\n        this.options.draggable = true;\n        this.updateDraggable();\n      };\n\n      proto.unbindDrag = function () {\n        this.options.draggable = false;\n        this.updateDraggable();\n      };\n\n      proto._uiChangeDrag = function () {\n        delete this.isFreeScrolling;\n      }; // -------------------------- pointer events -------------------------- //\n\n\n      proto.pointerDown = function (event, pointer) {\n        if (!this.isDraggable) {\n          this._pointerDownDefault(event, pointer);\n\n          return;\n        }\n\n        var isOkay = this.okayPointerDown(event);\n\n        if (!isOkay) {\n          return;\n        }\n\n        this._pointerDownPreventDefault(event);\n\n        this.pointerDownFocus(event); // blur\n\n        if (document.activeElement != this.element) {\n          // do not blur if already focused\n          this.pointerDownBlur();\n        } // stop if it was moving\n\n\n        this.dragX = this.x;\n        this.viewport.classList.add('is-pointer-down'); // track scrolling\n\n        this.pointerDownScroll = getScrollPosition();\n        window.addEventListener('scroll', this);\n\n        this._pointerDownDefault(event, pointer);\n      }; // default pointerDown logic, used for staticClick\n\n\n      proto._pointerDownDefault = function (event, pointer) {\n        // track start event position\n        // Safari 9 overrides pageX and pageY. These values needs to be copied. #779\n        this.pointerDownPointer = {\n          pageX: pointer.pageX,\n          pageY: pointer.pageY\n        }; // bind move and end events\n\n        this._bindPostStartEvents(event);\n\n        this.dispatchEvent('pointerDown', event, [pointer]);\n      };\n\n      var focusNodes = {\n        INPUT: true,\n        TEXTAREA: true,\n        SELECT: true\n      };\n\n      proto.pointerDownFocus = function (event) {\n        var isFocusNode = focusNodes[event.target.nodeName];\n\n        if (!isFocusNode) {\n          this.focus();\n        }\n      };\n\n      proto._pointerDownPreventDefault = function (event) {\n        var isTouchStart = event.type == 'touchstart';\n        var isTouchPointer = event.pointerType == 'touch';\n        var isFocusNode = focusNodes[event.target.nodeName];\n\n        if (!isTouchStart && !isTouchPointer && !isFocusNode) {\n          event.preventDefault();\n        }\n      }; // ----- move ----- //\n\n\n      proto.hasDragStarted = function (moveVector) {\n        return Math.abs(moveVector.x) > this.options.dragThreshold;\n      }; // ----- up ----- //\n\n\n      proto.pointerUp = function (event, pointer) {\n        delete this.isTouchScrolling;\n        this.viewport.classList.remove('is-pointer-down');\n        this.dispatchEvent('pointerUp', event, [pointer]);\n\n        this._dragPointerUp(event, pointer);\n      };\n\n      proto.pointerDone = function () {\n        window.removeEventListener('scroll', this);\n        delete this.pointerDownScroll;\n      }; // -------------------------- dragging -------------------------- //\n\n\n      proto.dragStart = function (event, pointer) {\n        if (!this.isDraggable) {\n          return;\n        }\n\n        this.dragStartPosition = this.x;\n        this.startAnimation();\n        window.removeEventListener('scroll', this);\n        this.dispatchEvent('dragStart', event, [pointer]);\n      };\n\n      proto.pointerMove = function (event, pointer) {\n        var moveVector = this._dragPointerMove(event, pointer);\n\n        this.dispatchEvent('pointerMove', event, [pointer, moveVector]);\n\n        this._dragMove(event, pointer, moveVector);\n      };\n\n      proto.dragMove = function (event, pointer, moveVector) {\n        if (!this.isDraggable) {\n          return;\n        }\n\n        event.preventDefault();\n        this.previousDragX = this.dragX; // reverse if right-to-left\n\n        var direction = this.options.rightToLeft ? -1 : 1;\n\n        if (this.options.wrapAround) {\n          // wrap around move. #589\n          moveVector.x = moveVector.x % this.slideableWidth;\n        }\n\n        var dragX = this.dragStartPosition + moveVector.x * direction;\n\n        if (!this.options.wrapAround && this.slides.length) {\n          // slow drag\n          var originBound = Math.max(-this.slides[0].target, this.dragStartPosition);\n          dragX = dragX > originBound ? (dragX + originBound) * 0.5 : dragX;\n          var endBound = Math.min(-this.getLastSlide().target, this.dragStartPosition);\n          dragX = dragX < endBound ? (dragX + endBound) * 0.5 : dragX;\n        }\n\n        this.dragX = dragX;\n        this.dragMoveTime = new Date();\n        this.dispatchEvent('dragMove', event, [pointer, moveVector]);\n      };\n\n      proto.dragEnd = function (event, pointer) {\n        if (!this.isDraggable) {\n          return;\n        }\n\n        if (this.options.freeScroll) {\n          this.isFreeScrolling = true;\n        } // set selectedIndex based on where flick will end up\n\n\n        var index = this.dragEndRestingSelect();\n\n        if (this.options.freeScroll && !this.options.wrapAround) {\n          // if free-scroll & not wrap around\n          // do not free-scroll if going outside of bounding slides\n          // so bounding slides can attract slider, and keep it in bounds\n          var restingX = this.getRestingPosition();\n          this.isFreeScrolling = -restingX > this.slides[0].target && -restingX < this.getLastSlide().target;\n        } else if (!this.options.freeScroll && index == this.selectedIndex) {\n          // boost selection if selected index has not changed\n          index += this.dragEndBoostSelect();\n        }\n\n        delete this.previousDragX; // apply selection\n        // TODO refactor this, selecting here feels weird\n        // HACK, set flag so dragging stays in correct direction\n\n        this.isDragSelect = this.options.wrapAround;\n        this.select(index);\n        delete this.isDragSelect;\n        this.dispatchEvent('dragEnd', event, [pointer]);\n      };\n\n      proto.dragEndRestingSelect = function () {\n        var restingX = this.getRestingPosition(); // how far away from selected slide\n\n        var distance = Math.abs(this.getSlideDistance(-restingX, this.selectedIndex)); // get closet resting going up and going down\n\n        var positiveResting = this._getClosestResting(restingX, distance, 1);\n\n        var negativeResting = this._getClosestResting(restingX, distance, -1); // use closer resting for wrap-around\n\n\n        var index = positiveResting.distance < negativeResting.distance ? positiveResting.index : negativeResting.index;\n        return index;\n      };\n      /**\n       * given resting X and distance to selected cell\n       * get the distance and index of the closest cell\n       * @param {Number} restingX - estimated post-flick resting position\n       * @param {Number} distance - distance to selected cell\n       * @param {Integer} increment - +1 or -1, going up or down\n       * @returns {Object} - { distance: {Number}, index: {Integer} }\n       */\n\n\n      proto._getClosestResting = function (restingX, distance, increment) {\n        var index = this.selectedIndex;\n        var minDistance = Infinity;\n        var condition = this.options.contain && !this.options.wrapAround ? // if contain, keep going if distance is equal to minDistance\n        function (d, md) {\n          return d <= md;\n        } : function (d, md) {\n          return d < md;\n        };\n\n        while (condition(distance, minDistance)) {\n          // measure distance to next cell\n          index += increment;\n          minDistance = distance;\n          distance = this.getSlideDistance(-restingX, index);\n\n          if (distance === null) {\n            break;\n          }\n\n          distance = Math.abs(distance);\n        }\n\n        return {\n          distance: minDistance,\n          // selected was previous index\n          index: index - increment\n        };\n      };\n      /**\n       * measure distance between x and a slide target\n       * @param {Number} x\n       * @param {Integer} index - slide index\n       */\n\n\n      proto.getSlideDistance = function (x, index) {\n        var len = this.slides.length; // wrap around if at least 2 slides\n\n        var isWrapAround = this.options.wrapAround && len > 1;\n        var slideIndex = isWrapAround ? utils.modulo(index, len) : index;\n        var slide = this.slides[slideIndex];\n\n        if (!slide) {\n          return null;\n        } // add distance for wrap-around slides\n\n\n        var wrap = isWrapAround ? this.slideableWidth * Math.floor(index / len) : 0;\n        return x - (slide.target + wrap);\n      };\n\n      proto.dragEndBoostSelect = function () {\n        // do not boost if no previousDragX or dragMoveTime\n        if (this.previousDragX === undefined || !this.dragMoveTime || // or if drag was held for 100 ms\n        new Date() - this.dragMoveTime > 100) {\n          return 0;\n        }\n\n        var distance = this.getSlideDistance(-this.dragX, this.selectedIndex);\n        var delta = this.previousDragX - this.dragX;\n\n        if (distance > 0 && delta > 0) {\n          // boost to next if moving towards the right, and positive velocity\n          return 1;\n        } else if (distance < 0 && delta < 0) {\n          // boost to previous if moving towards the left, and negative velocity\n          return -1;\n        }\n\n        return 0;\n      }; // ----- staticClick ----- //\n\n\n      proto.staticClick = function (event, pointer) {\n        // get clickedCell, if cell was clicked\n        var clickedCell = this.getParentCell(event.target);\n        var cellElem = clickedCell && clickedCell.element;\n        var cellIndex = clickedCell && this.cells.indexOf(clickedCell);\n        this.dispatchEvent('staticClick', event, [pointer, cellElem, cellIndex]);\n      }; // ----- scroll ----- //\n\n\n      proto.onscroll = function () {\n        var scroll = getScrollPosition();\n        var scrollMoveX = this.pointerDownScroll.x - scroll.x;\n        var scrollMoveY = this.pointerDownScroll.y - scroll.y; // cancel click/tap if scroll is too much\n\n        if (Math.abs(scrollMoveX) > 3 || Math.abs(scrollMoveY) > 3) {\n          this._pointerDone();\n        }\n      }; // ----- utils ----- //\n\n\n      function getScrollPosition() {\n        return {\n          x: window.pageXOffset,\n          y: window.pageYOffset\n        };\n      } // -----  ----- //\n\n\n      return Flickity;\n    });\n  });\n\n  var prevNextButton = createCommonjsModule(function (module) {\n    // prev/next buttons\n    (function (window, factory) {\n      // universal module definition\n\n      /* jshint strict: false */\n      if ( module.exports) {\n        // CommonJS\n        module.exports = factory(window, flickity, unipointer, utils);\n      } else {\n        // browser global\n        factory(window, window.Flickity, window.Unipointer, window.fizzyUIUtils);\n      }\n    })(window, function factory(window, Flickity, Unipointer, utils) {\n\n      var svgURI = 'http://www.w3.org/2000/svg'; // -------------------------- PrevNextButton -------------------------- //\n\n      function PrevNextButton(direction, parent) {\n        this.direction = direction;\n        this.parent = parent;\n\n        this._create();\n      }\n\n      PrevNextButton.prototype = Object.create(Unipointer.prototype);\n\n      PrevNextButton.prototype._create = function () {\n        // properties\n        this.isEnabled = true;\n        this.isPrevious = this.direction == -1;\n        var leftDirection = this.parent.options.rightToLeft ? 1 : -1;\n        this.isLeft = this.direction == leftDirection;\n        var element = this.element = document.createElement('button');\n        element.className = 'flickity-button flickity-prev-next-button';\n        element.className += this.isPrevious ? ' previous' : ' next'; // prevent button from submitting form http://stackoverflow.com/a/10836076/182183\n\n        element.setAttribute('type', 'button'); // init as disabled\n\n        this.disable();\n        element.setAttribute('aria-label', this.isPrevious ? 'Previous' : 'Next'); // create arrow\n\n        var svg = this.createSVG();\n        element.appendChild(svg); // events\n\n        this.parent.on('select', this.update.bind(this));\n        this.on('pointerDown', this.parent.childUIPointerDown.bind(this.parent));\n      };\n\n      PrevNextButton.prototype.activate = function () {\n        this.bindStartEvent(this.element);\n        this.element.addEventListener('click', this); // add to DOM\n\n        this.parent.element.appendChild(this.element);\n      };\n\n      PrevNextButton.prototype.deactivate = function () {\n        // remove from DOM\n        this.parent.element.removeChild(this.element); // click events\n\n        this.unbindStartEvent(this.element);\n        this.element.removeEventListener('click', this);\n      };\n\n      PrevNextButton.prototype.createSVG = function () {\n        var svg = document.createElementNS(svgURI, 'svg');\n        svg.setAttribute('class', 'flickity-button-icon');\n        svg.setAttribute('viewBox', '0 0 100 100');\n        var path = document.createElementNS(svgURI, 'path');\n        var pathMovements = getArrowMovements(this.parent.options.arrowShape);\n        path.setAttribute('d', pathMovements);\n        path.setAttribute('class', 'arrow'); // rotate arrow\n\n        if (!this.isLeft) {\n          path.setAttribute('transform', 'translate(100, 100) rotate(180) ');\n        }\n\n        svg.appendChild(path);\n        return svg;\n      }; // get SVG path movmement\n\n\n      function getArrowMovements(shape) {\n        // use shape as movement if string\n        if (typeof shape == 'string') {\n          return shape;\n        } // create movement string\n\n\n        return 'M ' + shape.x0 + ',50' + ' L ' + shape.x1 + ',' + (shape.y1 + 50) + ' L ' + shape.x2 + ',' + (shape.y2 + 50) + ' L ' + shape.x3 + ',50 ' + ' L ' + shape.x2 + ',' + (50 - shape.y2) + ' L ' + shape.x1 + ',' + (50 - shape.y1) + ' Z';\n      }\n\n      PrevNextButton.prototype.handleEvent = utils.handleEvent;\n\n      PrevNextButton.prototype.onclick = function () {\n        if (!this.isEnabled) {\n          return;\n        }\n\n        this.parent.uiChange();\n        var method = this.isPrevious ? 'previous' : 'next';\n        this.parent[method]();\n      }; // -----  ----- //\n\n\n      PrevNextButton.prototype.enable = function () {\n        if (this.isEnabled) {\n          return;\n        }\n\n        this.element.disabled = false;\n        this.isEnabled = true;\n      };\n\n      PrevNextButton.prototype.disable = function () {\n        if (!this.isEnabled) {\n          return;\n        }\n\n        this.element.disabled = true;\n        this.isEnabled = false;\n      };\n\n      PrevNextButton.prototype.update = function () {\n        // index of first or last slide, if previous or next\n        var slides = this.parent.slides; // enable is wrapAround and at least 2 slides\n\n        if (this.parent.options.wrapAround && slides.length > 1) {\n          this.enable();\n          return;\n        }\n\n        var lastIndex = slides.length ? slides.length - 1 : 0;\n        var boundIndex = this.isPrevious ? 0 : lastIndex;\n        var method = this.parent.selectedIndex == boundIndex ? 'disable' : 'enable';\n        this[method]();\n      };\n\n      PrevNextButton.prototype.destroy = function () {\n        this.deactivate();\n        this.allOff();\n      }; // -------------------------- Flickity prototype -------------------------- //\n\n\n      utils.extend(Flickity.defaults, {\n        prevNextButtons: true,\n        arrowShape: {\n          x0: 10,\n          x1: 60,\n          y1: 50,\n          x2: 70,\n          y2: 40,\n          x3: 30\n        }\n      });\n      Flickity.createMethods.push('_createPrevNextButtons');\n      var proto = Flickity.prototype;\n\n      proto._createPrevNextButtons = function () {\n        if (!this.options.prevNextButtons) {\n          return;\n        }\n\n        this.prevButton = new PrevNextButton(-1, this);\n        this.nextButton = new PrevNextButton(1, this);\n        this.on('activate', this.activatePrevNextButtons);\n      };\n\n      proto.activatePrevNextButtons = function () {\n        this.prevButton.activate();\n        this.nextButton.activate();\n        this.on('deactivate', this.deactivatePrevNextButtons);\n      };\n\n      proto.deactivatePrevNextButtons = function () {\n        this.prevButton.deactivate();\n        this.nextButton.deactivate();\n        this.off('deactivate', this.deactivatePrevNextButtons);\n      }; // --------------------------  -------------------------- //\n\n\n      Flickity.PrevNextButton = PrevNextButton;\n      return Flickity;\n    });\n  });\n\n  var pageDots = createCommonjsModule(function (module) {\n    // page dots\n    (function (window, factory) {\n      // universal module definition\n\n      /* jshint strict: false */\n      if ( module.exports) {\n        // CommonJS\n        module.exports = factory(window, flickity, unipointer, utils);\n      } else {\n        // browser global\n        factory(window, window.Flickity, window.Unipointer, window.fizzyUIUtils);\n      }\n    })(window, function factory(window, Flickity, Unipointer, utils) {\n\n      function PageDots(parent) {\n        this.parent = parent;\n\n        this._create();\n      }\n\n      PageDots.prototype = Object.create(Unipointer.prototype);\n\n      PageDots.prototype._create = function () {\n        // create holder element\n        this.holder = document.createElement('ol');\n        this.holder.className = 'flickity-page-dots'; // create dots, array of elements\n\n        this.dots = []; // events\n\n        this.handleClick = this.onClick.bind(this);\n        this.on('pointerDown', this.parent.childUIPointerDown.bind(this.parent));\n      };\n\n      PageDots.prototype.activate = function () {\n        this.setDots();\n        this.holder.addEventListener('click', this.handleClick);\n        this.bindStartEvent(this.holder); // add to DOM\n\n        this.parent.element.appendChild(this.holder);\n      };\n\n      PageDots.prototype.deactivate = function () {\n        this.holder.removeEventListener('click', this.handleClick);\n        this.unbindStartEvent(this.holder); // remove from DOM\n\n        this.parent.element.removeChild(this.holder);\n      };\n\n      PageDots.prototype.setDots = function () {\n        // get difference between number of slides and number of dots\n        var delta = this.parent.slides.length - this.dots.length;\n\n        if (delta > 0) {\n          this.addDots(delta);\n        } else if (delta < 0) {\n          this.removeDots(-delta);\n        }\n      };\n\n      PageDots.prototype.addDots = function (count) {\n        var fragment = document.createDocumentFragment();\n        var newDots = [];\n        var length = this.dots.length;\n        var max = length + count;\n\n        for (var i = length; i < max; i++) {\n          var dot = document.createElement('li');\n          dot.className = 'dot';\n          dot.setAttribute('aria-label', 'Page dot ' + (i + 1));\n          fragment.appendChild(dot);\n          newDots.push(dot);\n        }\n\n        this.holder.appendChild(fragment);\n        this.dots = this.dots.concat(newDots);\n      };\n\n      PageDots.prototype.removeDots = function (count) {\n        // remove from this.dots collection\n        var removeDots = this.dots.splice(this.dots.length - count, count); // remove from DOM\n\n        removeDots.forEach(function (dot) {\n          this.holder.removeChild(dot);\n        }, this);\n      };\n\n      PageDots.prototype.updateSelected = function () {\n        // remove selected class on previous\n        if (this.selectedDot) {\n          this.selectedDot.className = 'dot';\n          this.selectedDot.removeAttribute('aria-current');\n        } // don't proceed if no dots\n\n\n        if (!this.dots.length) {\n          return;\n        }\n\n        this.selectedDot = this.dots[this.parent.selectedIndex];\n        this.selectedDot.className = 'dot is-selected';\n        this.selectedDot.setAttribute('aria-current', 'step');\n      };\n\n      PageDots.prototype.onTap = // old method name, backwards-compatible\n      PageDots.prototype.onClick = function (event) {\n        var target = event.target; // only care about dot clicks\n\n        if (target.nodeName != 'LI') {\n          return;\n        }\n\n        this.parent.uiChange();\n        var index = this.dots.indexOf(target);\n        this.parent.select(index);\n      };\n\n      PageDots.prototype.destroy = function () {\n        this.deactivate();\n        this.allOff();\n      };\n\n      Flickity.PageDots = PageDots; // -------------------------- Flickity -------------------------- //\n\n      utils.extend(Flickity.defaults, {\n        pageDots: true\n      });\n      Flickity.createMethods.push('_createPageDots');\n      var proto = Flickity.prototype;\n\n      proto._createPageDots = function () {\n        if (!this.options.pageDots) {\n          return;\n        }\n\n        this.pageDots = new PageDots(this); // events\n\n        this.on('activate', this.activatePageDots);\n        this.on('select', this.updateSelectedPageDots);\n        this.on('cellChange', this.updatePageDots);\n        this.on('resize', this.updatePageDots);\n        this.on('deactivate', this.deactivatePageDots);\n      };\n\n      proto.activatePageDots = function () {\n        this.pageDots.activate();\n      };\n\n      proto.updateSelectedPageDots = function () {\n        this.pageDots.updateSelected();\n      };\n\n      proto.updatePageDots = function () {\n        this.pageDots.setDots();\n      };\n\n      proto.deactivatePageDots = function () {\n        this.pageDots.deactivate();\n      }; // -----  ----- //\n\n\n      Flickity.PageDots = PageDots;\n      return Flickity;\n    });\n  });\n\n  var player = createCommonjsModule(function (module) {\n    // player & autoPlay\n    (function (window, factory) {\n      // universal module definition\n\n      /* jshint strict: false */\n      if ( module.exports) {\n        // CommonJS\n        module.exports = factory(evEmitter, utils, flickity);\n      } else {\n        // browser global\n        factory(window.EvEmitter, window.fizzyUIUtils, window.Flickity);\n      }\n    })(window, function factory(EvEmitter, utils, Flickity) {\n\n      function Player(parent) {\n        this.parent = parent;\n        this.state = 'stopped'; // visibility change event handler\n\n        this.onVisibilityChange = this.visibilityChange.bind(this);\n        this.onVisibilityPlay = this.visibilityPlay.bind(this);\n      }\n\n      Player.prototype = Object.create(EvEmitter.prototype); // start play\n\n      Player.prototype.play = function () {\n        if (this.state == 'playing') {\n          return;\n        } // do not play if page is hidden, start playing when page is visible\n\n\n        var isPageHidden = document.hidden;\n\n        if (isPageHidden) {\n          document.addEventListener('visibilitychange', this.onVisibilityPlay);\n          return;\n        }\n\n        this.state = 'playing'; // listen to visibility change\n\n        document.addEventListener('visibilitychange', this.onVisibilityChange); // start ticking\n\n        this.tick();\n      };\n\n      Player.prototype.tick = function () {\n        // do not tick if not playing\n        if (this.state != 'playing') {\n          return;\n        }\n\n        var time = this.parent.options.autoPlay; // default to 3 seconds\n\n        time = typeof time == 'number' ? time : 3000;\n\n        var _this = this; // HACK: reset ticks if stopped and started within interval\n\n\n        this.clear();\n        this.timeout = setTimeout(function () {\n          _this.parent.next(true);\n\n          _this.tick();\n        }, time);\n      };\n\n      Player.prototype.stop = function () {\n        this.state = 'stopped';\n        this.clear(); // remove visibility change event\n\n        document.removeEventListener('visibilitychange', this.onVisibilityChange);\n      };\n\n      Player.prototype.clear = function () {\n        clearTimeout(this.timeout);\n      };\n\n      Player.prototype.pause = function () {\n        if (this.state == 'playing') {\n          this.state = 'paused';\n          this.clear();\n        }\n      };\n\n      Player.prototype.unpause = function () {\n        // re-start play if paused\n        if (this.state == 'paused') {\n          this.play();\n        }\n      }; // pause if page visibility is hidden, unpause if visible\n\n\n      Player.prototype.visibilityChange = function () {\n        var isPageHidden = document.hidden;\n        this[isPageHidden ? 'pause' : 'unpause']();\n      };\n\n      Player.prototype.visibilityPlay = function () {\n        this.play();\n        document.removeEventListener('visibilitychange', this.onVisibilityPlay);\n      }; // -------------------------- Flickity -------------------------- //\n\n\n      utils.extend(Flickity.defaults, {\n        pauseAutoPlayOnHover: true\n      });\n      Flickity.createMethods.push('_createPlayer');\n      var proto = Flickity.prototype;\n\n      proto._createPlayer = function () {\n        this.player = new Player(this);\n        this.on('activate', this.activatePlayer);\n        this.on('uiChange', this.stopPlayer);\n        this.on('pointerDown', this.stopPlayer);\n        this.on('deactivate', this.deactivatePlayer);\n      };\n\n      proto.activatePlayer = function () {\n        if (!this.options.autoPlay) {\n          return;\n        }\n\n        this.player.play();\n        this.element.addEventListener('mouseenter', this);\n      }; // Player API, don't hate the ... thanks I know where the door is\n\n\n      proto.playPlayer = function () {\n        this.player.play();\n      };\n\n      proto.stopPlayer = function () {\n        this.player.stop();\n      };\n\n      proto.pausePlayer = function () {\n        this.player.pause();\n      };\n\n      proto.unpausePlayer = function () {\n        this.player.unpause();\n      };\n\n      proto.deactivatePlayer = function () {\n        this.player.stop();\n        this.element.removeEventListener('mouseenter', this);\n      }; // ----- mouseenter/leave ----- //\n      // pause auto-play on hover\n\n\n      proto.onmouseenter = function () {\n        if (!this.options.pauseAutoPlayOnHover) {\n          return;\n        }\n\n        this.player.pause();\n        this.element.addEventListener('mouseleave', this);\n      }; // resume auto-play on hover off\n\n\n      proto.onmouseleave = function () {\n        this.player.unpause();\n        this.element.removeEventListener('mouseleave', this);\n      }; // -----  ----- //\n\n\n      Flickity.Player = Player;\n      return Flickity;\n    });\n  });\n\n  var addRemoveCell = createCommonjsModule(function (module) {\n    // add, remove cell\n    (function (window, factory) {\n      // universal module definition\n\n      /* jshint strict: false */\n      if ( module.exports) {\n        // CommonJS\n        module.exports = factory(window, flickity, utils);\n      } else {\n        // browser global\n        factory(window, window.Flickity, window.fizzyUIUtils);\n      }\n    })(window, function factory(window, Flickity, utils) {\n\n      function getCellsFragment(cells) {\n        var fragment = document.createDocumentFragment();\n        cells.forEach(function (cell) {\n          fragment.appendChild(cell.element);\n        });\n        return fragment;\n      } // -------------------------- add/remove cell prototype -------------------------- //\n\n\n      var proto = Flickity.prototype;\n      /**\n       * Insert, prepend, or append cells\n       * @param {Element, Array, NodeList} elems\n       * @param {Integer} index\n       */\n\n      proto.insert = function (elems, index) {\n        var cells = this._makeCells(elems);\n\n        if (!cells || !cells.length) {\n          return;\n        }\n\n        var len = this.cells.length; // default to append\n\n        index = index === undefined ? len : index; // add cells with document fragment\n\n        var fragment = getCellsFragment(cells); // append to slider\n\n        var isAppend = index == len;\n\n        if (isAppend) {\n          this.slider.appendChild(fragment);\n        } else {\n          var insertCellElement = this.cells[index].element;\n          this.slider.insertBefore(fragment, insertCellElement);\n        } // add to this.cells\n\n\n        if (index === 0) {\n          // prepend, add to start\n          this.cells = cells.concat(this.cells);\n        } else if (isAppend) {\n          // append, add to end\n          this.cells = this.cells.concat(cells);\n        } else {\n          // insert in this.cells\n          var endCells = this.cells.splice(index, len - index);\n          this.cells = this.cells.concat(cells).concat(endCells);\n        }\n\n        this._sizeCells(cells);\n\n        this.cellChange(index, true);\n      };\n\n      proto.append = function (elems) {\n        this.insert(elems, this.cells.length);\n      };\n\n      proto.prepend = function (elems) {\n        this.insert(elems, 0);\n      };\n      /**\n       * Remove cells\n       * @param {Element, Array, NodeList} elems\n       */\n\n\n      proto.remove = function (elems) {\n        var cells = this.getCells(elems);\n\n        if (!cells || !cells.length) {\n          return;\n        }\n\n        var minCellIndex = this.cells.length - 1; // remove cells from collection & DOM\n\n        cells.forEach(function (cell) {\n          cell.remove();\n          var index = this.cells.indexOf(cell);\n          minCellIndex = Math.min(index, minCellIndex);\n          utils.removeFrom(this.cells, cell);\n        }, this);\n        this.cellChange(minCellIndex, true);\n      };\n      /**\n       * logic to be run after a cell's size changes\n       * @param {Element} elem - cell's element\n       */\n\n\n      proto.cellSizeChange = function (elem) {\n        var cell = this.getCell(elem);\n\n        if (!cell) {\n          return;\n        }\n\n        cell.getSize();\n        var index = this.cells.indexOf(cell);\n        this.cellChange(index);\n      };\n      /**\n       * logic any time a cell is changed: added, removed, or size changed\n       * @param {Integer} changedCellIndex - index of the changed cell, optional\n       */\n\n\n      proto.cellChange = function (changedCellIndex, isPositioningSlider) {\n        var prevSelectedElem = this.selectedElement;\n\n        this._positionCells(changedCellIndex);\n\n        this._getWrapShiftCells();\n\n        this.setGallerySize(); // update selectedIndex\n        // try to maintain position & select previous selected element\n\n        var cell = this.getCell(prevSelectedElem);\n\n        if (cell) {\n          this.selectedIndex = this.getCellSlideIndex(cell);\n        }\n\n        this.selectedIndex = Math.min(this.slides.length - 1, this.selectedIndex);\n        this.emitEvent('cellChange', [changedCellIndex]); // position slider\n\n        this.select(this.selectedIndex); // do not position slider after lazy load\n\n        if (isPositioningSlider) {\n          this.positionSliderAtSelected();\n        }\n      }; // -----  ----- //\n\n\n      return Flickity;\n    });\n  });\n\n  var lazyload = createCommonjsModule(function (module) {\n    // lazyload\n    (function (window, factory) {\n      // universal module definition\n\n      /* jshint strict: false */\n      if ( module.exports) {\n        // CommonJS\n        module.exports = factory(window, flickity, utils);\n      } else {\n        // browser global\n        factory(window, window.Flickity, window.fizzyUIUtils);\n      }\n    })(window, function factory(window, Flickity, utils) {\n\n      Flickity.createMethods.push('_createLazyload');\n      var proto = Flickity.prototype;\n\n      proto._createLazyload = function () {\n        this.on('select', this.lazyLoad);\n      };\n\n      proto.lazyLoad = function () {\n        var lazyLoad = this.options.lazyLoad;\n\n        if (!lazyLoad) {\n          return;\n        } // get adjacent cells, use lazyLoad option for adjacent count\n\n\n        var adjCount = typeof lazyLoad == 'number' ? lazyLoad : 0;\n        var cellElems = this.getAdjacentCellElements(adjCount); // get lazy images in those cells\n\n        var lazyImages = [];\n        cellElems.forEach(function (cellElem) {\n          var lazyCellImages = getCellLazyImages(cellElem);\n          lazyImages = lazyImages.concat(lazyCellImages);\n        }); // load lazy images\n\n        lazyImages.forEach(function (img) {\n          new LazyLoader(img, this);\n        }, this);\n      };\n\n      function getCellLazyImages(cellElem) {\n        // check if cell element is lazy image\n        if (cellElem.nodeName == 'IMG') {\n          var lazyloadAttr = cellElem.getAttribute('data-flickity-lazyload');\n          var srcAttr = cellElem.getAttribute('data-flickity-lazyload-src');\n          var srcsetAttr = cellElem.getAttribute('data-flickity-lazyload-srcset');\n\n          if (lazyloadAttr || srcAttr || srcsetAttr) {\n            return [cellElem];\n          }\n        } // select lazy images in cell\n\n\n        var lazySelector = 'img[data-flickity-lazyload], ' + 'img[data-flickity-lazyload-src], img[data-flickity-lazyload-srcset]';\n        var imgs = cellElem.querySelectorAll(lazySelector);\n        return utils.makeArray(imgs);\n      } // -------------------------- LazyLoader -------------------------- //\n\n      /**\n       * class to handle loading images\n       */\n\n\n      function LazyLoader(img, flickity) {\n        this.img = img;\n        this.flickity = flickity;\n        this.load();\n      }\n\n      LazyLoader.prototype.handleEvent = utils.handleEvent;\n\n      LazyLoader.prototype.load = function () {\n        this.img.addEventListener('load', this);\n        this.img.addEventListener('error', this); // get src & srcset\n\n        var src = this.img.getAttribute('data-flickity-lazyload') || this.img.getAttribute('data-flickity-lazyload-src');\n        var srcset = this.img.getAttribute('data-flickity-lazyload-srcset'); // set src & serset\n\n        this.img.src = src;\n\n        if (srcset) {\n          this.img.setAttribute('srcset', srcset);\n        } // remove attr\n\n\n        this.img.removeAttribute('data-flickity-lazyload');\n        this.img.removeAttribute('data-flickity-lazyload-src');\n        this.img.removeAttribute('data-flickity-lazyload-srcset');\n      };\n\n      LazyLoader.prototype.onload = function (event) {\n        this.complete(event, 'flickity-lazyloaded');\n      };\n\n      LazyLoader.prototype.onerror = function (event) {\n        this.complete(event, 'flickity-lazyerror');\n      };\n\n      LazyLoader.prototype.complete = function (event, className) {\n        // unbind events\n        this.img.removeEventListener('load', this);\n        this.img.removeEventListener('error', this);\n        var cell = this.flickity.getParentCell(this.img);\n        var cellElem = cell && cell.element;\n        this.flickity.cellSizeChange(cellElem);\n        this.img.classList.add(className);\n        this.flickity.dispatchEvent('lazyLoad', event, cellElem);\n      }; // -----  ----- //\n\n\n      Flickity.LazyLoader = LazyLoader;\n      return Flickity;\n    });\n  });\n\n  var js = createCommonjsModule(function (module) {\n    /*!\n     * Flickity v2.2.1\n     * Touch, responsive, flickable carousels\n     *\n     * Licensed GPLv3 for open source use\n     * or Flickity Commercial License for commercial use\n     *\n     * https://flickity.metafizzy.co\n     * Copyright 2015-2019 Metafizzy\n     */\n    (function (window, factory) {\n      // universal module definition\n\n      /* jshint strict: false */\n      if ( module.exports) {\n        // CommonJS\n        module.exports = factory(flickity, drag, prevNextButton, pageDots, player, addRemoveCell, lazyload);\n      }\n    })(window, function factory(Flickity) {\n      /*jshint strict: false*/\n      return Flickity;\n    });\n  });\n\n  var flickityFade = createCommonjsModule(function (module) {\n    /**\n     * Flickity fade v1.0.0\n     * Fade between Flickity slides\n     */\n\n    /* jshint browser: true, undef: true, unused: true */\n    (function (window, factory) {\n      // universal module definition\n\n      /*globals define, module, require */\n      if ( module.exports) {\n        // CommonJS\n        module.exports = factory(js, utils);\n      } else {\n        // browser global\n        factory(window.Flickity, window.fizzyUIUtils);\n      }\n    })(commonjsGlobal, function factory(Flickity, utils) {\n      // ---- Slide ---- //\n      var Slide = Flickity.Slide;\n      var slideUpdateTarget = Slide.prototype.updateTarget;\n\n      Slide.prototype.updateTarget = function () {\n        slideUpdateTarget.apply(this, arguments);\n\n        if (!this.parent.options.fade) {\n          return;\n        } // position cells at selected target\n\n\n        var slideTargetX = this.target - this.x;\n        var firstCellX = this.cells[0].x;\n        this.cells.forEach(function (cell) {\n          var targetX = cell.x - firstCellX - slideTargetX;\n          cell.renderPosition(targetX);\n        });\n      };\n\n      Slide.prototype.setOpacity = function (alpha) {\n        this.cells.forEach(function (cell) {\n          cell.element.style.opacity = alpha;\n        });\n      }; // ---- Flickity ---- //\n\n\n      var proto = Flickity.prototype;\n      Flickity.createMethods.push('_createFade');\n\n      proto._createFade = function () {\n        this.fadeIndex = this.selectedIndex;\n        this.prevSelectedIndex = this.selectedIndex;\n        this.on('select', this.onSelectFade);\n        this.on('dragEnd', this.onDragEndFade);\n        this.on('settle', this.onSettleFade);\n        this.on('activate', this.onActivateFade);\n        this.on('deactivate', this.onDeactivateFade);\n      };\n\n      var updateSlides = proto.updateSlides;\n\n      proto.updateSlides = function () {\n        updateSlides.apply(this, arguments);\n\n        if (!this.options.fade) {\n          return;\n        } // set initial opacity\n\n\n        this.slides.forEach(function (slide, i) {\n          var alpha = i == this.selectedIndex ? 1 : 0;\n          slide.setOpacity(alpha);\n        }, this);\n      };\n      /* ---- events ---- */\n\n\n      proto.onSelectFade = function () {\n        // in case of resize, keep fadeIndex within current count\n        this.fadeIndex = Math.min(this.prevSelectedIndex, this.slides.length - 1);\n        this.prevSelectedIndex = this.selectedIndex;\n      };\n\n      proto.onSettleFade = function () {\n        delete this.didDragEnd;\n\n        if (!this.options.fade) {\n          return;\n        } // set full and 0 opacity on selected & faded slides\n\n\n        this.selectedSlide.setOpacity(1);\n        var fadedSlide = this.slides[this.fadeIndex];\n\n        if (fadedSlide && this.fadeIndex != this.selectedIndex) {\n          this.slides[this.fadeIndex].setOpacity(0);\n        }\n      };\n\n      proto.onDragEndFade = function () {\n        // set flag\n        this.didDragEnd = true;\n      };\n\n      proto.onActivateFade = function () {\n        if (this.options.fade) {\n          this.element.classList.add('is-fade');\n        }\n      };\n\n      proto.onDeactivateFade = function () {\n        if (!this.options.fade) {\n          return;\n        }\n\n        this.element.classList.remove('is-fade'); // reset opacity\n\n        this.slides.forEach(function (slide) {\n          slide.setOpacity('');\n        });\n      };\n      /* ---- position & fading ---- */\n\n\n      var positionSlider = proto.positionSlider;\n\n      proto.positionSlider = function () {\n        if (!this.options.fade) {\n          positionSlider.apply(this, arguments);\n          return;\n        }\n\n        this.fadeSlides();\n        this.dispatchScrollEvent();\n      };\n\n      var positionSliderAtSelected = proto.positionSliderAtSelected;\n\n      proto.positionSliderAtSelected = function () {\n        if (this.options.fade) {\n          // position fade slider at origin\n          this.setTranslateX(0);\n        }\n\n        positionSliderAtSelected.apply(this, arguments);\n      };\n\n      proto.fadeSlides = function () {\n        if (this.slides.length < 2) {\n          return;\n        } // get slides to fade-in & fade-out\n\n\n        var indexes = this.getFadeIndexes();\n        var fadeSlideA = this.slides[indexes.a];\n        var fadeSlideB = this.slides[indexes.b];\n        var distance = this.wrapDifference(fadeSlideA.target, fadeSlideB.target);\n        var progress = this.wrapDifference(fadeSlideA.target, -this.x);\n        progress = progress / distance;\n        fadeSlideA.setOpacity(1 - progress);\n        fadeSlideB.setOpacity(progress); // hide previous slide\n\n        var fadeHideIndex = indexes.a;\n\n        if (this.isDragging) {\n          fadeHideIndex = progress > 0.5 ? indexes.a : indexes.b;\n        }\n\n        var isNewHideIndex = this.fadeHideIndex != undefined && this.fadeHideIndex != fadeHideIndex && this.fadeHideIndex != indexes.a && this.fadeHideIndex != indexes.b;\n\n        if (isNewHideIndex) {\n          // new fadeHideSlide set, hide previous\n          this.slides[this.fadeHideIndex].setOpacity(0);\n        }\n\n        this.fadeHideIndex = fadeHideIndex;\n      };\n\n      proto.getFadeIndexes = function () {\n        if (!this.isDragging && !this.didDragEnd) {\n          return {\n            a: this.fadeIndex,\n            b: this.selectedIndex\n          };\n        }\n\n        if (this.options.wrapAround) {\n          return this.getFadeDragWrapIndexes();\n        } else {\n          return this.getFadeDragLimitIndexes();\n        }\n      };\n\n      proto.getFadeDragWrapIndexes = function () {\n        var distances = this.slides.map(function (slide, i) {\n          return this.getSlideDistance(-this.x, i);\n        }, this);\n        var absDistances = distances.map(function (distance) {\n          return Math.abs(distance);\n        });\n        var minDistance = Math.min.apply(Math, absDistances);\n        var closestIndex = absDistances.indexOf(minDistance);\n        var distance = distances[closestIndex];\n        var len = this.slides.length;\n        var delta = distance >= 0 ? 1 : -1;\n        return {\n          a: closestIndex,\n          b: utils.modulo(closestIndex + delta, len)\n        };\n      };\n\n      proto.getFadeDragLimitIndexes = function () {\n        // calculate closest previous slide\n        var dragIndex = 0;\n\n        for (var i = 0; i < this.slides.length - 1; i++) {\n          var slide = this.slides[i];\n\n          if (-this.x < slide.target) {\n            break;\n          }\n\n          dragIndex = i;\n        }\n\n        return {\n          a: dragIndex,\n          b: dragIndex + 1\n        };\n      };\n\n      proto.wrapDifference = function (a, b) {\n        var diff = b - a;\n\n        if (!this.options.wrapAround) {\n          return diff;\n        }\n\n        var diffPlus = diff + this.slideableWidth;\n        var diffMinus = diff - this.slideableWidth;\n\n        if (Math.abs(diffPlus) < Math.abs(diff)) {\n          diff = diffPlus;\n        }\n\n        if (Math.abs(diffMinus) < Math.abs(diff)) {\n          diff = diffMinus;\n        }\n\n        return diff;\n      }; // ---- wrapAround ---- //\n\n\n      var _getWrapShiftCells = proto._getWrapShiftCells;\n\n      proto._getWrapShiftCells = function () {\n        if (!this.options.fade) {\n          _getWrapShiftCells.apply(this, arguments);\n        }\n      };\n\n      var shiftWrapCells = proto.shiftWrapCells;\n\n      proto.shiftWrapCells = function () {\n        if (!this.options.fade) {\n          shiftWrapCells.apply(this, arguments);\n        }\n      };\n\n      return Flickity;\n    });\n  });\n\n  var photoswipe = createCommonjsModule(function (module, exports) {\n    /*! PhotoSwipe - v4.1.3 - 2019-01-08\n    * http://photoswipe.com\n    * Copyright (c) 2019 Dmitry Semenov; */\n    (function (root, factory) {\n      {\n        module.exports = factory();\n      }\n    })(commonjsGlobal, function () {\n\n      var PhotoSwipe = function PhotoSwipe(template, UiClass, items, options) {\n        /*>>framework-bridge*/\n\n        /**\n         *\n         * Set of generic functions used by gallery.\n         *\n         * You're free to modify anything here as long as functionality is kept.\n         *\n         */\n        var framework = {\n          features: null,\n          bind: function bind(target, type, listener, unbind) {\n            var methodName = (unbind ? 'remove' : 'add') + 'EventListener';\n            type = type.split(' ');\n\n            for (var i = 0; i < type.length; i++) {\n              if (type[i]) {\n                target[methodName](type[i], listener, false);\n              }\n            }\n          },\n          isArray: function isArray(obj) {\n            return obj instanceof Array;\n          },\n          createEl: function createEl(classes, tag) {\n            var el = document.createElement(tag || 'div');\n\n            if (classes) {\n              el.className = classes;\n            }\n\n            return el;\n          },\n          getScrollY: function getScrollY() {\n            var yOffset = window.pageYOffset;\n            return yOffset !== undefined ? yOffset : document.documentElement.scrollTop;\n          },\n          unbind: function unbind(target, type, listener) {\n            framework.bind(target, type, listener, true);\n          },\n          removeClass: function removeClass(el, className) {\n            var reg = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)');\n            el.className = el.className.replace(reg, ' ').replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '');\n          },\n          addClass: function addClass(el, className) {\n            if (!framework.hasClass(el, className)) {\n              el.className += (el.className ? ' ' : '') + className;\n            }\n          },\n          hasClass: function hasClass(el, className) {\n            return el.className && new RegExp('(^|\\\\s)' + className + '(\\\\s|$)').test(el.className);\n          },\n          getChildByClass: function getChildByClass(parentEl, childClassName) {\n            var node = parentEl.firstChild;\n\n            while (node) {\n              if (framework.hasClass(node, childClassName)) {\n                return node;\n              }\n\n              node = node.nextSibling;\n            }\n          },\n          arraySearch: function arraySearch(array, value, key) {\n            var i = array.length;\n\n            while (i--) {\n              if (array[i][key] === value) {\n                return i;\n              }\n            }\n\n            return -1;\n          },\n          extend: function extend(o1, o2, preventOverwrite) {\n            for (var prop in o2) {\n              if (o2.hasOwnProperty(prop)) {\n                if (preventOverwrite && o1.hasOwnProperty(prop)) {\n                  continue;\n                }\n\n                o1[prop] = o2[prop];\n              }\n            }\n          },\n          easing: {\n            sine: {\n              out: function out(k) {\n                return Math.sin(k * (Math.PI / 2));\n              },\n              inOut: function inOut(k) {\n                return -(Math.cos(Math.PI * k) - 1) / 2;\n              }\n            },\n            cubic: {\n              out: function out(k) {\n                return --k * k * k + 1;\n              }\n            }\n            /*\n            \telastic: {\n            \t\tout: function ( k ) {\n            \t\t\t\tvar s, a = 0.1, p = 0.4;\n            \t\t\tif ( k === 0 ) return 0;\n            \t\t\tif ( k === 1 ) return 1;\n            \t\t\tif ( !a || a < 1 ) { a = 1; s = p / 4; }\n            \t\t\telse s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );\n            \t\t\treturn ( a * Math.pow( 2, - 10 * k) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) + 1 );\n            \t\t\t},\n            \t},\n            \tback: {\n            \t\tout: function ( k ) {\n            \t\t\tvar s = 1.70158;\n            \t\t\treturn --k * k * ( ( s + 1 ) * k + s ) + 1;\n            \t\t}\n            \t}\n            */\n\n          },\n\n          /**\n           *\n           * @return {object}\n           *\n           * {\n           *  raf : request animation frame function\n           *  caf : cancel animation frame function\n           *  transfrom : transform property key (with vendor), or null if not supported\n           *  oldIE : IE8 or below\n           * }\n           *\n           */\n          detectFeatures: function detectFeatures() {\n            if (framework.features) {\n              return framework.features;\n            }\n\n            var helperEl = framework.createEl(),\n                helperStyle = helperEl.style,\n                vendor = '',\n                features = {}; // IE8 and below\n\n            features.oldIE = document.all && !document.addEventListener;\n            features.touch = 'ontouchstart' in window;\n\n            if (window.requestAnimationFrame) {\n              features.raf = window.requestAnimationFrame;\n              features.caf = window.cancelAnimationFrame;\n            }\n\n            features.pointerEvent = !!window.PointerEvent || navigator.msPointerEnabled; // fix false-positive detection of old Android in new IE\n            // (IE11 ua string contains \"Android 4.0\")\n\n            if (!features.pointerEvent) {\n              var ua = navigator.userAgent; // Detect if device is iPhone or iPod and if it's older than iOS 8\n              // http://stackoverflow.com/a/14223920\n              //\n              // This detection is made because of buggy top/bottom toolbars\n              // that don't trigger window.resize event.\n              // For more info refer to _isFixedPosition variable in core.js\n\n              if (/iP(hone|od)/.test(navigator.platform)) {\n                var v = navigator.appVersion.match(/OS (\\d+)_(\\d+)_?(\\d+)?/);\n\n                if (v && v.length > 0) {\n                  v = parseInt(v[1], 10);\n\n                  if (v >= 1 && v < 8) {\n                    features.isOldIOSPhone = true;\n                  }\n                }\n              } // Detect old Android (before KitKat)\n              // due to bugs related to position:fixed\n              // http://stackoverflow.com/questions/7184573/pick-up-the-android-version-in-the-browser-by-javascript\n\n\n              var match = ua.match(/Android\\s([0-9\\.]*)/);\n              var androidversion = match ? match[1] : 0;\n              androidversion = parseFloat(androidversion);\n\n              if (androidversion >= 1) {\n                if (androidversion < 4.4) {\n                  features.isOldAndroid = true; // for fixed position bug & performance\n                }\n\n                features.androidVersion = androidversion; // for touchend bug\n              }\n\n              features.isMobileOpera = /opera mini|opera mobi/i.test(ua); // p.s. yes, yes, UA sniffing is bad, propose your solution for above bugs.\n            }\n\n            var styleChecks = ['transform', 'perspective', 'animationName'],\n                vendors = ['', 'webkit', 'Moz', 'ms', 'O'],\n                styleCheckItem,\n                styleName;\n\n            for (var i = 0; i < 4; i++) {\n              vendor = vendors[i];\n\n              for (var a = 0; a < 3; a++) {\n                styleCheckItem = styleChecks[a]; // uppercase first letter of property name, if vendor is present\n\n                styleName = vendor + (vendor ? styleCheckItem.charAt(0).toUpperCase() + styleCheckItem.slice(1) : styleCheckItem);\n\n                if (!features[styleCheckItem] && styleName in helperStyle) {\n                  features[styleCheckItem] = styleName;\n                }\n              }\n\n              if (vendor && !features.raf) {\n                vendor = vendor.toLowerCase();\n                features.raf = window[vendor + 'RequestAnimationFrame'];\n\n                if (features.raf) {\n                  features.caf = window[vendor + 'CancelAnimationFrame'] || window[vendor + 'CancelRequestAnimationFrame'];\n                }\n              }\n            }\n\n            if (!features.raf) {\n              var lastTime = 0;\n\n              features.raf = function (fn) {\n                var currTime = new Date().getTime();\n                var timeToCall = Math.max(0, 16 - (currTime - lastTime));\n                var id = window.setTimeout(function () {\n                  fn(currTime + timeToCall);\n                }, timeToCall);\n                lastTime = currTime + timeToCall;\n                return id;\n              };\n\n              features.caf = function (id) {\n                clearTimeout(id);\n              };\n            } // Detect SVG support\n\n\n            features.svg = !!document.createElementNS && !!document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGRect;\n            framework.features = features;\n            return features;\n          }\n        };\n        framework.detectFeatures(); // Override addEventListener for old versions of IE\n\n        if (framework.features.oldIE) {\n          framework.bind = function (target, type, listener, unbind) {\n            type = type.split(' ');\n\n            var methodName = (unbind ? 'detach' : 'attach') + 'Event',\n                evName,\n                _handleEv = function _handleEv() {\n              listener.handleEvent.call(listener);\n            };\n\n            for (var i = 0; i < type.length; i++) {\n              evName = type[i];\n\n              if (evName) {\n                if (_typeof(listener) === 'object' && listener.handleEvent) {\n                  if (!unbind) {\n                    listener['oldIE' + evName] = _handleEv;\n                  } else {\n                    if (!listener['oldIE' + evName]) {\n                      return false;\n                    }\n                  }\n\n                  target[methodName]('on' + evName, listener['oldIE' + evName]);\n                } else {\n                  target[methodName]('on' + evName, listener);\n                }\n              }\n            }\n          };\n        }\n        /*>>framework-bridge*/\n\n        /*>>core*/\n        //function(template, UiClass, items, options)\n\n\n        var self = this;\n        /**\n         * Static vars, don't change unless you know what you're doing.\n         */\n\n        var DOUBLE_TAP_RADIUS = 25,\n            NUM_HOLDERS = 3;\n        /**\n         * Options\n         */\n\n        var _options = {\n          allowPanToNext: true,\n          spacing: 0.12,\n          bgOpacity: 1,\n          mouseUsed: false,\n          loop: true,\n          pinchToClose: true,\n          closeOnScroll: true,\n          closeOnVerticalDrag: true,\n          verticalDragRange: 0.75,\n          hideAnimationDuration: 333,\n          showAnimationDuration: 333,\n          showHideOpacity: false,\n          focus: true,\n          escKey: true,\n          arrowKeys: true,\n          mainScrollEndFriction: 0.35,\n          panEndFriction: 0.35,\n          isClickableElement: function isClickableElement(el) {\n            return el.tagName === 'A';\n          },\n          getDoubleTapZoom: function getDoubleTapZoom(isMouseClick, item) {\n            if (isMouseClick) {\n              return 1;\n            } else {\n              return item.initialZoomLevel < 0.7 ? 1 : 1.33;\n            }\n          },\n          maxSpreadZoom: 1.33,\n          modal: true,\n          // not fully implemented yet\n          scaleMode: 'fit' // TODO\n\n        };\n        framework.extend(_options, options);\n        /**\n         * Private helper variables & functions\n         */\n\n        var _getEmptyPoint = function _getEmptyPoint() {\n          return {\n            x: 0,\n            y: 0\n          };\n        };\n\n        var _isOpen,\n            _isDestroying,\n            _closedByScroll,\n            _currentItemIndex,\n            _containerStyle,\n            _containerShiftIndex,\n            _currPanDist = _getEmptyPoint(),\n            _startPanOffset = _getEmptyPoint(),\n            _panOffset = _getEmptyPoint(),\n            _upMoveEvents,\n            // drag move, drag end & drag cancel events array\n        _downEvents,\n            // drag start events array\n        _globalEventHandlers,\n            _viewportSize = {},\n            _currZoomLevel,\n            _startZoomLevel,\n            _translatePrefix,\n            _translateSufix,\n            _updateSizeInterval,\n            _itemsNeedUpdate,\n            _currPositionIndex = 0,\n            _offset = {},\n            _slideSize = _getEmptyPoint(),\n            // size of slide area, including spacing\n        _itemHolders,\n            _prevItemIndex,\n            _indexDiff = 0,\n            // difference of indexes since last content update\n        _dragStartEvent,\n            _dragMoveEvent,\n            _dragEndEvent,\n            _dragCancelEvent,\n            _transformKey,\n            _pointerEventEnabled,\n            _isFixedPosition = true,\n            _likelyTouchDevice,\n            _modules = [],\n            _requestAF,\n            _cancelAF,\n            _initalClassName,\n            _initalWindowScrollY,\n            _oldIE,\n            _currentWindowScrollY,\n            _features,\n            _windowVisibleSize = {},\n            _renderMaxResolution = false,\n            _orientationChangeTimeout,\n            // Registers PhotoSWipe module (History, Controller ...)\n        _registerModule = function _registerModule(name, module) {\n          framework.extend(self, module.publicMethods);\n\n          _modules.push(name);\n        },\n            _getLoopedId = function _getLoopedId(index) {\n          var numSlides = _getNumItems();\n\n          if (index > numSlides - 1) {\n            return index - numSlides;\n          } else if (index < 0) {\n            return numSlides + index;\n          }\n\n          return index;\n        },\n            // Micro bind/trigger\n        _listeners = {},\n            _listen = function _listen(name, fn) {\n          if (!_listeners[name]) {\n            _listeners[name] = [];\n          }\n\n          return _listeners[name].push(fn);\n        },\n            _shout = function _shout(name) {\n          var listeners = _listeners[name];\n\n          if (listeners) {\n            var args = Array.prototype.slice.call(arguments);\n            args.shift();\n\n            for (var i = 0; i < listeners.length; i++) {\n              listeners[i].apply(self, args);\n            }\n          }\n        },\n            _getCurrentTime = function _getCurrentTime() {\n          return new Date().getTime();\n        },\n            _applyBgOpacity = function _applyBgOpacity(opacity) {\n          _bgOpacity = opacity;\n          self.bg.style.opacity = opacity * _options.bgOpacity;\n        },\n            _applyZoomTransform = function _applyZoomTransform(styleObj, x, y, zoom, item) {\n          if (!_renderMaxResolution || item && item !== self.currItem) {\n            zoom = zoom / (item ? item.fitRatio : self.currItem.fitRatio);\n          }\n\n          styleObj[_transformKey] = _translatePrefix + x + 'px, ' + y + 'px' + _translateSufix + ' scale(' + zoom + ')';\n        },\n            _applyCurrentZoomPan = function _applyCurrentZoomPan(allowRenderResolution) {\n          if (_currZoomElementStyle) {\n            if (allowRenderResolution) {\n              if (_currZoomLevel > self.currItem.fitRatio) {\n                if (!_renderMaxResolution) {\n                  _setImageSize(self.currItem, false, true);\n\n                  _renderMaxResolution = true;\n                }\n              } else {\n                if (_renderMaxResolution) {\n                  _setImageSize(self.currItem);\n\n                  _renderMaxResolution = false;\n                }\n              }\n            }\n\n            _applyZoomTransform(_currZoomElementStyle, _panOffset.x, _panOffset.y, _currZoomLevel);\n          }\n        },\n            _applyZoomPanToItem = function _applyZoomPanToItem(item) {\n          if (item.container) {\n            _applyZoomTransform(item.container.style, item.initialPosition.x, item.initialPosition.y, item.initialZoomLevel, item);\n          }\n        },\n            _setTranslateX = function _setTranslateX(x, elStyle) {\n          elStyle[_transformKey] = _translatePrefix + x + 'px, 0px' + _translateSufix;\n        },\n            _moveMainScroll = function _moveMainScroll(x, dragging) {\n          if (!_options.loop && dragging) {\n            var newSlideIndexOffset = _currentItemIndex + (_slideSize.x * _currPositionIndex - x) / _slideSize.x,\n                delta = Math.round(x - _mainScrollPos.x);\n\n            if (newSlideIndexOffset < 0 && delta > 0 || newSlideIndexOffset >= _getNumItems() - 1 && delta < 0) {\n              x = _mainScrollPos.x + delta * _options.mainScrollEndFriction;\n            }\n          }\n\n          _mainScrollPos.x = x;\n\n          _setTranslateX(x, _containerStyle);\n        },\n            _calculatePanOffset = function _calculatePanOffset(axis, zoomLevel) {\n          var m = _midZoomPoint[axis] - _offset[axis];\n          return _startPanOffset[axis] + _currPanDist[axis] + m - m * (zoomLevel / _startZoomLevel);\n        },\n            _equalizePoints = function _equalizePoints(p1, p2) {\n          p1.x = p2.x;\n          p1.y = p2.y;\n\n          if (p2.id) {\n            p1.id = p2.id;\n          }\n        },\n            _roundPoint = function _roundPoint(p) {\n          p.x = Math.round(p.x);\n          p.y = Math.round(p.y);\n        },\n            _mouseMoveTimeout = null,\n            _onFirstMouseMove = function _onFirstMouseMove() {\n          // Wait until mouse move event is fired at least twice during 100ms\n          // We do this, because some mobile browsers trigger it on touchstart\n          if (_mouseMoveTimeout) {\n            framework.unbind(document, 'mousemove', _onFirstMouseMove);\n            framework.addClass(template, 'pswp--has_mouse');\n            _options.mouseUsed = true;\n\n            _shout('mouseUsed');\n          }\n\n          _mouseMoveTimeout = setTimeout(function () {\n            _mouseMoveTimeout = null;\n          }, 100);\n        },\n            _bindEvents = function _bindEvents() {\n          framework.bind(document, 'keydown', self);\n\n          if (_features.transform) {\n            // don't bind click event in browsers that don't support transform (mostly IE8)\n            framework.bind(self.scrollWrap, 'click', self);\n          }\n\n          if (!_options.mouseUsed) {\n            framework.bind(document, 'mousemove', _onFirstMouseMove);\n          }\n\n          framework.bind(window, 'resize scroll orientationchange', self);\n\n          _shout('bindEvents');\n        },\n            _unbindEvents = function _unbindEvents() {\n          framework.unbind(window, 'resize scroll orientationchange', self);\n          framework.unbind(window, 'scroll', _globalEventHandlers.scroll);\n          framework.unbind(document, 'keydown', self);\n          framework.unbind(document, 'mousemove', _onFirstMouseMove);\n\n          if (_features.transform) {\n            framework.unbind(self.scrollWrap, 'click', self);\n          }\n\n          if (_isDragging) {\n            framework.unbind(window, _upMoveEvents, self);\n          }\n\n          clearTimeout(_orientationChangeTimeout);\n\n          _shout('unbindEvents');\n        },\n            _calculatePanBounds = function _calculatePanBounds(zoomLevel, update) {\n          var bounds = _calculateItemSize(self.currItem, _viewportSize, zoomLevel);\n\n          if (update) {\n            _currPanBounds = bounds;\n          }\n\n          return bounds;\n        },\n            _getMinZoomLevel = function _getMinZoomLevel(item) {\n          if (!item) {\n            item = self.currItem;\n          }\n\n          return item.initialZoomLevel;\n        },\n            _getMaxZoomLevel = function _getMaxZoomLevel(item) {\n          if (!item) {\n            item = self.currItem;\n          }\n\n          return item.w > 0 ? _options.maxSpreadZoom : 1;\n        },\n            // Return true if offset is out of the bounds\n        _modifyDestPanOffset = function _modifyDestPanOffset(axis, destPanBounds, destPanOffset, destZoomLevel) {\n          if (destZoomLevel === self.currItem.initialZoomLevel) {\n            destPanOffset[axis] = self.currItem.initialPosition[axis];\n            return true;\n          } else {\n            destPanOffset[axis] = _calculatePanOffset(axis, destZoomLevel);\n\n            if (destPanOffset[axis] > destPanBounds.min[axis]) {\n              destPanOffset[axis] = destPanBounds.min[axis];\n              return true;\n            } else if (destPanOffset[axis] < destPanBounds.max[axis]) {\n              destPanOffset[axis] = destPanBounds.max[axis];\n              return true;\n            }\n          }\n\n          return false;\n        },\n            _setupTransforms = function _setupTransforms() {\n          if (_transformKey) {\n            // setup 3d transforms\n            var allow3dTransform = _features.perspective && !_likelyTouchDevice;\n            _translatePrefix = 'translate' + (allow3dTransform ? '3d(' : '(');\n            _translateSufix = _features.perspective ? ', 0px)' : ')';\n            return;\n          } // Override zoom/pan/move functions in case old browser is used (most likely IE)\n          // (so they use left/top/width/height, instead of CSS transform)\n\n\n          _transformKey = 'left';\n          framework.addClass(template, 'pswp--ie');\n\n          _setTranslateX = function _setTranslateX(x, elStyle) {\n            elStyle.left = x + 'px';\n          };\n\n          _applyZoomPanToItem = function _applyZoomPanToItem(item) {\n            var zoomRatio = item.fitRatio > 1 ? 1 : item.fitRatio,\n                s = item.container.style,\n                w = zoomRatio * item.w,\n                h = zoomRatio * item.h;\n            s.width = w + 'px';\n            s.height = h + 'px';\n            s.left = item.initialPosition.x + 'px';\n            s.top = item.initialPosition.y + 'px';\n          };\n\n          _applyCurrentZoomPan = function _applyCurrentZoomPan() {\n            if (_currZoomElementStyle) {\n              var s = _currZoomElementStyle,\n                  item = self.currItem,\n                  zoomRatio = item.fitRatio > 1 ? 1 : item.fitRatio,\n                  w = zoomRatio * item.w,\n                  h = zoomRatio * item.h;\n              s.width = w + 'px';\n              s.height = h + 'px';\n              s.left = _panOffset.x + 'px';\n              s.top = _panOffset.y + 'px';\n            }\n          };\n        },\n            _onKeyDown = function _onKeyDown(e) {\n          var keydownAction = '';\n\n          if (_options.escKey && e.keyCode === 27) {\n            keydownAction = 'close';\n          } else if (_options.arrowKeys) {\n            if (e.keyCode === 37) {\n              keydownAction = 'prev';\n            } else if (e.keyCode === 39) {\n              keydownAction = 'next';\n            }\n          }\n\n          if (keydownAction) {\n            // don't do anything if special key pressed to prevent from overriding default browser actions\n            // e.g. in Chrome on Mac cmd+arrow-left returns to previous page\n            if (!e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey) {\n              if (e.preventDefault) {\n                e.preventDefault();\n              } else {\n                e.returnValue = false;\n              }\n\n              self[keydownAction]();\n            }\n          }\n        },\n            _onGlobalClick = function _onGlobalClick(e) {\n          if (!e) {\n            return;\n          } // don't allow click event to pass through when triggering after drag or some other gesture\n\n\n          if (_moved || _zoomStarted || _mainScrollAnimating || _verticalDragInitiated) {\n            e.preventDefault();\n            e.stopPropagation();\n          }\n        },\n            _updatePageScrollOffset = function _updatePageScrollOffset() {\n          self.setScrollOffset(0, framework.getScrollY());\n        }; // Micro animation engine\n\n\n        var _animations = {},\n            _numAnimations = 0,\n            _stopAnimation = function _stopAnimation(name) {\n          if (_animations[name]) {\n            if (_animations[name].raf) {\n              _cancelAF(_animations[name].raf);\n            }\n\n            _numAnimations--;\n            delete _animations[name];\n          }\n        },\n            _registerStartAnimation = function _registerStartAnimation(name) {\n          if (_animations[name]) {\n            _stopAnimation(name);\n          }\n\n          if (!_animations[name]) {\n            _numAnimations++;\n            _animations[name] = {};\n          }\n        },\n            _stopAllAnimations = function _stopAllAnimations() {\n          for (var prop in _animations) {\n            if (_animations.hasOwnProperty(prop)) {\n              _stopAnimation(prop);\n            }\n          }\n        },\n            _animateProp = function _animateProp(name, b, endProp, d, easingFn, onUpdate, onComplete) {\n          var startAnimTime = _getCurrentTime(),\n              t;\n\n          _registerStartAnimation(name);\n\n          var animloop = function animloop() {\n            if (_animations[name]) {\n              t = _getCurrentTime() - startAnimTime; // time diff\n              //b - beginning (start prop)\n              //d - anim duration\n\n              if (t >= d) {\n                _stopAnimation(name);\n\n                onUpdate(endProp);\n\n                if (onComplete) {\n                  onComplete();\n                }\n\n                return;\n              }\n\n              onUpdate((endProp - b) * easingFn(t / d) + b);\n              _animations[name].raf = _requestAF(animloop);\n            }\n          };\n\n          animloop();\n        };\n\n        var publicMethods = {\n          // make a few local variables and functions public\n          shout: _shout,\n          listen: _listen,\n          viewportSize: _viewportSize,\n          options: _options,\n          isMainScrollAnimating: function isMainScrollAnimating() {\n            return _mainScrollAnimating;\n          },\n          getZoomLevel: function getZoomLevel() {\n            return _currZoomLevel;\n          },\n          getCurrentIndex: function getCurrentIndex() {\n            return _currentItemIndex;\n          },\n          isDragging: function isDragging() {\n            return _isDragging;\n          },\n          isZooming: function isZooming() {\n            return _isZooming;\n          },\n          setScrollOffset: function setScrollOffset(x, y) {\n            _offset.x = x;\n            _currentWindowScrollY = _offset.y = y;\n\n            _shout('updateScrollOffset', _offset);\n          },\n          applyZoomPan: function applyZoomPan(zoomLevel, panX, panY, allowRenderResolution) {\n            _panOffset.x = panX;\n            _panOffset.y = panY;\n            _currZoomLevel = zoomLevel;\n\n            _applyCurrentZoomPan(allowRenderResolution);\n          },\n          init: function init() {\n            if (_isOpen || _isDestroying) {\n              return;\n            }\n\n            var i;\n            self.framework = framework; // basic functionality\n\n            self.template = template; // root DOM element of PhotoSwipe\n\n            self.bg = framework.getChildByClass(template, 'pswp__bg');\n            _initalClassName = template.className;\n            _isOpen = true;\n            _features = framework.detectFeatures();\n            _requestAF = _features.raf;\n            _cancelAF = _features.caf;\n            _transformKey = _features.transform;\n            _oldIE = _features.oldIE;\n            self.scrollWrap = framework.getChildByClass(template, 'pswp__scroll-wrap');\n            self.container = framework.getChildByClass(self.scrollWrap, 'pswp__container');\n            _containerStyle = self.container.style; // for fast access\n            // Objects that hold slides (there are only 3 in DOM)\n\n            self.itemHolders = _itemHolders = [{\n              el: self.container.children[0],\n              wrap: 0,\n              index: -1\n            }, {\n              el: self.container.children[1],\n              wrap: 0,\n              index: -1\n            }, {\n              el: self.container.children[2],\n              wrap: 0,\n              index: -1\n            }]; // hide nearby item holders until initial zoom animation finishes (to avoid extra Paints)\n\n            _itemHolders[0].el.style.display = _itemHolders[2].el.style.display = 'none';\n\n            _setupTransforms(); // Setup global events\n\n\n            _globalEventHandlers = {\n              resize: self.updateSize,\n              // Fixes: iOS 10.3 resize event\n              // does not update scrollWrap.clientWidth instantly after resize\n              // https://github.com/dimsemenov/PhotoSwipe/issues/1315\n              orientationchange: function orientationchange() {\n                clearTimeout(_orientationChangeTimeout);\n                _orientationChangeTimeout = setTimeout(function () {\n                  if (_viewportSize.x !== self.scrollWrap.clientWidth) {\n                    self.updateSize();\n                  }\n                }, 500);\n              },\n              scroll: _updatePageScrollOffset,\n              keydown: _onKeyDown,\n              click: _onGlobalClick\n            }; // disable show/hide effects on old browsers that don't support CSS animations or transforms,\n            // old IOS, Android and Opera mobile. Blackberry seems to work fine, even older models.\n\n            var oldPhone = _features.isOldIOSPhone || _features.isOldAndroid || _features.isMobileOpera;\n\n            if (!_features.animationName || !_features.transform || oldPhone) {\n              _options.showAnimationDuration = _options.hideAnimationDuration = 0;\n            } // init modules\n\n\n            for (i = 0; i < _modules.length; i++) {\n              self['init' + _modules[i]]();\n            } // init\n\n\n            if (UiClass) {\n              var ui = self.ui = new UiClass(self, framework);\n              ui.init();\n            }\n\n            _shout('firstUpdate');\n\n            _currentItemIndex = _currentItemIndex || _options.index || 0; // validate index\n\n            if (isNaN(_currentItemIndex) || _currentItemIndex < 0 || _currentItemIndex >= _getNumItems()) {\n              _currentItemIndex = 0;\n            }\n\n            self.currItem = _getItemAt(_currentItemIndex);\n\n            if (_features.isOldIOSPhone || _features.isOldAndroid) {\n              _isFixedPosition = false;\n            }\n\n            template.setAttribute('aria-hidden', 'false');\n\n            if (_options.modal) {\n              if (!_isFixedPosition) {\n                template.style.position = 'absolute';\n                template.style.top = framework.getScrollY() + 'px';\n              } else {\n                template.style.position = 'fixed';\n              }\n            }\n\n            if (_currentWindowScrollY === undefined) {\n              _shout('initialLayout');\n\n              _currentWindowScrollY = _initalWindowScrollY = framework.getScrollY();\n            } // add classes to root element of PhotoSwipe\n\n\n            var rootClasses = 'pswp--open ';\n\n            if (_options.mainClass) {\n              rootClasses += _options.mainClass + ' ';\n            }\n\n            if (_options.showHideOpacity) {\n              rootClasses += 'pswp--animate_opacity ';\n            }\n\n            rootClasses += _likelyTouchDevice ? 'pswp--touch' : 'pswp--notouch';\n            rootClasses += _features.animationName ? ' pswp--css_animation' : '';\n            rootClasses += _features.svg ? ' pswp--svg' : '';\n            framework.addClass(template, rootClasses);\n            self.updateSize(); // initial update\n\n            _containerShiftIndex = -1;\n            _indexDiff = null;\n\n            for (i = 0; i < NUM_HOLDERS; i++) {\n              _setTranslateX((i + _containerShiftIndex) * _slideSize.x, _itemHolders[i].el.style);\n            }\n\n            if (!_oldIE) {\n              framework.bind(self.scrollWrap, _downEvents, self); // no dragging for old IE\n            }\n\n            _listen('initialZoomInEnd', function () {\n              self.setContent(_itemHolders[0], _currentItemIndex - 1);\n              self.setContent(_itemHolders[2], _currentItemIndex + 1);\n              _itemHolders[0].el.style.display = _itemHolders[2].el.style.display = 'block';\n\n              if (_options.focus) {\n                // focus causes layout,\n                // which causes lag during the animation,\n                // that's why we delay it untill the initial zoom transition ends\n                template.focus();\n              }\n\n              _bindEvents();\n            }); // set content for center slide (first time)\n\n\n            self.setContent(_itemHolders[1], _currentItemIndex);\n            self.updateCurrItem();\n\n            _shout('afterInit');\n\n            if (!_isFixedPosition) {\n              // On all versions of iOS lower than 8.0, we check size of viewport every second.\n              //\n              // This is done to detect when Safari top & bottom bars appear,\n              // as this action doesn't trigger any events (like resize).\n              //\n              // On iOS8 they fixed this.\n              //\n              // 10 Nov 2014: iOS 7 usage ~40%. iOS 8 usage 56%.\n              _updateSizeInterval = setInterval(function () {\n                if (!_numAnimations && !_isDragging && !_isZooming && _currZoomLevel === self.currItem.initialZoomLevel) {\n                  self.updateSize();\n                }\n              }, 1000);\n            }\n\n            framework.addClass(template, 'pswp--visible');\n          },\n          // Close the gallery, then destroy it\n          close: function close() {\n            if (!_isOpen) {\n              return;\n            }\n\n            _isOpen = false;\n            _isDestroying = true;\n\n            _shout('close');\n\n            _unbindEvents();\n\n            _showOrHide(self.currItem, null, true, self.destroy);\n          },\n          // destroys the gallery (unbinds events, cleans up intervals and timeouts to avoid memory leaks)\n          destroy: function destroy() {\n            _shout('destroy');\n\n            if (_showOrHideTimeout) {\n              clearTimeout(_showOrHideTimeout);\n            }\n\n            template.setAttribute('aria-hidden', 'true');\n            template.className = _initalClassName;\n\n            if (_updateSizeInterval) {\n              clearInterval(_updateSizeInterval);\n            }\n\n            framework.unbind(self.scrollWrap, _downEvents, self); // we unbind scroll event at the end, as closing animation may depend on it\n\n            framework.unbind(window, 'scroll', self);\n\n            _stopDragUpdateLoop();\n\n            _stopAllAnimations();\n\n            _listeners = null;\n          },\n\n          /**\n           * Pan image to position\n           * @param {Number} x\n           * @param {Number} y\n           * @param {Boolean} force Will ignore bounds if set to true.\n           */\n          panTo: function panTo(x, y, force) {\n            if (!force) {\n              if (x > _currPanBounds.min.x) {\n                x = _currPanBounds.min.x;\n              } else if (x < _currPanBounds.max.x) {\n                x = _currPanBounds.max.x;\n              }\n\n              if (y > _currPanBounds.min.y) {\n                y = _currPanBounds.min.y;\n              } else if (y < _currPanBounds.max.y) {\n                y = _currPanBounds.max.y;\n              }\n            }\n\n            _panOffset.x = x;\n            _panOffset.y = y;\n\n            _applyCurrentZoomPan();\n          },\n          handleEvent: function handleEvent(e) {\n            e = e || window.event;\n\n            if (_globalEventHandlers[e.type]) {\n              _globalEventHandlers[e.type](e);\n            }\n          },\n          goTo: function goTo(index) {\n            index = _getLoopedId(index);\n            var diff = index - _currentItemIndex;\n            _indexDiff = diff;\n            _currentItemIndex = index;\n            self.currItem = _getItemAt(_currentItemIndex);\n            _currPositionIndex -= diff;\n\n            _moveMainScroll(_slideSize.x * _currPositionIndex);\n\n            _stopAllAnimations();\n\n            _mainScrollAnimating = false;\n            self.updateCurrItem();\n          },\n          next: function next() {\n            self.goTo(_currentItemIndex + 1);\n          },\n          prev: function prev() {\n            self.goTo(_currentItemIndex - 1);\n          },\n          // update current zoom/pan objects\n          updateCurrZoomItem: function updateCurrZoomItem(emulateSetContent) {\n            if (emulateSetContent) {\n              _shout('beforeChange', 0);\n            } // itemHolder[1] is middle (current) item\n\n\n            if (_itemHolders[1].el.children.length) {\n              var zoomElement = _itemHolders[1].el.children[0];\n\n              if (framework.hasClass(zoomElement, 'pswp__zoom-wrap')) {\n                _currZoomElementStyle = zoomElement.style;\n              } else {\n                _currZoomElementStyle = null;\n              }\n            } else {\n              _currZoomElementStyle = null;\n            }\n\n            _currPanBounds = self.currItem.bounds;\n            _startZoomLevel = _currZoomLevel = self.currItem.initialZoomLevel;\n            _panOffset.x = _currPanBounds.center.x;\n            _panOffset.y = _currPanBounds.center.y;\n\n            if (emulateSetContent) {\n              _shout('afterChange');\n            }\n          },\n          invalidateCurrItems: function invalidateCurrItems() {\n            _itemsNeedUpdate = true;\n\n            for (var i = 0; i < NUM_HOLDERS; i++) {\n              if (_itemHolders[i].item) {\n                _itemHolders[i].item.needsUpdate = true;\n              }\n            }\n          },\n          updateCurrItem: function updateCurrItem(beforeAnimation) {\n            if (_indexDiff === 0) {\n              return;\n            }\n\n            var diffAbs = Math.abs(_indexDiff),\n                tempHolder;\n\n            if (beforeAnimation && diffAbs < 2) {\n              return;\n            }\n\n            self.currItem = _getItemAt(_currentItemIndex);\n            _renderMaxResolution = false;\n\n            _shout('beforeChange', _indexDiff);\n\n            if (diffAbs >= NUM_HOLDERS) {\n              _containerShiftIndex += _indexDiff + (_indexDiff > 0 ? -NUM_HOLDERS : NUM_HOLDERS);\n              diffAbs = NUM_HOLDERS;\n            }\n\n            for (var i = 0; i < diffAbs; i++) {\n              if (_indexDiff > 0) {\n                tempHolder = _itemHolders.shift();\n                _itemHolders[NUM_HOLDERS - 1] = tempHolder; // move first to last\n\n                _containerShiftIndex++;\n\n                _setTranslateX((_containerShiftIndex + 2) * _slideSize.x, tempHolder.el.style);\n\n                self.setContent(tempHolder, _currentItemIndex - diffAbs + i + 1 + 1);\n              } else {\n                tempHolder = _itemHolders.pop();\n\n                _itemHolders.unshift(tempHolder); // move last to first\n\n\n                _containerShiftIndex--;\n\n                _setTranslateX(_containerShiftIndex * _slideSize.x, tempHolder.el.style);\n\n                self.setContent(tempHolder, _currentItemIndex + diffAbs - i - 1 - 1);\n              }\n            } // reset zoom/pan on previous item\n\n\n            if (_currZoomElementStyle && Math.abs(_indexDiff) === 1) {\n              var prevItem = _getItemAt(_prevItemIndex);\n\n              if (prevItem.initialZoomLevel !== _currZoomLevel) {\n                _calculateItemSize(prevItem, _viewportSize);\n\n                _setImageSize(prevItem);\n\n                _applyZoomPanToItem(prevItem);\n              }\n            } // reset diff after update\n\n\n            _indexDiff = 0;\n            self.updateCurrZoomItem();\n            _prevItemIndex = _currentItemIndex;\n\n            _shout('afterChange');\n          },\n          updateSize: function updateSize(force) {\n            if (!_isFixedPosition && _options.modal) {\n              var windowScrollY = framework.getScrollY();\n\n              if (_currentWindowScrollY !== windowScrollY) {\n                template.style.top = windowScrollY + 'px';\n                _currentWindowScrollY = windowScrollY;\n              }\n\n              if (!force && _windowVisibleSize.x === window.innerWidth && _windowVisibleSize.y === window.innerHeight) {\n                return;\n              }\n\n              _windowVisibleSize.x = window.innerWidth;\n              _windowVisibleSize.y = window.innerHeight; //template.style.width = _windowVisibleSize.x + 'px';\n\n              template.style.height = _windowVisibleSize.y + 'px';\n            }\n\n            _viewportSize.x = self.scrollWrap.clientWidth;\n            _viewportSize.y = self.scrollWrap.clientHeight;\n\n            _updatePageScrollOffset();\n\n            _slideSize.x = _viewportSize.x + Math.round(_viewportSize.x * _options.spacing);\n            _slideSize.y = _viewportSize.y;\n\n            _moveMainScroll(_slideSize.x * _currPositionIndex);\n\n            _shout('beforeResize'); // even may be used for example to switch image sources\n            // don't re-calculate size on inital size update\n\n\n            if (_containerShiftIndex !== undefined) {\n              var holder, item, hIndex;\n\n              for (var i = 0; i < NUM_HOLDERS; i++) {\n                holder = _itemHolders[i];\n\n                _setTranslateX((i + _containerShiftIndex) * _slideSize.x, holder.el.style);\n\n                hIndex = _currentItemIndex + i - 1;\n\n                if (_options.loop && _getNumItems() > 2) {\n                  hIndex = _getLoopedId(hIndex);\n                } // update zoom level on items and refresh source (if needsUpdate)\n\n\n                item = _getItemAt(hIndex); // re-render gallery item if `needsUpdate`,\n                // or doesn't have `bounds` (entirely new slide object)\n\n                if (item && (_itemsNeedUpdate || item.needsUpdate || !item.bounds)) {\n                  self.cleanSlide(item);\n                  self.setContent(holder, hIndex); // if \"center\" slide\n\n                  if (i === 1) {\n                    self.currItem = item;\n                    self.updateCurrZoomItem(true);\n                  }\n\n                  item.needsUpdate = false;\n                } else if (holder.index === -1 && hIndex >= 0) {\n                  // add content first time\n                  self.setContent(holder, hIndex);\n                }\n\n                if (item && item.container) {\n                  _calculateItemSize(item, _viewportSize);\n\n                  _setImageSize(item);\n\n                  _applyZoomPanToItem(item);\n                }\n              }\n\n              _itemsNeedUpdate = false;\n            }\n\n            _startZoomLevel = _currZoomLevel = self.currItem.initialZoomLevel;\n            _currPanBounds = self.currItem.bounds;\n\n            if (_currPanBounds) {\n              _panOffset.x = _currPanBounds.center.x;\n              _panOffset.y = _currPanBounds.center.y;\n\n              _applyCurrentZoomPan(true);\n            }\n\n            _shout('resize');\n          },\n          // Zoom current item to\n          zoomTo: function zoomTo(destZoomLevel, centerPoint, speed, easingFn, updateFn) {\n            /*\n            \tif(destZoomLevel === 'fit') {\n            \t\tdestZoomLevel = self.currItem.fitRatio;\n            \t} else if(destZoomLevel === 'fill') {\n            \t\tdestZoomLevel = self.currItem.fillRatio;\n            \t}\n            */\n            if (centerPoint) {\n              _startZoomLevel = _currZoomLevel;\n              _midZoomPoint.x = Math.abs(centerPoint.x) - _panOffset.x;\n              _midZoomPoint.y = Math.abs(centerPoint.y) - _panOffset.y;\n\n              _equalizePoints(_startPanOffset, _panOffset);\n            }\n\n            var destPanBounds = _calculatePanBounds(destZoomLevel, false),\n                destPanOffset = {};\n\n            _modifyDestPanOffset('x', destPanBounds, destPanOffset, destZoomLevel);\n\n            _modifyDestPanOffset('y', destPanBounds, destPanOffset, destZoomLevel);\n\n            var initialZoomLevel = _currZoomLevel;\n            var initialPanOffset = {\n              x: _panOffset.x,\n              y: _panOffset.y\n            };\n\n            _roundPoint(destPanOffset);\n\n            var onUpdate = function onUpdate(now) {\n              if (now === 1) {\n                _currZoomLevel = destZoomLevel;\n                _panOffset.x = destPanOffset.x;\n                _panOffset.y = destPanOffset.y;\n              } else {\n                _currZoomLevel = (destZoomLevel - initialZoomLevel) * now + initialZoomLevel;\n                _panOffset.x = (destPanOffset.x - initialPanOffset.x) * now + initialPanOffset.x;\n                _panOffset.y = (destPanOffset.y - initialPanOffset.y) * now + initialPanOffset.y;\n              }\n\n              if (updateFn) {\n                updateFn(now);\n              }\n\n              _applyCurrentZoomPan(now === 1);\n            };\n\n            if (speed) {\n              _animateProp('customZoomTo', 0, 1, speed, easingFn || framework.easing.sine.inOut, onUpdate);\n            } else {\n              onUpdate(1);\n            }\n          }\n        };\n        /*>>core*/\n\n        /*>>gestures*/\n\n        /**\n         * Mouse/touch/pointer event handlers.\n         *\n         * separated from @core.js for readability\n         */\n\n        var MIN_SWIPE_DISTANCE = 30,\n            DIRECTION_CHECK_OFFSET = 10; // amount of pixels to drag to determine direction of swipe\n\n        var _gestureStartTime,\n            _gestureCheckSpeedTime,\n            // pool of objects that are used during dragging of zooming\n        p = {},\n            // first point\n        p2 = {},\n            // second point (for zoom gesture)\n        delta = {},\n            _currPoint = {},\n            _startPoint = {},\n            _currPointers = [],\n            _startMainScrollPos = {},\n            _releaseAnimData,\n            _posPoints = [],\n            // array of points during dragging, used to determine type of gesture\n        _tempPoint = {},\n            _isZoomingIn,\n            _verticalDragInitiated,\n            _oldAndroidTouchEndTimeout,\n            _currZoomedItemIndex = 0,\n            _centerPoint = _getEmptyPoint(),\n            _lastReleaseTime = 0,\n            _isDragging,\n            // at least one pointer is down\n        _isMultitouch,\n            // at least two _pointers are down\n        _zoomStarted,\n            // zoom level changed during zoom gesture\n        _moved,\n            _dragAnimFrame,\n            _mainScrollShifted,\n            _currentPoints,\n            // array of current touch points\n        _isZooming,\n            _currPointsDistance,\n            _startPointsDistance,\n            _currPanBounds,\n            _mainScrollPos = _getEmptyPoint(),\n            _currZoomElementStyle,\n            _mainScrollAnimating,\n            // true, if animation after swipe gesture is running\n        _midZoomPoint = _getEmptyPoint(),\n            _currCenterPoint = _getEmptyPoint(),\n            _direction,\n            _isFirstMove,\n            _opacityChanged,\n            _bgOpacity,\n            _wasOverInitialZoom,\n            _isEqualPoints = function _isEqualPoints(p1, p2) {\n          return p1.x === p2.x && p1.y === p2.y;\n        },\n            _isNearbyPoints = function _isNearbyPoints(touch0, touch1) {\n          return Math.abs(touch0.x - touch1.x) < DOUBLE_TAP_RADIUS && Math.abs(touch0.y - touch1.y) < DOUBLE_TAP_RADIUS;\n        },\n            _calculatePointsDistance = function _calculatePointsDistance(p1, p2) {\n          _tempPoint.x = Math.abs(p1.x - p2.x);\n          _tempPoint.y = Math.abs(p1.y - p2.y);\n          return Math.sqrt(_tempPoint.x * _tempPoint.x + _tempPoint.y * _tempPoint.y);\n        },\n            _stopDragUpdateLoop = function _stopDragUpdateLoop() {\n          if (_dragAnimFrame) {\n            _cancelAF(_dragAnimFrame);\n\n            _dragAnimFrame = null;\n          }\n        },\n            _dragUpdateLoop = function _dragUpdateLoop() {\n          if (_isDragging) {\n            _dragAnimFrame = _requestAF(_dragUpdateLoop);\n\n            _renderMovement();\n          }\n        },\n            _canPan = function _canPan() {\n          return !(_options.scaleMode === 'fit' && _currZoomLevel === self.currItem.initialZoomLevel);\n        },\n            // find the closest parent DOM element\n        _closestElement = function _closestElement(el, fn) {\n          if (!el || el === document) {\n            return false;\n          } // don't search elements above pswp__scroll-wrap\n\n\n          if (el.getAttribute('class') && el.getAttribute('class').indexOf('pswp__scroll-wrap') > -1) {\n            return false;\n          }\n\n          if (fn(el)) {\n            return el;\n          }\n\n          return _closestElement(el.parentNode, fn);\n        },\n            _preventObj = {},\n            _preventDefaultEventBehaviour = function _preventDefaultEventBehaviour(e, isDown) {\n          _preventObj.prevent = !_closestElement(e.target, _options.isClickableElement);\n\n          _shout('preventDragEvent', e, isDown, _preventObj);\n\n          return _preventObj.prevent;\n        },\n            _convertTouchToPoint = function _convertTouchToPoint(touch, p) {\n          p.x = touch.pageX;\n          p.y = touch.pageY;\n          p.id = touch.identifier;\n          return p;\n        },\n            _findCenterOfPoints = function _findCenterOfPoints(p1, p2, pCenter) {\n          pCenter.x = (p1.x + p2.x) * 0.5;\n          pCenter.y = (p1.y + p2.y) * 0.5;\n        },\n            _pushPosPoint = function _pushPosPoint(time, x, y) {\n          if (time - _gestureCheckSpeedTime > 50) {\n            var o = _posPoints.length > 2 ? _posPoints.shift() : {};\n            o.x = x;\n            o.y = y;\n\n            _posPoints.push(o);\n\n            _gestureCheckSpeedTime = time;\n          }\n        },\n            _calculateVerticalDragOpacityRatio = function _calculateVerticalDragOpacityRatio() {\n          var yOffset = _panOffset.y - self.currItem.initialPosition.y; // difference between initial and current position\n\n          return 1 - Math.abs(yOffset / (_viewportSize.y / 2));\n        },\n            // points pool, reused during touch events\n        _ePoint1 = {},\n            _ePoint2 = {},\n            _tempPointsArr = [],\n            _tempCounter,\n            _getTouchPoints = function _getTouchPoints(e) {\n          // clean up previous points, without recreating array\n          while (_tempPointsArr.length > 0) {\n            _tempPointsArr.pop();\n          }\n\n          if (!_pointerEventEnabled) {\n            if (e.type.indexOf('touch') > -1) {\n              if (e.touches && e.touches.length > 0) {\n                _tempPointsArr[0] = _convertTouchToPoint(e.touches[0], _ePoint1);\n\n                if (e.touches.length > 1) {\n                  _tempPointsArr[1] = _convertTouchToPoint(e.touches[1], _ePoint2);\n                }\n              }\n            } else {\n              _ePoint1.x = e.pageX;\n              _ePoint1.y = e.pageY;\n              _ePoint1.id = '';\n              _tempPointsArr[0] = _ePoint1; //_ePoint1;\n            }\n          } else {\n            _tempCounter = 0; // we can use forEach, as pointer events are supported only in modern browsers\n\n            _currPointers.forEach(function (p) {\n              if (_tempCounter === 0) {\n                _tempPointsArr[0] = p;\n              } else if (_tempCounter === 1) {\n                _tempPointsArr[1] = p;\n              }\n\n              _tempCounter++;\n            });\n          }\n\n          return _tempPointsArr;\n        },\n            _panOrMoveMainScroll = function _panOrMoveMainScroll(axis, delta) {\n          var panFriction,\n              overDiff = 0,\n              newOffset = _panOffset[axis] + delta[axis],\n              startOverDiff,\n              dir = delta[axis] > 0,\n              newMainScrollPosition = _mainScrollPos.x + delta.x,\n              mainScrollDiff = _mainScrollPos.x - _startMainScrollPos.x,\n              newPanPos,\n              newMainScrollPos; // calculate fdistance over the bounds and friction\n\n          if (newOffset > _currPanBounds.min[axis] || newOffset < _currPanBounds.max[axis]) {\n            panFriction = _options.panEndFriction; // Linear increasing of friction, so at 1/4 of viewport it's at max value.\n            // Looks not as nice as was expected. Left for history.\n            // panFriction = (1 - (_panOffset[axis] + delta[axis] + panBounds.min[axis]) / (_viewportSize[axis] / 4) );\n          } else {\n            panFriction = 1;\n          }\n\n          newOffset = _panOffset[axis] + delta[axis] * panFriction; // move main scroll or start panning\n\n          if (_options.allowPanToNext || _currZoomLevel === self.currItem.initialZoomLevel) {\n            if (!_currZoomElementStyle) {\n              newMainScrollPos = newMainScrollPosition;\n            } else if (_direction === 'h' && axis === 'x' && !_zoomStarted) {\n              if (dir) {\n                if (newOffset > _currPanBounds.min[axis]) {\n                  panFriction = _options.panEndFriction;\n                  overDiff = _currPanBounds.min[axis] - newOffset;\n                  startOverDiff = _currPanBounds.min[axis] - _startPanOffset[axis];\n                } // drag right\n\n\n                if ((startOverDiff <= 0 || mainScrollDiff < 0) && _getNumItems() > 1) {\n                  newMainScrollPos = newMainScrollPosition;\n\n                  if (mainScrollDiff < 0 && newMainScrollPosition > _startMainScrollPos.x) {\n                    newMainScrollPos = _startMainScrollPos.x;\n                  }\n                } else {\n                  if (_currPanBounds.min.x !== _currPanBounds.max.x) {\n                    newPanPos = newOffset;\n                  }\n                }\n              } else {\n                if (newOffset < _currPanBounds.max[axis]) {\n                  panFriction = _options.panEndFriction;\n                  overDiff = newOffset - _currPanBounds.max[axis];\n                  startOverDiff = _startPanOffset[axis] - _currPanBounds.max[axis];\n                }\n\n                if ((startOverDiff <= 0 || mainScrollDiff > 0) && _getNumItems() > 1) {\n                  newMainScrollPos = newMainScrollPosition;\n\n                  if (mainScrollDiff > 0 && newMainScrollPosition < _startMainScrollPos.x) {\n                    newMainScrollPos = _startMainScrollPos.x;\n                  }\n                } else {\n                  if (_currPanBounds.min.x !== _currPanBounds.max.x) {\n                    newPanPos = newOffset;\n                  }\n                }\n              } //\n\n            }\n\n            if (axis === 'x') {\n              if (newMainScrollPos !== undefined) {\n                _moveMainScroll(newMainScrollPos, true);\n\n                if (newMainScrollPos === _startMainScrollPos.x) {\n                  _mainScrollShifted = false;\n                } else {\n                  _mainScrollShifted = true;\n                }\n              }\n\n              if (_currPanBounds.min.x !== _currPanBounds.max.x) {\n                if (newPanPos !== undefined) {\n                  _panOffset.x = newPanPos;\n                } else if (!_mainScrollShifted) {\n                  _panOffset.x += delta.x * panFriction;\n                }\n              }\n\n              return newMainScrollPos !== undefined;\n            }\n          }\n\n          if (!_mainScrollAnimating) {\n            if (!_mainScrollShifted) {\n              if (_currZoomLevel > self.currItem.fitRatio) {\n                _panOffset[axis] += delta[axis] * panFriction;\n              }\n            }\n          }\n        },\n            // Pointerdown/touchstart/mousedown handler\n        _onDragStart = function _onDragStart(e) {\n          // Allow dragging only via left mouse button.\n          // As this handler is not added in IE8 - we ignore e.which\n          //\n          // http://www.quirksmode.org/js/events_properties.html\n          // https://developer.mozilla.org/en-US/docs/Web/API/event.button\n          if (e.type === 'mousedown' && e.button > 0) {\n            return;\n          }\n\n          if (_initialZoomRunning) {\n            e.preventDefault();\n            return;\n          }\n\n          if (_oldAndroidTouchEndTimeout && e.type === 'mousedown') {\n            return;\n          }\n\n          if (_preventDefaultEventBehaviour(e, true)) {\n            e.preventDefault();\n          }\n\n          _shout('pointerDown');\n\n          if (_pointerEventEnabled) {\n            var pointerIndex = framework.arraySearch(_currPointers, e.pointerId, 'id');\n\n            if (pointerIndex < 0) {\n              pointerIndex = _currPointers.length;\n            }\n\n            _currPointers[pointerIndex] = {\n              x: e.pageX,\n              y: e.pageY,\n              id: e.pointerId\n            };\n          }\n\n          var startPointsList = _getTouchPoints(e),\n              numPoints = startPointsList.length;\n\n          _currentPoints = null;\n\n          _stopAllAnimations(); // init drag\n\n\n          if (!_isDragging || numPoints === 1) {\n            _isDragging = _isFirstMove = true;\n            framework.bind(window, _upMoveEvents, self);\n            _isZoomingIn = _wasOverInitialZoom = _opacityChanged = _verticalDragInitiated = _mainScrollShifted = _moved = _isMultitouch = _zoomStarted = false;\n            _direction = null;\n\n            _shout('firstTouchStart', startPointsList);\n\n            _equalizePoints(_startPanOffset, _panOffset);\n\n            _currPanDist.x = _currPanDist.y = 0;\n\n            _equalizePoints(_currPoint, startPointsList[0]);\n\n            _equalizePoints(_startPoint, _currPoint); //_equalizePoints(_startMainScrollPos, _mainScrollPos);\n\n\n            _startMainScrollPos.x = _slideSize.x * _currPositionIndex;\n            _posPoints = [{\n              x: _currPoint.x,\n              y: _currPoint.y\n            }];\n            _gestureCheckSpeedTime = _gestureStartTime = _getCurrentTime(); //_mainScrollAnimationEnd(true);\n\n            _calculatePanBounds(_currZoomLevel, true); // Start rendering\n\n\n            _stopDragUpdateLoop();\n\n            _dragUpdateLoop();\n          } // init zoom\n\n\n          if (!_isZooming && numPoints > 1 && !_mainScrollAnimating && !_mainScrollShifted) {\n            _startZoomLevel = _currZoomLevel;\n            _zoomStarted = false; // true if zoom changed at least once\n\n            _isZooming = _isMultitouch = true;\n            _currPanDist.y = _currPanDist.x = 0;\n\n            _equalizePoints(_startPanOffset, _panOffset);\n\n            _equalizePoints(p, startPointsList[0]);\n\n            _equalizePoints(p2, startPointsList[1]);\n\n            _findCenterOfPoints(p, p2, _currCenterPoint);\n\n            _midZoomPoint.x = Math.abs(_currCenterPoint.x) - _panOffset.x;\n            _midZoomPoint.y = Math.abs(_currCenterPoint.y) - _panOffset.y;\n            _currPointsDistance = _startPointsDistance = _calculatePointsDistance(p, p2);\n          }\n        },\n            // Pointermove/touchmove/mousemove handler\n        _onDragMove = function _onDragMove(e) {\n          e.preventDefault();\n\n          if (_pointerEventEnabled) {\n            var pointerIndex = framework.arraySearch(_currPointers, e.pointerId, 'id');\n\n            if (pointerIndex > -1) {\n              var p = _currPointers[pointerIndex];\n              p.x = e.pageX;\n              p.y = e.pageY;\n            }\n          }\n\n          if (_isDragging) {\n            var touchesList = _getTouchPoints(e);\n\n            if (!_direction && !_moved && !_isZooming) {\n              if (_mainScrollPos.x !== _slideSize.x * _currPositionIndex) {\n                // if main scroll position is shifted \u2013 direction is always horizontal\n                _direction = 'h';\n              } else {\n                var diff = Math.abs(touchesList[0].x - _currPoint.x) - Math.abs(touchesList[0].y - _currPoint.y); // check the direction of movement\n\n                if (Math.abs(diff) >= DIRECTION_CHECK_OFFSET) {\n                  _direction = diff > 0 ? 'h' : 'v';\n                  _currentPoints = touchesList;\n                }\n              }\n            } else {\n              _currentPoints = touchesList;\n            }\n          }\n        },\n            //\n        _renderMovement = function _renderMovement() {\n          if (!_currentPoints) {\n            return;\n          }\n\n          var numPoints = _currentPoints.length;\n\n          if (numPoints === 0) {\n            return;\n          }\n\n          _equalizePoints(p, _currentPoints[0]);\n\n          delta.x = p.x - _currPoint.x;\n          delta.y = p.y - _currPoint.y;\n\n          if (_isZooming && numPoints > 1) {\n            // Handle behaviour for more than 1 point\n            _currPoint.x = p.x;\n            _currPoint.y = p.y; // check if one of two points changed\n\n            if (!delta.x && !delta.y && _isEqualPoints(_currentPoints[1], p2)) {\n              return;\n            }\n\n            _equalizePoints(p2, _currentPoints[1]);\n\n            if (!_zoomStarted) {\n              _zoomStarted = true;\n\n              _shout('zoomGestureStarted');\n            } // Distance between two points\n\n\n            var pointsDistance = _calculatePointsDistance(p, p2);\n\n            var zoomLevel = _calculateZoomLevel(pointsDistance); // slightly over the of initial zoom level\n\n\n            if (zoomLevel > self.currItem.initialZoomLevel + self.currItem.initialZoomLevel / 15) {\n              _wasOverInitialZoom = true;\n            } // Apply the friction if zoom level is out of the bounds\n\n\n            var zoomFriction = 1,\n                minZoomLevel = _getMinZoomLevel(),\n                maxZoomLevel = _getMaxZoomLevel();\n\n            if (zoomLevel < minZoomLevel) {\n              if (_options.pinchToClose && !_wasOverInitialZoom && _startZoomLevel <= self.currItem.initialZoomLevel) {\n                // fade out background if zooming out\n                var minusDiff = minZoomLevel - zoomLevel;\n                var percent = 1 - minusDiff / (minZoomLevel / 1.2);\n\n                _applyBgOpacity(percent);\n\n                _shout('onPinchClose', percent);\n\n                _opacityChanged = true;\n              } else {\n                zoomFriction = (minZoomLevel - zoomLevel) / minZoomLevel;\n\n                if (zoomFriction > 1) {\n                  zoomFriction = 1;\n                }\n\n                zoomLevel = minZoomLevel - zoomFriction * (minZoomLevel / 3);\n              }\n            } else if (zoomLevel > maxZoomLevel) {\n              // 1.5 - extra zoom level above the max. E.g. if max is x6, real max 6 + 1.5 = 7.5\n              zoomFriction = (zoomLevel - maxZoomLevel) / (minZoomLevel * 6);\n\n              if (zoomFriction > 1) {\n                zoomFriction = 1;\n              }\n\n              zoomLevel = maxZoomLevel + zoomFriction * minZoomLevel;\n            }\n\n            if (zoomFriction < 0) {\n              zoomFriction = 0;\n            } // distance between touch points after friction is applied\n\n\n            _currPointsDistance = pointsDistance; // _centerPoint - The point in the middle of two pointers\n\n            _findCenterOfPoints(p, p2, _centerPoint); // paning with two pointers pressed\n\n\n            _currPanDist.x += _centerPoint.x - _currCenterPoint.x;\n            _currPanDist.y += _centerPoint.y - _currCenterPoint.y;\n\n            _equalizePoints(_currCenterPoint, _centerPoint);\n\n            _panOffset.x = _calculatePanOffset('x', zoomLevel);\n            _panOffset.y = _calculatePanOffset('y', zoomLevel);\n            _isZoomingIn = zoomLevel > _currZoomLevel;\n            _currZoomLevel = zoomLevel;\n\n            _applyCurrentZoomPan();\n          } else {\n            // handle behaviour for one point (dragging or panning)\n            if (!_direction) {\n              return;\n            }\n\n            if (_isFirstMove) {\n              _isFirstMove = false; // subtract drag distance that was used during the detection direction\n\n              if (Math.abs(delta.x) >= DIRECTION_CHECK_OFFSET) {\n                delta.x -= _currentPoints[0].x - _startPoint.x;\n              }\n\n              if (Math.abs(delta.y) >= DIRECTION_CHECK_OFFSET) {\n                delta.y -= _currentPoints[0].y - _startPoint.y;\n              }\n            }\n\n            _currPoint.x = p.x;\n            _currPoint.y = p.y; // do nothing if pointers position hasn't changed\n\n            if (delta.x === 0 && delta.y === 0) {\n              return;\n            }\n\n            if (_direction === 'v' && _options.closeOnVerticalDrag) {\n              if (!_canPan()) {\n                _currPanDist.y += delta.y;\n                _panOffset.y += delta.y;\n\n                var opacityRatio = _calculateVerticalDragOpacityRatio();\n\n                _verticalDragInitiated = true;\n\n                _shout('onVerticalDrag', opacityRatio);\n\n                _applyBgOpacity(opacityRatio);\n\n                _applyCurrentZoomPan();\n\n                return;\n              }\n            }\n\n            _pushPosPoint(_getCurrentTime(), p.x, p.y);\n\n            _moved = true;\n            _currPanBounds = self.currItem.bounds;\n\n            var mainScrollChanged = _panOrMoveMainScroll('x', delta);\n\n            if (!mainScrollChanged) {\n              _panOrMoveMainScroll('y', delta);\n\n              _roundPoint(_panOffset);\n\n              _applyCurrentZoomPan();\n            }\n          }\n        },\n            // Pointerup/pointercancel/touchend/touchcancel/mouseup event handler\n        _onDragRelease = function _onDragRelease(e) {\n          if (_features.isOldAndroid) {\n            if (_oldAndroidTouchEndTimeout && e.type === 'mouseup') {\n              return;\n            } // on Android (v4.1, 4.2, 4.3 & possibly older)\n            // ghost mousedown/up event isn't preventable via e.preventDefault,\n            // which causes fake mousedown event\n            // so we block mousedown/up for 600ms\n\n\n            if (e.type.indexOf('touch') > -1) {\n              clearTimeout(_oldAndroidTouchEndTimeout);\n              _oldAndroidTouchEndTimeout = setTimeout(function () {\n                _oldAndroidTouchEndTimeout = 0;\n              }, 600);\n            }\n          }\n\n          _shout('pointerUp');\n\n          if (_preventDefaultEventBehaviour(e, false)) {\n            e.preventDefault();\n          }\n\n          var releasePoint;\n\n          if (_pointerEventEnabled) {\n            var pointerIndex = framework.arraySearch(_currPointers, e.pointerId, 'id');\n\n            if (pointerIndex > -1) {\n              releasePoint = _currPointers.splice(pointerIndex, 1)[0];\n\n              if (navigator.msPointerEnabled) {\n                var MSPOINTER_TYPES = {\n                  4: 'mouse',\n                  // event.MSPOINTER_TYPE_MOUSE\n                  2: 'touch',\n                  // event.MSPOINTER_TYPE_TOUCH\n                  3: 'pen' // event.MSPOINTER_TYPE_PEN\n\n                };\n                releasePoint.type = MSPOINTER_TYPES[e.pointerType];\n\n                if (!releasePoint.type) {\n                  releasePoint.type = e.pointerType || 'mouse';\n                }\n              } else {\n                releasePoint.type = e.pointerType || 'mouse';\n              }\n            }\n          }\n\n          var touchList = _getTouchPoints(e),\n              gestureType,\n              numPoints = touchList.length;\n\n          if (e.type === 'mouseup') {\n            numPoints = 0;\n          } // Do nothing if there were 3 touch points or more\n\n\n          if (numPoints === 2) {\n            _currentPoints = null;\n            return true;\n          } // if second pointer released\n\n\n          if (numPoints === 1) {\n            _equalizePoints(_startPoint, touchList[0]);\n          } // pointer hasn't moved, send \"tap release\" point\n\n\n          if (numPoints === 0 && !_direction && !_mainScrollAnimating) {\n            if (!releasePoint) {\n              if (e.type === 'mouseup') {\n                releasePoint = {\n                  x: e.pageX,\n                  y: e.pageY,\n                  type: 'mouse'\n                };\n              } else if (e.changedTouches && e.changedTouches[0]) {\n                releasePoint = {\n                  x: e.changedTouches[0].pageX,\n                  y: e.changedTouches[0].pageY,\n                  type: 'touch'\n                };\n              }\n            }\n\n            _shout('touchRelease', e, releasePoint);\n          } // Difference in time between releasing of two last touch points (zoom gesture)\n\n\n          var releaseTimeDiff = -1; // Gesture completed, no pointers left\n\n          if (numPoints === 0) {\n            _isDragging = false;\n            framework.unbind(window, _upMoveEvents, self);\n\n            _stopDragUpdateLoop();\n\n            if (_isZooming) {\n              // Two points released at the same time\n              releaseTimeDiff = 0;\n            } else if (_lastReleaseTime !== -1) {\n              releaseTimeDiff = _getCurrentTime() - _lastReleaseTime;\n            }\n          }\n\n          _lastReleaseTime = numPoints === 1 ? _getCurrentTime() : -1;\n\n          if (releaseTimeDiff !== -1 && releaseTimeDiff < 150) {\n            gestureType = 'zoom';\n          } else {\n            gestureType = 'swipe';\n          }\n\n          if (_isZooming && numPoints < 2) {\n            _isZooming = false; // Only second point released\n\n            if (numPoints === 1) {\n              gestureType = 'zoomPointerUp';\n            }\n\n            _shout('zoomGestureEnded');\n          }\n\n          _currentPoints = null;\n\n          if (!_moved && !_zoomStarted && !_mainScrollAnimating && !_verticalDragInitiated) {\n            // nothing to animate\n            return;\n          }\n\n          _stopAllAnimations();\n\n          if (!_releaseAnimData) {\n            _releaseAnimData = _initDragReleaseAnimationData();\n          }\n\n          _releaseAnimData.calculateSwipeSpeed('x');\n\n          if (_verticalDragInitiated) {\n            var opacityRatio = _calculateVerticalDragOpacityRatio();\n\n            if (opacityRatio < _options.verticalDragRange) {\n              self.close();\n            } else {\n              var initalPanY = _panOffset.y,\n                  initialBgOpacity = _bgOpacity;\n\n              _animateProp('verticalDrag', 0, 1, 300, framework.easing.cubic.out, function (now) {\n                _panOffset.y = (self.currItem.initialPosition.y - initalPanY) * now + initalPanY;\n\n                _applyBgOpacity((1 - initialBgOpacity) * now + initialBgOpacity);\n\n                _applyCurrentZoomPan();\n              });\n\n              _shout('onVerticalDrag', 1);\n            }\n\n            return;\n          } // main scroll\n\n\n          if ((_mainScrollShifted || _mainScrollAnimating) && numPoints === 0) {\n            var itemChanged = _finishSwipeMainScrollGesture(gestureType, _releaseAnimData);\n\n            if (itemChanged) {\n              return;\n            }\n\n            gestureType = 'zoomPointerUp';\n          } // prevent zoom/pan animation when main scroll animation runs\n\n\n          if (_mainScrollAnimating) {\n            return;\n          } // Complete simple zoom gesture (reset zoom level if it's out of the bounds)\n\n\n          if (gestureType !== 'swipe') {\n            _completeZoomGesture();\n\n            return;\n          } // Complete pan gesture if main scroll is not shifted, and it's possible to pan current image\n\n\n          if (!_mainScrollShifted && _currZoomLevel > self.currItem.fitRatio) {\n            _completePanGesture(_releaseAnimData);\n          }\n        },\n            // Returns object with data about gesture\n        // It's created only once and then reused\n        _initDragReleaseAnimationData = function _initDragReleaseAnimationData() {\n          // temp local vars\n          var lastFlickDuration, tempReleasePos; // s = this\n\n          var s = {\n            lastFlickOffset: {},\n            lastFlickDist: {},\n            lastFlickSpeed: {},\n            slowDownRatio: {},\n            slowDownRatioReverse: {},\n            speedDecelerationRatio: {},\n            speedDecelerationRatioAbs: {},\n            distanceOffset: {},\n            backAnimDestination: {},\n            backAnimStarted: {},\n            calculateSwipeSpeed: function calculateSwipeSpeed(axis) {\n              if (_posPoints.length > 1) {\n                lastFlickDuration = _getCurrentTime() - _gestureCheckSpeedTime + 50;\n                tempReleasePos = _posPoints[_posPoints.length - 2][axis];\n              } else {\n                lastFlickDuration = _getCurrentTime() - _gestureStartTime; // total gesture duration\n\n                tempReleasePos = _startPoint[axis];\n              }\n\n              s.lastFlickOffset[axis] = _currPoint[axis] - tempReleasePos;\n              s.lastFlickDist[axis] = Math.abs(s.lastFlickOffset[axis]);\n\n              if (s.lastFlickDist[axis] > 20) {\n                s.lastFlickSpeed[axis] = s.lastFlickOffset[axis] / lastFlickDuration;\n              } else {\n                s.lastFlickSpeed[axis] = 0;\n              }\n\n              if (Math.abs(s.lastFlickSpeed[axis]) < 0.1) {\n                s.lastFlickSpeed[axis] = 0;\n              }\n\n              s.slowDownRatio[axis] = 0.95;\n              s.slowDownRatioReverse[axis] = 1 - s.slowDownRatio[axis];\n              s.speedDecelerationRatio[axis] = 1;\n            },\n            calculateOverBoundsAnimOffset: function calculateOverBoundsAnimOffset(axis, speed) {\n              if (!s.backAnimStarted[axis]) {\n                if (_panOffset[axis] > _currPanBounds.min[axis]) {\n                  s.backAnimDestination[axis] = _currPanBounds.min[axis];\n                } else if (_panOffset[axis] < _currPanBounds.max[axis]) {\n                  s.backAnimDestination[axis] = _currPanBounds.max[axis];\n                }\n\n                if (s.backAnimDestination[axis] !== undefined) {\n                  s.slowDownRatio[axis] = 0.7;\n                  s.slowDownRatioReverse[axis] = 1 - s.slowDownRatio[axis];\n\n                  if (s.speedDecelerationRatioAbs[axis] < 0.05) {\n                    s.lastFlickSpeed[axis] = 0;\n                    s.backAnimStarted[axis] = true;\n\n                    _animateProp('bounceZoomPan' + axis, _panOffset[axis], s.backAnimDestination[axis], speed || 300, framework.easing.sine.out, function (pos) {\n                      _panOffset[axis] = pos;\n\n                      _applyCurrentZoomPan();\n                    });\n                  }\n                }\n              }\n            },\n            // Reduces the speed by slowDownRatio (per 10ms)\n            calculateAnimOffset: function calculateAnimOffset(axis) {\n              if (!s.backAnimStarted[axis]) {\n                s.speedDecelerationRatio[axis] = s.speedDecelerationRatio[axis] * (s.slowDownRatio[axis] + s.slowDownRatioReverse[axis] - s.slowDownRatioReverse[axis] * s.timeDiff / 10);\n                s.speedDecelerationRatioAbs[axis] = Math.abs(s.lastFlickSpeed[axis] * s.speedDecelerationRatio[axis]);\n                s.distanceOffset[axis] = s.lastFlickSpeed[axis] * s.speedDecelerationRatio[axis] * s.timeDiff;\n                _panOffset[axis] += s.distanceOffset[axis];\n              }\n            },\n            panAnimLoop: function panAnimLoop() {\n              if (_animations.zoomPan) {\n                _animations.zoomPan.raf = _requestAF(s.panAnimLoop);\n                s.now = _getCurrentTime();\n                s.timeDiff = s.now - s.lastNow;\n                s.lastNow = s.now;\n                s.calculateAnimOffset('x');\n                s.calculateAnimOffset('y');\n\n                _applyCurrentZoomPan();\n\n                s.calculateOverBoundsAnimOffset('x');\n                s.calculateOverBoundsAnimOffset('y');\n\n                if (s.speedDecelerationRatioAbs.x < 0.05 && s.speedDecelerationRatioAbs.y < 0.05) {\n                  // round pan position\n                  _panOffset.x = Math.round(_panOffset.x);\n                  _panOffset.y = Math.round(_panOffset.y);\n\n                  _applyCurrentZoomPan();\n\n                  _stopAnimation('zoomPan');\n\n                  return;\n                }\n              }\n            }\n          };\n          return s;\n        },\n            _completePanGesture = function _completePanGesture(animData) {\n          // calculate swipe speed for Y axis (paanning)\n          animData.calculateSwipeSpeed('y');\n          _currPanBounds = self.currItem.bounds;\n          animData.backAnimDestination = {};\n          animData.backAnimStarted = {}; // Avoid acceleration animation if speed is too low\n\n          if (Math.abs(animData.lastFlickSpeed.x) <= 0.05 && Math.abs(animData.lastFlickSpeed.y) <= 0.05) {\n            animData.speedDecelerationRatioAbs.x = animData.speedDecelerationRatioAbs.y = 0; // Run pan drag release animation. E.g. if you drag image and release finger without momentum.\n\n            animData.calculateOverBoundsAnimOffset('x');\n            animData.calculateOverBoundsAnimOffset('y');\n            return true;\n          } // Animation loop that controls the acceleration after pan gesture ends\n\n\n          _registerStartAnimation('zoomPan');\n\n          animData.lastNow = _getCurrentTime();\n          animData.panAnimLoop();\n        },\n            _finishSwipeMainScrollGesture = function _finishSwipeMainScrollGesture(gestureType, _releaseAnimData) {\n          var itemChanged;\n\n          if (!_mainScrollAnimating) {\n            _currZoomedItemIndex = _currentItemIndex;\n          }\n\n          var itemsDiff;\n\n          if (gestureType === 'swipe') {\n            var totalShiftDist = _currPoint.x - _startPoint.x,\n                isFastLastFlick = _releaseAnimData.lastFlickDist.x < 10; // if container is shifted for more than MIN_SWIPE_DISTANCE,\n            // and last flick gesture was in right direction\n\n            if (totalShiftDist > MIN_SWIPE_DISTANCE && (isFastLastFlick || _releaseAnimData.lastFlickOffset.x > 20)) {\n              // go to prev item\n              itemsDiff = -1;\n            } else if (totalShiftDist < -MIN_SWIPE_DISTANCE && (isFastLastFlick || _releaseAnimData.lastFlickOffset.x < -20)) {\n              // go to next item\n              itemsDiff = 1;\n            }\n          }\n\n          var nextCircle;\n\n          if (itemsDiff) {\n            _currentItemIndex += itemsDiff;\n\n            if (_currentItemIndex < 0) {\n              _currentItemIndex = _options.loop ? _getNumItems() - 1 : 0;\n              nextCircle = true;\n            } else if (_currentItemIndex >= _getNumItems()) {\n              _currentItemIndex = _options.loop ? 0 : _getNumItems() - 1;\n              nextCircle = true;\n            }\n\n            if (!nextCircle || _options.loop) {\n              _indexDiff += itemsDiff;\n              _currPositionIndex -= itemsDiff;\n              itemChanged = true;\n            }\n          }\n\n          var animateToX = _slideSize.x * _currPositionIndex;\n          var animateToDist = Math.abs(animateToX - _mainScrollPos.x);\n          var finishAnimDuration;\n\n          if (!itemChanged && animateToX > _mainScrollPos.x !== _releaseAnimData.lastFlickSpeed.x > 0) {\n            // \"return to current\" duration, e.g. when dragging from slide 0 to -1\n            finishAnimDuration = 333;\n          } else {\n            finishAnimDuration = Math.abs(_releaseAnimData.lastFlickSpeed.x) > 0 ? animateToDist / Math.abs(_releaseAnimData.lastFlickSpeed.x) : 333;\n            finishAnimDuration = Math.min(finishAnimDuration, 400);\n            finishAnimDuration = Math.max(finishAnimDuration, 250);\n          }\n\n          if (_currZoomedItemIndex === _currentItemIndex) {\n            itemChanged = false;\n          }\n\n          _mainScrollAnimating = true;\n\n          _shout('mainScrollAnimStart');\n\n          _animateProp('mainScroll', _mainScrollPos.x, animateToX, finishAnimDuration, framework.easing.cubic.out, _moveMainScroll, function () {\n            _stopAllAnimations();\n\n            _mainScrollAnimating = false;\n            _currZoomedItemIndex = -1;\n\n            if (itemChanged || _currZoomedItemIndex !== _currentItemIndex) {\n              self.updateCurrItem();\n            }\n\n            _shout('mainScrollAnimComplete');\n          });\n\n          if (itemChanged) {\n            self.updateCurrItem(true);\n          }\n\n          return itemChanged;\n        },\n            _calculateZoomLevel = function _calculateZoomLevel(touchesDistance) {\n          return 1 / _startPointsDistance * touchesDistance * _startZoomLevel;\n        },\n            // Resets zoom if it's out of bounds\n        _completeZoomGesture = function _completeZoomGesture() {\n          var destZoomLevel = _currZoomLevel,\n              minZoomLevel = _getMinZoomLevel(),\n              maxZoomLevel = _getMaxZoomLevel();\n\n          if (_currZoomLevel < minZoomLevel) {\n            destZoomLevel = minZoomLevel;\n          } else if (_currZoomLevel > maxZoomLevel) {\n            destZoomLevel = maxZoomLevel;\n          }\n\n          var destOpacity = 1,\n              onUpdate,\n              initialOpacity = _bgOpacity;\n\n          if (_opacityChanged && !_isZoomingIn && !_wasOverInitialZoom && _currZoomLevel < minZoomLevel) {\n            //_closedByScroll = true;\n            self.close();\n            return true;\n          }\n\n          if (_opacityChanged) {\n            onUpdate = function onUpdate(now) {\n              _applyBgOpacity((destOpacity - initialOpacity) * now + initialOpacity);\n            };\n          }\n\n          self.zoomTo(destZoomLevel, 0, 200, framework.easing.cubic.out, onUpdate);\n          return true;\n        };\n\n        _registerModule('Gestures', {\n          publicMethods: {\n            initGestures: function initGestures() {\n              // helper function that builds touch/pointer/mouse events\n              var addEventNames = function addEventNames(pref, down, move, up, cancel) {\n                _dragStartEvent = pref + down;\n                _dragMoveEvent = pref + move;\n                _dragEndEvent = pref + up;\n\n                if (cancel) {\n                  _dragCancelEvent = pref + cancel;\n                } else {\n                  _dragCancelEvent = '';\n                }\n              };\n\n              _pointerEventEnabled = _features.pointerEvent;\n\n              if (_pointerEventEnabled && _features.touch) {\n                // we don't need touch events, if browser supports pointer events\n                _features.touch = false;\n              }\n\n              if (_pointerEventEnabled) {\n                if (navigator.msPointerEnabled) {\n                  // IE10 pointer events are case-sensitive\n                  addEventNames('MSPointer', 'Down', 'Move', 'Up', 'Cancel');\n                } else {\n                  addEventNames('pointer', 'down', 'move', 'up', 'cancel');\n                }\n              } else if (_features.touch) {\n                addEventNames('touch', 'start', 'move', 'end', 'cancel');\n                _likelyTouchDevice = true;\n              } else {\n                addEventNames('mouse', 'down', 'move', 'up');\n              }\n\n              _upMoveEvents = _dragMoveEvent + ' ' + _dragEndEvent + ' ' + _dragCancelEvent;\n              _downEvents = _dragStartEvent;\n\n              if (_pointerEventEnabled && !_likelyTouchDevice) {\n                _likelyTouchDevice = navigator.maxTouchPoints > 1 || navigator.msMaxTouchPoints > 1;\n              } // make variable public\n\n\n              self.likelyTouchDevice = _likelyTouchDevice;\n              _globalEventHandlers[_dragStartEvent] = _onDragStart;\n              _globalEventHandlers[_dragMoveEvent] = _onDragMove;\n              _globalEventHandlers[_dragEndEvent] = _onDragRelease; // the Kraken\n\n              if (_dragCancelEvent) {\n                _globalEventHandlers[_dragCancelEvent] = _globalEventHandlers[_dragEndEvent];\n              } // Bind mouse events on device with detected hardware touch support, in case it supports multiple types of input.\n\n\n              if (_features.touch) {\n                _downEvents += ' mousedown';\n                _upMoveEvents += ' mousemove mouseup';\n                _globalEventHandlers.mousedown = _globalEventHandlers[_dragStartEvent];\n                _globalEventHandlers.mousemove = _globalEventHandlers[_dragMoveEvent];\n                _globalEventHandlers.mouseup = _globalEventHandlers[_dragEndEvent];\n              }\n\n              if (!_likelyTouchDevice) {\n                // don't allow pan to next slide from zoomed state on Desktop\n                _options.allowPanToNext = false;\n              }\n            }\n          }\n        });\n        /*>>gestures*/\n\n        /*>>show-hide-transition*/\n\n        /**\n         * show-hide-transition.js:\n         *\n         * Manages initial opening or closing transition.\n         *\n         * If you're not planning to use transition for gallery at all,\n         * you may set options hideAnimationDuration and showAnimationDuration to 0,\n         * and just delete startAnimation function.\n         *\n         */\n\n\n        var _showOrHideTimeout,\n            _showOrHide = function _showOrHide(item, img, out, completeFn) {\n          if (_showOrHideTimeout) {\n            clearTimeout(_showOrHideTimeout);\n          }\n\n          _initialZoomRunning = true;\n          _initialContentSet = true; // dimensions of small thumbnail {x:,y:,w:}.\n          // Height is optional, as calculated based on large image.\n\n          var thumbBounds;\n\n          if (item.initialLayout) {\n            thumbBounds = item.initialLayout;\n            item.initialLayout = null;\n          } else {\n            thumbBounds = _options.getThumbBoundsFn && _options.getThumbBoundsFn(_currentItemIndex);\n          }\n\n          var duration = out ? _options.hideAnimationDuration : _options.showAnimationDuration;\n\n          var onComplete = function onComplete() {\n            _stopAnimation('initialZoom');\n\n            if (!out) {\n              _applyBgOpacity(1);\n\n              if (img) {\n                img.style.display = 'block';\n              }\n\n              framework.addClass(template, 'pswp--animated-in');\n\n              _shout('initialZoom' + (out ? 'OutEnd' : 'InEnd'));\n            } else {\n              self.template.removeAttribute('style');\n              self.bg.removeAttribute('style');\n            }\n\n            if (completeFn) {\n              completeFn();\n            }\n\n            _initialZoomRunning = false;\n          }; // if bounds aren't provided, just open gallery without animation\n\n\n          if (!duration || !thumbBounds || thumbBounds.x === undefined) {\n            _shout('initialZoom' + (out ? 'Out' : 'In'));\n\n            _currZoomLevel = item.initialZoomLevel;\n\n            _equalizePoints(_panOffset, item.initialPosition);\n\n            _applyCurrentZoomPan();\n\n            template.style.opacity = out ? 0 : 1;\n\n            _applyBgOpacity(1);\n\n            if (duration) {\n              setTimeout(function () {\n                onComplete();\n              }, duration);\n            } else {\n              onComplete();\n            }\n\n            return;\n          }\n\n          var startAnimation = function startAnimation() {\n            var closeWithRaf = _closedByScroll,\n                fadeEverything = !self.currItem.src || self.currItem.loadError || _options.showHideOpacity; // apply hw-acceleration to image\n\n            if (item.miniImg) {\n              item.miniImg.style.webkitBackfaceVisibility = 'hidden';\n            }\n\n            if (!out) {\n              _currZoomLevel = thumbBounds.w / item.w;\n              _panOffset.x = thumbBounds.x;\n              _panOffset.y = thumbBounds.y - _initalWindowScrollY;\n              self[fadeEverything ? 'template' : 'bg'].style.opacity = 0.001;\n\n              _applyCurrentZoomPan();\n            }\n\n            _registerStartAnimation('initialZoom');\n\n            if (out && !closeWithRaf) {\n              framework.removeClass(template, 'pswp--animated-in');\n            }\n\n            if (fadeEverything) {\n              if (out) {\n                framework[(closeWithRaf ? 'remove' : 'add') + 'Class'](template, 'pswp--animate_opacity');\n              } else {\n                setTimeout(function () {\n                  framework.addClass(template, 'pswp--animate_opacity');\n                }, 30);\n              }\n            }\n\n            _showOrHideTimeout = setTimeout(function () {\n              _shout('initialZoom' + (out ? 'Out' : 'In'));\n\n              if (!out) {\n                // \"in\" animation always uses CSS transitions (instead of rAF).\n                // CSS transition work faster here,\n                // as developer may also want to animate other things,\n                // like ui on top of sliding area, which can be animated just via CSS\n                _currZoomLevel = item.initialZoomLevel;\n\n                _equalizePoints(_panOffset, item.initialPosition);\n\n                _applyCurrentZoomPan();\n\n                _applyBgOpacity(1);\n\n                if (fadeEverything) {\n                  template.style.opacity = 1;\n                } else {\n                  _applyBgOpacity(1);\n                }\n\n                _showOrHideTimeout = setTimeout(onComplete, duration + 20);\n              } else {\n                // \"out\" animation uses rAF only when PhotoSwipe is closed by browser scroll, to recalculate position\n                var destZoomLevel = thumbBounds.w / item.w,\n                    initialPanOffset = {\n                  x: _panOffset.x,\n                  y: _panOffset.y\n                },\n                    initialZoomLevel = _currZoomLevel,\n                    initalBgOpacity = _bgOpacity,\n                    onUpdate = function onUpdate(now) {\n                  if (now === 1) {\n                    _currZoomLevel = destZoomLevel;\n                    _panOffset.x = thumbBounds.x;\n                    _panOffset.y = thumbBounds.y - _currentWindowScrollY;\n                  } else {\n                    _currZoomLevel = (destZoomLevel - initialZoomLevel) * now + initialZoomLevel;\n                    _panOffset.x = (thumbBounds.x - initialPanOffset.x) * now + initialPanOffset.x;\n                    _panOffset.y = (thumbBounds.y - _currentWindowScrollY - initialPanOffset.y) * now + initialPanOffset.y;\n                  }\n\n                  _applyCurrentZoomPan();\n\n                  if (fadeEverything) {\n                    template.style.opacity = 1 - now;\n                  } else {\n                    _applyBgOpacity(initalBgOpacity - now * initalBgOpacity);\n                  }\n                };\n\n                if (closeWithRaf) {\n                  _animateProp('initialZoom', 0, 1, duration, framework.easing.cubic.out, onUpdate, onComplete);\n                } else {\n                  onUpdate(1);\n                  _showOrHideTimeout = setTimeout(onComplete, duration + 20);\n                }\n              }\n            }, out ? 25 : 90); // Main purpose of this delay is to give browser time to paint and\n            // create composite layers of PhotoSwipe UI parts (background, controls, caption, arrows).\n            // Which avoids lag at the beginning of scale transition.\n          };\n\n          startAnimation();\n        };\n        /*>>show-hide-transition*/\n\n        /*>>items-controller*/\n\n        /**\n        *\n        * Controller manages gallery items, their dimensions, and their content.\n        *\n        */\n\n\n        var _items,\n            _tempPanAreaSize = {},\n            _imagesToAppendPool = [],\n            _initialContentSet,\n            _initialZoomRunning,\n            _controllerDefaultOptions = {\n          index: 0,\n          errorMsg: '<div class=\"pswp__error-msg\"><a href=\"%url%\" target=\"_blank\">The image</a> could not be loaded.</div>',\n          forceProgressiveLoading: false,\n          // TODO\n          preload: [1, 1],\n          getNumItemsFn: function getNumItemsFn() {\n            return _items.length;\n          }\n        };\n\n        var _getItemAt,\n            _getNumItems,\n            _getZeroBounds = function _getZeroBounds() {\n          return {\n            center: {\n              x: 0,\n              y: 0\n            },\n            max: {\n              x: 0,\n              y: 0\n            },\n            min: {\n              x: 0,\n              y: 0\n            }\n          };\n        },\n            _calculateSingleItemPanBounds = function _calculateSingleItemPanBounds(item, realPanElementW, realPanElementH) {\n          var bounds = item.bounds; // position of element when it's centered\n\n          bounds.center.x = Math.round((_tempPanAreaSize.x - realPanElementW) / 2);\n          bounds.center.y = Math.round((_tempPanAreaSize.y - realPanElementH) / 2) + item.vGap.top; // maximum pan position\n\n          bounds.max.x = realPanElementW > _tempPanAreaSize.x ? Math.round(_tempPanAreaSize.x - realPanElementW) : bounds.center.x;\n          bounds.max.y = realPanElementH > _tempPanAreaSize.y ? Math.round(_tempPanAreaSize.y - realPanElementH) + item.vGap.top : bounds.center.y; // minimum pan position\n\n          bounds.min.x = realPanElementW > _tempPanAreaSize.x ? 0 : bounds.center.x;\n          bounds.min.y = realPanElementH > _tempPanAreaSize.y ? item.vGap.top : bounds.center.y;\n        },\n            _calculateItemSize = function _calculateItemSize(item, viewportSize, zoomLevel) {\n          if (item.src && !item.loadError) {\n            var isInitial = !zoomLevel;\n\n            if (isInitial) {\n              if (!item.vGap) {\n                item.vGap = {\n                  top: 0,\n                  bottom: 0\n                };\n              } // allows overriding vertical margin for individual items\n\n\n              _shout('parseVerticalMargin', item);\n            }\n\n            _tempPanAreaSize.x = viewportSize.x;\n            _tempPanAreaSize.y = viewportSize.y - item.vGap.top - item.vGap.bottom;\n\n            if (isInitial) {\n              var hRatio = _tempPanAreaSize.x / item.w;\n              var vRatio = _tempPanAreaSize.y / item.h;\n              item.fitRatio = hRatio < vRatio ? hRatio : vRatio; //item.fillRatio = hRatio > vRatio ? hRatio : vRatio;\n\n              var scaleMode = _options.scaleMode;\n\n              if (scaleMode === 'orig') {\n                zoomLevel = 1;\n              } else if (scaleMode === 'fit') {\n                zoomLevel = item.fitRatio;\n              }\n\n              if (zoomLevel > 1) {\n                zoomLevel = 1;\n              }\n\n              item.initialZoomLevel = zoomLevel;\n\n              if (!item.bounds) {\n                // reuse bounds object\n                item.bounds = _getZeroBounds();\n              }\n            }\n\n            if (!zoomLevel) {\n              return;\n            }\n\n            _calculateSingleItemPanBounds(item, item.w * zoomLevel, item.h * zoomLevel);\n\n            if (isInitial && zoomLevel === item.initialZoomLevel) {\n              item.initialPosition = item.bounds.center;\n            }\n\n            return item.bounds;\n          } else {\n            item.w = item.h = 0;\n            item.initialZoomLevel = item.fitRatio = 1;\n            item.bounds = _getZeroBounds();\n            item.initialPosition = item.bounds.center; // if it's not image, we return zero bounds (content is not zoomable)\n\n            return item.bounds;\n          }\n        },\n            _appendImage = function _appendImage(index, item, baseDiv, img, preventAnimation, keepPlaceholder) {\n          if (item.loadError) {\n            return;\n          }\n\n          if (img) {\n            item.imageAppended = true;\n\n            _setImageSize(item, img, item === self.currItem && _renderMaxResolution);\n\n            baseDiv.appendChild(img);\n\n            if (keepPlaceholder) {\n              setTimeout(function () {\n                if (item && item.loaded && item.placeholder) {\n                  item.placeholder.style.display = 'none';\n                  item.placeholder = null;\n                }\n              }, 500);\n            }\n          }\n        },\n            _preloadImage = function _preloadImage(item) {\n          item.loading = true;\n          item.loaded = false;\n          var img = item.img = framework.createEl('pswp__img', 'img');\n\n          var onComplete = function onComplete() {\n            item.loading = false;\n            item.loaded = true;\n\n            if (item.loadComplete) {\n              item.loadComplete(item);\n            } else {\n              item.img = null; // no need to store image object\n            }\n\n            img.onload = img.onerror = null;\n            img = null;\n          };\n\n          img.onload = onComplete;\n\n          img.onerror = function () {\n            item.loadError = true;\n            onComplete();\n          };\n\n          img.src = item.src; // + '?a=' + Math.random();\n\n          return img;\n        },\n            _checkForError = function _checkForError(item, cleanUp) {\n          if (item.src && item.loadError && item.container) {\n            if (cleanUp) {\n              item.container.innerHTML = '';\n            }\n\n            item.container.innerHTML = _options.errorMsg.replace('%url%', item.src);\n            return true;\n          }\n        },\n            _setImageSize = function _setImageSize(item, img, maxRes) {\n          if (!item.src) {\n            return;\n          }\n\n          if (!img) {\n            img = item.container.lastChild;\n          }\n\n          var w = maxRes ? item.w : Math.round(item.w * item.fitRatio),\n              h = maxRes ? item.h : Math.round(item.h * item.fitRatio);\n\n          if (item.placeholder && !item.loaded) {\n            item.placeholder.style.width = w + 'px';\n            item.placeholder.style.height = h + 'px';\n          }\n\n          img.style.width = w + 'px';\n          img.style.height = h + 'px';\n        },\n            _appendImagesPool = function _appendImagesPool() {\n          if (_imagesToAppendPool.length) {\n            var poolItem;\n\n            for (var i = 0; i < _imagesToAppendPool.length; i++) {\n              poolItem = _imagesToAppendPool[i];\n\n              if (poolItem.holder.index === poolItem.index) {\n                _appendImage(poolItem.index, poolItem.item, poolItem.baseDiv, poolItem.img, false, poolItem.clearPlaceholder);\n              }\n            }\n\n            _imagesToAppendPool = [];\n          }\n        };\n\n        _registerModule('Controller', {\n          publicMethods: {\n            lazyLoadItem: function lazyLoadItem(index) {\n              index = _getLoopedId(index);\n\n              var item = _getItemAt(index);\n\n              if (!item || (item.loaded || item.loading) && !_itemsNeedUpdate) {\n                return;\n              }\n\n              _shout('gettingData', index, item);\n\n              if (!item.src) {\n                return;\n              }\n\n              _preloadImage(item);\n            },\n            initController: function initController() {\n              framework.extend(_options, _controllerDefaultOptions, true);\n              self.items = _items = items;\n              _getItemAt = self.getItemAt;\n              _getNumItems = _options.getNumItemsFn; //self.getNumItems;\n\n              if (_getNumItems() < 3) {\n                _options.loop = false; // disable loop if less then 3 items\n              }\n\n              _listen('beforeChange', function (diff) {\n                var p = _options.preload,\n                    isNext = diff === null ? true : diff >= 0,\n                    preloadBefore = Math.min(p[0], _getNumItems()),\n                    preloadAfter = Math.min(p[1], _getNumItems()),\n                    i;\n\n                for (i = 1; i <= (isNext ? preloadAfter : preloadBefore); i++) {\n                  self.lazyLoadItem(_currentItemIndex + i);\n                }\n\n                for (i = 1; i <= (isNext ? preloadBefore : preloadAfter); i++) {\n                  self.lazyLoadItem(_currentItemIndex - i);\n                }\n              });\n\n              _listen('initialLayout', function () {\n                self.currItem.initialLayout = _options.getThumbBoundsFn && _options.getThumbBoundsFn(_currentItemIndex);\n              });\n\n              _listen('mainScrollAnimComplete', _appendImagesPool);\n\n              _listen('initialZoomInEnd', _appendImagesPool);\n\n              _listen('destroy', function () {\n                var item;\n\n                for (var i = 0; i < _items.length; i++) {\n                  item = _items[i]; // remove reference to DOM elements, for GC\n\n                  if (item.container) {\n                    item.container = null;\n                  }\n\n                  if (item.placeholder) {\n                    item.placeholder = null;\n                  }\n\n                  if (item.img) {\n                    item.img = null;\n                  }\n\n                  if (item.preloader) {\n                    item.preloader = null;\n                  }\n\n                  if (item.loadError) {\n                    item.loaded = item.loadError = false;\n                  }\n                }\n\n                _imagesToAppendPool = null;\n              });\n            },\n            getItemAt: function getItemAt(index) {\n              if (index >= 0) {\n                return _items[index] !== undefined ? _items[index] : false;\n              }\n\n              return false;\n            },\n            allowProgressiveImg: function allowProgressiveImg() {\n              // 1. Progressive image loading isn't working on webkit/blink\n              //    when hw-acceleration (e.g. translateZ) is applied to IMG element.\n              //    That's why in PhotoSwipe parent element gets zoom transform, not image itself.\n              //\n              // 2. Progressive image loading sometimes blinks in webkit/blink when applying animation to parent element.\n              //    That's why it's disabled on touch devices (mainly because of swipe transition)\n              //\n              // 3. Progressive image loading sometimes doesn't work in IE (up to 11).\n              // Don't allow progressive loading on non-large touch devices\n              return _options.forceProgressiveLoading || !_likelyTouchDevice || _options.mouseUsed || screen.width > 1200; // 1200 - to eliminate touch devices with large screen (like Chromebook Pixel)\n            },\n            setContent: function setContent(holder, index) {\n              if (_options.loop) {\n                index = _getLoopedId(index);\n              }\n\n              var prevItem = self.getItemAt(holder.index);\n\n              if (prevItem) {\n                prevItem.container = null;\n              }\n\n              var item = self.getItemAt(index),\n                  img;\n\n              if (!item) {\n                holder.el.innerHTML = '';\n                return;\n              } // allow to override data\n\n\n              _shout('gettingData', index, item);\n\n              holder.index = index;\n              holder.item = item; // base container DIV is created only once for each of 3 holders\n\n              var baseDiv = item.container = framework.createEl('pswp__zoom-wrap');\n\n              if (!item.src && item.html) {\n                if (item.html.tagName) {\n                  baseDiv.appendChild(item.html);\n                } else {\n                  baseDiv.innerHTML = item.html;\n                }\n              }\n\n              _checkForError(item);\n\n              _calculateItemSize(item, _viewportSize);\n\n              if (item.src && !item.loadError && !item.loaded) {\n                item.loadComplete = function (item) {\n                  // gallery closed before image finished loading\n                  if (!_isOpen) {\n                    return;\n                  } // check if holder hasn't changed while image was loading\n\n\n                  if (holder && holder.index === index) {\n                    if (_checkForError(item, true)) {\n                      item.loadComplete = item.img = null;\n\n                      _calculateItemSize(item, _viewportSize);\n\n                      _applyZoomPanToItem(item);\n\n                      if (holder.index === _currentItemIndex) {\n                        // recalculate dimensions\n                        self.updateCurrZoomItem();\n                      }\n\n                      return;\n                    }\n\n                    if (!item.imageAppended) {\n                      if (_features.transform && (_mainScrollAnimating || _initialZoomRunning)) {\n                        _imagesToAppendPool.push({\n                          item: item,\n                          baseDiv: baseDiv,\n                          img: item.img,\n                          index: index,\n                          holder: holder,\n                          clearPlaceholder: true\n                        });\n                      } else {\n                        _appendImage(index, item, baseDiv, item.img, _mainScrollAnimating || _initialZoomRunning, true);\n                      }\n                    } else {\n                      // remove preloader & mini-img\n                      if (!_initialZoomRunning && item.placeholder) {\n                        item.placeholder.style.display = 'none';\n                        item.placeholder = null;\n                      }\n                    }\n                  }\n\n                  item.loadComplete = null;\n                  item.img = null; // no need to store image element after it's added\n\n                  _shout('imageLoadComplete', index, item);\n                };\n\n                if (framework.features.transform) {\n                  var placeholderClassName = 'pswp__img pswp__img--placeholder';\n                  placeholderClassName += item.msrc ? '' : ' pswp__img--placeholder--blank';\n                  var placeholder = framework.createEl(placeholderClassName, item.msrc ? 'img' : '');\n\n                  if (item.msrc) {\n                    placeholder.src = item.msrc;\n                  }\n\n                  _setImageSize(item, placeholder);\n\n                  baseDiv.appendChild(placeholder);\n                  item.placeholder = placeholder;\n                }\n\n                if (!item.loading) {\n                  _preloadImage(item);\n                }\n\n                if (self.allowProgressiveImg()) {\n                  // just append image\n                  if (!_initialContentSet && _features.transform) {\n                    _imagesToAppendPool.push({\n                      item: item,\n                      baseDiv: baseDiv,\n                      img: item.img,\n                      index: index,\n                      holder: holder\n                    });\n                  } else {\n                    _appendImage(index, item, baseDiv, item.img, true, true);\n                  }\n                }\n              } else if (item.src && !item.loadError) {\n                // image object is created every time, due to bugs of image loading & delay when switching images\n                img = framework.createEl('pswp__img', 'img');\n                img.style.opacity = 1;\n                img.src = item.src;\n\n                _setImageSize(item, img);\n\n                _appendImage(index, item, baseDiv, img);\n              }\n\n              if (!_initialContentSet && index === _currentItemIndex) {\n                _currZoomElementStyle = baseDiv.style;\n\n                _showOrHide(item, img || item.img);\n              } else {\n                _applyZoomPanToItem(item);\n              }\n\n              holder.el.innerHTML = '';\n              holder.el.appendChild(baseDiv);\n            },\n            cleanSlide: function cleanSlide(item) {\n              if (item.img) {\n                item.img.onload = item.img.onerror = null;\n              }\n\n              item.loaded = item.loading = item.img = item.imageAppended = false;\n            }\n          }\n        });\n        /*>>items-controller*/\n\n        /*>>tap*/\n\n        /**\n         * tap.js:\n         *\n         * Displatches tap and double-tap events.\n         *\n         */\n\n\n        var tapTimer,\n            tapReleasePoint = {},\n            _dispatchTapEvent = function _dispatchTapEvent(origEvent, releasePoint, pointerType) {\n          var e = document.createEvent('CustomEvent'),\n              eDetail = {\n            origEvent: origEvent,\n            target: origEvent.target,\n            releasePoint: releasePoint,\n            pointerType: pointerType || 'touch'\n          };\n          e.initCustomEvent('pswpTap', true, true, eDetail);\n          origEvent.target.dispatchEvent(e);\n        };\n\n        _registerModule('Tap', {\n          publicMethods: {\n            initTap: function initTap() {\n              _listen('firstTouchStart', self.onTapStart);\n\n              _listen('touchRelease', self.onTapRelease);\n\n              _listen('destroy', function () {\n                tapReleasePoint = {};\n                tapTimer = null;\n              });\n            },\n            onTapStart: function onTapStart(touchList) {\n              if (touchList.length > 1) {\n                clearTimeout(tapTimer);\n                tapTimer = null;\n              }\n            },\n            onTapRelease: function onTapRelease(e, releasePoint) {\n              if (!releasePoint) {\n                return;\n              }\n\n              if (!_moved && !_isMultitouch && !_numAnimations) {\n                var p0 = releasePoint;\n\n                if (tapTimer) {\n                  clearTimeout(tapTimer);\n                  tapTimer = null; // Check if taped on the same place\n\n                  if (_isNearbyPoints(p0, tapReleasePoint)) {\n                    _shout('doubleTap', p0);\n\n                    return;\n                  }\n                }\n\n                if (releasePoint.type === 'mouse') {\n                  _dispatchTapEvent(e, releasePoint, 'mouse');\n\n                  return;\n                }\n\n                var clickedTagName = e.target.tagName.toUpperCase(); // avoid double tap delay on buttons and elements that have class pswp__single-tap\n\n                if (clickedTagName === 'BUTTON' || framework.hasClass(e.target, 'pswp__single-tap')) {\n                  _dispatchTapEvent(e, releasePoint);\n\n                  return;\n                }\n\n                _equalizePoints(tapReleasePoint, p0);\n\n                tapTimer = setTimeout(function () {\n                  _dispatchTapEvent(e, releasePoint);\n\n                  tapTimer = null;\n                }, 300);\n              }\n            }\n          }\n        });\n        /*>>tap*/\n\n        /*>>desktop-zoom*/\n\n        /**\n         *\n         * desktop-zoom.js:\n         *\n         * - Binds mousewheel event for paning zoomed image.\n         * - Manages \"dragging\", \"zoomed-in\", \"zoom-out\" classes.\n         *   (which are used for cursors and zoom icon)\n         * - Adds toggleDesktopZoom function.\n         *\n         */\n\n\n        var _wheelDelta;\n\n        _registerModule('DesktopZoom', {\n          publicMethods: {\n            initDesktopZoom: function initDesktopZoom() {\n              if (_oldIE) {\n                // no zoom for old IE (<=8)\n                return;\n              }\n\n              if (_likelyTouchDevice) {\n                // if detected hardware touch support, we wait until mouse is used,\n                // and only then apply desktop-zoom features\n                _listen('mouseUsed', function () {\n                  self.setupDesktopZoom();\n                });\n              } else {\n                self.setupDesktopZoom(true);\n              }\n            },\n            setupDesktopZoom: function setupDesktopZoom(onInit) {\n              _wheelDelta = {};\n              var events = 'wheel mousewheel DOMMouseScroll';\n\n              _listen('bindEvents', function () {\n                framework.bind(template, events, self.handleMouseWheel);\n              });\n\n              _listen('unbindEvents', function () {\n                if (_wheelDelta) {\n                  framework.unbind(template, events, self.handleMouseWheel);\n                }\n              });\n\n              self.mouseZoomedIn = false;\n\n              var hasDraggingClass,\n                  updateZoomable = function updateZoomable() {\n                if (self.mouseZoomedIn) {\n                  framework.removeClass(template, 'pswp--zoomed-in');\n                  self.mouseZoomedIn = false;\n                }\n\n                if (_currZoomLevel < 1) {\n                  framework.addClass(template, 'pswp--zoom-allowed');\n                } else {\n                  framework.removeClass(template, 'pswp--zoom-allowed');\n                }\n\n                removeDraggingClass();\n              },\n                  removeDraggingClass = function removeDraggingClass() {\n                if (hasDraggingClass) {\n                  framework.removeClass(template, 'pswp--dragging');\n                  hasDraggingClass = false;\n                }\n              };\n\n              _listen('resize', updateZoomable);\n\n              _listen('afterChange', updateZoomable);\n\n              _listen('pointerDown', function () {\n                if (self.mouseZoomedIn) {\n                  hasDraggingClass = true;\n                  framework.addClass(template, 'pswp--dragging');\n                }\n              });\n\n              _listen('pointerUp', removeDraggingClass);\n\n              if (!onInit) {\n                updateZoomable();\n              }\n            },\n            handleMouseWheel: function handleMouseWheel(e) {\n              if (_currZoomLevel <= self.currItem.fitRatio) {\n                if (_options.modal) {\n                  if (!_options.closeOnScroll || _numAnimations || _isDragging) {\n                    e.preventDefault();\n                  } else if (_transformKey && Math.abs(e.deltaY) > 2) {\n                    // close PhotoSwipe\n                    // if browser supports transforms & scroll changed enough\n                    _closedByScroll = true;\n                    self.close();\n                  }\n                }\n\n                return true;\n              } // allow just one event to fire\n\n\n              e.stopPropagation(); // https://developer.mozilla.org/en-US/docs/Web/Events/wheel\n\n              _wheelDelta.x = 0;\n\n              if ('deltaX' in e) {\n                if (e.deltaMode === 1\n                /* DOM_DELTA_LINE */\n                ) {\n                    // 18 - average line height\n                    _wheelDelta.x = e.deltaX * 18;\n                    _wheelDelta.y = e.deltaY * 18;\n                  } else {\n                  _wheelDelta.x = e.deltaX;\n                  _wheelDelta.y = e.deltaY;\n                }\n              } else if ('wheelDelta' in e) {\n                if (e.wheelDeltaX) {\n                  _wheelDelta.x = -0.16 * e.wheelDeltaX;\n                }\n\n                if (e.wheelDeltaY) {\n                  _wheelDelta.y = -0.16 * e.wheelDeltaY;\n                } else {\n                  _wheelDelta.y = -0.16 * e.wheelDelta;\n                }\n              } else if ('detail' in e) {\n                _wheelDelta.y = e.detail;\n              } else {\n                return;\n              }\n\n              _calculatePanBounds(_currZoomLevel, true);\n\n              var newPanX = _panOffset.x - _wheelDelta.x,\n                  newPanY = _panOffset.y - _wheelDelta.y; // only prevent scrolling in nonmodal mode when not at edges\n\n              if (_options.modal || newPanX <= _currPanBounds.min.x && newPanX >= _currPanBounds.max.x && newPanY <= _currPanBounds.min.y && newPanY >= _currPanBounds.max.y) {\n                e.preventDefault();\n              } // TODO: use rAF instead of mousewheel?\n\n\n              self.panTo(newPanX, newPanY);\n            },\n            toggleDesktopZoom: function toggleDesktopZoom(centerPoint) {\n              centerPoint = centerPoint || {\n                x: _viewportSize.x / 2 + _offset.x,\n                y: _viewportSize.y / 2 + _offset.y\n              };\n\n              var doubleTapZoomLevel = _options.getDoubleTapZoom(true, self.currItem);\n\n              var zoomOut = _currZoomLevel === doubleTapZoomLevel;\n              self.mouseZoomedIn = !zoomOut;\n              self.zoomTo(zoomOut ? self.currItem.initialZoomLevel : doubleTapZoomLevel, centerPoint, 333);\n              framework[(!zoomOut ? 'add' : 'remove') + 'Class'](template, 'pswp--zoomed-in');\n            }\n          }\n        });\n        /*>>desktop-zoom*/\n\n        /*>>history*/\n\n        /**\n         *\n         * history.js:\n         *\n         * - Back button to close gallery.\n         *\n         * - Unique URL for each slide: example.com/&pid=1&gid=3\n         *   (where PID is picture index, and GID and gallery index)\n         *\n         * - Switch URL when slides change.\n         *\n         */\n\n\n        var _historyDefaultOptions = {\n          history: true,\n          galleryUID: 1\n        };\n\n        var _historyUpdateTimeout,\n            _hashChangeTimeout,\n            _hashAnimCheckTimeout,\n            _hashChangedByScript,\n            _hashChangedByHistory,\n            _hashReseted,\n            _initialHash,\n            _historyChanged,\n            _closedFromURL,\n            _urlChangedOnce,\n            _windowLoc,\n            _supportsPushState,\n            _getHash = function _getHash() {\n          return _windowLoc.hash.substring(1);\n        },\n            _cleanHistoryTimeouts = function _cleanHistoryTimeouts() {\n          if (_historyUpdateTimeout) {\n            clearTimeout(_historyUpdateTimeout);\n          }\n\n          if (_hashAnimCheckTimeout) {\n            clearTimeout(_hashAnimCheckTimeout);\n          }\n        },\n            // pid - Picture index\n        // gid - Gallery index\n        _parseItemIndexFromURL = function _parseItemIndexFromURL() {\n          var hash = _getHash(),\n              params = {};\n\n          if (hash.length < 5) {\n            // pid=1\n            return params;\n          }\n\n          var i,\n              vars = hash.split('&');\n\n          for (i = 0; i < vars.length; i++) {\n            if (!vars[i]) {\n              continue;\n            }\n\n            var pair = vars[i].split('=');\n\n            if (pair.length < 2) {\n              continue;\n            }\n\n            params[pair[0]] = pair[1];\n          }\n\n          if (_options.galleryPIDs) {\n            // detect custom pid in hash and search for it among the items collection\n            var searchfor = params.pid;\n            params.pid = 0; // if custom pid cannot be found, fallback to the first item\n\n            for (i = 0; i < _items.length; i++) {\n              if (_items[i].pid === searchfor) {\n                params.pid = i;\n                break;\n              }\n            }\n          } else {\n            params.pid = parseInt(params.pid, 10) - 1;\n          }\n\n          if (params.pid < 0) {\n            params.pid = 0;\n          }\n\n          return params;\n        },\n            _updateHash = function _updateHash() {\n          if (_hashAnimCheckTimeout) {\n            clearTimeout(_hashAnimCheckTimeout);\n          }\n\n          if (_numAnimations || _isDragging) {\n            // changing browser URL forces layout/paint in some browsers, which causes noticable lag during animation\n            // that's why we update hash only when no animations running\n            _hashAnimCheckTimeout = setTimeout(_updateHash, 500);\n            return;\n          }\n\n          if (_hashChangedByScript) {\n            clearTimeout(_hashChangeTimeout);\n          } else {\n            _hashChangedByScript = true;\n          }\n\n          var pid = _currentItemIndex + 1;\n\n          var item = _getItemAt(_currentItemIndex);\n\n          if (item.hasOwnProperty('pid')) {\n            // carry forward any custom pid assigned to the item\n            pid = item.pid;\n          }\n\n          var newHash = _initialHash + '&' + 'gid=' + _options.galleryUID + '&' + 'pid=' + pid;\n\n          if (!_historyChanged) {\n            if (_windowLoc.hash.indexOf(newHash) === -1) {\n              _urlChangedOnce = true;\n            } // first time - add new hisory record, then just replace\n\n          }\n\n          var newURL = _windowLoc.href.split('#')[0] + '#' + newHash;\n\n          if (_supportsPushState) {\n            if ('#' + newHash !== window.location.hash) {\n              history[_historyChanged ? 'replaceState' : 'pushState']('', document.title, newURL);\n            }\n          } else {\n            if (_historyChanged) {\n              _windowLoc.replace(newURL);\n            } else {\n              _windowLoc.hash = newHash;\n            }\n          }\n\n          _historyChanged = true;\n          _hashChangeTimeout = setTimeout(function () {\n            _hashChangedByScript = false;\n          }, 60);\n        };\n\n        _registerModule('History', {\n          publicMethods: {\n            initHistory: function initHistory() {\n              framework.extend(_options, _historyDefaultOptions, true);\n\n              if (!_options.history) {\n                return;\n              }\n\n              _windowLoc = window.location;\n              _urlChangedOnce = false;\n              _closedFromURL = false;\n              _historyChanged = false;\n              _initialHash = _getHash();\n              _supportsPushState = 'pushState' in history;\n\n              if (_initialHash.indexOf('gid=') > -1) {\n                _initialHash = _initialHash.split('&gid=')[0];\n                _initialHash = _initialHash.split('?gid=')[0];\n              }\n\n              _listen('afterChange', self.updateURL);\n\n              _listen('unbindEvents', function () {\n                framework.unbind(window, 'hashchange', self.onHashChange);\n              });\n\n              var returnToOriginal = function returnToOriginal() {\n                _hashReseted = true;\n\n                if (!_closedFromURL) {\n                  if (_urlChangedOnce) {\n                    history.back();\n                  } else {\n                    if (_initialHash) {\n                      _windowLoc.hash = _initialHash;\n                    } else {\n                      if (_supportsPushState) {\n                        // remove hash from url without refreshing it or scrolling to top\n                        history.pushState('', document.title, _windowLoc.pathname + _windowLoc.search);\n                      } else {\n                        _windowLoc.hash = '';\n                      }\n                    }\n                  }\n                }\n\n                _cleanHistoryTimeouts();\n              };\n\n              _listen('unbindEvents', function () {\n                if (_closedByScroll) {\n                  // if PhotoSwipe is closed by scroll, we go \"back\" before the closing animation starts\n                  // this is done to keep the scroll position\n                  returnToOriginal();\n                }\n              });\n\n              _listen('destroy', function () {\n                if (!_hashReseted) {\n                  returnToOriginal();\n                }\n              });\n\n              _listen('firstUpdate', function () {\n                _currentItemIndex = _parseItemIndexFromURL().pid;\n              });\n\n              var index = _initialHash.indexOf('pid=');\n\n              if (index > -1) {\n                _initialHash = _initialHash.substring(0, index);\n\n                if (_initialHash.slice(-1) === '&') {\n                  _initialHash = _initialHash.slice(0, -1);\n                }\n              }\n\n              setTimeout(function () {\n                if (_isOpen) {\n                  // hasn't destroyed yet\n                  framework.bind(window, 'hashchange', self.onHashChange);\n                }\n              }, 40);\n            },\n            onHashChange: function onHashChange() {\n              if (_getHash() === _initialHash) {\n                _closedFromURL = true;\n                self.close();\n                return;\n              }\n\n              if (!_hashChangedByScript) {\n                _hashChangedByHistory = true;\n                self.goTo(_parseItemIndexFromURL().pid);\n                _hashChangedByHistory = false;\n              }\n            },\n            updateURL: function updateURL() {\n              // Delay the update of URL, to avoid lag during transition,\n              // and to not to trigger actions like \"refresh page sound\" or \"blinking favicon\" to often\n              _cleanHistoryTimeouts();\n\n              if (_hashChangedByHistory) {\n                return;\n              }\n\n              if (!_historyChanged) {\n                _updateHash(); // first time\n\n              } else {\n                _historyUpdateTimeout = setTimeout(_updateHash, 800);\n              }\n            }\n          }\n        });\n        /*>>history*/\n\n\n        framework.extend(self, publicMethods);\n      };\n\n      return PhotoSwipe;\n    });\n  });\n\n  function _typeof$1(obj) {\n    if (typeof Symbol === \"function\" && _typeof(Symbol.iterator) === \"symbol\") {\n      _typeof$1 = function _typeof$1(obj) {\n        return _typeof(obj);\n      };\n    } else {\n      _typeof$1 = function _typeof$1(obj) {\n        return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : _typeof(obj);\n      };\n    }\n\n    return _typeof$1(obj);\n  } // This is not really a perfect check, but works fine.\n  // From http://stackoverflow.com/questions/384286\n\n\n  var HAS_DOM_2 = (typeof HTMLElement === \"undefined\" ? \"undefined\" : _typeof$1(HTMLElement)) === \"object\";\n  function isDOMElement(obj) {\n    return HAS_DOM_2 ? obj instanceof HTMLElement : obj && _typeof$1(obj) === \"object\" && obj !== null && obj.nodeType === 1 && typeof obj.nodeName === \"string\";\n  }\n  function addClasses(el, classNames) {\n    classNames.forEach(function (className) {\n      el.classList.add(className);\n    });\n  }\n  function removeClasses(el, classNames) {\n    classNames.forEach(function (className) {\n      el.classList.remove(className);\n    });\n  }\n\n  /* UNMINIFIED RULES\n\n  const RULES = `\n  @keyframes noop {\n    0% { zoom: 1; }\n  }\n\n  @-webkit-keyframes noop {\n    0% { zoom: 1; }\n  }\n\n  .drift-zoom-pane.drift-open {\n    display: block;\n  }\n\n  .drift-zoom-pane.drift-opening, .drift-zoom-pane.drift-closing {\n    animation: noop 1ms;\n    -webkit-animation: noop 1ms;\n  }\n\n  .drift-zoom-pane {\n    position: absolute;\n    overflow: hidden;\n    width: 100%;\n    height: 100%;\n    top: 0;\n    left: 0;\n    pointer-events: none;\n  }\n\n  .drift-zoom-pane-loader {\n    display: none;\n  }\n\n  .drift-zoom-pane img {\n    position: absolute;\n    display: block;\n    max-width: none;\n    max-height: none;\n  }\n\n  .drift-bounding-box {\n    position: absolute;\n    pointer-events: none;\n  }\n  `;\n\n  */\n  var RULES = \".drift-bounding-box,.drift-zoom-pane{position:absolute;pointer-events:none}@keyframes noop{0%{zoom:1}}@-webkit-keyframes noop{0%{zoom:1}}.drift-zoom-pane.drift-open{display:block}.drift-zoom-pane.drift-closing,.drift-zoom-pane.drift-opening{animation:noop 1ms;-webkit-animation:noop 1ms}.drift-zoom-pane{overflow:hidden;width:100%;height:100%;top:0;left:0}.drift-zoom-pane-loader{display:none}.drift-zoom-pane img{position:absolute;display:block;max-width:none;max-height:none}\";\n  function injectBaseStylesheet() {\n    if (document.querySelector(\".drift-base-styles\")) {\n      return;\n    }\n\n    var styleEl = document.createElement(\"style\");\n    styleEl.type = \"text/css\";\n    styleEl.classList.add(\"drift-base-styles\");\n    styleEl.appendChild(document.createTextNode(RULES));\n    var head = document.head;\n    head.insertBefore(styleEl, head.firstChild);\n  }\n\n  function throwIfMissing() {\n    throw new Error(\"Missing parameter\");\n  }\n\n  function _classCallCheck$1(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  }\n\n  function _defineProperties$1(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  function _createClass$1(Constructor, protoProps, staticProps) {\n    if (protoProps) _defineProperties$1(Constructor.prototype, protoProps);\n    if (staticProps) _defineProperties$1(Constructor, staticProps);\n    return Constructor;\n  }\n\n  var BoundingBox = /*#__PURE__*/function () {\n    function BoundingBox(options) {\n      _classCallCheck$1(this, BoundingBox);\n\n      this.isShowing = false;\n      var _options$namespace = options.namespace,\n          namespace = _options$namespace === void 0 ? null : _options$namespace,\n          _options$zoomFactor = options.zoomFactor,\n          zoomFactor = _options$zoomFactor === void 0 ? throwIfMissing() : _options$zoomFactor,\n          _options$containerEl = options.containerEl,\n          containerEl = _options$containerEl === void 0 ? throwIfMissing() : _options$containerEl;\n      this.settings = {\n        namespace: namespace,\n        zoomFactor: zoomFactor,\n        containerEl: containerEl\n      };\n      this.openClasses = this._buildClasses(\"open\");\n\n      this._buildElement();\n    }\n\n    _createClass$1(BoundingBox, [{\n      key: \"_buildClasses\",\n      value: function _buildClasses(suffix) {\n        var classes = [\"drift-\".concat(suffix)];\n        var ns = this.settings.namespace;\n\n        if (ns) {\n          classes.push(\"\".concat(ns, \"-\").concat(suffix));\n        }\n\n        return classes;\n      }\n    }, {\n      key: \"_buildElement\",\n      value: function _buildElement() {\n        this.el = document.createElement(\"div\");\n        addClasses(this.el, this._buildClasses(\"bounding-box\"));\n      }\n    }, {\n      key: \"show\",\n      value: function show(zoomPaneWidth, zoomPaneHeight) {\n        this.isShowing = true;\n        this.settings.containerEl.appendChild(this.el);\n        var style = this.el.style;\n        style.width = \"\".concat(Math.round(zoomPaneWidth / this.settings.zoomFactor), \"px\");\n        style.height = \"\".concat(Math.round(zoomPaneHeight / this.settings.zoomFactor), \"px\");\n        addClasses(this.el, this.openClasses);\n      }\n    }, {\n      key: \"hide\",\n      value: function hide() {\n        if (this.isShowing) {\n          this.settings.containerEl.removeChild(this.el);\n        }\n\n        this.isShowing = false;\n        removeClasses(this.el, this.openClasses);\n      }\n    }, {\n      key: \"setPosition\",\n      value: function setPosition(percentageOffsetX, percentageOffsetY, triggerRect) {\n        var pageXOffset = window.pageXOffset;\n        var pageYOffset = window.pageYOffset;\n        var inlineLeft = triggerRect.left + percentageOffsetX * triggerRect.width - this.el.clientWidth / 2 + pageXOffset;\n        var inlineTop = triggerRect.top + percentageOffsetY * triggerRect.height - this.el.clientHeight / 2 + pageYOffset;\n\n        if (inlineLeft < triggerRect.left + pageXOffset) {\n          inlineLeft = triggerRect.left + pageXOffset;\n        } else if (inlineLeft + this.el.clientWidth > triggerRect.left + triggerRect.width + pageXOffset) {\n          inlineLeft = triggerRect.left + triggerRect.width - this.el.clientWidth + pageXOffset;\n        }\n\n        if (inlineTop < triggerRect.top + pageYOffset) {\n          inlineTop = triggerRect.top + pageYOffset;\n        } else if (inlineTop + this.el.clientHeight > triggerRect.top + triggerRect.height + pageYOffset) {\n          inlineTop = triggerRect.top + triggerRect.height - this.el.clientHeight + pageYOffset;\n        }\n\n        this.el.style.left = \"\".concat(inlineLeft, \"px\");\n        this.el.style.top = \"\".concat(inlineTop, \"px\");\n      }\n    }]);\n\n    return BoundingBox;\n  }();\n\n  function _classCallCheck$2(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  }\n\n  function _defineProperties$2(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  function _createClass$2(Constructor, protoProps, staticProps) {\n    if (protoProps) _defineProperties$2(Constructor.prototype, protoProps);\n    if (staticProps) _defineProperties$2(Constructor, staticProps);\n    return Constructor;\n  }\n\n  var Trigger = /*#__PURE__*/function () {\n    function Trigger() {\n      var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n      _classCallCheck$2(this, Trigger);\n\n      this._show = this._show.bind(this);\n      this._hide = this._hide.bind(this);\n      this._handleEntry = this._handleEntry.bind(this);\n      this._handleMovement = this._handleMovement.bind(this);\n      var _options$el = options.el,\n          el = _options$el === void 0 ? throwIfMissing() : _options$el,\n          _options$zoomPane = options.zoomPane,\n          zoomPane = _options$zoomPane === void 0 ? throwIfMissing() : _options$zoomPane,\n          _options$sourceAttrib = options.sourceAttribute,\n          sourceAttribute = _options$sourceAttrib === void 0 ? throwIfMissing() : _options$sourceAttrib,\n          _options$handleTouch = options.handleTouch,\n          handleTouch = _options$handleTouch === void 0 ? throwIfMissing() : _options$handleTouch,\n          _options$onShow = options.onShow,\n          onShow = _options$onShow === void 0 ? null : _options$onShow,\n          _options$onHide = options.onHide,\n          onHide = _options$onHide === void 0 ? null : _options$onHide,\n          _options$hoverDelay = options.hoverDelay,\n          hoverDelay = _options$hoverDelay === void 0 ? 0 : _options$hoverDelay,\n          _options$touchDelay = options.touchDelay,\n          touchDelay = _options$touchDelay === void 0 ? 0 : _options$touchDelay,\n          _options$hoverBoundin = options.hoverBoundingBox,\n          hoverBoundingBox = _options$hoverBoundin === void 0 ? throwIfMissing() : _options$hoverBoundin,\n          _options$touchBoundin = options.touchBoundingBox,\n          touchBoundingBox = _options$touchBoundin === void 0 ? throwIfMissing() : _options$touchBoundin,\n          _options$namespace = options.namespace,\n          namespace = _options$namespace === void 0 ? null : _options$namespace,\n          _options$zoomFactor = options.zoomFactor,\n          zoomFactor = _options$zoomFactor === void 0 ? throwIfMissing() : _options$zoomFactor,\n          _options$boundingBoxC = options.boundingBoxContainer,\n          boundingBoxContainer = _options$boundingBoxC === void 0 ? throwIfMissing() : _options$boundingBoxC;\n      this.settings = {\n        el: el,\n        zoomPane: zoomPane,\n        sourceAttribute: sourceAttribute,\n        handleTouch: handleTouch,\n        onShow: onShow,\n        onHide: onHide,\n        hoverDelay: hoverDelay,\n        touchDelay: touchDelay,\n        hoverBoundingBox: hoverBoundingBox,\n        touchBoundingBox: touchBoundingBox,\n        namespace: namespace,\n        zoomFactor: zoomFactor,\n        boundingBoxContainer: boundingBoxContainer\n      };\n\n      if (this.settings.hoverBoundingBox || this.settings.touchBoundingBox) {\n        this.boundingBox = new BoundingBox({\n          namespace: this.settings.namespace,\n          zoomFactor: this.settings.zoomFactor,\n          containerEl: this.settings.boundingBoxContainer\n        });\n      }\n\n      this.enabled = true;\n\n      this._bindEvents();\n    }\n\n    _createClass$2(Trigger, [{\n      key: \"_preventDefault\",\n      value: function _preventDefault(event) {\n        event.preventDefault();\n      }\n    }, {\n      key: \"_preventDefaultAllowTouchScroll\",\n      value: function _preventDefaultAllowTouchScroll(event) {\n        if (!this.settings.touchDelay || !this._isTouchEvent(event) || this.isShowing) {\n          event.preventDefault();\n        }\n      }\n    }, {\n      key: \"_isTouchEvent\",\n      value: function _isTouchEvent(event) {\n        return !!event.touches;\n      }\n    }, {\n      key: \"_bindEvents\",\n      value: function _bindEvents() {\n        this.settings.el.addEventListener(\"mouseenter\", this._handleEntry, false);\n        this.settings.el.addEventListener(\"mouseleave\", this._hide, false);\n        this.settings.el.addEventListener(\"mousemove\", this._handleMovement, false);\n\n        if (this.settings.handleTouch) {\n          this.settings.el.addEventListener(\"touchstart\", this._handleEntry, false);\n          this.settings.el.addEventListener(\"touchend\", this._hide, false);\n          this.settings.el.addEventListener(\"touchmove\", this._handleMovement, false);\n        } else {\n          this.settings.el.addEventListener(\"touchstart\", this._preventDefault, false);\n          this.settings.el.addEventListener(\"touchend\", this._preventDefault, false);\n          this.settings.el.addEventListener(\"touchmove\", this._preventDefault, false);\n        }\n      }\n    }, {\n      key: \"_unbindEvents\",\n      value: function _unbindEvents() {\n        this.settings.el.removeEventListener(\"mouseenter\", this._handleEntry, false);\n        this.settings.el.removeEventListener(\"mouseleave\", this._hide, false);\n        this.settings.el.removeEventListener(\"mousemove\", this._handleMovement, false);\n\n        if (this.settings.handleTouch) {\n          this.settings.el.removeEventListener(\"touchstart\", this._handleEntry, false);\n          this.settings.el.removeEventListener(\"touchend\", this._hide, false);\n          this.settings.el.removeEventListener(\"touchmove\", this._handleMovement, false);\n        } else {\n          this.settings.el.removeEventListener(\"touchstart\", this._preventDefault, false);\n          this.settings.el.removeEventListener(\"touchend\", this._preventDefault, false);\n          this.settings.el.removeEventListener(\"touchmove\", this._preventDefault, false);\n        }\n      }\n    }, {\n      key: \"_handleEntry\",\n      value: function _handleEntry(e) {\n        this._preventDefaultAllowTouchScroll(e);\n\n        this._lastMovement = e;\n\n        if (e.type == \"mouseenter\" && this.settings.hoverDelay) {\n          this.entryTimeout = setTimeout(this._show, this.settings.hoverDelay);\n        } else if (this.settings.touchDelay) {\n          this.entryTimeout = setTimeout(this._show, this.settings.touchDelay);\n        } else {\n          this._show();\n        }\n      }\n    }, {\n      key: \"_show\",\n      value: function _show() {\n        if (!this.enabled) {\n          return;\n        }\n\n        var onShow = this.settings.onShow;\n\n        if (onShow && typeof onShow === \"function\") {\n          onShow();\n        }\n\n        this.settings.zoomPane.show(this.settings.el.getAttribute(this.settings.sourceAttribute), this.settings.el.clientWidth, this.settings.el.clientHeight);\n\n        if (this._lastMovement) {\n          var touchActivated = this._lastMovement.touches;\n\n          if (touchActivated && this.settings.touchBoundingBox || !touchActivated && this.settings.hoverBoundingBox) {\n            this.boundingBox.show(this.settings.zoomPane.el.clientWidth, this.settings.zoomPane.el.clientHeight);\n          }\n        }\n\n        this._handleMovement();\n      }\n    }, {\n      key: \"_hide\",\n      value: function _hide(e) {\n        if (e) {\n          this._preventDefaultAllowTouchScroll(e);\n        }\n\n        this._lastMovement = null;\n\n        if (this.entryTimeout) {\n          clearTimeout(this.entryTimeout);\n        }\n\n        if (this.boundingBox) {\n          this.boundingBox.hide();\n        }\n\n        var onHide = this.settings.onHide;\n\n        if (onHide && typeof onHide === \"function\") {\n          onHide();\n        }\n\n        this.settings.zoomPane.hide();\n      }\n    }, {\n      key: \"_handleMovement\",\n      value: function _handleMovement(e) {\n        if (e) {\n          this._preventDefaultAllowTouchScroll(e);\n\n          this._lastMovement = e;\n        } else if (this._lastMovement) {\n          e = this._lastMovement;\n        } else {\n          return;\n        }\n\n        var movementX;\n        var movementY;\n\n        if (e.touches) {\n          var firstTouch = e.touches[0];\n          movementX = firstTouch.clientX;\n          movementY = firstTouch.clientY;\n        } else {\n          movementX = e.clientX;\n          movementY = e.clientY;\n        }\n\n        var el = this.settings.el;\n        var rect = el.getBoundingClientRect();\n        var offsetX = movementX - rect.left;\n        var offsetY = movementY - rect.top;\n        var percentageOffsetX = offsetX / this.settings.el.clientWidth;\n        var percentageOffsetY = offsetY / this.settings.el.clientHeight;\n\n        if (this.boundingBox) {\n          this.boundingBox.setPosition(percentageOffsetX, percentageOffsetY, rect);\n        }\n\n        this.settings.zoomPane.setPosition(percentageOffsetX, percentageOffsetY, rect);\n      }\n    }, {\n      key: \"isShowing\",\n      get: function get() {\n        return this.settings.zoomPane.isShowing;\n      }\n    }]);\n\n    return Trigger;\n  }();\n\n  function _classCallCheck$3(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  }\n\n  function _defineProperties$3(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  function _createClass$3(Constructor, protoProps, staticProps) {\n    if (protoProps) _defineProperties$3(Constructor.prototype, protoProps);\n    if (staticProps) _defineProperties$3(Constructor, staticProps);\n    return Constructor;\n  }\n  // account for, just in case.\n\n  var divStyle = document.createElement(\"div\").style;\n  var HAS_ANIMATION = typeof document === \"undefined\" ? false : \"animation\" in divStyle || \"webkitAnimation\" in divStyle;\n\n  var ZoomPane = /*#__PURE__*/function () {\n    function ZoomPane() {\n      var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n      _classCallCheck$3(this, ZoomPane);\n\n      this._completeShow = this._completeShow.bind(this);\n      this._completeHide = this._completeHide.bind(this);\n      this._handleLoad = this._handleLoad.bind(this);\n      this.isShowing = false;\n      var _options$container = options.container,\n          container = _options$container === void 0 ? null : _options$container,\n          _options$zoomFactor = options.zoomFactor,\n          zoomFactor = _options$zoomFactor === void 0 ? throwIfMissing() : _options$zoomFactor,\n          _options$inline = options.inline,\n          inline = _options$inline === void 0 ? throwIfMissing() : _options$inline,\n          _options$namespace = options.namespace,\n          namespace = _options$namespace === void 0 ? null : _options$namespace,\n          _options$showWhitespa = options.showWhitespaceAtEdges,\n          showWhitespaceAtEdges = _options$showWhitespa === void 0 ? throwIfMissing() : _options$showWhitespa,\n          _options$containInlin = options.containInline,\n          containInline = _options$containInlin === void 0 ? throwIfMissing() : _options$containInlin,\n          _options$inlineOffset = options.inlineOffsetX,\n          inlineOffsetX = _options$inlineOffset === void 0 ? 0 : _options$inlineOffset,\n          _options$inlineOffset2 = options.inlineOffsetY,\n          inlineOffsetY = _options$inlineOffset2 === void 0 ? 0 : _options$inlineOffset2,\n          _options$inlineContai = options.inlineContainer,\n          inlineContainer = _options$inlineContai === void 0 ? document.body : _options$inlineContai;\n      this.settings = {\n        container: container,\n        zoomFactor: zoomFactor,\n        inline: inline,\n        namespace: namespace,\n        showWhitespaceAtEdges: showWhitespaceAtEdges,\n        containInline: containInline,\n        inlineOffsetX: inlineOffsetX,\n        inlineOffsetY: inlineOffsetY,\n        inlineContainer: inlineContainer\n      };\n      this.openClasses = this._buildClasses(\"open\");\n      this.openingClasses = this._buildClasses(\"opening\");\n      this.closingClasses = this._buildClasses(\"closing\");\n      this.inlineClasses = this._buildClasses(\"inline\");\n      this.loadingClasses = this._buildClasses(\"loading\");\n\n      this._buildElement();\n    }\n\n    _createClass$3(ZoomPane, [{\n      key: \"_buildClasses\",\n      value: function _buildClasses(suffix) {\n        var classes = [\"drift-\".concat(suffix)];\n        var ns = this.settings.namespace;\n\n        if (ns) {\n          classes.push(\"\".concat(ns, \"-\").concat(suffix));\n        }\n\n        return classes;\n      }\n    }, {\n      key: \"_buildElement\",\n      value: function _buildElement() {\n        this.el = document.createElement(\"div\");\n        addClasses(this.el, this._buildClasses(\"zoom-pane\"));\n        var loaderEl = document.createElement(\"div\");\n        addClasses(loaderEl, this._buildClasses(\"zoom-pane-loader\"));\n        this.el.appendChild(loaderEl);\n        this.imgEl = document.createElement(\"img\");\n        this.el.appendChild(this.imgEl);\n      }\n    }, {\n      key: \"_setImageURL\",\n      value: function _setImageURL(imageURL) {\n        this.imgEl.setAttribute(\"src\", imageURL);\n      }\n    }, {\n      key: \"_setImageSize\",\n      value: function _setImageSize(triggerWidth, triggerHeight) {\n        this.imgEl.style.width = \"\".concat(triggerWidth * this.settings.zoomFactor, \"px\");\n        this.imgEl.style.height = \"\".concat(triggerHeight * this.settings.zoomFactor, \"px\");\n      } // `percentageOffsetX` and `percentageOffsetY` must be percentages\n      // expressed as floats between `0' and `1`.\n\n    }, {\n      key: \"setPosition\",\n      value: function setPosition(percentageOffsetX, percentageOffsetY, triggerRect) {\n        var imgElWidth = this.imgEl.offsetWidth;\n        var imgElHeight = this.imgEl.offsetHeight;\n        var elWidth = this.el.offsetWidth;\n        var elHeight = this.el.offsetHeight;\n        var centreOfContainerX = elWidth / 2;\n        var centreOfContainerY = elHeight / 2;\n        var targetImgXToBeCentre = imgElWidth * percentageOffsetX;\n        var targetImgYToBeCentre = imgElHeight * percentageOffsetY;\n        var left = centreOfContainerX - targetImgXToBeCentre;\n        var top = centreOfContainerY - targetImgYToBeCentre;\n        var differenceBetweenContainerWidthAndImgWidth = elWidth - imgElWidth;\n        var differenceBetweenContainerHeightAndImgHeight = elHeight - imgElHeight;\n        var isContainerLargerThanImgX = differenceBetweenContainerWidthAndImgWidth > 0;\n        var isContainerLargerThanImgY = differenceBetweenContainerHeightAndImgHeight > 0;\n        var minLeft = isContainerLargerThanImgX ? differenceBetweenContainerWidthAndImgWidth / 2 : 0;\n        var minTop = isContainerLargerThanImgY ? differenceBetweenContainerHeightAndImgHeight / 2 : 0;\n        var maxLeft = isContainerLargerThanImgX ? differenceBetweenContainerWidthAndImgWidth / 2 : differenceBetweenContainerWidthAndImgWidth;\n        var maxTop = isContainerLargerThanImgY ? differenceBetweenContainerHeightAndImgHeight / 2 : differenceBetweenContainerHeightAndImgHeight;\n\n        if (this.el.parentElement === this.settings.inlineContainer) {\n          // This may be needed in the future to deal with browser event\n          // inconsistencies, but it's difficult to tell for sure.\n          // let scrollX = isTouch ? 0 : window.scrollX;\n          // let scrollY = isTouch ? 0 : window.scrollY;\n          var scrollX = window.pageXOffset;\n          var scrollY = window.pageYOffset;\n          var inlineLeft = triggerRect.left + percentageOffsetX * triggerRect.width - elWidth / 2 + this.settings.inlineOffsetX + scrollX;\n          var inlineTop = triggerRect.top + percentageOffsetY * triggerRect.height - elHeight / 2 + this.settings.inlineOffsetY + scrollY;\n\n          if (this.settings.containInline) {\n            if (inlineLeft < triggerRect.left + scrollX) {\n              inlineLeft = triggerRect.left + scrollX;\n            } else if (inlineLeft + elWidth > triggerRect.left + triggerRect.width + scrollX) {\n              inlineLeft = triggerRect.left + triggerRect.width - elWidth + scrollX;\n            }\n\n            if (inlineTop < triggerRect.top + scrollY) {\n              inlineTop = triggerRect.top + scrollY;\n            } else if (inlineTop + elHeight > triggerRect.top + triggerRect.height + scrollY) {\n              inlineTop = triggerRect.top + triggerRect.height - elHeight + scrollY;\n            }\n          }\n\n          this.el.style.left = \"\".concat(inlineLeft, \"px\");\n          this.el.style.top = \"\".concat(inlineTop, \"px\");\n        }\n\n        if (!this.settings.showWhitespaceAtEdges) {\n          if (left > minLeft) {\n            left = minLeft;\n          } else if (left < maxLeft) {\n            left = maxLeft;\n          }\n\n          if (top > minTop) {\n            top = minTop;\n          } else if (top < maxTop) {\n            top = maxTop;\n          }\n        }\n\n        this.imgEl.style.transform = \"translate(\".concat(left, \"px, \").concat(top, \"px)\");\n        this.imgEl.style.webkitTransform = \"translate(\".concat(left, \"px, \").concat(top, \"px)\");\n      }\n    }, {\n      key: \"_removeListenersAndResetClasses\",\n      value: function _removeListenersAndResetClasses() {\n        this.el.removeEventListener(\"animationend\", this._completeShow, false);\n        this.el.removeEventListener(\"animationend\", this._completeHide, false);\n        this.el.removeEventListener(\"webkitAnimationEnd\", this._completeShow, false);\n        this.el.removeEventListener(\"webkitAnimationEnd\", this._completeHide, false);\n        removeClasses(this.el, this.openClasses);\n        removeClasses(this.el, this.closingClasses);\n      }\n    }, {\n      key: \"show\",\n      value: function show(imageURL, triggerWidth, triggerHeight) {\n        this._removeListenersAndResetClasses();\n\n        this.isShowing = true;\n        addClasses(this.el, this.openClasses);\n\n        if (this.imgEl.getAttribute(\"src\") != imageURL) {\n          addClasses(this.el, this.loadingClasses);\n          this.imgEl.addEventListener(\"load\", this._handleLoad, false);\n\n          this._setImageURL(imageURL);\n        }\n\n        this._setImageSize(triggerWidth, triggerHeight);\n\n        if (this._isInline) {\n          this._showInline();\n        } else {\n          this._showInContainer();\n        }\n\n        if (HAS_ANIMATION) {\n          this.el.addEventListener(\"animationend\", this._completeShow, false);\n          this.el.addEventListener(\"webkitAnimationEnd\", this._completeShow, false);\n          addClasses(this.el, this.openingClasses);\n        }\n      }\n    }, {\n      key: \"_showInline\",\n      value: function _showInline() {\n        this.settings.inlineContainer.appendChild(this.el);\n        addClasses(this.el, this.inlineClasses);\n      }\n    }, {\n      key: \"_showInContainer\",\n      value: function _showInContainer() {\n        this.settings.container.appendChild(this.el);\n      }\n    }, {\n      key: \"hide\",\n      value: function hide() {\n        this._removeListenersAndResetClasses();\n\n        this.isShowing = false;\n\n        if (HAS_ANIMATION) {\n          this.el.addEventListener(\"animationend\", this._completeHide, false);\n          this.el.addEventListener(\"webkitAnimationEnd\", this._completeHide, false);\n          addClasses(this.el, this.closingClasses);\n        } else {\n          removeClasses(this.el, this.openClasses);\n          removeClasses(this.el, this.inlineClasses);\n        }\n      }\n    }, {\n      key: \"_completeShow\",\n      value: function _completeShow() {\n        this.el.removeEventListener(\"animationend\", this._completeShow, false);\n        this.el.removeEventListener(\"webkitAnimationEnd\", this._completeShow, false);\n        removeClasses(this.el, this.openingClasses);\n      }\n    }, {\n      key: \"_completeHide\",\n      value: function _completeHide() {\n        this.el.removeEventListener(\"animationend\", this._completeHide, false);\n        this.el.removeEventListener(\"webkitAnimationEnd\", this._completeHide, false);\n        removeClasses(this.el, this.openClasses);\n        removeClasses(this.el, this.closingClasses);\n        removeClasses(this.el, this.inlineClasses);\n        this.el.setAttribute(\"style\", \"\"); // The window could have been resized above or below `inline`\n        // limits since the ZoomPane was shown. Because of this, we\n        // can't rely on `this._isInline` here.\n\n        if (this.el.parentElement === this.settings.container) {\n          this.settings.container.removeChild(this.el);\n        } else if (this.el.parentElement === this.settings.inlineContainer) {\n          this.settings.inlineContainer.removeChild(this.el);\n        }\n      }\n    }, {\n      key: \"_handleLoad\",\n      value: function _handleLoad() {\n        this.imgEl.removeEventListener(\"load\", this._handleLoad, false);\n        removeClasses(this.el, this.loadingClasses);\n      }\n    }, {\n      key: \"_isInline\",\n      get: function get() {\n        var inline = this.settings.inline;\n        return inline === true || typeof inline === \"number\" && window.innerWidth <= inline;\n      }\n    }]);\n\n    return ZoomPane;\n  }();\n\n  function _classCallCheck$4(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  }\n\n  function _defineProperties$4(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  function _createClass$4(Constructor, protoProps, staticProps) {\n    if (protoProps) _defineProperties$4(Constructor.prototype, protoProps);\n    if (staticProps) _defineProperties$4(Constructor, staticProps);\n    return Constructor;\n  }\n\n  var Drift = /*#__PURE__*/function () {\n    function Drift(triggerEl) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n      _classCallCheck$4(this, Drift);\n\n      this.VERSION = \"1.4.0\";\n      this.triggerEl = triggerEl;\n      this.destroy = this.destroy.bind(this);\n\n      if (!isDOMElement(this.triggerEl)) {\n        throw new TypeError(\"`new Drift` requires a DOM element as its first argument.\");\n      } // Prefix for generated element class names (e.g. `my-ns` will\n      // result in classes such as `my-ns-pane`. Default `drift-`\n      // prefixed classes will always be added as well.\n\n\n      var namespace = options[\"namespace\"] || null; // Whether the ZoomPane should show whitespace when near the edges.\n\n      var showWhitespaceAtEdges = options[\"showWhitespaceAtEdges\"] || false; // Whether the inline ZoomPane should stay inside\n      // the bounds of its image.\n\n      var containInline = options[\"containInline\"] || false; // How much to offset the ZoomPane from the\n      // interaction point when inline.\n\n      var inlineOffsetX = options[\"inlineOffsetX\"] || 0;\n      var inlineOffsetY = options[\"inlineOffsetY\"] || 0; // A DOM element to append the inline ZoomPane to\n\n      var inlineContainer = options[\"inlineContainer\"] || document.body; // Which trigger attribute to pull the ZoomPane image source from.\n\n      var sourceAttribute = options[\"sourceAttribute\"] || \"data-zoom\"; // How much to magnify the trigger by in the ZoomPane.\n      // (e.g., `zoomFactor: 3` will result in a 900 px wide ZoomPane imag\n      // if the trigger is displayed at 300 px wide)\n\n      var zoomFactor = options[\"zoomFactor\"] || 3; // A DOM element to append the non-inline ZoomPane to.\n      // Required if `inlinePane !== true`.\n\n      var paneContainer = options[\"paneContainer\"] === undefined ? document.body : options[\"paneContainer\"]; // When to switch to an inline ZoomPane. This can be a boolean or\n      // an integer. If `true`, the ZoomPane will always be inline,\n      // if `false`, it will switch to inline when `windowWidth <= inlinePane`\n\n      var inlinePane = options[\"inlinePane\"] || 375; // If `true`, touch events will trigger the zoom, like mouse events.\n\n      var handleTouch = \"handleTouch\" in options ? !!options[\"handleTouch\"] : true; // If present (and a function), this will be called\n      // whenever the ZoomPane is shown.\n\n      var onShow = options[\"onShow\"] || null; // If present (and a function), this will be called\n      // whenever the ZoomPane is hidden.\n\n      var onHide = options[\"onHide\"] || null; // Add base styles to the page. See the \"Theming\"\n      // section of README.md for more information.\n\n      var injectBaseStyles = \"injectBaseStyles\" in options ? !!options[\"injectBaseStyles\"] : true; // An optional number that determines how long to wait before\n      // showing the ZoomPane because of a `mouseenter` event.\n\n      var hoverDelay = options[\"hoverDelay\"] || 0; // An optional number that determines how long to wait before\n      // showing the ZoomPane because of a `touchstart` event.\n      // It's unlikely that you would want to use this option, since\n      // \"tap and hold\" is much more intentional than a hover event.\n\n      var touchDelay = options[\"touchDelay\"] || 0; // If true, a bounding box will show the area currently being previewed\n      // during mouse hover\n\n      var hoverBoundingBox = options[\"hoverBoundingBox\"] || false; // If true, a bounding box will show the area currently being previewed\n      // during touch events\n\n      var touchBoundingBox = options[\"touchBoundingBox\"] || false; // A DOM element to append the bounding box to.\n\n      var boundingBoxContainer = options[\"boundingBoxContainer\"] || document.body;\n\n      if (inlinePane !== true && !isDOMElement(paneContainer)) {\n        throw new TypeError(\"`paneContainer` must be a DOM element when `inlinePane !== true`\");\n      }\n\n      if (!isDOMElement(inlineContainer)) {\n        throw new TypeError(\"`inlineContainer` must be a DOM element\");\n      }\n\n      this.settings = {\n        namespace: namespace,\n        showWhitespaceAtEdges: showWhitespaceAtEdges,\n        containInline: containInline,\n        inlineOffsetX: inlineOffsetX,\n        inlineOffsetY: inlineOffsetY,\n        inlineContainer: inlineContainer,\n        sourceAttribute: sourceAttribute,\n        zoomFactor: zoomFactor,\n        paneContainer: paneContainer,\n        inlinePane: inlinePane,\n        handleTouch: handleTouch,\n        onShow: onShow,\n        onHide: onHide,\n        injectBaseStyles: injectBaseStyles,\n        hoverDelay: hoverDelay,\n        touchDelay: touchDelay,\n        hoverBoundingBox: hoverBoundingBox,\n        touchBoundingBox: touchBoundingBox,\n        boundingBoxContainer: boundingBoxContainer\n      };\n\n      if (this.settings.injectBaseStyles) {\n        injectBaseStylesheet();\n      }\n\n      this._buildZoomPane();\n\n      this._buildTrigger();\n    }\n\n    _createClass$4(Drift, [{\n      key: \"_buildZoomPane\",\n      value: function _buildZoomPane() {\n        this.zoomPane = new ZoomPane({\n          container: this.settings.paneContainer,\n          zoomFactor: this.settings.zoomFactor,\n          showWhitespaceAtEdges: this.settings.showWhitespaceAtEdges,\n          containInline: this.settings.containInline,\n          inline: this.settings.inlinePane,\n          namespace: this.settings.namespace,\n          inlineOffsetX: this.settings.inlineOffsetX,\n          inlineOffsetY: this.settings.inlineOffsetY,\n          inlineContainer: this.settings.inlineContainer\n        });\n      }\n    }, {\n      key: \"_buildTrigger\",\n      value: function _buildTrigger() {\n        this.trigger = new Trigger({\n          el: this.triggerEl,\n          zoomPane: this.zoomPane,\n          handleTouch: this.settings.handleTouch,\n          onShow: this.settings.onShow,\n          onHide: this.settings.onHide,\n          sourceAttribute: this.settings.sourceAttribute,\n          hoverDelay: this.settings.hoverDelay,\n          touchDelay: this.settings.touchDelay,\n          hoverBoundingBox: this.settings.hoverBoundingBox,\n          touchBoundingBox: this.settings.touchBoundingBox,\n          namespace: this.settings.namespace,\n          zoomFactor: this.settings.zoomFactor,\n          boundingBoxContainer: this.settings.boundingBoxContainer\n        });\n      }\n    }, {\n      key: \"setZoomImageURL\",\n      value: function setZoomImageURL(imageURL) {\n        this.zoomPane._setImageURL(imageURL);\n      }\n    }, {\n      key: \"disable\",\n      value: function disable() {\n        this.trigger.enabled = false;\n      }\n    }, {\n      key: \"enable\",\n      value: function enable() {\n        this.trigger.enabled = true;\n      }\n    }, {\n      key: \"destroy\",\n      value: function destroy() {\n        this.trigger._hide();\n\n        this.trigger._unbindEvents();\n      }\n    }, {\n      key: \"isShowing\",\n      get: function get() {\n        return this.zoomPane.isShowing;\n      }\n    }, {\n      key: \"zoomFactor\",\n      get: function get() {\n        return this.settings.zoomFactor;\n      },\n      set: function set(zf) {\n        this.settings.zoomFactor = zf;\n        this.zoomPane.settings.zoomFactor = zf;\n        this.trigger.settings.zoomFactor = zf;\n        this.boundingBox.settings.zoomFactor = zf;\n      }\n    }]);\n\n    return Drift;\n  }(); // Public API\n  Object.defineProperty(Drift.prototype, \"isShowing\", {\n    get: function get() {\n      return this.isShowing;\n    }\n  });\n  Object.defineProperty(Drift.prototype, \"zoomFactor\", {\n    get: function get() {\n      return this.zoomFactor;\n    },\n    set: function set(value) {\n      this.zoomFactor = value;\n    }\n  });\n  Drift.prototype[\"setZoomImageURL\"] = Drift.prototype.setZoomImageURL;\n  Drift.prototype[\"disable\"] = Drift.prototype.disable;\n  Drift.prototype[\"enable\"] = Drift.prototype.enable;\n  Drift.prototype[\"destroy\"] = Drift.prototype.destroy;\n  /* eslint-enable no-self-assign */\n\n  var ProductGallery = /*#__PURE__*/function () {\n    function ProductGallery(element, options) {\n      _classCallCheck(this, ProductGallery);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.viewInSpaceElement = this.element.querySelector('[data-shopify-xr]');\n      this.options = options; // The media property will hold all the media manages by the gallery so we can easily turn them off. They are\n      // indexed by the media ID\n\n      this.media = {};\n      this.previouslySelectedMedia = null;\n\n      this._createCarousel();\n\n      this._createZoom();\n\n      this._attachListeners();\n    }\n\n    _createClass(ProductGallery, [{\n      key: \"destroy\",\n      value: function destroy() {\n        if (this.flickityInstance) {\n          this.flickityInstance.destroy();\n        }\n\n        for (var mediaId in this.media) {\n          if (this.media.hasOwnProperty(mediaId)) {\n            this.media[mediaId].destroy();\n          }\n        }\n      }\n    }, {\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        var _this = this;\n\n        this.delegateElement.on('model:played', this._disableDrag.bind(this));\n        this.delegateElement.on('video:played', this._disableDrag.bind(this));\n        this.delegateElement.on('model:paused', this._enableDrag.bind(this));\n        this.delegateElement.on('video:paused', this._enableDrag.bind(this));\n\n        if (this.options['enableImageZoom']) {\n          window.addEventListener('resize', this._handleZoomForMediaQuery.bind(this));\n          this.delegateElement.on('click', '.product-gallery__image', this._openMobileZoom.bind(this));\n          this.delegateElement.on('click', '.pswp__button', this._doPswpAction.bind(this));\n        }\n\n        var lastWidth = window.innerWidth;\n        window.addEventListener('resize', function () {\n          if (window.innerWidth !== lastWidth && _this.flickityInstance) {\n            _this.flickityInstance.resize();\n\n            lastWidth = window.innerWidth;\n          }\n        });\n      }\n      /**\n       * This method must be called whenever the variant is changed\n       */\n\n    }, {\n      key: \"variantHasChanged\",\n      value: function variantHasChanged(newVariant) {\n        var _this2 = this;\n\n        // We may have selected a variant that will cause the set of images to change completely. To do that we need to iterate through all images,\n        // check for the attribute \"data-group-name\" and verify if some images need to be filtered or not\n        var shouldReload = false;\n        fastdom.mutate(function () {\n          _this2.productGalleryCellsElements.forEach(function (cell, imageIndex) {\n            if (cell.hasAttribute('data-group-name')) {\n              // If it has an attribute, we get the group name, and match it against the option\n              var groupName = cell.getAttribute('data-group-name');\n\n              _this2.options['productOptions'].forEach(function (option, optionIndex) {\n                if (option.toLowerCase() === groupName) {\n                  // groupName from attribute is already lowercased in Liquid\n                  // Now we compare the value: if it's the same or that the image is part of the variant we keep it, otherwise we filter it\n                  if (newVariant[\"option\".concat(optionIndex + 1)].toLowerCase() === cell.getAttribute('data-group-value') || newVariant['featured_media'] && newVariant['featured_media']['id'] === parseInt(cell.getAttribute('data-media-id'))) {\n                    cell.classList.remove('is-filtered');\n\n                    _this2.productThumbnailsCellsElements[imageIndex].classList.remove('is-filtered');\n                  } else {\n                    cell.classList.add('is-filtered');\n\n                    _this2.productThumbnailsCellsElements[imageIndex].classList.add('is-filtered');\n                  }\n                }\n              });\n\n              shouldReload = true;\n            }\n          });\n\n          if (shouldReload) {\n            _this2.flickityInstance.deactivate();\n\n            _this2.flickityInstance.activate();\n          }\n\n          if (Responsive.matchesBreakpoint('lap-and-up')) {\n            var slides = _this2.element.querySelectorAll('.product-gallery__carousel-item');\n\n            slides.forEach(function (slide) {\n              slide.classList.remove('product-gallery__carousel-item--hidden');\n            });\n          }\n\n          if (_this2.flickityInstance && newVariant && newVariant['featured_media']) {\n            _this2.flickityInstance.selectCell(\"[data-media-id=\\\"\".concat(newVariant['featured_media']['id'], \"\\\"]\"));\n          }\n        });\n      }\n    }, {\n      key: \"_createCarousel\",\n      value: function _createCarousel() {\n        var _this3 = this;\n\n        this.productGalleryElement = this.element.querySelector('.product-gallery__carousel');\n        this.productGalleryCellsElements = this.productGalleryElement ? this.productGalleryElement.querySelectorAll('.product-gallery__carousel-item') : [];\n\n        if (this.productGalleryElement) {\n          // We need to create a list of media (for now we only handle video and model a bit differently)\n          this.productGalleryCellsElements.forEach(function (item) {\n            switch (item.getAttribute('data-media-type')) {\n              case 'external_video':\n              case 'video':\n                _this3.media[item.getAttribute('data-media-id')] = new ProductVideo(item, _this3.options['enableVideoLooping']);\n                break;\n\n              case 'model':\n                _this3.media[item.getAttribute('data-media-id')] = new ProductModel(item);\n                break;\n            }\n          });\n\n          if (parseInt(this.productGalleryElement.getAttribute('data-media-count')) > 1) {\n            // Due to the fact that some images may be filtered, we have to do additional logic to compute the initial index\n            var filteredCells = [].slice.call(this.productGalleryCellsElements).filter(function (item) {\n              return !item.classList.contains('is-filtered');\n            });\n            var initialIndex = 0;\n            filteredCells.forEach(function (item, index) {\n              if (item.getAttribute('data-media-id') === _this3.productGalleryElement.getAttribute('data-initial-media-id')) {\n                initialIndex = index;\n              }\n            }); // For some reason (and I have spent hours trying to understand), Flickity set a zero height at start, before\n            // replacing it with the correct height. Unfortunately this cause the carousel to jump, which is detrimental\n            // to both user experience and PageSpeed score. As a consequence, I am pre-setting the height\n\n            var firstSlide = filteredCells[initialIndex];\n            firstSlide.classList.add('is-selected');\n            this.productGalleryElement.style.height = \"\".concat(firstSlide.clientHeight, \"px\");\n            this.flickityInstance = new flickityFade(this.productGalleryElement, {\n              accessibility: false,\n              prevNextButtons: false,\n              pageDots: false,\n              resize: false,\n              adaptiveHeight: true,\n              draggable: !Responsive.matchesBreakpoint('supports-hover'),\n              fade: this.options['galleryTransitionEffect'] === 'fade',\n              cellSelector: '.product-gallery__carousel-item:not(.is-filtered)',\n              initialIndex: initialIndex,\n              on: {\n                ready: function ready() {\n                  // Remove the pre-set height (that was used to pre-allocate the space) so that it can react properly to\n                  // changes of height.\n                  setTimeout(function () {\n                    _this3.productGalleryElement.style.height = null;\n                  }, 1000);\n                }\n              }\n            });\n          }\n        } // If there are thumbnails, we need to synchronize the thumbnails\n\n\n        this.productThumbnailsListElement = this.element.querySelector('.product-gallery__thumbnail-list');\n        this.delegateElement.on('click', '.product-gallery__thumbnail', this._onThumbnailClicked.bind(this));\n\n        if (this.productThumbnailsListElement && this.flickityInstance) {\n          this.productThumbnailsCellsElements = this.productThumbnailsListElement.querySelectorAll('.product-gallery__thumbnail');\n          this.flickityInstance.on('select', this._onGallerySlideChanged.bind(this));\n\n          if (this.options['galleryTransitionEffect'] === 'fade') {\n            this.flickityInstance.on('select', this._onGallerySlideSettled.bind(this));\n          } else {\n            this.flickityInstance.on('settle', this._onGallerySlideSettled.bind(this));\n          }\n\n          this._onGallerySlideChanged(false); // We call it once initially to force adjust the thumbnails\n\n\n          this._onGallerySlideSettled();\n        }\n      }\n    }, {\n      key: \"_createZoom\",\n      value: function _createZoom() {\n        var _this4 = this;\n\n        if (!this.options['enableImageZoom']) {\n          return;\n        } // On desktop, we uses Drift to power the zoom\n\n\n        if (Responsive.matchesBreakpoint('lap-and-up')) {\n          this.driftObjects = [];\n          var zoomWrapper = this.element.querySelector('.product__zoom-wrapper');\n          this.element.querySelectorAll('.product-gallery__image').forEach(function (image) {\n            _this4.driftObjects.push(new Drift(image, {\n              containInline: _this4.options['zoomEffect'] === 'outside',\n              inlinePane: window.innerWidth < 1024 ? true : _this4.options['zoomEffect'] !== 'outside',\n              hoverBoundingBox: _this4.options['zoomEffect'] === 'outside',\n              handleTouch: false,\n              inlineOffsetY: window.innerWidth < 1024 ? -85 : 0,\n              paneContainer: zoomWrapper\n            }));\n          });\n        }\n      }\n    }, {\n      key: \"_openMobileZoom\",\n      value: function _openMobileZoom() {\n        var _this5 = this;\n\n        // On mobile, we use instead PhotoSwipe\n        var pswpElement = this.element.querySelector('.pswp');\n\n        if (!pswpElement || !Responsive.matchesBreakpoint('pocket')) {\n          return;\n        }\n\n        var filteredItems = this.element.querySelectorAll('.product-gallery__carousel-item:not(.is-filtered)[data-media-type=\"image\"]'),\n            defaultIndex = 0,\n            items = [];\n        filteredItems.forEach(function (filteredItem, index) {\n          var image = filteredItem.querySelector('.product-gallery__image');\n          items.push({\n            src: image.getAttribute('data-zoom'),\n            w: parseInt(image.getAttribute('data-zoom-width')),\n            h: parseInt(image.getAttribute('data-zoom-width')) * (image.height / image.width),\n            msrc: image.currentSrc\n          });\n\n          if (filteredItem.classList.contains('is-selected')) {\n            defaultIndex = index;\n          }\n        });\n        var prevNextElement = pswpElement.querySelector('.pswp__prev-next');\n        prevNextElement.style.display = items.length > 1 ? 'flex' : 'none'; // Initializes and opens PhotoSwipe\n        // Initializes and opens PhotoSwipe\n\n        this.photoSwipeInstance = new photoswipe(pswpElement, false, items, {\n          index: defaultIndex,\n          closeOnVerticalDrag: false,\n          closeOnScroll: false,\n          history: false,\n          showHideOpacity: true,\n          pinchToClose: false,\n          maxSpreadZoom: 1,\n          showAnimationDuration: false,\n          allowPanToNext: false\n        }); // We need to patch PhotoSwipe update size to solve iOS 15 issue\n\n        var originalUpdateSize = this.photoSwipeInstance.updateSize,\n            lastWidth = null;\n\n        this.photoSwipeInstance.updateSize = function () {\n          if (lastWidth === null || lastWidth !== window.innerWidth) {\n            originalUpdateSize(this, arguments);\n          }\n\n          lastWidth = window.innerWidth;\n        };\n\n        this.photoSwipeInstance.listen('destroy', function () {\n          _this5.photoSwipeInstance = null;\n        });\n        this.photoSwipeInstance.listen('beforeChange', function () {\n          var currentItem = _this5.element.querySelector('.pswp__pagination-current'),\n              paginationCount = _this5.element.querySelector('.pswp__pagination-count');\n\n          currentItem.textContent = _this5.photoSwipeInstance.getCurrentIndex() + 1;\n          paginationCount.textContent = _this5.photoSwipeInstance.options.getNumItemsFn();\n        });\n        this.photoSwipeInstance.init();\n      }\n    }, {\n      key: \"_doPswpAction\",\n      value: function _doPswpAction(event, element) {\n        if (!this.photoSwipeInstance) {\n          return;\n        }\n\n        if (element.classList.contains('pswp__button--close')) {\n          this.photoSwipeInstance.close();\n        } else if (element.classList.contains('pswp__button--arrow--left')) {\n          this.photoSwipeInstance.prev();\n        } else if (element.classList.contains('pswp__button--arrow--right')) {\n          this.photoSwipeInstance.next();\n        }\n      }\n    }, {\n      key: \"_handleZoomForMediaQuery\",\n      value: function _handleZoomForMediaQuery() {\n        if (Responsive.matchesBreakpoint('lap-and-up') && this.photoSwipeInstance) {\n          this.photoSwipeInstance.close();\n          this.photoSwipeInstance = null;\n        }\n      }\n    }, {\n      key: \"_onGallerySlideChanged\",\n      value: function _onGallerySlideChanged() {\n        var _this6 = this;\n\n        var animate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n        var previousNavElement = null,\n            newNavElement = null;\n        this.productThumbnailsCellsElements.forEach(function (item) {\n          if (item.classList.contains('is-nav-selected')) {\n            previousNavElement = item;\n          }\n\n          if (item.getAttribute('data-media-id') === _this6.flickityInstance.selectedElement.getAttribute('data-media-id')) {\n            newNavElement = item;\n          }\n        });\n        previousNavElement.classList.remove('is-nav-selected');\n        newNavElement.classList.add('is-nav-selected'); // We animate to move the selected nav item\n\n        if (Responsive.matchesBreakpoint('pocket')) {\n          var scrollX = newNavElement.offsetLeft - (this.productThumbnailsListElement.parentNode.clientWidth - newNavElement.clientWidth) / 2;\n          this.productThumbnailsListElement.parentNode.scrollTo({\n            left: scrollX,\n            behavior: animate ? 'smooth' : 'auto'\n          });\n        } else {\n          var scrollY = newNavElement.offsetTop - (this.productThumbnailsListElement.clientHeight - newNavElement.clientHeight) / 2;\n          this.productThumbnailsListElement.scrollTo({\n            top: scrollY,\n            behavior: animate ? 'smooth' : 'auto'\n          });\n        }\n      }\n      /**\n       * The difference with \"change\" is that this function is called after the item has transitioned\n       */\n\n    }, {\n      key: \"_onGallerySlideSettled\",\n      value: function _onGallerySlideSettled() {\n        this._handleMedia(this.flickityInstance.selectedElement);\n\n        if (Responsive.matchesBreakpoint('lap-and-up')) {\n          var slides = this.element.querySelectorAll('.product-gallery__carousel-item:not(.is-selected)');\n          slides.forEach(function (slide) {\n            slide.classList.add('product-gallery__carousel-item--hidden');\n          });\n        }\n      }\n    }, {\n      key: \"_onThumbnailClicked\",\n      value: function _onThumbnailClicked(event, target) {\n        event.preventDefault();\n\n        if (this.flickityInstance) {\n          this.flickityInstance.selectCell(\"[data-media-id=\\\"\".concat(target.getAttribute('data-media-id'), \"\\\"]\"));\n\n          if (Responsive.matchesBreakpoint('lap-and-up')) {\n            var slides = this.element.querySelectorAll('.product-gallery__carousel-item');\n            slides.forEach(function (slide) {\n              slide.classList.remove('product-gallery__carousel-item--hidden');\n            });\n          }\n        }\n      }\n    }, {\n      key: \"_disableDrag\",\n      value: function _disableDrag() {\n        this.flickityInstance.options.draggable = false;\n        this.flickityInstance.updateDraggable();\n      }\n    }, {\n      key: \"_enableDrag\",\n      value: function _enableDrag() {\n        this.flickityInstance.options.draggable = !Responsive.matchesBreakpoint('supports-hover');\n        this.flickityInstance.updateDraggable();\n      }\n      /**\n       * This method will handle the given media (for now model and video) to do the appropriate actions (such as launching\n       * a video for instance)\n       */\n\n    }, {\n      key: \"_handleMedia\",\n      value: function _handleMedia(item) {\n        var isInitialLoading = this.previouslySelectedMedia === null; // First, we need to turn off the previous media (if any)\n\n        if (this.previouslySelectedMedia && this.previouslySelectedMedia !== item) {\n          switch (this.previouslySelectedMedia.getAttribute('data-media-type')) {\n            case 'video':\n            case 'external_video':\n            case 'model':\n              this.media[this.previouslySelectedMedia.getAttribute('data-media-id')].hasBeenDeselected();\n          } // If the previous media was a model, we need to adjust the \"view in space\" button to go back to initial value\n\n\n          if (this.previouslySelectedMedia.getAttribute('data-media-type') === 'model' && this.viewInSpaceElement) {\n            this.viewInSpaceElement.setAttribute('data-shopify-model3d-id', this.viewInSpaceElement.getAttribute('data-shopify-model3d-default-id'));\n          }\n        } // Then, we have to handle the currently selected media\n\n\n        switch (item.getAttribute('data-media-type')) {\n          case 'video':\n          case 'external_video':\n          case 'model':\n            this.media[item.getAttribute('data-media-id')].hasBeenSelected(isInitialLoading);\n            this.element.querySelector('.product-gallery__carousel').classList.remove('product-gallery__carousel--zoomable');\n            break;\n\n          case 'image':\n            this.element.querySelector('.product-gallery__carousel').classList.add('product-gallery__carousel--zoomable');\n            break;\n        } // If the media is a model, we need to adjust the \"view in space\" button\n\n\n        if (item.getAttribute('data-media-type') === 'model' && this.viewInSpaceElement) {\n          this.viewInSpaceElement.setAttribute('data-shopify-model3d-id', item.getAttribute('data-media-id'));\n        } // We set the previously selected media to the currently new one, so that when it changes it can be properly accounted\n\n\n        this.previouslySelectedMedia = item;\n      }\n    }]);\n\n    return ProductGallery;\n  }();\n\n  var QuantityPicker = /*#__PURE__*/function () {\n    function QuantityPicker(element) {\n      _classCallCheck(this, QuantityPicker);\n\n      if (!element) {\n        return;\n      }\n\n      this.element = element;\n      this.inputElement = this.element.querySelector('[name=\"quantity\"]');\n      this.delegateElement = new Delegate(this.element);\n\n      this._attachListeners();\n    }\n\n    _createClass(QuantityPicker, [{\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        this.delegateElement.on('click', '[data-action=\"decrease-picker-quantity\"]', this._onDecrease.bind(this));\n        this.delegateElement.on('click', '[data-action=\"increase-picker-quantity\"]', this._onIncrease.bind(this));\n        this.delegateElement.on('keyup', this._onInputValueChanged.bind(this));\n        this.delegateElement.on('focusout', this._onInputFocusOut.bind(this));\n      }\n    }, {\n      key: \"_onDecrease\",\n      value: function _onDecrease() {\n        this.inputElement.value = Math.max(1, parseInt(this.inputElement.value) - 1);\n      }\n    }, {\n      key: \"_onIncrease\",\n      value: function _onIncrease() {\n        this.inputElement.value = parseInt(this.inputElement.value) + 1;\n      }\n    }, {\n      key: \"_onInputValueChanged\",\n      value: function _onInputValueChanged(event) {\n        var value = event.target.value;\n\n        if (value !== '' && isNaN(value)) {\n          event.target.value = Math.max(1, parseInt(value) || 1);\n        }\n      }\n    }, {\n      key: \"_onInputFocusOut\",\n      value: function _onInputFocusOut(event) {\n        event.target.value = Math.max(1, parseInt(event.target.value) || 1);\n      }\n    }]);\n\n    return QuantityPicker;\n  }();\n\n  var ShippingEstimator = /*#__PURE__*/function () {\n    function ShippingEstimator(element, options) {\n      _classCallCheck(this, ShippingEstimator);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.options = options;\n      this.countrySelector = new CountrySelector(this.element.querySelector('[name=\"country\"]'), this.element.querySelector('[name=\"province\"]'));\n\n      this._attachListeners();\n    }\n\n    _createClass(ShippingEstimator, [{\n      key: \"destroy\",\n      value: function destroy() {\n        this.delegateElement.off('click');\n        this.countrySelector.destroy();\n      }\n    }, {\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        this.delegateElement.on('click', '[data-action=\"estimate-shipping\"]', this._fetchRates.bind(this));\n      }\n    }, {\n      key: \"_fetchRates\",\n      value: function _fetchRates() {\n        document.dispatchEvent(new CustomEvent('theme:loading:start'));\n\n        if (this.options['singleProduct']) {\n          this._fetchRatesForProduct();\n        } else {\n          this._fetchRatesForCart();\n        }\n      }\n    }, {\n      key: \"_fetchRatesForCart\",\n      value: function _fetchRatesForCart() {\n        var _this = this;\n\n        var country = this.element.querySelector('[name=\"country\"]').value,\n            province = this.element.querySelector('[name=\"province\"]').value,\n            zip = this.element.querySelector('[name=\"zip\"]').value;\n        fetch(\"\".concat(window.routes.cartUrl, \"/shipping_rates.json?shipping_address[zip]=\").concat(zip, \"&shipping_address[country]=\").concat(country, \"&shipping_address[province]=\").concat(province), {\n          credentials: 'same-origin',\n          method: 'GET'\n        }).then(function (response) {\n          document.dispatchEvent(new CustomEvent('theme:loading:end'));\n          response.json().then(function (result) {\n            _this._formatResults(response.ok, result);\n          });\n        });\n      }\n      /**\n       * Technique is coming from this website: https://freakdesign.com.au/blogs/news/get-shipping-estimates-on-a-product-page\n       */\n\n    }, {\n      key: \"_fetchRatesForProduct\",\n      value: function _fetchRatesForProduct() {\n        var _this2 = this;\n\n        // grab the current cookie for the cart and we store it\n        var cartCookie = this._getCookie('cart'),\n            tempCookieValue = 'temp-cart-cookie___' + Date.now() + parseInt(Math.random() * 1000),\n            fakeCookieValue = 'fake-cart-cookie___' + Date.now() + parseInt(Math.random() * 1000); // if not found, make a new temp cookie\n\n\n        if (!cartCookie) {\n          this._updateCartCookie(tempCookieValue);\n\n          cartCookie = this._getCookie('cart');\n        } // if found but has a weird length, bail\n\n\n        if (cartCookie.length < 32) {\n          return;\n        } // change the cookie value to a new 32 character value\n\n\n        this._updateCartCookie(fakeCookieValue); // add the product to our fake cart\n\n\n        var formElement = document.querySelector('form[action*=\"/cart/add\"]');\n        fetch(\"\".concat(window.routes.cartAddUrl, \".js\"), {\n          body: JSON.stringify(Form.serialize(formElement)),\n          credentials: 'same-origin',\n          headers: {\n            'Content-Type': 'application/json',\n            'X-Requested-With': 'XMLHttpRequest' // This is needed as currently there is a bug in Shopify that assumes this header\n\n          },\n          method: 'POST'\n        }).then(function (response) {\n          response.json().then(function () {\n            var country = _this2.element.querySelector('[name=\"country\"]').value,\n                province = _this2.element.querySelector('[name=\"province\"]').value,\n                zip = _this2.element.querySelector('[name=\"zip\"]').value;\n\n            fetch(\"\".concat(window.routes.cartUrl, \"/shipping_rates.json?shipping_address[zip]=\").concat(zip, \"&shipping_address[country]=\").concat(country, \"&shipping_address[province]=\").concat(province), {\n              credentials: 'same-origin',\n              method: 'GET'\n            }).then(function (response) {\n              document.dispatchEvent(new CustomEvent('theme:loading:end'));\n              response.json().then(function (result) {\n                _this2._formatResults(response.ok, result);\n              });\n\n              _this2._updateCartCookie(cartCookie); // We can restore the cookie\n\n            })[\"catch\"](function () {\n              _this2._updateCartCookie(cartCookie);\n            });\n          })[\"catch\"](function () {\n            // We have error so we have to reset cookie\n            _this2._updateCartCookie(cartCookie);\n\n            document.dispatchEvent(new CustomEvent('theme:loading:end'));\n          });\n        });\n      }\n    }, {\n      key: \"_formatResults\",\n      value: function _formatResults(isOk, results) {\n        var resultsElement = this.element.querySelector('.shipping-estimator__results');\n        resultsElement.innerHTML = '';\n\n        if (isOk) {\n          var shippingRates = results['shipping_rates'];\n\n          if (shippingRates.length === 0) {\n            resultsElement.innerHTML = \"<p>\".concat(window.languages.shippingEstimatorNoResults, \"</p>\");\n          } else {\n            if (shippingRates.length === 1) {\n              resultsElement.innerHTML = \"<p>\".concat(window.languages.shippingEstimatorOneResult, \"</p>\");\n            } else {\n              resultsElement.innerHTML = \"<p>\".concat(window.languages.shippingEstimatorMultipleResults.replace('{{count}}', shippingRates.length), \"</p>\");\n            }\n\n            var listRatesHtml = '';\n            shippingRates.forEach(function (item) {\n              listRatesHtml += \"<li>\".concat(item['name'], \": \").concat(Currency.formatMoney(parseInt(item['price'] * 100), window.theme.moneyFormat), \"</li>\");\n            });\n            resultsElement.innerHTML += \"<ul>\".concat(listRatesHtml, \"</ul>\");\n          }\n        } else {\n          resultsElement.innerHTML = \"<p>\".concat(window.languages.shippingEstimatorErrors, \"</p>\");\n          var errorHtml = '';\n          Object.keys(results).forEach(function (key) {\n            errorHtml += \"<li class=\\\"alert__list-item\\\">\".concat(key, \" \").concat(results[key], \"</li>\");\n          });\n          resultsElement.innerHTML += \"<ul>\".concat(errorHtml, \"</ul>\");\n        }\n\n        resultsElement.style.display = 'block';\n      }\n    }, {\n      key: \"_getCookie\",\n      value: function _getCookie(name) {\n        var value = \"; \".concat(document.cookie),\n            parts = value.split('; ' + name + '=');\n\n        if (parts.length === 2) {\n          return parts.pop().split(';').shift();\n        }\n      }\n    }, {\n      key: \"_updateCartCookie\",\n      value: function _updateCartCookie(value) {\n        var date = new Date();\n        date.setTime(date.getTime() + 14 * 86400000);\n        document.cookie = \"cart=\".concat(value, \"; expires=\").concat(date.toUTCString(), \"; path=/\");\n      }\n    }]);\n\n    return ShippingEstimator;\n  }();\n\n  /**\n   * The given ID must be the value picker itself (the element that contains the class \"value-picker\", not the button that toggles it\n   */\n\n  var ValuePicker = /*#__PURE__*/function () {\n    function ValuePicker(id) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n      _classCallCheck(this, ValuePicker);\n\n      this.id = id;\n      this.delegateRoot = new Delegate(document.documentElement);\n      this.isOpen = false;\n      this.togglerElement = document.querySelector(\"[data-action=\\\"open-value-picker\\\"][aria-controls=\\\"\".concat(this.id, \"\\\"]\"));\n\n      this.onSelect = options['onValueSelect'] || function () {};\n\n      this._attachListeners();\n    }\n\n    _createClass(ValuePicker, [{\n      key: \"destroy\",\n      value: function destroy() {\n        this.delegateRoot.off();\n      }\n    }, {\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        this.delegateRoot.on('click', \"[data-action=\\\"open-value-picker\\\"][aria-controls=\\\"\".concat(this.id, \"\\\"]\"), this._toggle.bind(this));\n        this.delegateRoot.on('click', \"[data-action=\\\"close-value-picker\\\"][aria-controls=\\\"\".concat(this.id, \"\\\"]\"), this._toggle.bind(this));\n        this.delegateRoot.on('click', \"#\".concat(this.id, \" [data-action=\\\"select-value\\\"]\"), this._selectValue.bind(this));\n        this.delegateRoot.on('click', this._detectOutsideClick.bind(this), true);\n        this.delegateRoot.on('focusout', \"#\".concat(this.id), this._onFocusOut.bind(this));\n      }\n    }, {\n      key: \"_toggle\",\n      value: function _toggle(event) {\n        if (this.isOpen) {\n          this._close(event);\n        } else {\n          this._open(event);\n        }\n      }\n    }, {\n      key: \"_open\",\n      value: function _open() {\n        document.querySelector(\"[data-action=\\\"open-value-picker\\\"][aria-controls=\\\"\".concat(this.id, \"\\\"]\")).setAttribute('aria-expanded', 'true');\n        document.getElementById(this.id).setAttribute('aria-hidden', 'false'); // This is quite ugly, but in order to avoid an issue with the header that has a higher z-index, we have to temporarily reduce\n        // it while we have the element open\n\n        if (Responsive.matchesBreakpoint('phone')) {\n          var headerElement = document.querySelector('.shopify-section__header');\n          headerElement.style.zIndex = '3';\n        }\n\n        this.isOpen = true;\n        document.body.classList.add('no-mobile-scroll');\n      }\n    }, {\n      key: \"_close\",\n      value: function _close() {\n        document.querySelector(\"[data-action=\\\"open-value-picker\\\"][aria-controls=\\\"\".concat(this.id, \"\\\"]\")).setAttribute('aria-expanded', 'false');\n        document.getElementById(this.id).setAttribute('aria-hidden', 'true'); // This is quite ugly, but in order to avoid an issue with the header that has a higher z-index, we have to temporarily reduce\n        // it while we have the element open\n\n        var headerElement = document.querySelector('.shopify-section__header');\n        headerElement.style.zIndex = '';\n        this.isOpen = false;\n        document.body.classList.remove('no-mobile-scroll');\n      }\n    }, {\n      key: \"_selectValue\",\n      value: function _selectValue(event, target) {\n        this.onSelect(target.getAttribute('data-value'));\n\n        this._close();\n      }\n    }, {\n      key: \"_onFocusOut\",\n      value: function _onFocusOut(event) {\n        var container = document.getElementById(this.id); // If the element that get the new focus is not contains within the value picker, we close it\n\n        if (!container.contains(event.relatedTarget)) {\n          this._close();\n        }\n      }\n    }, {\n      key: \"_detectOutsideClick\",\n      value: function _detectOutsideClick(event) {\n        // If already closed, nothing to do\n        if (!this.isOpen || this.togglerElement === event.target || this.togglerElement.contains(event.target)) {\n          return;\n        }\n\n        if (!event.target.closest('.value-picker__inner') && this.isOpen) {\n          this._close(event);\n        }\n      }\n    }]);\n\n    return ValuePicker;\n  }();\n\n  var AccountSection = /*#__PURE__*/function () {\n    function AccountSection(element) {\n      _classCallCheck(this, AccountSection);\n\n      this.element = element;\n      this.domDelegate = new Delegate(this.element);\n      this.element.querySelectorAll('[action*=\"/account/addresses\"]').forEach(function (addressForm) {\n        new CountrySelector(addressForm.querySelector('[name=\"address[country]\"]'), addressForm.querySelector('[name=\"address[province]\"]'));\n      });\n      this.pageSelector = new ValuePicker('account-selector');\n    }\n\n    _createClass(AccountSection, [{\n      key: \"_onUnload\",\n      value: function _onUnload() {\n        this.pageSelector.destroy();\n      }\n    }]);\n\n    return AccountSection;\n  }();\n\n  var AnnouncementBarSection = /*#__PURE__*/function () {\n    function AnnouncementBarSection(element) {\n      _classCallCheck(this, AnnouncementBarSection);\n\n      this.element = element;\n      this.domDelegate = new Delegate(this.element);\n      this.options = JSON.parse(this.element.getAttribute('data-section-settings'));\n      this.isOpen = false; // We set the new width of the announcement bar button if any\n\n      if (this.options['showNewsletter']) {\n        document.documentElement.style.setProperty('--announcement-bar-button-width', this.element.querySelector('.announcement-bar__button').clientWidth + 'px');\n      } else {\n        document.documentElement.style.removeProperty('--announcement-bar-button-width');\n      }\n\n      this._attachListeners();\n    }\n\n    _createClass(AnnouncementBarSection, [{\n      key: \"onSelect\",\n      value: function onSelect() {\n        if (this.options['showNewsletter'] && !this.isOpen) {\n          this._toggleNewsletter();\n        }\n      }\n    }, {\n      key: \"onDeselect\",\n      value: function onDeselect() {\n        if (this.options['showNewsletter'] && this.isOpen) {\n          this._toggleNewsletter();\n        }\n      }\n    }, {\n      key: \"onUnload\",\n      value: function onUnload() {\n        this.domDelegate.off();\n      }\n    }, {\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        this.domDelegate.on('click', '[data-action=\"toggle-newsletter\"]', this._toggleNewsletter.bind(this));\n        this.domDelegate.on('keyup', this._handleKey.bind(this));\n      }\n    }, {\n      key: \"_toggleNewsletter\",\n      value: function _toggleNewsletter() {\n        var togglerElement = this.element.querySelector('.announcement-bar__button'),\n            newsletterElement = this.element.querySelector('.announcement-bar__newsletter');\n\n        if (togglerElement.getAttribute('aria-expanded') === 'false') {\n          togglerElement.setAttribute('aria-expanded', 'true');\n          newsletterElement.setAttribute('aria-hidden', 'false');\n          Animation.slideDown(newsletterElement, function () {\n            Accessibility.trapFocus(newsletterElement, 'announcement-bar');\n          });\n        } else {\n          togglerElement.setAttribute('aria-expanded', 'false');\n          newsletterElement.setAttribute('aria-hidden', 'true');\n          Animation.slideUp(newsletterElement);\n          Accessibility.removeTrapFocus(newsletterElement, 'announcement-bar');\n        }\n\n        this.isOpen = !this.isOpen;\n      }\n    }, {\n      key: \"_handleKey\",\n      value: function _handleKey(event) {\n        if (event.key === 'Escape' && this.isOpen) {\n          this._toggleNewsletter();\n        }\n      }\n    }]);\n\n    return AnnouncementBarSection;\n  }();\n\n  var BlogSection = /*#__PURE__*/function () {\n    function BlogSection(element) {\n      _classCallCheck(this, BlogSection);\n\n      this.element = element;\n      this.blogTagSelector = new ValuePicker('blog-tag-selector');\n\n      if (Shopify.designMode) {\n        var elementToAdd = this.element.querySelector('.page__header');\n\n        if (elementToAdd) {\n          document.querySelector('.blog-container').previousElementSibling.remove();\n          document.querySelector('.blog-container').insertAdjacentElement('beforebegin', elementToAdd);\n        }\n      }\n    }\n\n    _createClass(BlogSection, [{\n      key: \"onUnload\",\n      value: function onUnload() {\n        this.blogTagSelector.destroy();\n      }\n    }]);\n\n    return BlogSection;\n  }();\n\n  var BlogPostSection = function BlogPostSection(element) {\n    _classCallCheck(this, BlogPostSection);\n\n    this.element = element;\n\n    if (Shopify.designMode) {\n      var elementToAdd = this.element.querySelector('.page__header');\n\n      if (elementToAdd) {\n        document.querySelector('.blog-container').previousElementSibling.remove();\n        document.querySelector('.blog-container').insertAdjacentElement('beforebegin', elementToAdd);\n      }\n    }\n  };\n\n  var BlogSidebarSection = /*#__PURE__*/function () {\n    function BlogSidebarSection(element) {\n      _classCallCheck(this, BlogSidebarSection);\n\n      this.element = element;\n\n      if (window.theme.pageType === 'blog') {\n        this._fixItemsPerRow();\n      }\n    }\n    /**\n     * If sidebar is not visible, then we must do some adjustments to the grid of article (especially, we must change how many items per row are displayed).\n     * Because Shopify sections are independent, I didn't find a better approach than changing it in JavaScript\n     */\n\n\n    _createClass(BlogSidebarSection, [{\n      key: \"_fixItemsPerRow\",\n      value: function _fixItemsPerRow() {\n        var blocks = this.element.querySelectorAll('.blog-sidebar__item');\n\n        if (blocks.length === 0) {\n          document.querySelector('.blog-container').classList.add('blog-container--without-sidebar');\n          document.querySelectorAll('.shopify-section__blog-posts .block-list__item').forEach(function (item) {\n            if (item.classList.contains('1/2--lap-and-up')) {\n              item.classList.remove('1/2--lap-and-up');\n              item.classList.add('1/3--lap-and-up');\n            }\n          });\n        } else {\n          document.querySelector('.blog-container').classList.remove('blog-container--without-sidebar');\n          document.querySelectorAll('.shopify-section__blog-posts .block-list__item').forEach(function (item) {\n            if (item.classList.contains('1/3--lap-and-up')) {\n              item.classList.remove('1/3--lap-and-up');\n              item.classList.add('1/2--lap-and-up');\n            }\n          });\n        }\n      }\n    }]);\n\n    return BlogSidebarSection;\n  }();\n\n  var ProductSection = /*#__PURE__*/function () {\n    function ProductSection(element) {\n      var _this = this;\n\n      _classCallCheck(this, ProductSection);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.options = JSON.parse(this.element.getAttribute('data-section-settings'));\n      this.productGallery = new ProductGallery(this.element, this.options);\n\n      this._initShopifyReviews(); // If loaded by quick view, we need to do various initialization stuff\n\n\n      if (this.options['isQuickView'] && this.options['showPaymentButton'] && window.Shopify.PaymentButton) {\n        Shopify.PaymentButton.init();\n      }\n\n      this.productVariants = new ProductVariants(this.element, this.options);\n\n      if (this.options['showShippingEstimator']) {\n        this.shippingEstimator = new ShippingEstimator(this.element.querySelector('.shipping-estimator'), {\n          singleProduct: true\n        });\n      }\n\n      if (this.options['showQuantitySelector']) {\n        var quantityPickerElement = this.element.querySelector('.quantity-selector--product');\n\n        if (quantityPickerElement) {\n          this.quantityPicker = new QuantityPicker(quantityPickerElement);\n        }\n      }\n\n      var productInfoElement = this.element.querySelector('.product-block-list__item--info .card');\n\n      if (productInfoElement) {\n        this.element.querySelector('.product-block-list__wrapper').style.minHeight = \"\".concat(productInfoElement.clientHeight, \"px\");\n\n        if (window.ResizeObserver) {\n          this.productInfoResizeObserver = new ResizeObserver(function (event) {\n            if (event[0].contentBoxSize) {\n              _this.element.querySelector('.product-block-list__wrapper').style.minHeight = \"\".concat(event[0].contentBoxSize[0].blockSize, \"px\");\n            } else {\n              _this.element.querySelector('.product-block-list__wrapper').style.minHeight = \"\".concat(event[0].contentRect.height, \"px\");\n            }\n          });\n          this.productInfoResizeObserver.observe(productInfoElement);\n        }\n\n        if (this.options['infoOverflowScroll']) {\n          this.infoOverflowScroller = new OverflowScroller(productInfoElement, {\n            offsetTop: document.documentElement.style.getPropertyValue('--header-is-sticky') * parseInt(document.documentElement.style.getPropertyValue('--header-height') + 30),\n            offsetBottom: 30\n          });\n        }\n      }\n\n      this._attachListeners();\n    }\n\n    _createClass(ProductSection, [{\n      key: \"onUnload\",\n      value: function onUnload() {\n        this.productVariants.destroy();\n        this.productGallery.destroy();\n\n        if (this.options['showShippingEstimator']) {\n          this.shippingEstimator.destroy();\n        }\n\n        if (this.options['infoOverflowScroll']) {\n          this.infoOverflowScroller.destroy();\n        }\n\n        if (window.ResizeObserver && this.productInfoResizeObserver) {\n          this.productInfoResizeObserver.disconnect();\n        }\n\n        this.delegateElement.off();\n        this.element.removeEventListener('variant:changed', this._onVariantChangedListener);\n      }\n    }, {\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        this._onVariantChangedListener = this._onVariantChanged.bind(this);\n        this.element.addEventListener('variant:changed', this._onVariantChangedListener);\n      }\n      /**\n       * Shopify Reviews app is quite funky and hard to extend... excuse this code\n       */\n\n    }, {\n      key: \"_initShopifyReviews\",\n      value: function _initShopifyReviews() {\n        var _this2 = this;\n\n        if (Shopify.designMode && window.SPR) {\n          window.SPR.initDomEls();\n          window.SPR.loadProducts();\n        }\n\n        window.SPRCallbacks = {}; // This allows us to add some class to adjust the styling\n\n        window.SPRCallbacks.onFormSuccess = function () {\n          _this2.element.querySelector('#shopify-product-reviews .spr-form').classList.add('spr-form-submitted');\n        }; // If loaded by quick view, we need to do various initialization stuff\n\n\n        if (this.options['isQuickView'] && this.options['showPaymentButton'] && window.Shopify.PaymentButton) {\n          Shopify.PaymentButton.init();\n        }\n      }\n      /**\n       * This method is called when the variant is changed due to option\n       */\n\n    }, {\n      key: \"_onVariantChanged\",\n      value: function _onVariantChanged(event) {\n        this.productGallery.variantHasChanged(event.detail.variant);\n      }\n    }]);\n\n    return ProductSection;\n  }();\n\n  var CartSection = /*#__PURE__*/function () {\n    function CartSection(element) {\n      _classCallCheck(this, CartSection);\n\n      this.element = element;\n      this.domDelegate = new Delegate(this.element);\n      this.delegateRoot = new Delegate(document.documentElement);\n      this.options = JSON.parse(this.element.getAttribute('data-section-settings'));\n\n      if (this.options['showShippingEstimator']) {\n        this.shippingEstimator = new ShippingEstimator(this.element.querySelector('.shipping-estimator'), {\n          singleProduct: false\n        });\n      }\n\n      this._attachListeners();\n\n      this._enforceMinimumHeight();\n    }\n\n    _createClass(CartSection, [{\n      key: \"onUnload\",\n      value: function onUnload() {\n        if (this.options['showShippingEstimator']) {\n          this.shippingEstimator.destroy();\n        }\n      }\n    }, {\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        this.domDelegate.on('click', '[data-action=\"add-to-cart\"]', this._addToCart.bind(this));\n        this.domDelegate.on('click', '[data-action=\"save-note\"]', this._saveNote.bind(this));\n        this.domDelegate.on('click', '[data-secondary-action=\"open-quick-view\"]', this._openQuickView.bind(this));\n        this.delegateRoot.on('cart:rerendered', this._onCartRerendered.bind(this));\n      }\n    }, {\n      key: \"_saveNote\",\n      value: function _saveNote() {\n        var noteValue = this.element.querySelector('[name=\"note\"]').value;\n        fetch(\"\".concat(window.routes.cartUrl, \"/update.js\"), {\n          body: JSON.stringify({\n            note: noteValue\n          }),\n          credentials: 'same-origin',\n          method: 'POST',\n          headers: {\n            'Content-Type': 'application/json',\n            'X-Requested-With': 'XMLHttpRequest' // This is needed as currently there is a bug in Shopify that assumes this header\n\n          }\n        }); // Hide or show the note edit button depending on content\n\n        this.element.querySelector('.cart-recap__note-edit').classList.toggle('is-visible', noteValue !== ''); // Close the button by sending a global event\n\n        document.dispatchEvent(new CustomEvent('collapsible:toggle', {\n          detail: {\n            id: 'order-note'\n          }\n        }));\n      }\n    }, {\n      key: \"_addToCart\",\n      value: function _addToCart(event, target) {\n        var _this = this;\n\n        if (window.theme.cartType === 'page') {\n          return; // When using a cart type of page, we just simply redirect to the cart page\n        }\n\n        event.preventDefault(); // Prevent form to be submitted\n\n        event.stopPropagation(); // First, we switch the status of the button\n\n        target.setAttribute('disabled', 'disabled');\n        document.dispatchEvent(new CustomEvent('theme:loading:start')); // Then we add the product in Ajax\n\n        var formElement = target.closest('form[action*=\"/cart/add\"]');\n        fetch(\"\".concat(window.routes.cartAddUrl, \".js\"), {\n          body: JSON.stringify(Form.serialize(formElement)),\n          credentials: 'same-origin',\n          method: 'POST',\n          headers: {\n            'Content-Type': 'application/json',\n            'X-Requested-With': 'XMLHttpRequest' // This is needed as currently there is a bug in Shopify that assumes this header\n\n          }\n        }).then(function (response) {\n          if (response.ok) {\n            target.removeAttribute('disabled'); // We simply trigger an event so the mini-cart can re-render\n\n            _this.element.dispatchEvent(new CustomEvent('product:added', {\n              bubbles: true,\n              detail: {\n                variant: null,\n                quantity: parseInt(formElement.querySelector('[name=\"quantity\"]').value)\n              }\n            }));\n          } else {\n            target.removeAttribute('disabled');\n          }\n        });\n        event.preventDefault();\n      }\n    }, {\n      key: \"_openQuickView\",\n      value: function _openQuickView(event, target) {\n        var modal = document.getElementById(target.getAttribute('aria-controls'));\n        modal.classList.add('is-loading');\n        fetch(\"\".concat(target.getAttribute('data-product-url'), \"?view=quick-view\"), {\n          credentials: 'same-origin',\n          method: 'GET'\n        }).then(function (response) {\n          response.text().then(function (content) {\n            modal.querySelector('.modal__inner').innerHTML = content;\n            modal.classList.remove('is-loading'); // Register a new section to power the JS\n\n            var modalProductSection = new ProductSection(modal.querySelector('[data-section-type=\"product\"]')); // We set a listener so we can cleanup on close\n\n            var doCleanUp = function doCleanUp() {\n              modalProductSection.onUnload();\n              modal.removeEventListener('modal:closed', doCleanUp);\n            };\n\n            modal.addEventListener('modal:closed', doCleanUp);\n          });\n        });\n      }\n      /**\n       * On desktop we need to enforce a minimum height for the cart-wrapper\n       */\n\n    }, {\n      key: \"_enforceMinimumHeight\",\n      value: function _enforceMinimumHeight() {\n        var cartWrapperElement = this.element.querySelector('.cart-wrapper'),\n            cartRecapScrollerElement = this.element.querySelector('.cart-recap__scroller');\n\n        if (cartWrapperElement && cartRecapScrollerElement) {\n          cartWrapperElement.style.minHeight = \"\".concat(cartRecapScrollerElement.clientHeight, \"px\");\n\n          if (window.ResizeObserver) {\n            var resizeObserver = new ResizeObserver(function (entries) {\n              var _iterator = _createForOfIteratorHelper(entries),\n                  _step;\n\n              try {\n                for (_iterator.s(); !(_step = _iterator.n()).done;) {\n                  var entry = _step.value;\n                  cartWrapperElement.style.minHeight = \"\".concat(parseInt(entry.contentRect.height), \"px\");\n                }\n              } catch (err) {\n                _iterator.e(err);\n              } finally {\n                _iterator.f();\n              }\n            });\n            resizeObserver.observe(cartRecapScrollerElement);\n          }\n        }\n      }\n      /* When the cart re-render, we have some operations to do */\n\n    }, {\n      key: \"_onCartRerendered\",\n      value: function _onCartRerendered() {\n        // For now the only thing we have to do is re-create the shipping estimator\n        if (this.options['showShippingEstimator']) {\n          this.shippingEstimator.destroy();\n          this.shippingEstimator = new ShippingEstimator(this.element.querySelector('.shipping-estimator'), {\n            singleProduct: false\n          });\n        }\n\n        this._enforceMinimumHeight();\n      }\n    }]);\n\n    return CartSection;\n  }();\n\n  var CollectionListSection = /*#__PURE__*/function () {\n    function CollectionListSection(element) {\n      var _this = this;\n\n      _classCallCheck(this, CollectionListSection);\n\n      this.element = element;\n      var collectionListElement = this.element.querySelector('.collection-list');\n      if(collectionListElement.classList.contains('enable-slider')) {\n        this.flickityInstance = new js(collectionListElement, {\n          watchCSS: true,\n          prevNextButtons: true,\n          draggable: !window.matchMedia('(-moz-touch-enabled: 0), (hover: hover)').matches,\n          pageDots: false,\n          resize: false,\n          cellAlign: collectionListElement.childElementCount < 6 ? 'center' : 'left',\n          contain: true,\n          groupCells: true\n        });\n      }\n      var lastWidth = window.innerWidth;\n      window.addEventListener('resize', function () {\n        if (window.innerWidth !== lastWidth) {\n          _this.flickityInstance.resize();\n\n          lastWidth = window.innerWidth;\n        }\n      });\n    }\n\n    _createClass(CollectionListSection, [{\n      key: \"onUnload\",\n      value: function onUnload() {\n        this.flickityInstance.destroy();\n      }\n    }, {\n      key: \"onBlockSelect\",\n      value: function onBlockSelect(event) {\n        if (this.flickityInstance.isActive) {\n          this.flickityInstance.selectCell(parseInt(event.target.getAttribute('data-collection-index')), null, event.detail.load);\n        }\n      }\n    }]);\n\n    return CollectionListSection;\n  }();\n\n  var CollectionSection = /*#__PURE__*/function () {\n    function CollectionSection(element) {\n      var _this = this;\n\n      _classCallCheck(this, CollectionSection);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.options = JSON.parse(this.element.getAttribute('data-section-settings'));\n      this.currentUrl = new URL(window.location.href);\n      this.mobileFilterDrawer = new CollectionFilterDrawer(this.options);\n      this.displayByValuePicker = new ValuePicker('display-by-selector', {\n        onValueSelect: this._showingCountChanged.bind(this)\n      });\n      this.sortByValuePicker = new ValuePicker('sort-by-selector', {\n        onValueSelect: this._sortByChanged.bind(this)\n      });\n      this.productItemColorSwatch = new ProductItemColorSwatch(this.element); // If we are in the template search and that we are supposed to show pages and blog posts, we do more work\n\n      if (window.theme.pageType === 'search') {\n        this._loadContentResults();\n      }\n\n      window.addEventListener('popstate', function () {\n        _this.currentUrl = new URL(window.location.href);\n\n        _this._reload(false);\n      });\n\n      this._attachListeners();\n    }\n\n    _createClass(CollectionSection, [{\n      key: \"onUnload\",\n      value: function onUnload() {\n        this.delegateElement.off();\n        this.mobileFilterDrawer.destroy();\n        this.displayByValuePicker.destroy();\n        this.sortByValuePicker.destroy();\n        this.productItemColorSwatch.destroy();\n      }\n    }, {\n      key: \"onSelect\",\n      value: function onSelect(event) {\n        if (Shopify.designMode && event.detail.load) {\n          // We also force the layout and number of items per page in the editor, no matter if you have choose an explicit mode\n          this.element.querySelector(\".collection__layout-button[data-layout-mode=\\\"\".concat(this.options['defaultLayout'], \"\\\"]\")).click();\n\n          this._showingCountChanged(this.options['defaultProductsPerPage']);\n        }\n      }\n    }, {\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        this.delegateElement.on('click', '[data-action=\"change-layout\"]', this._changeLayout.bind(this));\n        this.delegateElement.on('change', '#mobile-sort-by, #desktop-sort-by', this._sortByChanged.bind(this));\n        this.delegateElement.on('change', '#showing-count', this._showingCountChanged.bind(this));\n        this.delegateElement.on('click', '.pagination [data-page]', this._paginationPageChanged.bind(this));\n        this.delegateElement.on('click', '[data-secondary-action=\"open-quick-view\"]', this._openQuickView.bind(this));\n        this.delegateElement.on('click', '[data-action=\"add-to-cart\"]', this._addToCart.bind(this));\n        this.delegateElement.on('change', '[name^=\"filter.\"]', this._onFilterChanged.bind(this));\n        this.delegateElement.on('click', '[data-action=\"clear-filters\"]', this._onFiltersCleared.bind(this));\n      }\n    }, {\n      key: \"_openQuickView\",\n      value: function _openQuickView(event, target) {\n        var productUrl = new URL(\"\".concat(window.location.origin).concat(target.getAttribute('data-product-url'))); // If we are on mobile or tablet, we redirect to product page directly\n\n        if (Responsive.matchesBreakpoint('phone') || Responsive.matchesBreakpoint('tablet')) {\n          window.location.href = productUrl.href;\n          return false;\n        }\n\n        var modal = document.getElementById(target.getAttribute('aria-controls'));\n        modal.classList.add('is-loading');\n        productUrl.searchParams.set('view', 'quick-view');\n        fetch(productUrl.href, {\n          credentials: 'same-origin',\n          method: 'GET'\n        }).then(function (response) {\n          response.text().then(function (content) {\n            modal.querySelector('.modal__inner').innerHTML = content;\n            modal.classList.remove('is-loading'); // Register a new section to power the JS\n\n            var modalProductSection = new ProductSection(modal.querySelector('[data-section-type=\"product\"]')); // We set a listener so we can cleanup on close\n\n            var doCleanUp = function doCleanUp() {\n              modalProductSection.onUnload();\n              modal.removeEventListener('modal:closed', doCleanUp);\n            };\n\n            modal.addEventListener('modal:closed', doCleanUp);\n          });\n        });\n      }\n      /**\n       * Switch layout mode\n       */\n\n    }, {\n      key: \"_changeLayout\",\n      value: function _changeLayout(event, target) {\n        var _this2 = this;\n\n        if (target.classList.contains('is-selected')) {\n          return;\n        }\n\n        var newLayoutMode = target.getAttribute('data-layout-mode'); // We save the new attribute so that we can select the appropriate mode without causing reflow\n\n        fetch(\"\".concat(window.routes.cartUrl, \"/update.js\"), {\n          body: JSON.stringify({\n            attributes: {\n              'collection_layout': newLayoutMode\n            }\n          }),\n          credentials: 'same-origin',\n          method: 'POST',\n          headers: {\n            'Content-Type': 'application/json',\n            'X-Requested-With': 'XMLHttpRequest' // This is needed as currently there is a bug in Shopify that assumes this header\n\n          }\n        }); // Finally, we change everything!\n\n        fastdom.mutate(function () {\n          Dom.getSiblings(target, '.is-selected').forEach(function (button) {\n            return button.classList.remove('is-selected');\n          });\n          target.classList.add('is-selected');\n\n          _this2.element.querySelectorAll('.product-item').forEach(function (item) {\n            if (newLayoutMode === 'grid') {\n              item.className = \"product-item product-item--vertical \".concat(_this2.options['gridClasses']);\n            } else {\n              item.className = 'product-item product-item--list';\n            }\n          }); // Reload the swatches\n\n\n          _this2.productItemColorSwatch.recalculateSwatches();\n        });\n      }\n      /**\n       * Update the URL and reload products\n       */\n\n    }, {\n      key: \"_sortByChanged\",\n      value: function _sortByChanged(value) {\n        this.currentUrl.searchParams.set('sort_by', value);\n        this.currentUrl.searchParams[\"delete\"]('page');\n\n        this._reload(true);\n      }\n      /**\n       * When the number of items has changed\n       */\n\n    }, {\n      key: \"_showingCountChanged\",\n      value: function _showingCountChanged(value) {\n        var _this3 = this;\n\n        this.currentUrl.searchParams[\"delete\"]('page'); // We save the new value as a cart attribute, so it can be retrieved in Liquid easily :)\n\n        fetch(\"\".concat(window.routes.cartUrl, \"/update.js\"), {\n          body: JSON.stringify({\n            attributes: {\n              'collection_products_per_page': value\n            }\n          }),\n          credentials: 'same-origin',\n          method: 'POST',\n          headers: {\n            'Content-Type': 'application/json',\n            'X-Requested-With': 'XMLHttpRequest' // This is needed as currently there is a bug in Shopify that assumes this header\n\n          }\n        }).then(function () {\n          _this3._reload(true);\n        });\n      }\n      /**\n       * When the page has changed\n       */\n\n    }, {\n      key: \"_paginationPageChanged\",\n      value: function _paginationPageChanged(event, target) {\n        event.preventDefault();\n        this.currentUrl.searchParams.set('page', parseInt(target.getAttribute('data-page')));\n\n        this._reload(true);\n      }\n    }, {\n      key: \"_onFilterChanged\",\n      value: function _onFilterChanged(event, target) {\n        var formData = new FormData(target.closest('form'));\n        var searchParamsAsString = new URLSearchParams(formData).toString();\n        this.currentUrl = new URL(\"\".concat(window.location.pathname, \"?\").concat(searchParamsAsString), window.location.origin);\n\n        this._reload(true);\n      }\n    }, {\n      key: \"_onFiltersCleared\",\n      value: function _onFiltersCleared(event, target) {\n        this.currentUrl = new URL(target.getAttribute('data-url'), window.location.origin);\n\n        this._reload(true);\n      }\n      /**\n       * Reload all products from the current URL\n       *\n       * @private\n       */\n\n    }, {\n      key: \"_reload\",\n      value: function _reload(pushState) {\n        var _this4 = this;\n\n        if (this.abortController) {\n          this.abortController.abort();\n        } // Then, we replace the URL\n\n\n        if (pushState) {\n          window.history.pushState({\n            path: this.currentUrl.toString()\n          }, '', this.currentUrl.toString());\n        }\n\n        document.dispatchEvent(new CustomEvent('theme:loading:start')); // We scroll to the top\n\n        var computedStyles = window.getComputedStyle(document.documentElement); // To load the content we use the newly introduced \"Sections API\", which also to get data much more efficiently\n\n        var sectionUrl = '';\n\n        if (this.currentUrl.search) {\n          sectionUrl = \"\".concat(this.currentUrl.pathname, \"/\").concat(this.currentUrl.search, \"&section_id=\").concat(this.element.getAttribute('data-section-id'));\n        } else {\n          sectionUrl = \"\".concat(this.currentUrl.pathname, \"?section_id=\").concat(this.element.getAttribute('data-section-id'));\n        }\n\n        try {\n          this.abortController = new AbortController();\n          return fetch(sectionUrl, {\n            credentials: 'same-origin',\n            method: 'GET',\n            signal: this.abortController.signal\n          }).then(function (response) {\n            response.text().then(function (content) {\n              var tempElement = document.createElement('div');\n              tempElement.innerHTML = content;\n              _this4.element.querySelector('.collection__dynamic-part').innerHTML = tempElement.querySelector('.collection__dynamic-part').innerHTML;\n\n              var desktopFilters = _this4.element.querySelector('#desktop-filters-form'),\n                  mobileFilters = _this4.element.querySelector('#mobile-collection-filters'),\n                  previousMobileScrollTop = 0;\n\n              if (mobileFilters) {\n                previousMobileScrollTop = mobileFilters.querySelector('.collection-drawer__inner').scrollTop;\n              } // A given collection may not have any filters\n\n\n              if (desktopFilters) {\n                Array.from(_this4.element.querySelectorAll('.collection__filter-group-name[aria-controls]')).forEach(function (groupName) {\n                  // Get the corresponding group from new filters\n                  var newGroup = tempElement.querySelector(\"[aria-controls=\\\"\".concat(groupName.getAttribute('aria-controls'), \"\\\"]\"));\n\n                  if (groupName.getAttribute('aria-expanded') === 'true') {\n                    newGroup.setAttribute('aria-expanded', 'true');\n                    newGroup.nextElementSibling.setAttribute('aria-hidden', 'false');\n                    newGroup.nextElementSibling.style.height = 'auto';\n                    newGroup.nextElementSibling.style.overflow = 'visible';\n                  } else {\n                    newGroup.setAttribute('aria-expanded', 'false');\n                    newGroup.nextElementSibling.setAttribute('aria-hidden', 'true');\n                    newGroup.nextElementSibling.style = '';\n                  }\n                });\n                desktopFilters.innerHTML = tempElement.querySelector('#desktop-filters-form').innerHTML;\n                mobileFilters.innerHTML = tempElement.querySelector('#mobile-collection-filters').innerHTML;\n                mobileFilters.querySelector('.collection-drawer__inner').scrollTop = previousMobileScrollTop;\n\n                _this4.mobileFilterDrawer._computeDrawerHeight();\n              } // Reload the swatches\n\n\n              _this4.productItemColorSwatch.recalculateSwatches();\n\n              var elementOffset = _this4.element.querySelector('.collection').getBoundingClientRect().top - 25 - parseInt(computedStyles.getPropertyValue('--header-is-sticky')) * parseInt(computedStyles.getPropertyValue('--header-height'));\n\n              if (elementOffset < 0) {\n                window.scrollBy({\n                  top: elementOffset,\n                  behavior: 'smooth'\n                });\n              } // Reload the product count\n\n\n              var countJson = JSON.parse(tempElement.querySelector('[data-collection-products-count]').innerHTML);\n\n              var showingProductsCount = _this4.element.querySelector('.collection__products-count-showing');\n\n              if (showingProductsCount) {\n                showingProductsCount.innerHTML = countJson['showingCount'];\n              }\n\n              _this4.element.querySelector('.collection__products-count-total').innerHTML = countJson['productsCount']; // Finally, we scroll to the element\n\n              document.dispatchEvent(new CustomEvent('theme:loading:end'));\n            });\n          });\n        } catch (e) {// Ignore the exception\n        }\n      }\n      /**\n       * ---------------------------------------------------------------------------------------------------\n       * SEARCH PAGE SPECIFIC METHOD\n       * ---------------------------------------------------------------------------------------------------\n       */\n\n    }, {\n      key: \"_loadContentResults\",\n      value: function _loadContentResults() {\n        var _this5 = this;\n\n        var currentUrl = new URL(window.location.href);\n        fetch(\"\".concat(window.routes.searchUrl, \"?section_id=search-content&q=\").concat(currentUrl.searchParams.get('q'), \"&type=article,page\"), {\n          credentials: 'same-origin'\n        }).then(function (response) {\n          response.text().then(function (content) {\n            var linkSearchResults = _this5.element.querySelector('.link-search-results'),\n                fakeDiv = document.createElement('div');\n\n            fakeDiv.innerHTML = content;\n\n            if (linkSearchResults && content.trim() !== '') {\n              linkSearchResults.innerHTML = fakeDiv.firstElementChild.innerHTML;\n              linkSearchResults.style.display = 'block';\n            }\n          });\n        });\n      }\n      /**\n       * ---------------------------------------------------------------------------------------------------\n       * INTERNAL CODE THAT HANDLE PRODUCT ADD TO CART\n       * ---------------------------------------------------------------------------------------------------\n       */\n\n    }, {\n      key: \"_addToCart\",\n      value: function _addToCart(event, target) {\n        var _this6 = this;\n\n        if (window.theme.cartType === 'page') {\n          return; // When using a cart type of page, we just simply redirect to the cart page\n        }\n\n        event.preventDefault(); // Prevent form to be submitted\n\n        event.stopPropagation(); // First, we switch the status of the button\n\n        target.setAttribute('disabled', 'disabled');\n        document.dispatchEvent(new CustomEvent('theme:loading:start')); // Then we add the product in Ajax\n\n        var formElement = target.closest('form[action*=\"/cart/add\"]');\n        fetch(\"\".concat(window.routes.cartAddUrl, \".js\"), {\n          body: JSON.stringify(Form.serialize(formElement)),\n          credentials: 'same-origin',\n          method: 'POST',\n          headers: {\n            'Content-Type': 'application/json',\n            'X-Requested-With': 'XMLHttpRequest' // This is needed as currently there is a bug in Shopify that assumes this header\n\n          }\n        }).then(function (response) {\n          target.removeAttribute('disabled');\n\n          if (response.ok) {\n            // We simply trigger an event so the mini-cart can re-render\n            _this6.element.dispatchEvent(new CustomEvent('product:added', {\n              bubbles: true,\n              detail: {\n                button: target,\n                variant: null,\n                quantity: parseInt(formElement.querySelector('[name=\"quantity\"]').value)\n              }\n            }));\n          } else {\n            document.dispatchEvent(new CustomEvent('theme:loading:end'));\n          }\n        });\n        event.preventDefault();\n      }\n    }]);\n\n    return CollectionSection;\n  }();\n\n  var FeaturedCollectionSection = /*#__PURE__*/function () {\n    function FeaturedCollectionSection(element) {\n      var _this = this;\n\n      _classCallCheck(this, FeaturedCollectionSection);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.options = JSON.parse(this.element.getAttribute('data-section-settings'));\n\n      if (!this.options['stackable']) {\n        this.flickityInstance = new js(this.element.querySelector('.product-list'), {\n          watchCSS: true,\n          pageDots: false,\n          prevNextButtons: true,\n          contain: true,\n          resize: false,\n          groupCells: true,\n          cellAlign: 'left',\n          draggable: !window.matchMedia('(-moz-touch-enabled: 0), (hover: hover)').matches\n        });\n        var lastWidth = window.innerWidth;\n        window.addEventListener('resize', function () {\n          if (window.innerWidth !== lastWidth) {\n            _this.flickityInstance.resize();\n\n            lastWidth = window.innerWidth;\n          }\n        });\n      }\n\n      this.productItemColorSwatch = new ProductItemColorSwatch(this.element);\n\n      this._fixSafari();\n\n      this._attachListeners();\n    }\n\n    _createClass(FeaturedCollectionSection, [{\n      key: \"onUnload\",\n      value: function onUnload() {\n        if (!this.options['stackable']) {\n          this.flickityInstance.destroy();\n        }\n\n        window.removeEventListener('resize', this._fixSafariListener);\n        this.delegateElement.off('change');\n        this.productItemColorSwatch.destroy();\n\n        if (this.resizeObserver) {\n          this.resizeObserver.disconnect();\n        }\n      }\n    }, {\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        var _this2 = this;\n\n        this._fixSafariListener = this._fixSafari.bind(this);\n        window.addEventListener('resize', this._fixSafariListener);\n        this.delegateElement.on('click', '[data-action=\"add-to-cart\"]', this._addToCart.bind(this));\n        this.delegateElement.on('click', '[data-secondary-action=\"open-quick-view\"]', this._openQuickView.bind(this)); // If the browser supports ResizeObserver we use it to detect when the size of the items in the carousel change,\n        // and if that's the case we force Flickity to resize\n\n        if (window.ResizeObserver && this.flickityInstance) {\n          this.resizeObserver = new ResizeObserver(function () {\n            _this2.flickityInstance.resize();\n          });\n          this.element.querySelectorAll('.product-item').forEach(function (item) {\n            _this2.resizeObserver.observe(item);\n          });\n        }\n      }\n      /**\n       * On Safari 11.1 and lower, the browser incorrectly calculate the height of flex and grid items due to a bug\n       * on how padding percentage is calculated (that we use for allocating image space). This is solved in Safari 11.1 and higher.\n       *\n       * For those browsers, we fix that in JavaScript by setting the height directly for each aspect ratio image\n       *\n       * @private\n       */\n\n    }, {\n      key: \"_fixSafari\",\n      value: function _fixSafari() {\n        var userAgent = window.navigator.userAgent.toLowerCase();\n\n        if (userAgent.includes('safari') && (userAgent.includes('version/10.1') || userAgent.includes('version/10.3') || userAgent.includes('version/11.0'))) {\n          var isPhone = Responsive.matchesBreakpoint('phone');\n          this.element.querySelectorAll('.product-item__image-wrapper .aspect-ratio, .product-item__image-wrapper .placeholder-svg').forEach(function (image) {\n            if (isPhone) {\n              image.parentNode.style.height = null;\n            } else {\n              image.parentNode.style.height = \"\".concat(image.clientHeight, \"px\");\n            }\n          });\n        }\n      }\n    }, {\n      key: \"_openQuickView\",\n      value: function _openQuickView(event, target) {\n        var productUrl = new URL(\"\".concat(window.location.origin).concat(target.getAttribute('data-product-url'))); // If we are on mobile or tablet, we redirect to product page directly\n\n        if (Responsive.matchesBreakpoint('phone') || Responsive.matchesBreakpoint('tablet')) {\n          window.location.href = productUrl.href;\n          return false;\n        }\n\n        var modal = document.getElementById(target.getAttribute('aria-controls'));\n        modal.classList.add('is-loading');\n        productUrl.searchParams.set('view', 'quick-view');\n        fetch(productUrl.href, {\n          credentials: 'same-origin',\n          method: 'GET'\n        }).then(function (response) {\n          response.text().then(function (content) {\n            modal.querySelector('.modal__inner').innerHTML = content;\n            modal.classList.remove('is-loading'); // Register a new section to power the JS\n\n            var modalProductSection = new ProductSection(modal.querySelector('[data-section-type=\"product\"]')); // We set a listener so we can cleanup on close\n\n            var doCleanUp = function doCleanUp() {\n              modalProductSection.onUnload();\n              modal.removeEventListener('modal:closed', doCleanUp);\n            };\n\n            modal.addEventListener('modal:closed', doCleanUp);\n          });\n        });\n      }\n      /**\n       * ---------------------------------------------------------------------------------------------------\n       * INTERNAL CODE THAT HANDLE PRODUCT ADD TO CART\n       * ---------------------------------------------------------------------------------------------------\n       */\n\n    }, {\n      key: \"_addToCart\",\n      value: function _addToCart(event, target) {\n        var _this3 = this;\n\n        if (window.theme.cartType === 'page') {\n          return; // When using a cart type of page, we just simply redirect to the cart page\n        }\n\n        event.preventDefault(); // Prevent form to be submitted\n\n        event.stopPropagation(); // First, we switch the status of the button\n\n        target.setAttribute('disabled', 'disabled');\n        document.dispatchEvent(new CustomEvent('theme:loading:start')); // Then we add the product in Ajax\n\n        var formElement = target.closest('form[action*=\"/cart/add\"]');\n        fetch(\"\".concat(window.routes.cartAddUrl, \".js\"), {\n          body: JSON.stringify(Form.serialize(formElement)),\n          credentials: 'same-origin',\n          method: 'POST',\n          headers: {\n            'Content-Type': 'application/json',\n            'X-Requested-With': 'XMLHttpRequest' // This is needed as currently there is a bug in Shopify that assumes this header\n\n          }\n        }).then(function (response) {\n          target.removeAttribute('disabled');\n\n          if (response.ok) {\n            // We simply trigger an event so the mini-cart can re-render\n            _this3.element.dispatchEvent(new CustomEvent('product:added', {\n              bubbles: true,\n              detail: {\n                button: target,\n                variant: null,\n                quantity: parseInt(formElement.querySelector('[name=\"quantity\"]').value)\n              }\n            }));\n          } else {\n            document.dispatchEvent(new CustomEvent('theme:loading:end'));\n          }\n        });\n        event.preventDefault();\n      }\n    }]);\n\n    return FeaturedCollectionSection;\n  }();\n\n  var GiftCardSection = /*#__PURE__*/function () {\n    function GiftCardSection(container) {\n      _classCallCheck(this, GiftCardSection);\n\n      this.element = container;\n      this.delegateElement = new Delegate(this.element);\n\n      this._createQrCode();\n\n      this._attachListeners();\n    }\n\n    _createClass(GiftCardSection, [{\n      key: \"onUnload\",\n      value: function onUnload() {\n        this.delegateElement.off();\n      }\n    }, {\n      key: \"_createQrCode\",\n      value: function _createQrCode() {\n        var qrCodeElements = document.querySelectorAll('.gift-card__qr');\n        qrCodeElements.forEach(function (qrCodeElement) {\n          new QRCode(qrCodeElement, {\n            text: qrCodeElement.getAttribute('data-identifier'),\n            width: 200,\n            height: 200\n          });\n        });\n      }\n    }, {\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        this.delegateElement.on('click', '[data-action=\"print\"]', this._print.bind(this));\n        this.delegateElement.on('click', '[data-action=\"select-code\"]', this._selectCode.bind(this));\n      }\n    }, {\n      key: \"_print\",\n      value: function _print() {\n        window.print();\n      }\n    }, {\n      key: \"_selectCode\",\n      value: function _selectCode(event, element) {\n        element.select();\n      }\n    }]);\n\n    return GiftCardSection;\n  }();\n\n  var FooterSection = /*#__PURE__*/function () {\n    function FooterSection(element) {\n      _classCallCheck(this, FooterSection);\n\n      this.element = element;\n      this.domDelegate = new Delegate(this.element);\n      this.localeValuePicker = new ValuePicker('footer-locale-picker');\n      this.currencyValuePicker = new ValuePicker('footer-currency-picker');\n      this.cookieBarElement = this.element.querySelector('.cookie-bar');\n\n      if (this.cookieBarElement) {\n        window.Shopify.loadFeatures([{\n          name: 'consent-tracking-api',\n          version: '0.1',\n          onLoad: this._setupCookieBar.bind(this)\n        }]);\n      }\n\n      this._setupCollapsibles();\n\n      this._attachListeners();\n    }\n\n    _createClass(FooterSection, [{\n      key: \"onUnload\",\n      value: function onUnload() {\n        window.removeEventListener('resize', this._setupCollapsiblesListener);\n        this.domDelegate.off();\n        this.localeValuePicker.destroy();\n        this.currencyValuePicker.destroy();\n      }\n    }, {\n      key: \"onSelect\",\n      value: function onSelect() {\n        if (this.cookieBarElement) {\n          this.cookieBarElement.setAttribute('aria-hidden', 'false');\n        }\n      }\n    }, {\n      key: \"onDeselect\",\n      value: function onDeselect() {\n        if (this.cookieBarElement) {\n          this.cookieBarElement.setAttribute('aria-hidden', 'true');\n        }\n      }\n    }, {\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        this._setupCollapsiblesListener = this._setupCollapsibles.bind(this);\n        window.addEventListener('resize', this._setupCollapsiblesListener);\n        this.domDelegate.on('click', '[data-action=\"accept-terms\"]', this._acceptCookieBarTerms.bind(this));\n        this.domDelegate.on('click', '[data-action=\"decline-terms\"]', this._declineCookieBarTerms.bind(this));\n      }\n      /**\n       * On mobile, some block items are collapsed, so we must slightly edit their HTML\n       */\n\n    }, {\n      key: \"_setupCollapsibles\",\n      value: function _setupCollapsibles() {\n        var collapsibleToggles = this.element.querySelectorAll('[data-action=\"toggle-collapsible\"]'),\n            isPhone = Responsive.matchesBreakpoint('phone');\n        collapsibleToggles.forEach(function (collapsibleToggle) {\n          if (isPhone) {\n            collapsibleToggle.removeAttribute('disabled');\n          } else {\n            collapsibleToggle.setAttribute('disabled', 'disabled');\n            document.getElementById(collapsibleToggle.getAttribute('aria-controls')).style.height = '';\n          }\n        });\n      }\n    }, {\n      key: \"_setupCookieBar\",\n      value: function _setupCookieBar() {\n        // We check if we should make it visible\n        try {\n          if (window.Shopify.customerPrivacy.shouldShowGDPRBanner()) {\n            this.cookieBarElement.setAttribute('aria-hidden', 'false');\n          }\n        } catch (e) {// Adblockers may prevent the customerPrivacy API from being loaded, so we catch errors here.\n        }\n      }\n    }, {\n      key: \"_acceptCookieBarTerms\",\n      value: function _acceptCookieBarTerms() {\n        var _this = this;\n\n        window.Shopify.customerPrivacy.setTrackingConsent(true, function () {\n          return _this.cookieBarElement.setAttribute('aria-hidden', 'true');\n        });\n      }\n    }, {\n      key: \"_declineCookieBarTerms\",\n      value: function _declineCookieBarTerms() {\n        var _this2 = this;\n\n        window.Shopify.customerPrivacy.setTrackingConsent(false, function () {\n          return _this2.cookieBarElement.setAttribute('aria-hidden', 'true');\n        });\n      }\n    }]);\n\n    return FooterSection;\n  }();\n\n  var SearchBar = /*#__PURE__*/function () {\n    function SearchBar(element) {\n      _classCallCheck(this, SearchBar);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.headerElement = this.element.closest('.header');\n      this.searchBarElement = this.element.querySelector('.search-bar');\n      this.inputElement = this.element.querySelector('[name=\"q\"]');\n      this.searchMenuElement = this.element.querySelector('.search-bar__menu-wrapper');\n      this.searchResultsElement = this.element.querySelector('.search-bar__results');\n      this.closeButtonElement = this.element.querySelector('.search-bar__close-button');\n      this.productTypeFilter = '';\n      this.isSearchOpen = false;\n\n      this._attachListeners();\n    }\n\n    _createClass(SearchBar, [{\n      key: \"destroy\",\n      value: function destroy() {\n        this.delegateElement.off();\n      }\n    }, {\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        this.delegateElement.on('click', '[data-action=\"clear-input\"]', this._clearInput.bind(this));\n        this.delegateElement.on('click', '[data-action=\"unfix-search\"]', this._unfixMobileSearch.bind(this));\n        this.delegateElement.on('focusin', '[name=\"q\"]', this._onInputFocus.bind(this));\n        document.addEventListener('click', this._onFocusOut.bind(this));\n        this.delegateElement.on('keydown', '[name=\"q\"]', this._handleTab.bind(this));\n        this.delegateElement.on('input', '[name=\"q\"]', this._debounce(this._doSearch.bind(this), 250));\n        this.delegateElement.on('change', '#search-product-type', this._productTypeChanged.bind(this));\n        this.delegateElement.on('submit', this._onFormSubmit.bind(this));\n      }\n      /**\n       * Toggle the mobile search (only applicable if the show condensed search is shown)\n       */\n\n    }, {\n      key: \"toggleMobileSearch\",\n      value: function toggleMobileSearch() {\n        if (this.isSearchOpen) {\n          this.headerElement.classList.remove('header--search-expanded');\n          this.element.classList.remove('is-visible');\n        } else {\n          this.headerElement.classList.add('header--search-expanded');\n          this.element.classList.add('is-visible');\n        }\n\n        this.isSearchOpen = !this.isSearchOpen;\n      }\n    }, {\n      key: \"_unfixMobileSearch\",\n      value: function _unfixMobileSearch() {\n        this.element.classList.remove('is-fixed');\n        this.closeButtonElement.style.width = '';\n        this.searchBarElement.classList.remove('is-expanded');\n        this.searchResultsElement.setAttribute('aria-hidden', 'true');\n        this.inputElement.classList.remove('is-filled');\n        document.body.classList.remove('no-mobile-scroll');\n\n        if (this.searchMenuElement) {\n          this.searchMenuElement.setAttribute('aria-hidden', 'true');\n        }\n      }\n      /**\n       * Only on mobile\n       */\n\n    }, {\n      key: \"_clearInput\",\n      value: function _clearInput() {\n        this.inputElement.value = '';\n        this.inputElement.classList.remove('is-filled');\n        this.searchResultsElement.setAttribute('aria-hidden', 'true');\n\n        if (this.searchMenuElement) {\n          this.searchMenuElement.setAttribute('aria-hidden', 'false');\n        }\n      }\n      /**\n       * When the input get focus, we display the quick links if they were specified by the merchant, or we open results if\n       * results were previously loaded\n       */\n\n    }, {\n      key: \"_onInputFocus\",\n      value: function _onInputFocus() {\n        this.element.classList.add('is-fixed');\n        this.closeButtonElement.style.width = \"\".concat(this.closeButtonElement.firstElementChild.offsetWidth, \"px\");\n        document.body.classList.add('no-mobile-scroll');\n\n        if (this.inputElement.value === '') {\n          if (this.searchMenuElement) {\n            this.searchMenuElement.setAttribute('aria-hidden', 'false');\n          }\n\n          this.searchResultsElement.setAttribute('aria-hidden', 'true');\n        } else {\n          if (this.searchMenuElement) {\n            this.searchMenuElement.setAttribute('aria-hidden', 'true');\n          }\n\n          this.searchResultsElement.setAttribute('aria-hidden', 'false');\n          this.inputElement.classList.add('is-filled');\n          this.searchBarElement.classList.add('is-expanded');\n        }\n\n        if (this.searchMenuElement) {\n          this.searchBarElement.classList.add('is-expanded');\n        }\n      }\n      /**\n       * Whenever the focus leaves the search, we close everything (both search results and quick links)\n       */\n\n    }, {\n      key: \"_onFocusOut\",\n      value: function _onFocusOut(event) {\n        var _this = this;\n\n        // On phone, nothing happens on focus out\n        if (Responsive.matchesBreakpoint('phone')) {\n          return;\n        }\n\n        if (Responsive.matchesBreakpoint('phone') || event.target.classList.contains('search-bar__input') || event.target.closest('.search-bar__inner')) {\n          return;\n        }\n\n        setTimeout(function () {\n          _this.element.classList.remove('is-fixed');\n\n          document.body.classList.remove('no-mobile-scroll');\n\n          if (!_this.element.contains(event.relatedTarget)) {\n            if (_this.searchMenuElement) {\n              _this.searchMenuElement.setAttribute('aria-hidden', 'true');\n            }\n\n            _this.searchResultsElement.setAttribute('aria-hidden', 'true');\n\n            _this.searchBarElement.classList.remove('is-expanded');\n          }\n        }, 150);\n      }\n      /**\n       * This allows to slightly improve the accessibility and user experience by directly focusing on the first search results (if any)\n       */\n\n    }, {\n      key: \"_handleTab\",\n      value: function _handleTab(event) {\n        if (event.key !== 'Tab') {\n          return;\n        } // Try to get the first link into the results to give focus to this element\n\n\n        var firstFocusableElement = this.searchResultsElement.querySelector('a');\n\n        if (firstFocusableElement) {\n          firstFocusableElement.focus();\n          event.preventDefault();\n        }\n      }\n      /**\n       * Fire the different Ajax requests\n       */\n\n    }, {\n      key: \"_doSearch\",\n      value: function _doSearch() {\n        var _this2 = this;\n\n        // Unfortunately, fetch does not support as of today cancelling a request. As a consequence what we do is that we manually\n        // keep track of sent requests, and only use the results of the last one\n        var currentInput = this.inputElement.value;\n        this.lastInputValue = currentInput;\n\n        if (currentInput === '') {\n          if (this.searchMenuElement) {\n            this.searchMenuElement.setAttribute('aria-hidden', 'false');\n          } else {\n            this.searchBarElement.classList.remove('is-expanded');\n          }\n\n          this.searchResultsElement.setAttribute('aria-hidden', 'true');\n        } else {\n          if (this.searchMenuElement) {\n            this.searchMenuElement.setAttribute('aria-hidden', 'true');\n          }\n\n          this.searchResultsElement.setAttribute('aria-hidden', 'false');\n          this.searchBarElement.classList.add('is-expanded', 'is-loading');\n          var queryOptions = {\n            method: 'GET',\n            credentials: 'same-origin'\n          },\n              url = \"\".concat(window.Shopify.routes.root, \"search\").concat(this._supportsPredictiveApi() ? '/suggest' : ''),\n              productQuery = \"\".concat(this.productTypeFilter !== '' ? \"product_type:\".concat(this.productTypeFilter, \" AND \") : '').concat(encodeURIComponent(this.lastInputValue)),\n              queries = [fetch(\"\".concat(url, \"?section_id=predictive-search&q=\").concat(productQuery, \"&resources[limit]=3&resources[limit_scope]=each\"), queryOptions)];\n          Promise.all(queries).then(function (responses) {\n            // If we receive the result for a query that is not the last one, we simply do not process the result\n            if (_this2.lastInputValue !== currentInput) {\n              return;\n            }\n\n            Promise.all(responses.map(function (response) {\n              return response.text().then(function (responseAsText) {\n                var div = document.createElement('div');\n                div.innerHTML = responseAsText;\n                return div.querySelector('.search-ajax').innerHTML;\n              });\n            })).then(function (contents) {\n              _this2.searchBarElement.classList.remove('is-loading');\n\n              var searchContent = document.createElement('div');\n              searchContent.innerHTML = contents.join('').trim(); // If there is a \"view all\" button, we move it at the end of the results\n\n              var viewAll = searchContent.querySelector('.search-bar__view-all');\n\n              if (viewAll) {\n                searchContent.insertAdjacentElement('beforeend', viewAll);\n              }\n\n              _this2.searchBarElement.querySelector('.search-bar__results-inner').innerHTML = searchContent.innerHTML;\n            });\n          });\n        }\n      }\n    }, {\n      key: \"_supportsPredictiveApi\",\n      value: function _supportsPredictiveApi() {\n        return JSON.parse(document.getElementById('shopify-features').innerHTML)['predictiveSearch'];\n      }\n      /**\n       * Warehouse allows to display a filter by type. When its value change, we re-do a new search to get the new data\n       */\n\n    }, {\n      key: \"_productTypeChanged\",\n      value: function _productTypeChanged(event, target) {\n        target.closest('.search-bar__filter').querySelector('.search-bar__filter-active').innerText = target.options[target.selectedIndex].innerText;\n        this.productTypeFilter = target.value;\n\n        if (this.inputElement.value !== '') {\n          this._doSearch();\n        }\n      }\n      /**\n       * Called when the form is submitted using the Enter key. We have to capture it and transform the query to include the wildcard\n       */\n\n    }, {\n      key: \"_onFormSubmit\",\n      value: function _onFormSubmit(event) {\n        var cloneNode = this.inputElement.cloneNode();\n        cloneNode.setAttribute('type', 'hidden');\n        cloneNode.value = '';\n\n        if (this.productTypeFilter !== '') {\n          cloneNode.value += \"product_type:\".concat(this.productTypeFilter);\n\n          if (this.inputElement.value !== '') {\n            cloneNode.value += ' AND ';\n          }\n        }\n\n        cloneNode.value += this.inputElement.value; // We remove the \"q\" attribute on existing node so it's not submitted\n\n        this.inputElement.removeAttribute('name'); // And we insert it into the DOM\n\n        this.inputElement.insertAdjacentElement('afterend', cloneNode);\n      }\n      /**\n       * Simple function that allows to debounce\n       */\n\n    }, {\n      key: \"_debounce\",\n      value: function _debounce(fn, delay) {\n        var _this3 = this;\n\n        var timer = null;\n        return function () {\n          for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n            args[_key] = arguments[_key];\n          }\n\n          clearTimeout(timer);\n          timer = setTimeout(function () {\n            fn.apply(_this3, args);\n          }, delay);\n        };\n      }\n    }]);\n\n    return SearchBar;\n  }();\n\n  var HeaderSection = /*#__PURE__*/function () {\n    function HeaderSection(element) {\n      _classCallCheck(this, HeaderSection);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.options = JSON.parse(this.element.getAttribute('data-section-settings'));\n      this.searchBar = new SearchBar(this.element.querySelector('.header__search-bar-wrapper'));\n      this.cart = new Cart(this.element.querySelector('.header__action-item--cart'), {\n        useStickyHeader: this.options['useStickyHeader']\n      }); // We create the desktop and mobile navigation conditionally as we've found that some merchants may have no menu\n\n      var desktopNavigationElement = this.element.querySelector(this.options['navigationLayout'] === 'inline' ? '.nav-bar' : '.header__desktop-nav');\n\n      if (desktopNavigationElement) {\n        this.desktopNavigation = new DesktopNavigation(desktopNavigationElement, this.options['navigationLayout'], this.options['desktopOpenTrigger']);\n      }\n\n      var mobileNavigationElement = this.element.querySelector('.header__mobile-nav');\n\n      if (mobileNavigationElement) {\n        this.mobileNavigation = new MobileNavigation(mobileNavigationElement);\n      }\n\n      this._setupCssVariables();\n\n      this._attachListeners();\n    }\n\n    _createClass(HeaderSection, [{\n      key: \"onUnload\",\n      value: function onUnload() {\n        this.searchBar.destroy();\n        this.cart.destroy();\n\n        if (this.desktopNavigation) {\n          this.desktopNavigation.destroy();\n        }\n\n        if (this.mobileNavigation) {\n          this.mobileNavigation.destroy();\n        }\n\n        window.removeEventListener('resize', this._setupCssVariablesListener);\n      }\n    }, {\n      key: \"onBlockSelect\",\n      value: function onBlockSelect(event) {\n        if (this.desktopNavigation) {\n          this.desktopNavigation.onBlockSelect(event);\n        }\n      }\n    }, {\n      key: \"onBlockDeselect\",\n      value: function onBlockDeselect(event) {\n        if (this.desktopNavigation) {\n          this.desktopNavigation.onBlockDeselect(event);\n        }\n      }\n    }, {\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        this._setupCssVariablesListener = this._setupCssVariables.bind(this);\n        window.addEventListener('resize', this._setupCssVariablesListener);\n        this.delegateElement.on('click', '[data-action=\"toggle-search\"]', this._toggleMobileSearch.bind(this));\n      }\n      /**\n       * We have some positioning that is based on the CSS variables, so we must make sure to update them whenever\n       * the section is reloaded into the editor\n       */\n\n    }, {\n      key: \"_setupCssVariables\",\n      value: function _setupCssVariables() {\n        document.documentElement.style.setProperty('--header-height', this.element.parentNode.clientHeight + 'px');\n      }\n      /**\n       * Toggle the mobile search\n       */\n\n    }, {\n      key: \"_toggleMobileSearch\",\n      value: function _toggleMobileSearch(event) {\n        this.searchBar.toggleMobileSearch();\n        event.preventDefault();\n      }\n    }]);\n\n    return HeaderSection;\n  }();\n\n  var LoginSection = /*#__PURE__*/function () {\n    function LoginSection(element) {\n      _classCallCheck(this, LoginSection);\n\n      this.element = element;\n      this.domDelegate = new Delegate(this.element);\n      this.customerLoginForm = this.element.querySelector('#customer_login');\n      this.recoverPasswordForm = this.element.querySelector('#recover_customer_password');\n      this.domDelegate.on('click', '[data-action=\"toggle-login-form\"]', this._showRecoverPassword.bind(this));\n    }\n\n    _createClass(LoginSection, [{\n      key: \"_showRecoverPassword\",\n      value: function _showRecoverPassword() {\n        var isLoginActive = this.customerLoginForm.style.display === 'block';\n\n        if (isLoginActive) {\n          this.customerLoginForm.style.display = 'none';\n          this.recoverPasswordForm.style.display = 'block';\n        } else {\n          this.customerLoginForm.style.display = 'block';\n          this.recoverPasswordForm.style.display = 'none';\n        }\n      }\n    }]);\n\n    return LoginSection;\n  }();\n\n  var MapSection = /*#__PURE__*/function () {\n    function MapSection(element) {\n      _classCallCheck(this, MapSection);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.options = JSON.parse(element.getAttribute('data-section-settings'));\n      this.mapPositions = [];\n      this.desktopMarkers = [];\n      this.desktopMapElement = null;\n      this.mobileMarkers = [];\n      this.mobileMapElements = [];\n\n      if (this.options['apiKey'] && this.options['mapAddresses'].length > 0) {\n        this._loadScript().then(this._initMaps.bind(this));\n      }\n\n      this._attachListeners();\n    }\n\n    _createClass(MapSection, [{\n      key: \"onUnload\",\n      value: function onUnload() {\n        this.delegateElement.off('click');\n\n        if (this.options['apiKey'] && this.options['mapAddresses'].length > 0) {\n          google.maps.event.clearInstanceListeners(window);\n        }\n      }\n    }, {\n      key: \"onBlockSelect\",\n      value: function onBlockSelect(event) {\n        this._showStore(event.target);\n      }\n    }, {\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        var _this = this;\n\n        this.delegateElement.on('click', '[data-action=\"toggle-store\"]', function (event, target) {\n          _this._showStore(target.closest('.map__store-item'));\n        });\n      }\n    }, {\n      key: \"_showStore\",\n      value: function _showStore(storeItem) {\n        var _this2 = this;\n\n        var toggleButton = storeItem.querySelector('[data-action=\"toggle-store\"]'); // If already open, we do nothing unless we are on mobile (as we need at least one store visible on desktop)\n\n        if (Responsive.getCurrentBreakpoint() !== 'phone' && toggleButton.getAttribute('aria-expanded') === 'true') {\n          return;\n        } // Otherwise, we activate it\n\n\n        if (toggleButton.getAttribute('aria-expanded') === 'true') {\n          toggleButton.setAttribute('aria-expanded', 'false');\n          Animation.slideUp(storeItem.querySelector('.map__store-collapsible'));\n        } else {\n          toggleButton.setAttribute('aria-expanded', 'true');\n          Animation.slideDown(storeItem.querySelector('.map__store-collapsible'));\n        } // Finally, we close the other ones (if any is open)\n\n\n        Dom.getSiblings(storeItem).forEach(function (storeItemToClose) {\n          storeItemToClose.querySelector('[data-action=\"toggle-store\"]').setAttribute('aria-expanded', 'false');\n          Animation.slideUp(storeItemToClose.querySelector('.map__store-collapsible'));\n        }); // We need to move the map to the new center, and we need to change its color to make it active\n\n        var storeIndex = parseInt(storeItem.getAttribute('data-store-index'));\n        this.desktopMapElement.panTo(this.mapPositions[storeIndex]);\n        this.desktopMarkers.forEach(function (marker, index) {\n          marker.setMap(_this2.desktopMapElement);\n\n          if (index === storeIndex) {\n            marker.icon.fillColor = _this2.options['markerActiveColor'];\n          } else {\n            marker.icon.fillColor = _this2.options['markerColor'];\n          }\n        });\n      }\n    }, {\n      key: \"_loadScript\",\n      value: function _loadScript() {\n        var _this3 = this;\n\n        return new Promise(function (resolve, reject) {\n          var script = document.createElement('script');\n          document.body.appendChild(script);\n          script.onload = resolve;\n          script.onerror = reject;\n          script.async = true;\n          script.src = \"https://maps.googleapis.com/maps/api/js?key=\".concat(_this3.options['apiKey']);\n        });\n      }\n    }, {\n      key: \"_initMaps\",\n      value: function _initMaps() {\n        var _this4 = this;\n\n        // First, we gather all the maps (desktop and mobile)\n        var mapOptions = {\n          zoom: this.options['zoom'],\n          draggable: this.options['draggableMap'],\n          clickableIcons: false,\n          scrollwheel: this.options['draggableMap'],\n          disableDoubleClickZoom: true,\n          disableDefaultUI: !this.options['showMapControls'],\n          styles: JSON.parse(this.element.querySelector('[data-gmap-style]').innerHTML)\n        };\n        this.desktopMapElement = new google.maps.Map(this.element.querySelector('.map__map-container--desktop .map__gmap'), mapOptions);\n        this.mobileMapElements = [];\n        this.element.querySelectorAll('.map__map-container--mobile .map__gmap').forEach(function (item, index) {\n          _this4.mobileMapElements[index] = new google.maps.Map(item, mapOptions);\n        }); // Then we geocode all addresses\n\n        this._geocodeAddresses(); // Make sure we attach the listeners so that it's properly resized\n\n\n        google.maps.event.addDomListener(window, 'resize', function () {\n          var desktopCenter = _this4.desktopMapElement.getCenter();\n\n          google.maps.event.trigger(_this4.desktopMapElement, 'resize');\n\n          _this4.desktopMapElement.setCenter(desktopCenter);\n\n          _this4.mobileMapElements.forEach(function (mobileMap) {\n            var mobileCenter = mobileMap.getCenter();\n            google.maps.event.trigger(mobileMap, 'resize');\n            mobileMap.setCenter(mobileCenter);\n          });\n        });\n      }\n    }, {\n      key: \"_onMarkerClicked\",\n      value: function _onMarkerClicked(address) {\n        window.open(\"https://www.google.com/maps/search/?api=1&query=\".concat(address), '_blank');\n      }\n    }, {\n      key: \"_geocodeAddresses\",\n      value: function _geocodeAddresses() {\n        var _this5 = this;\n\n        // Then, we geocode all the addresses, and place them on the map\n        var geocoder = new google.maps.Geocoder();\n        this.options['mapAddresses'].forEach(function (address, index) {\n          geocoder.geocode({\n            address: address\n          }, function (results, status) {\n            if (status !== google.maps.GeocoderStatus.OK) {\n              if (Shopify.designMode) ;\n            } else {\n              var position = results[0].geometry.location;\n              _this5.mapPositions[index] = position; // The desktop map holds all the markers, so we add it to the desktop global map.\n\n              _this5.desktopMarkers[index] = new google.maps.Marker({\n                map: index === 0 ? _this5.desktopMapElement : null,\n                position: position,\n                icon: {\n                  path: 'M12.5,0 C6.388889,0 0,4.7304348 0,12.5217391 C0,19.8956522 11.111111,31.1652174 11.527778,31.5826087 C11.805556,31.8608696 12.083333,32 12.5,32 C12.916667,32 13.194444,31.8608696 13.472222,31.5826087 C13.888889,31.1652174 25,19.8956522 25,12.5217391 C25,4.7304348 18.611111,0 12.5,0 Z M12,16 C9.733333,16 8,14.2666667 8,12 C8,9.7333333 9.733333,8 12,8 C14.266667,8 16,9.7333333 16,12 C16,14.2666667 14.266667,16 12,16 Z',\n                  fillColor: index === 0 ? _this5.options['markerActiveColor'] : _this5.options['markerColor'],\n                  fillOpacity: 1,\n                  anchor: new google.maps.Point(12, 30),\n                  strokeWeight: 0\n                }\n              }); // We then add it on the corresponding mobile map\n\n              _this5.mobileMarkers[index] = new google.maps.Marker({\n                map: _this5.mobileMapElements[index],\n                position: position,\n                icon: {\n                  path: 'M12.5,0 C6.388889,0 0,4.7304348 0,12.5217391 C0,19.8956522 11.111111,31.1652174 11.527778,31.5826087 C11.805556,31.8608696 12.083333,32 12.5,32 C12.916667,32 13.194444,31.8608696 13.472222,31.5826087 C13.888889,31.1652174 25,19.8956522 25,12.5217391 C25,4.7304348 18.611111,0 12.5,0 Z M12,16 C9.733333,16 8,14.2666667 8,12 C8,9.7333333 9.733333,8 12,8 C14.266667,8 16,9.7333333 16,12 C16,14.2666667 14.266667,16 12,16 Z',\n                  fillColor: _this5.options['markerActiveColor'],\n                  fillOpacity: 1,\n                  anchor: new google.maps.Point(12, 30),\n                  strokeWeight: 0\n                }\n              });\n\n              _this5.desktopMarkers[index].addListener('click', _this5._onMarkerClicked.bind(_this5, address));\n\n              _this5.mobileMarkers[index].addListener('click', _this5._onMarkerClicked.bind(_this5, address));\n\n              if (index === 0) {\n                _this5.desktopMapElement.setCenter(position);\n              }\n\n              _this5.mobileMapElements[index].setCenter(position);\n            }\n          });\n        });\n      }\n    }]);\n\n    return MapSection;\n  }();\n\n  var MinimalHeaderSection = /*#__PURE__*/function () {\n    function MinimalHeaderSection(element) {\n      _classCallCheck(this, MinimalHeaderSection);\n\n      this.element = element;\n\n      this._setupCssVariables();\n\n      this._attachListeners();\n    }\n\n    _createClass(MinimalHeaderSection, [{\n      key: \"onUnload\",\n      value: function onUnload() {\n        window.removeEventListener('resize', this._setupCssVariablesListener);\n      }\n    }, {\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        this._setupCssVariablesListener = this._setupCssVariables.bind(this);\n        window.addEventListener('resize', this._setupCssVariablesListener);\n      }\n      /**\n       * We have some positioning that is based on the CSS variables, so we must make sure to update them whenever\n       * the section is reloaded into the editor\n       */\n\n    }, {\n      key: \"_setupCssVariables\",\n      value: function _setupCssVariables() {\n        document.documentElement.style.setProperty('--header-height', this.element.parentNode.clientHeight + 'px');\n      }\n    }]);\n\n    return MinimalHeaderSection;\n  }();\n\n  var QuickLinksSection = function QuickLinksSection(element) {\n    _classCallCheck(this, QuickLinksSection);\n\n    this.element = element; // Make sure that the section is always visible in the editor, even if the option to hide it on desktop is checked\n\n    if (Shopify.designMode) {\n      this.element.classList.remove('hidden-lap-and-up');\n    }\n  };\n\n  /**\n   * This class handles both the newsletter popup and exit popup\n   */\n\n  var PopupsSection = /*#__PURE__*/function () {\n    function PopupsSection(element) {\n      var _this = this;\n\n      _classCallCheck(this, PopupsSection);\n\n      element.querySelectorAll('[data-popup-type]').forEach(function (popup) {\n        if (popup.getAttribute('data-popup-type') === 'exit') {\n          _this.exitPopup = new ExitPopup(popup);\n        } else if (popup.getAttribute('data-popup-type') === 'newsletter') {\n          _this.newsletterPopup = new NewsletterPopup(popup);\n        }\n      });\n    }\n\n    _createClass(PopupsSection, [{\n      key: \"onUnload\",\n      value: function onUnload() {\n        if (this.exitPopup) {\n          this.exitPopup.destroy();\n        }\n\n        if (this.newsletterPopup) {\n          this.newsletterPopup.destroy();\n        }\n      }\n    }, {\n      key: \"onBlockSelect\",\n      value: function onBlockSelect(event) {\n        if (event.target.getAttribute('data-popup-type') === 'exit' && this.exitPopup) {\n          this.exitPopup._openPopup();\n        } else if (event.target.getAttribute('data-popup-type') === 'newsletter' && this.newsletterPopup) {\n          this.newsletterPopup._openPopup();\n        }\n      }\n    }, {\n      key: \"onBlockDeselect\",\n      value: function onBlockDeselect() {\n        if (this.exitPopup) {\n          this.exitPopup._closePopup();\n        }\n\n        if (this.newsletterPopup) {\n          this.newsletterPopup._closePopup();\n        }\n      }\n    }]);\n\n    return PopupsSection;\n  }();\n\n  var ProductRecommendationsSection = /*#__PURE__*/function () {\n    function ProductRecommendationsSection(element) {\n      _classCallCheck(this, ProductRecommendationsSection);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.options = JSON.parse(this.element.getAttribute('data-section-settings'));\n\n      if (this.options['useRecommendations']) {\n        this._loadRecommendations().then(this._createSlideshow.bind(this));\n      } else {\n        this._createSlideshow();\n      }\n\n      this.productItemColorSwatch = new ProductItemColorSwatch(this.element);\n\n      this._fixSafari();\n\n      this._attachListeners();\n    }\n\n    _createClass(ProductRecommendationsSection, [{\n      key: \"onUnload\",\n      value: function onUnload() {\n        if (!this.options['stackable']) {\n          this.flickityInstance.destroy();\n        }\n\n        window.removeEventListener('resize', this._fixSafariListener);\n        this.delegateElement.off('change');\n        this.productItemColorSwatch.destroy();\n\n        if (this.resizeObserver) {\n          this.resizeObserver.disconnect();\n        }\n      }\n    }, {\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        this._fixSafariListener = this._fixSafari.bind(this);\n        window.addEventListener('resize', this._fixSafariListener);\n        this.delegateElement.on('click', '[data-action=\"add-to-cart\"]', this._addToCart.bind(this));\n        this.delegateElement.on('click', '[data-secondary-action=\"open-quick-view\"]', this._openQuickView.bind(this));\n      }\n      /**\n       * On Safari 11.1 and lower, the browser incorrectly calculate the height of flex and grid items due to a bug\n       * on how padding percentage is calculated (that we use for allocating image space). This is solved in Safari 11.1 and higher.\n       *\n       * For those browsers, we fix that in JavaScript by setting the height directly for each aspect ratio image\n       *\n       * @private\n       */\n\n    }, {\n      key: \"_fixSafari\",\n      value: function _fixSafari() {\n        var userAgent = window.navigator.userAgent.toLowerCase();\n\n        if (userAgent.includes('safari') && (userAgent.includes('version/10.1') || userAgent.includes('version/10.3') || userAgent.includes('version/11.0'))) {\n          var isPhone = Responsive.matchesBreakpoint('phone');\n          this.element.querySelectorAll('.product-item__image-wrapper .aspect-ratio, .product-item__image-wrapper .placeholder-svg').forEach(function (image) {\n            if (isPhone) {\n              image.parentNode.style.height = null;\n            } else {\n              image.parentNode.style.height = \"\".concat(image.clientHeight, \"px\");\n            }\n          });\n        }\n      }\n      /**\n       * This section uses the native product recommendations feature of Shopify (https://help.shopify.com/en/themes/liquid/objects/recommendations)\n       */\n\n    }, {\n      key: \"_loadRecommendations\",\n      value: function _loadRecommendations() {\n        var _this = this;\n\n        var url = \"\".concat(window.routes.productRecommendationsUrl, \"?section_id=\").concat(this.element.getAttribute('data-section-id'), \"&product_id=\").concat(this.options['productId'], \"&limit=\").concat(this.options['recommendationsCount']);\n        return fetch(url).then(function (response) {\n          return response.text().then(function (content) {\n            var container = document.createElement('div');\n            container.innerHTML = content;\n            _this.element.querySelector('.product-recommendations').innerHTML = container.querySelector('.product-recommendations').innerHTML;\n\n            _this.productItemColorSwatch.recalculateSwatches();\n          });\n        });\n      }\n    }, {\n      key: \"_createSlideshow\",\n      value: function _createSlideshow() {\n        var _this2 = this;\n\n        if (!this.options['stackable']) {\n          this.flickityInstance = new js(this.element.querySelector('.product-list'), {\n            watchCSS: true,\n            pageDots: false,\n            prevNextButtons: true,\n            contain: true,\n            resize: false,\n            groupCells: true,\n            cellAlign: 'left',\n            draggable: !window.matchMedia('(-moz-touch-enabled: 0), (hover: hover)').matches\n          });\n          var lastWidth = window.innerWidth;\n          window.addEventListener('resize', function () {\n            if (window.innerWidth !== lastWidth) {\n              _this2.flickityInstance.resize();\n\n              lastWidth = window.innerWidth;\n            }\n          });\n        } // If the browser supports ResizeObserver we use it to detect when the size of the items in the carousel change,\n        // and if that's the case we force Flickity to resize\n\n\n        if (window.ResizeObserver && this.flickityInstance) {\n          this.resizeObserver = new ResizeObserver(function () {\n            _this2.flickityInstance.resize();\n          });\n          this.element.querySelectorAll('.product-item').forEach(function (item) {\n            _this2.resizeObserver.observe(item);\n          });\n        }\n      }\n    }, {\n      key: \"_openQuickView\",\n      value: function _openQuickView(event, target) {\n        var productUrl = new URL(\"\".concat(window.location.origin).concat(target.getAttribute('data-product-url'))); // If we are on mobile or tablet, we redirect to product page directly\n\n        if (Responsive.matchesBreakpoint('phone') || Responsive.matchesBreakpoint('tablet')) {\n          window.location.href = productUrl.href;\n          return false;\n        }\n\n        var modal = document.getElementById(target.getAttribute('aria-controls'));\n        modal.classList.add('is-loading');\n        productUrl.searchParams.set('view', 'quick-view');\n        fetch(productUrl.href, {\n          credentials: 'same-origin',\n          method: 'GET'\n        }).then(function (response) {\n          response.text().then(function (content) {\n            modal.querySelector('.modal__inner').innerHTML = content;\n            modal.classList.remove('is-loading'); // Register a new section to power the JS\n\n            var modalProductSection = new ProductSection(modal.querySelector('[data-section-type=\"product\"]')); // We set a listener so we can cleanup on close\n\n            var doCleanUp = function doCleanUp() {\n              modalProductSection.onUnload();\n              modal.removeEventListener('modal:closed', doCleanUp);\n            };\n\n            modal.addEventListener('modal:closed', doCleanUp);\n          });\n        });\n      }\n      /**\n       * ---------------------------------------------------------------------------------------------------\n       * INTERNAL CODE THAT HANDLE PRODUCT ADD TO CART\n       * ---------------------------------------------------------------------------------------------------\n       */\n\n    }, {\n      key: \"_addToCart\",\n      value: function _addToCart(event, target) {\n        var _this3 = this;\n\n        if (window.theme.cartType === 'page') {\n          return; // When using a cart type of page, we just simply redirect to the cart page\n        }\n\n        event.preventDefault(); // Prevent form to be submitted\n\n        event.stopPropagation(); // First, we switch the status of the button\n\n        target.setAttribute('disabled', 'disabled');\n        document.dispatchEvent(new CustomEvent('theme:loading:start')); // Then we add the product in Ajax\n\n        var formElement = target.closest('form[action*=\"/cart/add\"]');\n        fetch(\"\".concat(window.routes.cartAddUrl, \".js\"), {\n          body: JSON.stringify(Form.serialize(formElement)),\n          credentials: 'same-origin',\n          method: 'POST',\n          headers: {\n            'Content-Type': 'application/json',\n            'X-Requested-With': 'XMLHttpRequest' // This is needed as currently there is a bug in Shopify that assumes this header\n\n          }\n        }).then(function (response) {\n          target.removeAttribute('disabled');\n\n          if (response.ok) {\n            // We simply trigger an event so the mini-cart can re-render\n            _this3.element.dispatchEvent(new CustomEvent('product:added', {\n              bubbles: true,\n              detail: {\n                button: target,\n                variant: null,\n                quantity: parseInt(formElement.querySelector('[name=\"quantity\"]').value)\n              }\n            }));\n          } else {\n            document.dispatchEvent(new CustomEvent('theme:loading:end'));\n          }\n        });\n        event.preventDefault();\n      }\n    }]);\n\n    return ProductRecommendationsSection;\n  }();\n\n  var RecentlyViewedProductsSection = /*#__PURE__*/function () {\n    function RecentlyViewedProductsSection(element) {\n      _classCallCheck(this, RecentlyViewedProductsSection);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.options = JSON.parse(this.element.getAttribute('data-section-settings'));\n      this.productItemColorSwatch = new ProductItemColorSwatch(this.element);\n\n      this._fetchProducts();\n\n      this._attachListeners();\n    }\n\n    _createClass(RecentlyViewedProductsSection, [{\n      key: \"onUnload\",\n      value: function onUnload() {\n        if (this.flickityInstance) {\n          this.flickityInstance.destroy();\n        }\n\n        this.productItemColorSwatch.destroy();\n\n        if (this.resizeObserver) {\n          this.resizeObserver.disconnect();\n        }\n      }\n    }, {\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        this.delegateElement.on('click', '[data-action=\"add-to-cart\"]', this._addToCart.bind(this));\n        this.delegateElement.on('click', '[data-secondary-action=\"open-quick-view\"]', this._openQuickView.bind(this));\n      }\n      /**\n       * In order to get the products to display, we hit the search template with the given IDs.\n       */\n\n    }, {\n      key: \"_fetchProducts\",\n      value: function _fetchProducts() {\n        var _this = this;\n\n        var queryString = this._getSearchQueryString();\n\n        if (queryString === '') {\n          return;\n        }\n\n        fetch(\"\".concat(window.routes.searchUrl, \"?section_id=\").concat(this.element.getAttribute('data-section-id'), \"&type=product&q=\").concat(queryString), {\n          credentials: 'same-origin',\n          method: 'GET'\n        }).then(function (response) {\n          response.text().then(function (content) {\n            var tempElement = document.createElement('div');\n            tempElement.innerHTML = content; // Set the content\n\n            _this.element.querySelector('.recently-viewed-products-placeholder').innerHTML = tempElement.querySelector('[data-section-type=\"recently-viewed-products\"] .recently-viewed-products-placeholder').innerHTML; // By default the section hide the products, so we force the section to be visible\n\n            _this.element.parentNode.style.display = 'block';\n\n            _this.productItemColorSwatch.recalculateSwatches(); // Create the slideshow\n\n\n            _this.flickityInstance = new js(_this.element.querySelector('.product-list'), {\n              watchCSS: true,\n              pageDots: false,\n              prevNextButtons: true,\n              contain: true,\n              resize: false,\n              groupCells: true,\n              cellAlign: 'left',\n              draggable: !window.matchMedia('(-moz-touch-enabled: 0), (hover: hover)').matches\n            });\n            var lastWidth = window.innerWidth;\n            window.addEventListener('resize', function () {\n              if (window.innerWidth !== lastWidth) {\n                _this.flickityInstance.resize();\n\n                lastWidth = window.innerWidth;\n              }\n            }); // If the browser supports ResizeObserver we use it to detect when the size of the items in the carousel change,\n            // and if that's the case we force Flickity to resize\n\n            if (window.ResizeObserver && _this.flickityInstance) {\n              _this.resizeObserver = new ResizeObserver(function () {\n                _this.flickityInstance.resize();\n              });\n\n              _this.element.querySelectorAll('.product-item').forEach(function (item) {\n                _this.resizeObserver.observe(item);\n              });\n            }\n          });\n        });\n      }\n    }, {\n      key: \"_getSearchQueryString\",\n      value: function _getSearchQueryString() {\n        var items = JSON.parse(localStorage.getItem('recentlyViewedProducts') || '[]'); // If we are on a product template, we make sure to remove the main product from the related product\n\n        if (items.includes(this.options['currentProductId'])) {\n          items.splice(items.indexOf(this.options['currentProductId']), 1);\n        }\n\n        return items.map(function (item) {\n          return 'id:' + item;\n        }).join(' OR ');\n      }\n    }, {\n      key: \"_openQuickView\",\n      value: function _openQuickView(event, target) {\n        var productUrl = new URL(\"\".concat(window.location.origin).concat(target.getAttribute('data-product-url'))); // If we are on mobile or tablet, we redirect to product page directly\n\n        if (Responsive.matchesBreakpoint('phone') || Responsive.matchesBreakpoint('tablet')) {\n          window.location.href = productUrl.href;\n          return false;\n        }\n\n        var modal = document.getElementById(target.getAttribute('aria-controls'));\n        modal.classList.add('is-loading');\n        productUrl.searchParams.set('view', 'quick-view');\n        fetch(productUrl.href, {\n          credentials: 'same-origin',\n          method: 'GET'\n        }).then(function (response) {\n          response.text().then(function (content) {\n            modal.querySelector('.modal__inner').innerHTML = content;\n            modal.classList.remove('is-loading'); // Register a new section to power the JS\n\n            var modalProductSection = new ProductSection(modal.querySelector('[data-section-type=\"product\"]')); // We set a listener so we can cleanup on close\n\n            var doCleanUp = function doCleanUp() {\n              modalProductSection.onUnload();\n              modal.removeEventListener('modal:closed', doCleanUp);\n            };\n\n            modal.addEventListener('modal:closed', doCleanUp);\n          });\n        });\n      }\n      /**\n       * ---------------------------------------------------------------------------------------------------\n       * INTERNAL CODE THAT HANDLE PRODUCT ADD TO CART\n       * ---------------------------------------------------------------------------------------------------\n       */\n\n    }, {\n      key: \"_addToCart\",\n      value: function _addToCart(event, target) {\n        var _this2 = this;\n\n        if (window.theme.cartType === 'page') {\n          return; // When using a cart type of page, we just simply redirect to the cart page\n        }\n\n        event.preventDefault(); // Prevent form to be submitted\n\n        event.stopPropagation(); // First, we switch the status of the button\n\n        target.setAttribute('disabled', 'disabled');\n        document.dispatchEvent(new CustomEvent('theme:loading:start')); // Then we add the product in Ajax\n\n        var formElement = target.closest('form[action*=\"/cart/add\"]');\n        fetch(\"\".concat(window.routes.cartAddUrl, \".js\"), {\n          body: JSON.stringify(Form.serialize(formElement)),\n          credentials: 'same-origin',\n          method: 'POST',\n          headers: {\n            'Content-Type': 'application/json',\n            'X-Requested-With': 'XMLHttpRequest' // This is needed as currently there is a bug in Shopify that assumes this header\n\n          }\n        }).then(function (response) {\n          target.removeAttribute('disabled');\n\n          if (response.ok) {\n            // We simply trigger an event so the mini-cart can re-render\n            _this2.element.dispatchEvent(new CustomEvent('product:added', {\n              bubbles: true,\n              detail: {\n                button: target,\n                variant: null,\n                quantity: parseInt(formElement.querySelector('[name=\"quantity\"]').value)\n              }\n            }));\n          } else {\n            document.dispatchEvent(new CustomEvent('theme:loading:end'));\n          }\n        });\n        event.preventDefault();\n      }\n    }]);\n\n    return RecentlyViewedProductsSection;\n  }();\n\n  /**\n   * This code is extracted from Slate\n   */\n  var SectionContainer = /*#__PURE__*/function () {\n    function SectionContainer() {\n      _classCallCheck(this, SectionContainer);\n\n      this.constructors = [];\n      this.instances = [];\n\n      this._attachListeners();\n    }\n\n    _createClass(SectionContainer, [{\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        document.addEventListener('shopify:section:load', this._onSectionLoad.bind(this));\n        document.addEventListener('shopify:section:unload', this._onSectionUnload.bind(this));\n        document.addEventListener('shopify:section:select', this._onSelect.bind(this));\n        document.addEventListener('shopify:section:deselect', this._onDeselect.bind(this));\n        document.addEventListener('shopify:section:reorder', this._onReorder.bind(this));\n        document.addEventListener('shopify:block:select', this._onBlockSelect.bind(this));\n        document.addEventListener('shopify:block:deselect', this._onBlockDeselect.bind(this));\n      }\n    }, {\n      key: \"register\",\n      value: function register(type, constructor) {\n        var _this = this;\n\n        this.constructors[type] = constructor;\n        document.querySelectorAll(\"[data-section-type=\".concat(type, \"]\")).forEach(function (container) {\n          _this._createInstance(container, constructor);\n        });\n      }\n      /**\n       * Return an object from an array of objects that matches the provided key and value\n       */\n\n    }, {\n      key: \"_findInstance\",\n      value: function _findInstance(array, key, value) {\n        for (var i = 0; i < array.length; i++) {\n          if (array[i][key] === value) {\n            return array[i];\n          }\n        }\n      }\n      /**\n       * Remove an object from an array of objects by matching the provided key and value\n       */\n\n    }, {\n      key: \"_removeInstance\",\n      value: function _removeInstance(array, key, value) {\n        var i = array.length;\n\n        while (i--) {\n          if (array[i][key] === value) {\n            array.splice(i, 1);\n            break;\n          }\n        }\n\n        return array;\n      }\n    }, {\n      key: \"_onSectionLoad\",\n      value: function _onSectionLoad(event) {\n        var container = event.target.querySelector('[data-section-id]');\n\n        if (container) {\n          this._createInstance(container);\n        }\n      }\n    }, {\n      key: \"_onSectionUnload\",\n      value: function _onSectionUnload(event) {\n        var instance = this._findInstance(this.instances, 'id', event.detail.sectionId);\n\n        if (!instance) {\n          return;\n        }\n\n        if (typeof instance.onUnload === 'function') {\n          instance.onUnload(event);\n        }\n\n        this.instances = this._removeInstance(this.instances, 'id', event.detail.sectionId);\n      }\n    }, {\n      key: \"_onSelect\",\n      value: function _onSelect(event) {\n        var instance = this._findInstance(this.instances, 'id', event.detail.sectionId);\n\n        if (instance && typeof instance.onSelect === 'function') {\n          instance.onSelect(event);\n        }\n      }\n    }, {\n      key: \"_onDeselect\",\n      value: function _onDeselect(event) {\n        var instance = this._findInstance(this.instances, 'id', event.detail.sectionId);\n\n        if (instance && typeof instance.onDeselect === 'function') {\n          instance.onDeselect(event);\n        }\n      }\n    }, {\n      key: \"_onReorder\",\n      value: function _onReorder(event) {\n        var instance = this._findInstance(this.instances, 'id', event.detail.sectionId);\n\n        if (instance && typeof instance.onReorder === 'function') {\n          instance.onReorder(event);\n        }\n      }\n    }, {\n      key: \"_onBlockSelect\",\n      value: function _onBlockSelect(event) {\n        var instance = this._findInstance(this.instances, 'id', event.detail.sectionId);\n\n        if (instance && typeof instance.onBlockSelect === 'function') {\n          instance.onBlockSelect(event);\n        }\n      }\n    }, {\n      key: \"_onBlockDeselect\",\n      value: function _onBlockDeselect(event) {\n        var instance = this._findInstance(this.instances, 'id', event.detail.sectionId);\n\n        if (instance && typeof instance.onBlockDeselect === 'function') {\n          instance.onBlockDeselect(event);\n        }\n      }\n    }, {\n      key: \"_createInstance\",\n      value: function _createInstance(container, constructor) {\n        var id = container.getAttribute('data-section-id'),\n            type = container.getAttribute('data-section-type');\n        constructor = constructor || this.constructors[type];\n\n        if (typeof constructor === 'undefined') {\n          return;\n        }\n\n        var instance = Object.assign(new constructor(container), {\n          id: id,\n          type: type,\n          container: container\n        });\n        this.instances.push(instance);\n      }\n    }]);\n\n    return SectionContainer;\n  }();\n\n  var SlideshowSection = /*#__PURE__*/function () {\n    function SlideshowSection(element) {\n      var _this = this;\n\n      _classCallCheck(this, SlideshowSection);\n\n      this.element = element;\n      this.options = JSON.parse(this.element.getAttribute('data-section-settings'));\n      this.flickityInstance = new flickityFade(element.querySelector('.slideshow'), {\n        pageDots: this.options['pageDots'],\n        prevNextButtons: this.options['prevNextButtons'],\n        wrapAround: true,\n        dragThreshold: 12,\n        resize: false,\n        draggable: '>1',\n        fade: this.options['transitionEffect'] === 'fade',\n        setGallerySize: this.options['setGallerySize'],\n        adaptiveHeight: this.options['adaptiveHeight'],\n        autoPlay: this.options['autoPlay'] ? this.options['cycleSpeed'] : false\n      });\n      var lastWidth = window.innerWidth;\n      window.addEventListener('resize', function () {\n        if (window.innerWidth !== lastWidth) {\n          _this.flickityInstance.resize();\n\n          lastWidth = window.innerWidth;\n        }\n      });\n    }\n\n    _createClass(SlideshowSection, [{\n      key: \"onUnload\",\n      value: function onUnload() {\n        this.flickityInstance.destroy();\n      }\n    }, {\n      key: \"onBlockSelect\",\n      value: function onBlockSelect(event) {\n        if (this.flickityInstance.isActive) {\n          this.flickityInstance.selectCell(parseInt(event.target.getAttribute('data-block-index')), false, event.detail.load);\n          this.flickityInstance.pausePlayer();\n        }\n      }\n    }, {\n      key: \"onBlockDeselect\",\n      value: function onBlockDeselect() {\n        if (this.flickityInstance.isActive) {\n          this.flickityInstance.unpausePlayer();\n        }\n      }\n    }]);\n\n    return SlideshowSection;\n  }();\n\n  var TextWithIconsSection = /*#__PURE__*/function () {\n    function TextWithIconsSection(element) {\n      var _this = this;\n\n      _classCallCheck(this, TextWithIconsSection);\n\n      this.flickityInstance = new js(element.querySelector('.text-with-icons'), {\n        pageDots: true,\n        prevNextButtons: false,\n        wrapAround: true,\n        autoPlay: 5000,\n        resize: false,\n        watchCSS: true\n      });\n      var lastWidth = window.innerWidth;\n      window.addEventListener('resize', function () {\n        if (window.innerWidth !== lastWidth) {\n          _this.flickityInstance.resize();\n\n          lastWidth = window.innerWidth;\n        }\n      });\n    }\n\n    _createClass(TextWithIconsSection, [{\n      key: \"onUnload\",\n      value: function onUnload() {\n        this.flickityInstance.destroy();\n      }\n    }, {\n      key: \"onBlockSelect\",\n      value: function onBlockSelect(event) {\n        if (this.flickityInstance.isActive) {\n          this.flickityInstance.selectCell(parseInt(event.target.getAttribute('data-block-index')), false, event.detail.load);\n          this.flickityInstance.pausePlayer();\n        }\n      }\n    }, {\n      key: \"onBlockDeselect\",\n      value: function onBlockDeselect() {\n        if (this.flickityInstance.isActive) {\n          this.flickityInstance.unpausePlayer();\n        }\n      }\n    }]);\n\n    return TextWithIconsSection;\n  }();\n\n  var VideoSection = /*#__PURE__*/function () {\n    function VideoSection(element) {\n      _classCallCheck(this, VideoSection);\n\n      this.element = element;\n      this.domDelegate = new Delegate(this.element);\n      this.options = JSON.parse(this.element.getAttribute('data-section-settings'));\n\n      this._attachListeners();\n    }\n\n    _createClass(VideoSection, [{\n      key: \"onUnload\",\n      value: function onUnload() {\n        this.domDelegate.off('click');\n      }\n    }, {\n      key: \"_attachListeners\",\n      value: function _attachListeners() {\n        this.domDelegate.on('click', '[data-action=\"play-video\"]', this._playVideo.bind(this));\n      }\n    }, {\n      key: \"_playVideo\",\n      value: function _playVideo(event, target) {\n        // To start the video, we simply replace the iframe source\n        var iframe = target.querySelector('iframe');\n        iframe.src = iframe.getAttribute('data-src');\n        target.classList.add('is-playing');\n      }\n    }]);\n\n    return VideoSection;\n  }();\n\n  var smoothscroll = createCommonjsModule(function (module, exports) {\n    /* smoothscroll v0.4.4 - 2019 - Dustan Kasten, Jeremias Menichelli - MIT License */\n    (function () {\n\n      function polyfill() {\n        // aliases\n        var w = window;\n        var d = document; // return if scroll behavior is supported and polyfill is not forced\n\n        if ('scrollBehavior' in d.documentElement.style && w.__forceSmoothScrollPolyfill__ !== true) {\n          return;\n        } // globals\n\n\n        var Element = w.HTMLElement || w.Element;\n        var SCROLL_TIME = 468; // object gathering original scroll methods\n\n        var original = {\n          scroll: w.scroll || w.scrollTo,\n          scrollBy: w.scrollBy,\n          elementScroll: Element.prototype.scroll || scrollElement,\n          scrollIntoView: Element.prototype.scrollIntoView\n        }; // define timing method\n\n        var now = w.performance && w.performance.now ? w.performance.now.bind(w.performance) : Date.now;\n        /**\n         * indicates if a the current browser is made by Microsoft\n         * @method isMicrosoftBrowser\n         * @param {String} userAgent\n         * @returns {Boolean}\n         */\n\n        function isMicrosoftBrowser(userAgent) {\n          var userAgentPatterns = ['MSIE ', 'Trident/', 'Edge/'];\n          return new RegExp(userAgentPatterns.join('|')).test(userAgent);\n        }\n        /*\n         * IE has rounding bug rounding down clientHeight and clientWidth and\n         * rounding up scrollHeight and scrollWidth causing false positives\n         * on hasScrollableSpace\n         */\n\n\n        var ROUNDING_TOLERANCE = isMicrosoftBrowser(w.navigator.userAgent) ? 1 : 0;\n        /**\n         * changes scroll position inside an element\n         * @method scrollElement\n         * @param {Number} x\n         * @param {Number} y\n         * @returns {undefined}\n         */\n\n        function scrollElement(x, y) {\n          this.scrollLeft = x;\n          this.scrollTop = y;\n        }\n        /**\n         * returns result of applying ease math function to a number\n         * @method ease\n         * @param {Number} k\n         * @returns {Number}\n         */\n\n\n        function ease(k) {\n          return 0.5 * (1 - Math.cos(Math.PI * k));\n        }\n        /**\n         * indicates if a smooth behavior should be applied\n         * @method shouldBailOut\n         * @param {Number|Object} firstArg\n         * @returns {Boolean}\n         */\n\n\n        function shouldBailOut(firstArg) {\n          if (firstArg === null || _typeof(firstArg) !== 'object' || firstArg.behavior === undefined || firstArg.behavior === 'auto' || firstArg.behavior === 'instant') {\n            // first argument is not an object/null\n            // or behavior is auto, instant or undefined\n            return true;\n          }\n\n          if (_typeof(firstArg) === 'object' && firstArg.behavior === 'smooth') {\n            // first argument is an object and behavior is smooth\n            return false;\n          } // throw error when behavior is not supported\n\n\n          throw new TypeError('behavior member of ScrollOptions ' + firstArg.behavior + ' is not a valid value for enumeration ScrollBehavior.');\n        }\n        /**\n         * indicates if an element has scrollable space in the provided axis\n         * @method hasScrollableSpace\n         * @param {Node} el\n         * @param {String} axis\n         * @returns {Boolean}\n         */\n\n\n        function hasScrollableSpace(el, axis) {\n          if (axis === 'Y') {\n            return el.clientHeight + ROUNDING_TOLERANCE < el.scrollHeight;\n          }\n\n          if (axis === 'X') {\n            return el.clientWidth + ROUNDING_TOLERANCE < el.scrollWidth;\n          }\n        }\n        /**\n         * indicates if an element has a scrollable overflow property in the axis\n         * @method canOverflow\n         * @param {Node} el\n         * @param {String} axis\n         * @returns {Boolean}\n         */\n\n\n        function canOverflow(el, axis) {\n          var overflowValue = w.getComputedStyle(el, null)['overflow' + axis];\n          return overflowValue === 'auto' || overflowValue === 'scroll';\n        }\n        /**\n         * indicates if an element can be scrolled in either axis\n         * @method isScrollable\n         * @param {Node} el\n         * @param {String} axis\n         * @returns {Boolean}\n         */\n\n\n        function isScrollable(el) {\n          var isScrollableY = hasScrollableSpace(el, 'Y') && canOverflow(el, 'Y');\n          var isScrollableX = hasScrollableSpace(el, 'X') && canOverflow(el, 'X');\n          return isScrollableY || isScrollableX;\n        }\n        /**\n         * finds scrollable parent of an element\n         * @method findScrollableParent\n         * @param {Node} el\n         * @returns {Node} el\n         */\n\n\n        function findScrollableParent(el) {\n          while (el !== d.body && isScrollable(el) === false) {\n            el = el.parentNode || el.host;\n          }\n\n          return el;\n        }\n        /**\n         * self invoked function that, given a context, steps through scrolling\n         * @method step\n         * @param {Object} context\n         * @returns {undefined}\n         */\n\n\n        function step(context) {\n          var time = now();\n          var value;\n          var currentX;\n          var currentY;\n          var elapsed = (time - context.startTime) / SCROLL_TIME; // avoid elapsed times higher than one\n\n          elapsed = elapsed > 1 ? 1 : elapsed; // apply easing to elapsed time\n\n          value = ease(elapsed);\n          currentX = context.startX + (context.x - context.startX) * value;\n          currentY = context.startY + (context.y - context.startY) * value;\n          context.method.call(context.scrollable, currentX, currentY); // scroll more if we have not reached our destination\n\n          if (currentX !== context.x || currentY !== context.y) {\n            w.requestAnimationFrame(step.bind(w, context));\n          }\n        }\n        /**\n         * scrolls window or element with a smooth behavior\n         * @method smoothScroll\n         * @param {Object|Node} el\n         * @param {Number} x\n         * @param {Number} y\n         * @returns {undefined}\n         */\n\n\n        function smoothScroll(el, x, y) {\n          var scrollable;\n          var startX;\n          var startY;\n          var method;\n          var startTime = now(); // define scroll context\n\n          if (el === d.body) {\n            scrollable = w;\n            startX = w.scrollX || w.pageXOffset;\n            startY = w.scrollY || w.pageYOffset;\n            method = original.scroll;\n          } else {\n            scrollable = el;\n            startX = el.scrollLeft;\n            startY = el.scrollTop;\n            method = scrollElement;\n          } // scroll looping over a frame\n\n\n          step({\n            scrollable: scrollable,\n            method: method,\n            startTime: startTime,\n            startX: startX,\n            startY: startY,\n            x: x,\n            y: y\n          });\n        } // ORIGINAL METHODS OVERRIDES\n        // w.scroll and w.scrollTo\n\n\n        w.scroll = w.scrollTo = function () {\n          // avoid action when no arguments are passed\n          if (arguments[0] === undefined) {\n            return;\n          } // avoid smooth behavior if not required\n\n\n          if (shouldBailOut(arguments[0]) === true) {\n            original.scroll.call(w, arguments[0].left !== undefined ? arguments[0].left : _typeof(arguments[0]) !== 'object' ? arguments[0] : w.scrollX || w.pageXOffset, // use top prop, second argument if present or fallback to scrollY\n            arguments[0].top !== undefined ? arguments[0].top : arguments[1] !== undefined ? arguments[1] : w.scrollY || w.pageYOffset);\n            return;\n          } // LET THE SMOOTHNESS BEGIN!\n\n\n          smoothScroll.call(w, d.body, arguments[0].left !== undefined ? ~~arguments[0].left : w.scrollX || w.pageXOffset, arguments[0].top !== undefined ? ~~arguments[0].top : w.scrollY || w.pageYOffset);\n        }; // w.scrollBy\n\n\n        w.scrollBy = function () {\n          // avoid action when no arguments are passed\n          if (arguments[0] === undefined) {\n            return;\n          } // avoid smooth behavior if not required\n\n\n          if (shouldBailOut(arguments[0])) {\n            original.scrollBy.call(w, arguments[0].left !== undefined ? arguments[0].left : _typeof(arguments[0]) !== 'object' ? arguments[0] : 0, arguments[0].top !== undefined ? arguments[0].top : arguments[1] !== undefined ? arguments[1] : 0);\n            return;\n          } // LET THE SMOOTHNESS BEGIN!\n\n\n          smoothScroll.call(w, d.body, ~~arguments[0].left + (w.scrollX || w.pageXOffset), ~~arguments[0].top + (w.scrollY || w.pageYOffset));\n        }; // Element.prototype.scroll and Element.prototype.scrollTo\n\n\n        Element.prototype.scroll = Element.prototype.scrollTo = function () {\n          // avoid action when no arguments are passed\n          if (arguments[0] === undefined) {\n            return;\n          } // avoid smooth behavior if not required\n\n\n          if (shouldBailOut(arguments[0]) === true) {\n            // if one number is passed, throw error to match Firefox implementation\n            if (typeof arguments[0] === 'number' && arguments[1] === undefined) {\n              throw new SyntaxError('Value could not be converted');\n            }\n\n            original.elementScroll.call(this, // use left prop, first number argument or fallback to scrollLeft\n            arguments[0].left !== undefined ? ~~arguments[0].left : _typeof(arguments[0]) !== 'object' ? ~~arguments[0] : this.scrollLeft, // use top prop, second argument or fallback to scrollTop\n            arguments[0].top !== undefined ? ~~arguments[0].top : arguments[1] !== undefined ? ~~arguments[1] : this.scrollTop);\n            return;\n          }\n\n          var left = arguments[0].left;\n          var top = arguments[0].top; // LET THE SMOOTHNESS BEGIN!\n\n          smoothScroll.call(this, this, typeof left === 'undefined' ? this.scrollLeft : ~~left, typeof top === 'undefined' ? this.scrollTop : ~~top);\n        }; // Element.prototype.scrollBy\n\n\n        Element.prototype.scrollBy = function () {\n          // avoid action when no arguments are passed\n          if (arguments[0] === undefined) {\n            return;\n          } // avoid smooth behavior if not required\n\n\n          if (shouldBailOut(arguments[0]) === true) {\n            original.elementScroll.call(this, arguments[0].left !== undefined ? ~~arguments[0].left + this.scrollLeft : ~~arguments[0] + this.scrollLeft, arguments[0].top !== undefined ? ~~arguments[0].top + this.scrollTop : ~~arguments[1] + this.scrollTop);\n            return;\n          }\n\n          this.scroll({\n            left: ~~arguments[0].left + this.scrollLeft,\n            top: ~~arguments[0].top + this.scrollTop,\n            behavior: arguments[0].behavior\n          });\n        }; // Element.prototype.scrollIntoView\n\n\n        Element.prototype.scrollIntoView = function () {\n          // avoid smooth behavior if not required\n          if (shouldBailOut(arguments[0]) === true) {\n            original.scrollIntoView.call(this, arguments[0] === undefined ? true : arguments[0]);\n            return;\n          } // LET THE SMOOTHNESS BEGIN!\n\n\n          var scrollableParent = findScrollableParent(this);\n          var parentRects = scrollableParent.getBoundingClientRect();\n          var clientRects = this.getBoundingClientRect();\n\n          if (scrollableParent !== d.body) {\n            // reveal element inside parent\n            smoothScroll.call(this, scrollableParent, scrollableParent.scrollLeft + clientRects.left - parentRects.left, scrollableParent.scrollTop + clientRects.top - parentRects.top); // reveal parent in viewport unless is fixed\n\n            if (w.getComputedStyle(scrollableParent).position !== 'fixed') {\n              w.scrollBy({\n                left: parentRects.left,\n                top: parentRects.top,\n                behavior: 'smooth'\n              });\n            }\n          } else {\n            // reveal element in viewport\n            w.scrollBy({\n              left: clientRects.left,\n              top: clientRects.top,\n              behavior: 'smooth'\n            });\n          }\n        };\n      }\n\n      {\n        // commonjs\n        module.exports = {\n          polyfill: polyfill\n        };\n      }\n    })();\n  });\n\n  /*! instant.page v5.1.0 - (C) 2019-2020 Alexandre Dieulot - https://instant.page/license */\n  var mouseoverTimer;\n  var lastTouchTimestamp;\n  var prefetches = new Set();\n  var prefetchElement = document.createElement('link');\n  var isSupported = prefetchElement.relList && prefetchElement.relList.supports && prefetchElement.relList.supports('prefetch') && window.IntersectionObserver && 'isIntersecting' in IntersectionObserverEntry.prototype;\n  var allowQueryString = ('instantAllowQueryString' in document.body.dataset);\n  var allowExternalLinks = ('instantAllowExternalLinks' in document.body.dataset);\n  var useWhitelist = ('instantWhitelist' in document.body.dataset);\n  var mousedownShortcut = ('instantMousedownShortcut' in document.body.dataset);\n  var DELAY_TO_NOT_BE_CONSIDERED_A_TOUCH_INITIATED_ACTION = 1111;\n  var delayOnHover = 65;\n  var useMousedown = false;\n  var useMousedownOnly = false;\n  var useViewport = false;\n\n  if ('instantIntensity' in document.body.dataset) {\n    var intensity = document.body.dataset.instantIntensity;\n\n    if (intensity.substr(0, 'mousedown'.length) == 'mousedown') {\n      useMousedown = true;\n\n      if (intensity == 'mousedown-only') {\n        useMousedownOnly = true;\n      }\n    } else if (intensity.substr(0, 'viewport'.length) == 'viewport') {\n      if (!(navigator.connection && (navigator.connection.saveData || navigator.connection.effectiveType && navigator.connection.effectiveType.includes('2g')))) {\n        if (intensity == \"viewport\") {\n          /* Biggest iPhone resolution (which we want): 414 \u00D7 896 = 370944\n           * Small 7\" tablet resolution (which we don\u2019t want): 600 \u00D7 1024 = 614400\n           * Note that the viewport (which we check here) is smaller than the resolution due to the UI\u2019s chrome */\n          if (document.documentElement.clientWidth * document.documentElement.clientHeight < 450000) {\n            useViewport = true;\n          }\n        } else if (intensity == \"viewport-all\") {\n          useViewport = true;\n        }\n      }\n    } else {\n      var milliseconds = parseInt(intensity);\n\n      if (!isNaN(milliseconds)) {\n        delayOnHover = milliseconds;\n      }\n    }\n  }\n\n  if (isSupported) {\n    var eventListenersOptions = {\n      capture: true,\n      passive: true\n    };\n\n    if (!useMousedownOnly) {\n      document.addEventListener('touchstart', touchstartListener, eventListenersOptions);\n    }\n\n    if (!useMousedown) {\n      document.addEventListener('mouseover', mouseoverListener, eventListenersOptions);\n    } else if (!mousedownShortcut) {\n      document.addEventListener('mousedown', mousedownListener, eventListenersOptions);\n    }\n\n    if (mousedownShortcut) {\n      document.addEventListener('mousedown', mousedownShortcutListener, eventListenersOptions);\n    }\n\n    if (useViewport) {\n      var triggeringFunction;\n\n      if (window.requestIdleCallback) {\n        triggeringFunction = function triggeringFunction(callback) {\n          requestIdleCallback(callback, {\n            timeout: 1500\n          });\n        };\n      } else {\n        triggeringFunction = function triggeringFunction(callback) {\n          callback();\n        };\n      }\n\n      triggeringFunction(function () {\n        var intersectionObserver = new IntersectionObserver(function (entries) {\n          entries.forEach(function (entry) {\n            if (entry.isIntersecting) {\n              var linkElement = entry.target;\n              intersectionObserver.unobserve(linkElement);\n              preload(linkElement.href);\n            }\n          });\n        });\n        document.querySelectorAll('a').forEach(function (linkElement) {\n          if (isPreloadable(linkElement)) {\n            intersectionObserver.observe(linkElement);\n          }\n        });\n      });\n    }\n  }\n\n  function touchstartListener(event) {\n    /* Chrome on Android calls mouseover before touchcancel so `lastTouchTimestamp`\n     * must be assigned on touchstart to be measured on mouseover. */\n    lastTouchTimestamp = performance.now();\n    var linkElement = event.target.closest('a');\n\n    if (!isPreloadable(linkElement)) {\n      return;\n    }\n\n    preload(linkElement.href);\n  }\n\n  function mouseoverListener(event) {\n    if (performance.now() - lastTouchTimestamp < DELAY_TO_NOT_BE_CONSIDERED_A_TOUCH_INITIATED_ACTION) {\n      return;\n    }\n\n    var linkElement = event.target.closest('a');\n\n    if (!isPreloadable(linkElement)) {\n      return;\n    }\n\n    linkElement.addEventListener('mouseout', mouseoutListener, {\n      passive: true\n    });\n    mouseoverTimer = setTimeout(function () {\n      preload(linkElement.href);\n      mouseoverTimer = undefined;\n    }, delayOnHover);\n  }\n\n  function mousedownListener(event) {\n    var linkElement = event.target.closest('a');\n\n    if (!isPreloadable(linkElement)) {\n      return;\n    }\n\n    preload(linkElement.href);\n  }\n\n  function mouseoutListener(event) {\n    if (event.relatedTarget && event.target.closest('a') == event.relatedTarget.closest('a')) {\n      return;\n    }\n\n    if (mouseoverTimer) {\n      clearTimeout(mouseoverTimer);\n      mouseoverTimer = undefined;\n    }\n  }\n\n  function mousedownShortcutListener(event) {\n    if (performance.now() - lastTouchTimestamp < DELAY_TO_NOT_BE_CONSIDERED_A_TOUCH_INITIATED_ACTION) {\n      return;\n    }\n\n    var linkElement = event.target.closest('a');\n\n    if (event.which > 1 || event.metaKey || event.ctrlKey) {\n      return;\n    }\n\n    if (!linkElement) {\n      return;\n    }\n\n    linkElement.addEventListener('click', function (event) {\n      if (event.detail == 1337) {\n        return;\n      }\n\n      event.preventDefault();\n    }, {\n      capture: true,\n      passive: false,\n      once: true\n    });\n    var customEvent = new MouseEvent('click', {\n      view: window,\n      bubbles: true,\n      cancelable: false,\n      detail: 1337\n    });\n    linkElement.dispatchEvent(customEvent);\n  }\n\n  function isPreloadable(linkElement) {\n    if (!linkElement || !linkElement.href) {\n      return;\n    }\n\n    if (useWhitelist && !('instant' in linkElement.dataset)) {\n      return;\n    }\n\n    if (!allowExternalLinks && linkElement.origin != location.origin && !('instant' in linkElement.dataset)) {\n      return;\n    }\n\n    if (!['http:', 'https:'].includes(linkElement.protocol)) {\n      return;\n    }\n\n    if (linkElement.protocol == 'http:' && location.protocol == 'https:') {\n      return;\n    }\n\n    if (!allowQueryString && linkElement.search && !('instant' in linkElement.dataset)) {\n      return;\n    }\n\n    if (linkElement.hash && linkElement.pathname + linkElement.search == location.pathname + location.search) {\n      return;\n    }\n\n    if ('noInstant' in linkElement.dataset) {\n      return;\n    }\n\n    return true;\n  }\n\n  function preload(url) {\n    if (prefetches.has(url)) {\n      return;\n    }\n\n    var prefetcher = document.createElement('link');\n    prefetcher.rel = 'prefetch';\n    prefetcher.href = url;\n    document.head.appendChild(prefetcher);\n    prefetches.add(url);\n  }\n\n  var PriceRange = /*#__PURE__*/function (_HTMLElement) {\n    _inherits(PriceRange, _HTMLElement);\n\n    var _super = _createSuper(PriceRange);\n\n    function PriceRange() {\n      _classCallCheck(this, PriceRange);\n\n      return _super.apply(this, arguments);\n    }\n\n    _createClass(PriceRange, [{\n      key: \"connectedCallback\",\n      value: function connectedCallback() {\n        var _this = this;\n\n        this.rangeLowerBound = this.querySelector('.price-range__range-group input:first-child');\n        this.rangeHigherBound = this.querySelector('.price-range__range-group input:last-child');\n        this.textInputLowerBound = this.querySelector('.price-range__input:first-child input');\n        this.textInputHigherBound = this.querySelector('.price-range__input:last-child input'); // Select whole text on focus for text field to improve user experience\n\n        this.textInputLowerBound.addEventListener('focus', function () {\n          return _this.textInputLowerBound.select();\n        });\n        this.textInputHigherBound.addEventListener('focus', function () {\n          return _this.textInputHigherBound.select();\n        }); // Keep in sync the range with the text input fields\n\n        this.textInputLowerBound.addEventListener('change', function (event) {\n          event.target.value = Math.max(Math.min(parseInt(event.target.value), parseInt(_this.textInputHigherBound.value || event.target.max) - 1), event.target.min);\n          _this.rangeLowerBound.value = event.target.value;\n\n          _this.rangeLowerBound.parentElement.style.setProperty('--range-min', \"\".concat(parseInt(_this.rangeLowerBound.value) / parseInt(_this.rangeLowerBound.max) * 100, \"%\"));\n        });\n        this.textInputHigherBound.addEventListener('change', function (event) {\n          event.target.value = Math.min(Math.max(parseInt(event.target.value), parseInt(_this.textInputLowerBound.value || event.target.min) + 1), event.target.max);\n          _this.rangeHigherBound.value = event.target.value;\n\n          _this.rangeHigherBound.parentElement.style.setProperty('--range-max', \"\".concat(parseInt(_this.rangeHigherBound.value) / parseInt(_this.rangeHigherBound.max) * 100, \"%\"));\n        });\n        this.rangeLowerBound.addEventListener('change', function (event) {\n          _this.textInputLowerBound.value = event.target.value;\n\n          _this.textInputLowerBound.dispatchEvent(new Event('change', {\n            bubbles: true\n          }));\n        });\n        this.rangeHigherBound.addEventListener('change', function (event) {\n          _this.textInputHigherBound.value = event.target.value;\n\n          _this.textInputHigherBound.dispatchEvent(new Event('change', {\n            bubbles: true\n          }));\n        }); // We also have to bound the two range sliders\n\n        this.rangeLowerBound.addEventListener('input', function (event) {\n          _this.dispatchEvent(new CustomEvent('collection:abort-loading', {\n            bubbles: true\n          }));\n\n          event.target.value = Math.min(parseInt(event.target.value), parseInt(_this.textInputHigherBound.value || event.target.max) - 1); // Bound the value\n\n          event.target.parentElement.style.setProperty('--range-min', \"\".concat(parseInt(event.target.value) / parseInt(event.target.max) * 100, \"%\"));\n          _this.textInputLowerBound.value = event.target.value;\n        });\n        this.rangeHigherBound.addEventListener('input', function (event) {\n          _this.dispatchEvent(new CustomEvent('collection:abort-loading', {\n            bubbles: true\n          }));\n\n          event.target.value = Math.max(parseInt(event.target.value), parseInt(_this.textInputLowerBound.value || event.target.min) + 1); // Bound the value\n\n          event.target.parentElement.style.setProperty('--range-max', \"\".concat(parseInt(event.target.value) / parseInt(event.target.max) * 100, \"%\"));\n          _this.textInputHigherBound.value = event.target.value;\n        });\n      }\n    }]);\n\n    return PriceRange;\n  }( /*#__PURE__*/_wrapNativeSuper(HTMLElement));\n  window.customElements.define('price-range', PriceRange);\n\n  var ProductRecommendations = /*#__PURE__*/function (_HTMLElement) {\n    _inherits(ProductRecommendations, _HTMLElement);\n\n    var _super = _createSuper(ProductRecommendations);\n\n    function ProductRecommendations() {\n      var _this;\n\n      _classCallCheck(this, ProductRecommendations);\n\n      _this = _super.call(this);\n      _this._isLoaded = false;\n      _this.delegateElement = new Delegate(_assertThisInitialized(_this));\n\n      _this.delegateElement.on('click', '[data-action=\"add-to-cart\"]', _this._addToCart.bind(_assertThisInitialized(_this)));\n\n      return _this;\n    }\n\n    _createClass(ProductRecommendations, [{\n      key: \"connectedCallback\",\n      value: function connectedCallback() {\n        this._loadRecommendations();\n      }\n    }, {\n      key: \"_loadRecommendations\",\n      value: function _loadRecommendations() {\n        var _this2 = this;\n\n        if (this._isLoaded) {\n          return;\n        }\n\n        this._isLoaded = true;\n        var section = this.closest('.shopify-section'),\n            intent = this.getAttribute('intent') || 'related',\n            url = \"\".concat(Shopify.routes.root, \"recommendations/products?product_id=\").concat(this.getAttribute('product'), \"&limit=\").concat(this.getAttribute('limit') || 4, \"&section_id=\").concat(this.getAttribute('section-id'), \"&intent=\").concat(intent);\n        fetch(url).then(function (response) {\n          response.text().then(function (text) {\n            var tempDiv = new DOMParser().parseFromString(text, 'text/html'),\n                productRecommendationsElement = tempDiv.querySelector('product-recommendations');\n\n            if (productRecommendationsElement.childElementCount > 0) {\n              _this2.replaceChildren.apply(_this2, _toConsumableArray(document.importNode(productRecommendationsElement, true).childNodes)); // Create Flickity slider\n\n\n              _this2.flickityInstance = new flickityFade(_this2.querySelector('.complementary-product-list'), {\n                pageDots: false,\n                watchCSS: true,\n                groupCells: 2,\n                cellAlign: 'left',\n                prevNextButtons: true,\n                wrapAround: true,\n                dragThreshold: 12,\n                percentPosition: true,\n                resize: false,\n                draggable: '>1'\n              });\n            } else {\n              if (intent === 'related') {\n                section.remove();\n              } else {\n                _this2.remove();\n              }\n            }\n          });\n        });\n      }\n      /**\n       * ---------------------------------------------------------------------------------------------------\n       * INTERNAL CODE THAT HANDLE PRODUCT ADD TO CART\n       * ---------------------------------------------------------------------------------------------------\n       */\n\n    }, {\n      key: \"_addToCart\",\n      value: function _addToCart(event, target) {\n        var _this3 = this;\n\n        if (window.theme.cartType === 'page') {\n          return; // When using a cart type of page, we just simply redirect to the cart page\n        }\n\n        event.preventDefault(); // Prevent form to be submitted\n\n        event.stopPropagation(); // First, we switch the status of the button\n\n        target.setAttribute('disabled', 'disabled');\n        document.dispatchEvent(new CustomEvent('theme:loading:start')); // Then we add the product in Ajax\n\n        var formElement = target.closest('form[action*=\"/cart/add\"]');\n        fetch(\"\".concat(window.routes.cartAddUrl, \".js\"), {\n          body: JSON.stringify(Form.serialize(formElement)),\n          credentials: 'same-origin',\n          method: 'POST',\n          headers: {\n            'Content-Type': 'application/json',\n            'X-Requested-With': 'XMLHttpRequest' // This is needed as currently there is a bug in Shopify that assumes this header\n\n          }\n        }).then(function (response) {\n          target.removeAttribute('disabled');\n\n          if (response.ok) {\n            // We simply trigger an event so the mini-cart can re-render\n            _this3.dispatchEvent(new CustomEvent('product:added', {\n              bubbles: true,\n              detail: {\n                button: target,\n                variant: null,\n                quantity: parseInt(formElement.querySelector('[name=\"quantity\"]').value)\n              }\n            }));\n          } else {\n            document.dispatchEvent(new CustomEvent('theme:loading:end'));\n          }\n        });\n        event.preventDefault();\n      }\n    }]);\n\n    return ProductRecommendations;\n  }( /*#__PURE__*/_wrapNativeSuper(HTMLElement));\n\n  if (!window.customElements.get('product-recommendations')) {\n    window.customElements.define('product-recommendations', ProductRecommendations);\n  }\n\n  (function () {\n    var bootTheme = function bootTheme() {\n      // Some polyfills not provided yet by polyfills.io\n      if (window.NodeList && !NodeList.prototype.forEach) {\n        NodeList.prototype.forEach = function (callback, thisArg) {\n          thisArg = thisArg || window;\n\n          for (var i = 0; i < this.length; i++) {\n            callback.call(thisArg, this[i], i, this);\n          }\n        };\n      } // Use for the smooth scroll polyfill\n\n\n      smoothscroll.polyfill(); // Instantiate global plugins\n\n      new CollapsibleManager();\n      new LoadingBar();\n      new ModalManager();\n      new PopoverManager(); // Then, we instantiate specific sections that may appear in all pages, and then only the template specific sections\n\n      var sections = new SectionContainer();\n      sections.register('account', AccountSection);\n      sections.register('announcement-bar', AnnouncementBarSection);\n      sections.register('blog', BlogSection);\n      sections.register('blog-sidebar', BlogSidebarSection);\n      sections.register('blog-post', BlogPostSection);\n      sections.register('cart', CartSection);\n      sections.register('collection-list', CollectionListSection);\n      sections.register('collection', CollectionSection);\n      sections.register('featured-collection', FeaturedCollectionSection);\n      sections.register('footer', FooterSection);\n      sections.register('gift-card', GiftCardSection);\n      sections.register('header', HeaderSection);\n      sections.register('login', LoginSection);\n      sections.register('map', MapSection);\n      sections.register('minimal-header', MinimalHeaderSection);\n      sections.register('popups', PopupsSection);\n      sections.register('product-recommendations', ProductRecommendationsSection);\n      sections.register('product', ProductSection);\n      sections.register('quick-links', QuickLinksSection);\n      sections.register('recently-viewed-products', RecentlyViewedProductsSection);\n      sections.register('slideshow', SlideshowSection);\n      sections.register('text-with-icons', TextWithIconsSection);\n      sections.register('video', VideoSection);\n      /**\n       * ----------------------------------------------------------------------------\n       * RTE\n       * ----------------------------------------------------------------------------\n       */\n\n      (function () {\n        // We wrap each RTE table by a specific class to allow wrapping\n        document.querySelectorAll('.rte table').forEach(function (table) {\n          table.outerHTML = '<div class=\"table-wrapper\">' + table.outerHTML + '</div>';\n        });\n        document.querySelectorAll('.rte iframe').forEach(function (iframe) {\n          // We scope the wrapping only for YouTube and Vimeo\n          if (iframe.src.indexOf('youtube') !== -1 || iframe.src.indexOf('youtu.be') !== -1 || iframe.src.indexOf('vimeo') !== -1) {\n            iframe.outerHTML = '<div class=\"video-wrapper\">' + iframe.outerHTML + '</div>'; // Re-set the src attribute on each iframe after page load for Chrome's \"incorrect iFrame content on 'back'\" bug.\n            // https://code.google.com/p/chromium/issues/detail?id=395791. Need to specifically target video and admin bar\n\n            iframe.src = iframe.src;\n          }\n        });\n      })();\n      /**\n       * ----------------------------------------------------------------------------\n       * FLICKITY\n       *\n       * Starting from iOS 11, Safari on iOS is experiencing a bug that prevents\n       * event.preventDefault to be called on dynamically added listeners, which is\n       * what Flickity is using.\n       *\n       * The bug is coming from iOS but it impacts indirectly Flickity. A temporary\n       * fix has been suggested here: https://github.com/metafizzy/flickity/issues/740\n       * and that we are using here as a temporary workaround, that should be removed\n       * once the bug is fixed on iOS\n       * ----------------------------------------------------------------------------\n       */\n\n\n      (function () {\n        var touchingCarousel = false,\n            touchStartCoords;\n        document.body.addEventListener('touchstart', function (e) {\n          var flickitySliderElement = e.target.closest('.flickity-slider');\n\n          if (flickitySliderElement) {\n            var flickity = js.data(flickitySliderElement.closest('.flickity-enabled'));\n\n            if (flickity.isDraggable) {\n              touchingCarousel = true;\n            } else {\n              touchingCarousel = false;\n              return;\n            }\n          } else {\n            touchingCarousel = false;\n            return;\n          }\n\n          touchStartCoords = {\n            x: e.touches[0].pageX,\n            y: e.touches[0].pageY\n          };\n        });\n        document.body.addEventListener('touchmove', function (e) {\n          if (!(touchingCarousel && e.cancelable)) {\n            return;\n          }\n\n          var moveVector = {\n            x: e.touches[0].pageX - touchStartCoords.x,\n            y: e.touches[0].pageY - touchStartCoords.y\n          };\n          if (Math.abs(moveVector.x) > 8) e.preventDefault();\n        }, {\n          passive: false\n        });\n      })();\n      /**\n       * ----------------------------------------------------------------------------\n       * UTILS\n       * ----------------------------------------------------------------------------\n       */\n\n      /**\n       * NOTE: I'm really not satisfied with the way this is handled, but this has been asked by design at the very\n       *       end of the process. This should be abstracted at some point to make it easier to re-use and with slightly\n       *       cleaner code!\n       */\n\n\n      (function () {\n        // In card, elements that have a \"card__section\" with a [aria-expanded] attribute can be clickable to open the content\n        // of the card itself\n        var documentDelegate = new Delegate(document.body);\n        documentDelegate.on('click', '.expandable-content__toggle', function (item, expandableButton) {\n          var parentSection = expandableButton.closest('.expandable-content');\n\n          if (parentSection.getAttribute('aria-expanded') === 'true') {\n            // Previously expanded, so we have to close it\n            parentSection.setAttribute('aria-expanded', 'false');\n            parentSection.style['max-height'] = \"\".concat(parentSection.offsetHeight, \"px\");\n            parentSection.offsetHeight; // Use to force a redraw\n\n            parentSection.style['max-height'] = null; // Remove the attribute to let the CSS decide the max-height\n\n            var expandableText = expandableButton.querySelector('.expandable-content__toggle-text');\n            expandableText.innerHTML = expandableText.getAttribute('data-view-more'); // We also have to scroll back to the top to preserve scroll position\n\n            var parentCard = parentSection.closest('.card');\n\n            if (parentCard) {\n              var amountToScroll = parentCard.getBoundingClientRect().top - 15 - parseInt(getComputedStyle(document.documentElement).getPropertyValue('--header-height'));\n              window.scrollBy({\n                top: amountToScroll,\n                behavior: 'smooth'\n              });\n            }\n          } else {\n            // Previously collapsed, so we have to open it\n            parentSection.setAttribute('aria-expanded', 'true'); // Because the expandable button is still positioned absolutely, we need to add margin to the sibling\n            // text to account the button. It's a bit ugly and hacky but this was the simplest I've found\n\n            if (expandableButton.previousElementSibling) {\n              expandableButton.previousElementSibling.style['margin-bottom'] = \"\".concat(parseInt(expandableButton.clientHeight), \"px\");\n            }\n\n            Animation.slideDown(parentSection, null, 'max-height');\n\n            var _expandableText = expandableButton.querySelector('.expandable-content__toggle-text');\n\n            _expandableText.innerHTML = _expandableText.getAttribute('data-view-less');\n          }\n        });\n\n        var processCollapsibles = function processCollapsibles() {\n          document.querySelectorAll('.expandable-content[aria-expanded]').forEach(function (item) {\n            if (item.scrollHeight > item.clientHeight) {\n              item.classList.add('expandable-content--expandable');\n            } else {\n              item.setAttribute('aria-expanded', 'true');\n            }\n          });\n        };\n\n        document.addEventListener('shopify:section:load', function (event) {\n          processCollapsibles();\n        });\n        processCollapsibles();\n      })();\n\n      (function () {\n        // Mobile browsers (like iOS) do not support opening keyboard, so we simply prevent the autofocus by unblurring\n        // all the fields\n        if (Responsive.getCurrentBreakpoint() === 'phone') {\n          var autoFocusedElements = document.querySelectorAll('input[autofocus]');\n\n          for (var i = 0; i < autoFocusedElements.length; i++) {\n            autoFocusedElements[i].blur();\n            autoFocusedElements[i].removeAttribute('autofocus');\n          }\n        }\n      })();\n\n      (function () {\n        var documentDelegate = new Delegate(document.body);\n        documentDelegate.on('click', '[href^=\"#\"], [data-href]', function (event, target) {\n          var selector = target.hasAttribute('href') ? target.getAttribute('href') : target.getAttribute('data-href');\n\n          if (selector === '#' || selector === '#main') {\n            return;\n          }\n\n          var element = null;\n\n          try {\n            element = document.querySelector(selector);\n          } catch (exception) {\n            // We may have an invalid selector, so if we catch it we just return\n            return;\n          }\n\n          var offset = parseInt(target.getAttribute('data-offset') || 0),\n              toTop = 0;\n\n          while (element.offsetParent.tagName !== 'BODY') {\n            toTop += element.offsetTop;\n            element = element.offsetParent;\n          }\n\n          toTop += element.offsetTop;\n          window.scrollTo({\n            behavior: 'smooth',\n            top: toTop - offset\n          });\n          event.preventDefault();\n        });\n      })();\n\n      (function () {\n        function handleFirstTab(event) {\n          if (event.key === 'Tab') {\n            document.body.classList.add('is-tabbing');\n            window.removeEventListener('keydown', handleFirstTab);\n          }\n        }\n\n        window.addEventListener('keydown', handleFirstTab);\n      })();\n\n      (function () {\n        var documentDelegate = new Delegate(document.body);\n        documentDelegate.on('keyup', 'input, textarea', function (event, target) {\n          target.classList.toggle('is-filled', target.value !== '');\n        });\n        documentDelegate.on('change', 'select', function (event, target) {\n          target.parentNode.classList.toggle('is-filled', target.value !== '');\n        });\n      })(); // This snippet allows to automatically adds a target=\"_blank\" to any link that is external. This is actually\n      // somewhat always desired by merchant and will allow to reduce support\n\n\n      (function () {\n        var links = document.links;\n        fastdom.mutate(function () {\n          for (var i = 0, linksLength = links.length; i < linksLength; i++) {\n            if (links[i].hostname !== window.location.hostname) {\n              links[i].target = '_blank';\n              links[i].relList.add('noopener');\n              links[i].setAttribute('aria-describedby', 'a11y-new-window-message');\n            }\n          }\n        });\n      })();\n    }; // In order to prevent loading polyfills on modern browser, we first detect if the browser support fetch and assign (if\n    // it does then it supports actually all the features we need). If that's not the case we first load the polyfill from\n    // polyfill.io and then boot the theme, otherwise we can skip this step completely\n\n\n    if ('fetch' in window && 'assign' in Object) {\n      bootTheme();\n    } else {\n      var scriptEl = document.createElement('script');\n      scriptEl.src = '//cdn.polyfill.io/v3/polyfill.min.js?unknown=polyfill&features=fetch,Element.prototype.closest,Element.prototype.matches,Element.prototype.remove,Element.prototype.classList,Array.prototype.includes,String.prototype.includes,Object.assign,CustomEvent,URL,DOMTokenList';\n      scriptEl.async = false;\n\n      scriptEl.onload = function () {\n        bootTheme();\n      };\n\n      document.head.appendChild(scriptEl);\n    }\n  })();\n\n})));\n"],
  "mappings": "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",
  "names": ["obj", "o", "p", "Parent", "args", "Class", "self", "Animation", "transitionEnded", "event", "Dom", "Delegate", "CollapsibleManager", "CountrySelector", "Responsive", "DesktopNavigation", "menuToClose", "index", "CollectionFilterDrawer", "ExitPopup", "LoadingBar", "Accessibility", "Cart", "MobileNavigation", "ModalManager", "onOpen", "onClose", "NewsletterPopup", "fastdom", "OverflowScroller", "PopoverManager", "ProductItemColorSwatch", "Currency", "value", "Form", "StoreAvailability", "availabilityModal", "ProductVariants", "valueIndex", "ProductModel", "ProductVideo", "global", "window", "getSize", "matchesSelector", "utils", "console", "cell", "getComputedStyle", "slide", "flickity", "distance", "module", "delta", "p2", "_onFirstMouseMove", "animloop", "_dragUpdateLoop", "_closestElement", "_releaseAnimData", "item", "_updateHash", "BoundingBox", "Trigger", "ZoomPane", "Drift", "ProductGallery", "animate", "QuantityPicker", "ShippingEstimator", "response", "ValuePicker", "AccountSection", "AnnouncementBarSection", "BlogSection", "BlogPostSection", "BlogSidebarSection", "ProductSection", "CartSection", "doCleanUp", "CollectionListSection", "CollectionSection", "FeaturedCollectionSection", "GiftCardSection", "FooterSection", "SearchBar", "HeaderSection", "LoginSection", "MapSection", "MinimalHeaderSection", "QuickLinksSection", "PopupsSection", "ProductRecommendationsSection", "RecentlyViewedProductsSection", "SectionContainer", "SlideshowSection", "TextWithIconsSection", "VideoSection", "Element", "PriceRange", "ProductRecommendations"]
}
