{
  "version": 3,
  "sources": ["/cdn/shop/t/38/assets/theme.js?x=1791206505561"],
  "sourcesContent": ["/*\n@license\n  Motion by Archetype Themes (https://archetypethemes.co)\n  Access unminified JS in assets/theme.js\n\n  Use this event listener to run your own JS outside of this file.\n  Documentation - https://archetypethemes.co/blogs/motion/javascript-events-for-developers\n\n  document.addEventListener('page:loaded', function() {\n    // Page has loaded and theme assets are ready\n  });\n*/\n\nwindow.theme = window.theme || {};\nwindow.Shopify = window.Shopify || {};\n\ntheme.config = {\n  bpSmall: false,\n  bpSmallValue: 589,\n  hasSessionStorage: true,\n  mediaQuerySmall: 'screen and (max-width: 589px)',\n  youTubeReady: false,\n  vimeoReady: false,\n  vimeoLoading: false,\n  isTouch: ('ontouchstart' in window) || window.DocumentTouch && window.document instanceof DocumentTouch || window.navigator.maxTouchPoints || window.navigator.msMaxTouchPoints ? true : false,\n  rtl: document.documentElement.getAttribute('dir') == 'rtl' ? true : false\n};\n\nif (theme.config.isTouch) {\n  document.documentElement.className += ' supports-touch';\n}\n\nif (console && console.log) {\n  console.log('Motion theme ('+theme.settings.themeVersion+') by ARCH\u039ETYPE | Learn more at https://archetypethemes.co');\n}\n\n(function(){\n  'use strict';\n\n  theme.delegate = {\n    on: function(event, callback, options){\n      if( !this.namespaces ) // save the namespaces on the DOM element itself\n        this.namespaces = {};\n  \n      this.namespaces[event] = callback;\n      options = options || false;\n  \n      this.addEventListener(event.split('.')[0], callback, options);\n      return this;\n    },\n    off: function(event) {\n      if (!this.namespaces) { return }\n      this.removeEventListener(event.split('.')[0], this.namespaces[event]);\n      delete this.namespaces[event];\n      return this;\n    }\n  };\n  \n  // Extend the DOM with these above custom methods\n  window.on = Element.prototype.on = theme.delegate.on;\n  window.off = Element.prototype.off = theme.delegate.off;\n  \n  theme.utils = {\n    defaultTo: function(value, defaultValue) {\n      return (value == null || value !== value) ? defaultValue : value\n    },\n  \n    wrap: function(el, wrapper) {\n      el.parentNode.insertBefore(wrapper, el);\n      wrapper.appendChild(el);\n    },\n  \n    debounce: function(wait, callback, immediate) {\n      var timeout;\n      return function() {\n        var context = this, args = arguments;\n        var later = function() {\n          timeout = null;\n          if (!immediate) callback.apply(context, args);\n        };\n        var callNow = immediate && !timeout;\n        clearTimeout(timeout);\n        timeout = setTimeout(later, wait);\n        if (callNow) callback.apply(context, args);\n      }\n    },\n  \n    throttle: function(limit, callback) {\n      var waiting = false;\n      return function () {\n        if (!waiting) {\n          callback.apply(this, arguments);\n          waiting = true;\n          setTimeout(function () {\n            waiting = false;\n          }, limit);\n        }\n      }\n    },\n  \n    prepareTransition: function(el, callback) {\n      el.addEventListener('transitionend', removeClass);\n  \n      function removeClass(evt) {\n        el.classList.remove('is-transitioning');\n        el.removeEventListener('transitionend', removeClass);\n      }\n  \n      el.classList.add('is-transitioning');\n      el.offsetWidth; // check offsetWidth to force the style rendering\n  \n      if (typeof callback === 'function') {\n        callback();\n      }\n    },\n  \n    // _.compact from lodash\n    // Creates an array with all falsey values removed. The values `false`, `null`,\n    // `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n    // _.compact([0, 1, false, 2, '', 3]);\n    // => [1, 2, 3]\n    compact: function(array) {\n      var index = -1,\n          length = array == null ? 0 : array.length,\n          resIndex = 0,\n          result = [];\n  \n      while (++index < length) {\n        var value = array[index];\n        if (value) {\n          result[resIndex++] = value;\n        }\n      }\n      return result;\n    },\n  \n    serialize: function(form) {\n      var arr = [];\n      Array.prototype.slice.call(form.elements).forEach(function(field) {\n        if (\n          !field.name ||\n          field.disabled ||\n          ['file', 'reset', 'submit', 'button'].indexOf(field.type) > -1\n        )\n          return;\n        if (field.type === 'select-multiple') {\n          Array.prototype.slice.call(field.options).forEach(function(option) {\n            if (!option.selected) return;\n            arr.push(\n              encodeURIComponent(field.name) +\n                '=' +\n                encodeURIComponent(option.value)\n            );\n          });\n          return;\n        }\n        if (['checkbox', 'radio'].indexOf(field.type) > -1 && !field.checked)\n          return;\n        arr.push(\n          encodeURIComponent(field.name) + '=' + encodeURIComponent(field.value)\n        );\n      });\n      return arr.join('&');\n    }\n  };\n  \n  theme.a11y = {\n    trapFocus: function(options) {\n      var eventsName = {\n        focusin: options.namespace ? 'focusin.' + options.namespace : 'focusin',\n        focusout: options.namespace\n          ? 'focusout.' + options.namespace\n          : 'focusout',\n        keydown: options.namespace\n          ? 'keydown.' + options.namespace\n          : 'keydown.handleFocus'\n      };\n  \n      // Get every possible visible focusable element\n      var focusableEls = options.container.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex^=\"-\"])');\n      var elArray = [].slice.call(focusableEls);\n      var focusableElements = elArray.filter(el => el.offsetParent !== null);\n  \n      var firstFocusable = focusableElements[0];\n      var lastFocusable = focusableElements[focusableElements.length - 1];\n  \n      if (!options.elementToFocus) {\n        options.elementToFocus = options.container;\n      }\n  \n      options.container.setAttribute('tabindex', '-1');\n      options.elementToFocus.focus();\n  \n      document.documentElement.off('focusin');\n      document.documentElement.on(eventsName.focusout, function() {\n        document.documentElement.off(eventsName.keydown);\n      });\n  \n      document.documentElement.on(eventsName.focusin, function(evt) {\n        if (evt.target !== options.container && evt.target !== lastFocusable && evt.target !== firstFocusable) return;\n  \n        document.documentElement.on(eventsName.keydown, function(evt) {\n          _manageFocus(evt);\n        });\n      });\n  \n      function _manageFocus(evt) {\n        if (evt.keyCode !== 9) return;\n        /**\n         * On the first focusable element and tab backward,\n         * focus the last element\n         */\n        if (evt.target === lastFocusable && !evt.shiftKey) {\n          evt.preventDefault();\n          firstFocusable.focus();\n        }\n      }\n    },\n    removeTrapFocus: function(options) {\n      var eventName = options.namespace\n        ? 'focusin.' + options.namespace\n        : 'focusin';\n  \n      if (options.container) {\n        options.container.removeAttribute('tabindex');\n      }\n  \n      document.documentElement.off(eventName);\n    },\n  \n    lockMobileScrolling: function(namespace, element) {\n      var el = element ? element : document.documentElement;\n      document.documentElement.classList.add('lock-scroll');\n      el.on('touchmove' + namespace, function() {\n        return true;\n      });\n    },\n  \n    unlockMobileScrolling: function(namespace, element) {\n      document.documentElement.classList.remove('lock-scroll');\n      var el = element ? element : document.documentElement;\n      el.off('touchmove' + namespace);\n    }\n  };\n  \n  // Add class when tab key starts being used to show outlines\n  document.documentElement.on('keyup.tab', function(evt) {\n    if (evt.keyCode === 9) {\n      document.documentElement.classList.add('tab-outline');\n      document.documentElement.off('keyup.tab');\n    }\n  });\n  \n  const trapFocusHandlers = {};\n  \n  /**\n   * Currency Helpers\n   * -----------------------------------------------------------------------------\n   * A collection of useful functions that help with currency formatting\n   *\n   * Current contents\n   * - formatMoney - Takes an amount in cents and returns it as a formatted dollar value.\n   *   - When theme.settings.superScriptPrice is enabled, format cents in <sup> tag\n   * - getBaseUnit - Splits unit price apart to get value + unit\n   *\n   */\n  \n  theme.Currency = (function() {\n    var moneyFormat = '${{amount}}';\n    var superScript = theme && theme.settings && theme.settings.superScriptPrice;\n  \n    function formatMoney(cents, format) {\n      if (!format) {\n        format = theme.settings.moneyFormat;\n      }\n  \n      if (typeof cents === 'string') {\n        cents = cents.replace('.', '');\n      }\n      var value = '';\n      var placeholderRegex = /\\{\\{\\s*(\\w+)\\s*\\}\\}/;\n      var formatString = (format || moneyFormat);\n  \n      function formatWithDelimiters(number, precision, thousands, decimal) {\n        precision = theme.utils.defaultTo(precision, 2);\n        thousands = theme.utils.defaultTo(thousands, ',');\n        decimal = theme.utils.defaultTo(decimal, '.');\n  \n        if (isNaN(number) || number == null) {\n          return 0;\n        }\n  \n        number = (number / 100.0).toFixed(precision);\n  \n        var parts = number.split('.');\n        var dollarsAmount = parts[0].replace(/(\\d)(?=(\\d\\d\\d)+(?!\\d))/g, '$1' + thousands);\n        var centsAmount = parts[1] ? (decimal + parts[1]) : '';\n  \n        return dollarsAmount + centsAmount;\n      }\n  \n      switch (formatString.match(placeholderRegex)[1]) {\n        case 'amount':\n          value = formatWithDelimiters(cents, 2);\n  \n          if (superScript && value && value.includes('.')) {\n            value = value.replace('.', '<sup>') + '</sup>';\n          }\n  \n          break;\n        case 'amount_no_decimals':\n          value = formatWithDelimiters(cents, 0);\n          break;\n        case 'amount_with_comma_separator':\n          value = formatWithDelimiters(cents, 2, '.', ',');\n  \n          if (superScript && value && value.includes(',')) {\n            value = value.replace(',', '<sup>') + '</sup>';\n          }\n  \n          break;\n        case 'amount_no_decimals_with_comma_separator':\n          value = formatWithDelimiters(cents, 0, '.', ',');\n          break;\n        case 'amount_no_decimals_with_space_separator':\n          value = formatWithDelimiters(cents, 0, ' ');\n          break;\n      }\n  \n      return formatString.replace(placeholderRegex, value);\n    }\n  \n    function getBaseUnit(variant) {\n      if (!variant) {\n        return;\n      }\n  \n      if (!variant.unit_price_measurement || !variant.unit_price_measurement.reference_value) {\n        return;\n      }\n  \n      return variant.unit_price_measurement.reference_value === 1\n        ? variant.unit_price_measurement.reference_unit\n        : variant.unit_price_measurement.reference_value +\n            variant.unit_price_measurement.reference_unit;\n    }\n  \n    return {\n      formatMoney: formatMoney,\n      getBaseUnit: getBaseUnit\n    }\n  })();\n  \n  theme.Images = (function() {\n  \n    /**\n     * Find the Shopify image attribute size\n     */\n    function imageSize(src) {\n      if (!src) {\n        return '620x'; // default based on theme\n      }\n  \n      var match = src.match(/.+_((?:pico|icon|thumb|small|compact|medium|large|grande)|\\d{1,4}x\\d{0,4}|x\\d{1,4})[_\\.@]/);\n  \n      if (match !== null) {\n        return match[1];\n      } else {\n        return null;\n      }\n    }\n  \n    /**\n     * Adds a Shopify size attribute to a URL\n     */\n    function getSizedImageUrl(src, size) {\n      if (!src) {\n        return src;\n      }\n  \n      if (size == null) {\n        return src;\n      }\n  \n      if (size === 'master') {\n        return this.removeProtocol(src);\n      }\n  \n      var match = src.match(/\\.(jpg|jpeg|gif|png|bmp|bitmap|tiff|tif)(\\?v=\\d+)?$/i);\n  \n      if (match != null) {\n        var prefix = src.split(match[0]);\n        var suffix = match[0];\n  \n        return this.removeProtocol(prefix[0] + '_' + size + suffix);\n      }\n  \n      return null;\n    }\n  \n    function removeProtocol(path) {\n      return path.replace(/http(s)?:/, '');\n    }\n  \n    function buildImagePath(string, widths) {\n  \n      if (string == null) return [];\n  \n      if (widths) {\n        const imageUrls = [];\n  \n        widths.forEach(width => {\n          let url = `${string}?width=${width}`;\n          if (width === widths[widths.length - 1]) {\n            url += ` ${width}w`\n          } else {\n            url += ` ${width}w,`\n          }\n          imageUrls.push(url);\n        })\n        return imageUrls;\n      } else {\n        return [string];\n      }\n    }\n  \n    return {\n      imageSize: imageSize,\n      getSizedImageUrl: getSizedImageUrl,\n      removeProtocol: removeProtocol,\n      buildImagePath: buildImagePath\n    };\n  })();\n  \n  // Init section function when it's visible, then disable observer\n  theme.initWhenVisible = function (options) {\n    var threshold = options.threshold ? options.threshold : 0\n  \n    var observer = new IntersectionObserver((entries, observer) => {\n      entries.forEach(entry => {\n        if (entry.isIntersecting) {\n          if (typeof options.callback === 'function') {\n            options.callback()\n            observer.unobserve(entry.target)\n          }\n        }\n      })\n    }, { rootMargin: '0px 0px ' + threshold + 'px 0px' })\n  \n    observer.observe(options.element)\n  }\n  \n  theme.LibraryLoader = (function() {\n    var types = {\n      link: 'link',\n      script: 'script'\n    };\n  \n    var status = {\n      requested: 'requested',\n      loaded: 'loaded'\n    };\n  \n    var cloudCdn = 'https://cdn.shopify.com/shopifycloud/';\n  \n    var libraries = {\n      youtubeSdk: {\n        tagId: 'youtube-sdk',\n        src: 'https://www.youtube.com/iframe_api',\n        type: types.script\n      },\n      vimeo: {\n        tagId: 'vimeo-api',\n        src: 'https://player.vimeo.com/api/player.js',\n        type: types.script\n      },\n      shopifyXr: {\n        tagId: 'shopify-model-viewer-xr',\n        src: cloudCdn + 'shopify-xr-js/assets/v1.0/shopify-xr.en.js',\n        type: types.script\n      },\n      modelViewerUi: {\n        tagId: 'shopify-model-viewer-ui',\n        src: cloudCdn + 'model-viewer-ui/assets/v1.0/model-viewer-ui.en.js',\n        type: types.script\n      },\n      modelViewerUiStyles: {\n        tagId: 'shopify-model-viewer-ui-styles',\n        src: cloudCdn + 'model-viewer-ui/assets/v1.0/model-viewer-ui.css',\n        type: types.link\n      }\n    };\n  \n    function load(libraryName, callback) {\n      var library = libraries[libraryName];\n  \n      if (!library) return;\n      if (library.status === status.requested) return;\n  \n      callback = callback || function() {};\n      if (library.status === status.loaded) {\n        callback();\n        return;\n      }\n  \n      library.status = status.requested;\n  \n      var tag;\n  \n      switch (library.type) {\n        case types.script:\n          tag = createScriptTag(library, callback);\n          break;\n        case types.link:\n          tag = createLinkTag(library, callback);\n          break;\n      }\n  \n      tag.id = library.tagId;\n      library.element = tag;\n  \n      var firstScriptTag = document.getElementsByTagName(library.type)[0];\n      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n    }\n  \n    function createScriptTag(library, callback) {\n      var tag = document.createElement('script');\n      tag.src = library.src;\n      tag.addEventListener('load', function() {\n        library.status = status.loaded;\n        callback();\n      });\n      return tag;\n    }\n  \n    function createLinkTag(library, callback) {\n      var tag = document.createElement('link');\n      tag.href = library.src;\n      tag.rel = 'stylesheet';\n      tag.type = 'text/css';\n      tag.addEventListener('load', function() {\n        library.status = status.loaded;\n        callback();\n      });\n      return tag;\n    }\n  \n    return {\n      load: load\n    };\n  })();\n  \n  theme.rteInit = function() {\n    // Wrap tables so they become scrollable on small screens\n    document.querySelectorAll('.rte table').forEach(table => {\n      var wrapWith = document.createElement('div');\n      wrapWith.classList.add('table-wrapper');\n      theme.utils.wrap(table, wrapWith);\n    });\n  \n    // Wrap video iframe embeds so they are responsive\n    document.querySelectorAll('.rte iframe[src*=\"youtube.com/embed\"]').forEach(iframe => {\n      wrapVideo(iframe);\n    });\n    document.querySelectorAll('.rte iframe[src*=\"player.vimeo\"]').forEach(iframe => {\n      wrapVideo(iframe);\n    });\n  \n    function wrapVideo(iframe) {\n      // Reset the src attribute on each iframe after page load\n      // for Chrome's \"incorrect iFrame content on 'back'\" bug.\n      // https://code.google.com/p/chromium/issues/detail?id=395791\n      iframe.src = iframe.src;\n      var wrapWith = document.createElement('div');\n      wrapWith.classList.add('video-wrapper');\n      theme.utils.wrap(iframe, wrapWith);\n    }\n  \n    // Remove CSS that adds animated underline under image links\n    document.querySelectorAll('.rte a img').forEach(img => {\n      img.parentNode.classList.add('rte__image');\n    });\n  }\n  \n  theme.Sections = function Sections() {\n    this.constructors = {};\n    this.instances = [];\n  \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:block:select', this._onBlockSelect.bind(this));\n    document.addEventListener('shopify:block:deselect', this._onBlockDeselect.bind(this));\n  };\n  \n  theme.Sections.prototype = Object.assign({}, theme.Sections.prototype, {\n    _createInstance: function(container, constructor, scope) {\n      var id = container.getAttribute('data-section-id');\n      var type = container.getAttribute('data-section-type');\n  \n      constructor = constructor || this.constructors[type];\n  \n      if (typeof constructor === 'undefined') {\n        return;\n      }\n  \n      // If custom scope passed, check to see if instance\n      // is already initialized so we don't double up\n      if (scope) {\n        var instanceExists = this._findInstance(id);\n        if (instanceExists) {\n          this._removeInstance(id);\n        }\n      }\n  \n      // If a section fails to init, handle the error without letting all subsequest section registers to fail\n      try {\n        var instance = Object.assign(new constructor(container), {\n          id: id,\n          type: type,\n          container: container\n        });\n        this.instances.push(instance);\n      } catch (e) {\n        console.error(e);\n      }\n    },\n  \n    _findInstance: function(id) {\n      for (var i = 0; i < this.instances.length; i++) {\n        if (this.instances[i].id === id) {\n          return this.instances[i];\n        }\n      }\n    },\n  \n    _removeInstance: function(id) {\n      var i = this.instances.length;\n      var instance;\n  \n      while(i--) {\n        if (this.instances[i].id === id) {\n          instance = this.instances[i];\n          this.instances.splice(i, 1);\n          break;\n        }\n      }\n  \n      return instance;\n    },\n  \n    _onSectionLoad: function(evt, subSection, subSectionId) {\n      if (window.AOS) { AOS.refreshHard() }\n      if (theme && theme.initGlobals) {\n        theme.initGlobals();\n      }\n  \n      var container = subSection ? subSection : evt.target;\n      var section = subSection ? subSection : evt.target.querySelector('[data-section-id]');\n  \n      if (!section) {\n        return;\n      }\n  \n      this._createInstance(section);\n  \n      var instance = subSection ? subSectionId : this._findInstance(evt.detail.sectionId);\n  \n      // Check if we have subsections to load\n      var haveSubSections = container.querySelectorAll('[data-subsection]');\n      if (haveSubSections.length) {\n        this.loadSubSections(container);\n      }\n  \n      // Run JS only in case of the section being selected in the editor\n      // before merchant clicks \"Add\"\n      if (instance && typeof instance.onLoad === 'function') {\n        instance.onLoad(evt);\n      }\n  \n      // Force editor to trigger scroll event when loading a section\n      setTimeout(function() {\n        window.dispatchEvent(new Event('scroll'));\n      }, 200);\n    },\n  \n    _onSectionUnload: function(evt) {\n      this.instances = this.instances.filter(function(instance) {\n        var isEventInstance = instance.id === evt.detail.sectionId;\n  \n        if (isEventInstance) {\n          if (typeof instance.onUnload === 'function') {\n            instance.onUnload(evt);\n          }\n        }\n  \n        return !isEventInstance;\n      });\n    },\n  \n    loadSubSections: function(scope) {\n      if (!scope) {\n        return;\n      }\n  \n      var sections = scope.querySelectorAll('[data-section-id]');\n  \n      sections.forEach(el => {\n        this._onSectionLoad(null, el, el.dataset.sectionId);\n      });\n    },\n  \n    _onSelect: function(evt) {\n      var instance = this._findInstance(evt.detail.sectionId);\n  \n      if (\n        typeof instance !== 'undefined' &&\n        typeof instance.onSelect === 'function'\n      ) {\n        instance.onSelect(evt);\n      }\n    },\n  \n    _onDeselect: function(evt) {\n      var instance = this._findInstance(evt.detail.sectionId);\n  \n      if (\n        typeof instance !== 'undefined' &&\n        typeof instance.onDeselect === 'function'\n      ) {\n        instance.onDeselect(evt);\n      }\n    },\n  \n    _onBlockSelect: function(evt) {\n      var instance = this._findInstance(evt.detail.sectionId);\n  \n      if (\n        typeof instance !== 'undefined' &&\n        typeof instance.onBlockSelect === 'function'\n      ) {\n        instance.onBlockSelect(evt);\n      }\n    },\n  \n    _onBlockDeselect: function(evt) {\n      var instance = this._findInstance(evt.detail.sectionId);\n  \n      if (\n        typeof instance !== 'undefined' &&\n        typeof instance.onBlockDeselect === 'function'\n      ) {\n        instance.onBlockDeselect(evt);\n      }\n    },\n  \n    register: function(type, constructor, scope) {\n      this.constructors[type] = constructor;\n  \n      var sections = document.querySelectorAll('[data-section-type=\"' + type + '\"]');\n  \n      if (scope) {\n        sections = scope.querySelectorAll('[data-section-type=\"' + type + '\"]');\n      }\n  \n      sections.forEach(\n        function(container) {\n          this._createInstance(container, constructor, scope);\n        }.bind(this)\n      );\n    },\n  \n    reinit: function(section) {\n      for (var i = 0; i < this.instances.length; i++) {\n        var instance = this.instances[i];\n        if (instance['type'] === section) {\n          if (typeof instance.forceReload === 'function') {\n            instance.forceReload();\n          }\n        }\n      }\n    }\n  });\n  \n  /*\n    Options:\n      container\n      enableHistoryState - enable when on single product page to update URL\n      singleOptionSelector - selector for individual variant option (e.g. 'Blue' or 'Small')\n      originalSelectorId - selector for base variant selector (visually hidden)\n      variants - JSON parsed object of product variant info\n   */\n  theme.Variants = (function() {\n  \n    function Variants(options) {\n      this.container = options.container;\n      this.variants = options.variants;\n      this.singleOptionSelector = options.singleOptionSelector;\n      this.originalSelectorId = options.originalSelectorId;\n      this.enableHistoryState = options.enableHistoryState;\n      this.dynamicVariantsEnabled = options.dynamicVariantsEnabled;\n      this.currentlySelectedValues = this._getCurrentOptions();\n      this.currentVariant = this._getVariantFromOptions();\n  \n      this.container.querySelectorAll(this.singleOptionSelector).forEach(el => {\n        el.addEventListener('change', this._onSelectChange.bind(this));\n      });\n    }\n  \n    Variants.prototype = Object.assign({}, Variants.prototype, {\n  \n      _getCurrentOptions: function() {\n        var result = [];\n  \n        this.container.querySelectorAll(this.singleOptionSelector).forEach(el => {\n          var type = el.getAttribute('type');\n  \n          if (type === 'radio' || type === 'checkbox') {\n            if (el.checked) {\n              result.push({\n                value: el.value,\n                index: el.dataset.index\n              });\n            }\n          } else {\n            result.push({\n              value: el.value,\n              index: el.dataset.index\n            });\n          }\n        });\n  \n        // remove any unchecked input values if using radio buttons or checkboxes\n        result = theme.utils.compact(result);\n  \n        return result;\n      },\n  \n      // Pull the number out of the option index name, e.g. 'option1' -> 1\n      _numberFromOptionKey: function(key) {\n        return parseInt(key.substr(-1));\n      },\n  \n      // Options should be ordered from highest to lowest priority. Make sure that priority\n      // is represented using weighted values when finding best match\n      _getWeightedOptionMatchCount: function(variant) {\n        return this._getCurrentOptions().reduce((count, {value, index}) => {\n          const optionIndex = this._numberFromOptionKey(index);\n          const weightedCount = 4 - optionIndex; // The lower the index, the better the match we have\n          return variant[index] === value ? count + weightedCount : count;\n        },0)\n      },\n  \n      _getFullMatch(needsToBeAvailable) {\n        const currentlySelectedOptions = this._getCurrentOptions();\n        const variants = this.variants;\n  \n        return variants.find(variant => {\n          const isMatch = currentlySelectedOptions.every(({value, index}) => {\n            return variant[index] === value;\n          });\n  \n          if (needsToBeAvailable) {\n            return isMatch && variant.available;\n          } else {\n            return isMatch;\n          }\n        });\n      },\n  \n      // Find a variant that is available and best matches last selected option\n      _getClosestAvailableMatch: function(lastSelectedOption) {\n        if (!lastSelectedOption) return null;\n  \n        const currentlySelectedOptions = this._getCurrentOptions();\n        const variants = this.variants;\n  \n        const potentialAvailableMatches = lastSelectedOption && variants.filter(variant => {\n          return currentlySelectedOptions\n            .filter(\n              // Only match based selected options that are equal and preceeding the last selected option\n              ({value, index}) => this._numberFromOptionKey(index) <= this._numberFromOptionKey(lastSelectedOption.index)\n            ).every(({value, index}) => {\n              // Variant needs to have options that match the current and preceeding selection options\n              return variant[index] === value;\n            }) && variant.available\n        });\n  \n        return potentialAvailableMatches.reduce((bestMatch, variant) => {\n          // If this is the first potential match we've found, store it as the best match\n          if (bestMatch === null) return variant;\n  \n          // If this is not the first potential match, compare the number of options our current best match has in common\n          // compared to the next contender.\n          const bestMatchCount = this._getWeightedOptionMatchCount(bestMatch, lastSelectedOption);\n          const newCount = this._getWeightedOptionMatchCount(variant, lastSelectedOption);\n  \n          return newCount > bestMatchCount ? variant : bestMatch;\n        }, null);\n      },\n  \n      _getVariantFromOptions: function(lastSelectedOption) {\n        const availableFullMatch = this._getFullMatch(true);\n        const closestAvailableMatch = this._getClosestAvailableMatch(lastSelectedOption);\n        const fullMatch = this._getFullMatch(false);\n  \n        if (this.dynamicVariantsEnabled) {\n          // Add some additional smarts to variant matching if Dynamic Variants are enabled\n          return availableFullMatch || closestAvailableMatch || fullMatch || null;\n        } else {\n          // Only return a full match or null (variant doesn't exist) if Dynamic Variants are disabled\n          return fullMatch || null;\n        }\n  \n      },\n  \n      _updateInputState: function (variant, el) {\n        return (input) => {\n          if (variant === null) return;\n  \n          const index = input.dataset.index;\n          const value = input.value;\n          const type = input.getAttribute('type');\n  \n          if (type === 'radio' || type === 'checkbox') {\n            input.checked = variant[index] === value\n            if (input.checked) {\n              input.dispatchEvent(new Event('updateSwatch'));\n            }\n          } else {\n            input.value = variant[index];\n          }\n        }\n      },\n  \n      _onSelectChange: function({srcElement}) {\n        const optionSelectElements = this.container.querySelectorAll(this.singleOptionSelector);\n  \n        // Get the best variant based on the current selection + last selected element\n        const variant = this._getVariantFromOptions({\n          index: srcElement.dataset.index,\n          value: srcElement.value\n        });\n  \n        // Update DOM option input states based on the variant that was found\n        optionSelectElements.forEach(this._updateInputState(variant, srcElement))\n  \n        // Make sure our currently selected values are up to date after updating state of DOM\n        const currentlySelectedValues = this.currentlySelectedValues = this._getCurrentOptions();\n  \n        const detail = {\n          variant,\n          currentlySelectedValues,\n          value: srcElement.value,\n          index: srcElement.parentElement.dataset.index\n        }\n  \n        this.container.dispatchEvent(new CustomEvent('variantChange', {detail}));\n        document.dispatchEvent(new CustomEvent('variant:change', {detail}));\n  \n        if (!variant) {\n          return;\n        }\n  \n        this._updateMasterSelect(variant);\n        this._updateImages(variant);\n        this._updatePrice(variant);\n        this._updateUnitPrice(variant);\n        this._updateSKU(variant);\n        this.currentVariant = variant;\n  \n        if (this.enableHistoryState) {\n          this._updateHistoryState(variant);\n        }\n      },\n  \n      _updateImages: function(variant) {\n        if (!variant.featured_image) {\n          return;\n        }\n  \n        this.container.dispatchEvent(new CustomEvent('variantImageChange', {\n          detail: {\n            variant: variant\n          }\n        }));\n      },\n  \n      _updatePrice: function(variant) {\n        if (this.currentVariant && variant.price === this.currentVariant.price && variant.compare_at_price === this.currentVariant.compare_at_price) {\n          return;\n        }\n  \n        this.container.dispatchEvent(new CustomEvent('variantPriceChange', {\n          detail: {\n            variant: variant\n          }\n        }));\n      },\n  \n      _updateUnitPrice: function(variant) {\n        if (this.currentVariant && variant.unit_price === this.currentVariant.unit_price) {\n          return;\n        }\n  \n        this.container.dispatchEvent(new CustomEvent('variantUnitPriceChange', {\n          detail: {\n            variant: variant\n          }\n        }));\n      },\n  \n      _updateSKU: function(variant) {\n        if (this.currentVariant && variant.sku === this.currentVariant.sku) {\n          return;\n        }\n  \n        this.container.dispatchEvent(new CustomEvent('variantSKUChange', {\n          detail: {\n            variant: variant\n          }\n        }));\n      },\n  \n      _updateHistoryState: function(variant) {\n        if (!history.replaceState || !variant) {\n          return;\n        }\n  \n        var newurl = window.location.protocol + '//' + window.location.host + window.location.pathname + '?variant=' + variant.id;\n        window.history.replaceState({path: newurl}, '', newurl);\n      },\n  \n      _updateMasterSelect: function(variant) {\n        let masterSelect = this.container.querySelector(this.originalSelectorId);\n        if (!masterSelect) return;\n  \n        masterSelect.value = variant.id;\n        // Force a change event so Shop Pay installments works after a variant is changed\n        masterSelect.dispatchEvent(new Event('change', { bubbles: true }));\n      }\n    });\n  \n    return Variants;\n  })();\n  \n  window.vimeoApiReady = function () {\n    theme.config.vimeoLoading = true\n  \n    // Because there's no way to check for the Vimeo API being loaded\n    // asynchronously, we use this terrible timeout to wait for it being ready\n    checkIfVimeoIsReady()\n      .then(function () {\n        theme.config.vimeoReady = true\n        theme.config.vimeoLoading = false\n        document.dispatchEvent(new CustomEvent('vimeoReady'))\n      })\n  }\n  \n  function checkIfVimeoIsReady () {\n    let wait\n    let timeout\n  \n    return new Promise((resolve, reject) => {\n      wait = setInterval(function () {\n        if (!Vimeo) {\n          return\n        }\n  \n        clearInterval(wait)\n        clearTimeout(timeout)\n        resolve()\n      }, 500)\n  \n      timeout = setTimeout(function () {\n        clearInterval(wait)\n        reject()\n      }, 4000) // subjective. test up to 8 times over 4 seconds\n    })\n  }\n  \n  theme.VimeoPlayer = (function () {\n    const classes = {\n      loading: 'loading',\n      loaded: 'loaded',\n      interactable: 'video-interactable'\n    }\n  \n    const defaults = {\n      byline: false,\n      loop: true,\n      muted: true,\n      playsinline: true,\n      portrait: false,\n      title: false\n    }\n  \n    function VimeoPlayer (divId, videoId, options) {\n      this.divId = divId\n      this.el = document.getElementById(divId)\n      this.videoId = videoId\n      this.iframe = null\n      this.options = options\n  \n      if (this.options && this.options.videoParent) {\n        this.parent = this.el.closest(this.options.videoParent)\n      }\n  \n      this.setAsLoading()\n  \n      if (theme.config.vimeoReady) {\n        this.init()\n      } else {\n        theme.LibraryLoader.load('vimeo', window.vimeoApiReady)\n        document.addEventListener('vimeoReady', this.init.bind(this))\n      }\n    }\n  \n    VimeoPlayer.prototype = Object.assign({}, VimeoPlayer.prototype, {\n      init: function () {\n        const args = defaults\n        args.id = this.videoId\n  \n        this.videoPlayer = new Vimeo.Player(this.el, args)\n  \n        this.videoPlayer.ready().then(this.playerReady.bind(this))\n      },\n  \n      playerReady: function () {\n        this.iframe = this.el.querySelector('iframe')\n        this.iframe.setAttribute('tabindex', '-1')\n  \n        if (this.options.loop === 'false') {\n          this.videoPlayer.setLoop(false)\n        }\n  \n        // When sound is enabled in section settings,\n        // for some mobile browsers Vimeo video playback\n        // will stop immediately after starting and\n        // will require users to tap the play button once more\n        if (this.options.style === 'sound') {\n          this.videoPlayer.setVolume(1)\n        } else {\n          this.videoPlayer.setVolume(0)\n        }\n  \n        this.setAsLoaded()\n  \n        // pause when out of view\n        const observer = new IntersectionObserver((entries, observer) => {\n          entries.forEach(entry => {\n            if (entry.isIntersecting) {\n              this.play()\n            } else {\n              this.pause()\n            }\n          })\n        }, { rootMargin: '0px 0px 50px 0px' })\n  \n        observer.observe(this.iframe)\n      },\n  \n      setAsLoading: function () {\n        if (!this.parent) return\n        this.parent.classList.add(classes.loading)\n      },\n  \n      setAsLoaded: function () {\n        if (!this.parent) return\n        this.parent.classList.remove(classes.loading)\n        this.parent.classList.add(classes.loaded)\n        this.parent.classList.add(classes.interactable) // Once video is loaded, we should be able to interact with it\n        if (Shopify && Shopify.designMode) {\n          if (window.AOS) {AOS.refreshHard()}\n        }\n      },\n  \n      enableInteraction: function () {\n        if (!this.parent) return\n        this.parent.classList.add(classes.interactable)\n      },\n  \n      play: function () {\n        if (this.videoPlayer && typeof this.videoPlayer.play === 'function') {\n          this.videoPlayer.play()\n        }\n      },\n  \n      pause: function () {\n        if (this.videoPlayer && typeof this.videoPlayer.pause === 'function') {\n          this.videoPlayer.pause()\n        }\n      },\n  \n      destroy: function () {\n        if (this.videoPlayer && typeof this.videoPlayer.destroy === 'function') {\n          this.videoPlayer.destroy()\n        }\n      }\n    })\n  \n    return VimeoPlayer\n  })()\n  \n  window.onYouTubeIframeAPIReady = function() {\n    theme.config.youTubeReady = true;\n    document.dispatchEvent(new CustomEvent('youTubeReady'));\n  }\n  \n  /*============================================================================\n    YouTube SDK method\n    Parameters:\n      - player div id (required)\n      - arguments\n        - videoId (required)\n        - videoParent (selector, optional for section loading state)\n        - events (object, optional)\n  ==============================================================================*/\n  theme.YouTube = (function() {\n    var classes = {\n      loading: 'loading',\n      loaded: 'loaded',\n      interactable: 'video-interactable'\n    }\n  \n    var defaults = {\n      width: 1280,\n      height: 720,\n      playerVars: {\n        autohide: 0,\n        autoplay: 1,\n        cc_load_policy: 0,\n        controls: 0,\n        fs: 0,\n        iv_load_policy: 3,\n        modestbranding: 1,\n        playsinline: 1,\n        rel: 0\n      }\n    };\n  \n    function YouTube(divId, options) {\n      this.divId = divId;\n      this.iframe = null;\n  \n      this.attemptedToPlay = false;\n  \n      // API callback events\n      defaults.events = {\n        onReady: this.onVideoPlayerReady.bind(this),\n        onStateChange: this.onVideoStateChange.bind(this)\n      };\n  \n      this.options = Object.assign({}, defaults, options);\n  \n      if (this.options) {\n        if (this.options.videoParent) {\n          this.parent = document.getElementById(this.divId).closest(this.options.videoParent);\n        }\n  \n        // Most YT videos will autoplay. If in product media,\n        // will handle in theme.Product instead\n        if (!this.options.autoplay) {\n          this.options.playerVars.autoplay = this.options.autoplay;\n        }\n  \n        if (this.options.style === 'sound') {\n          this.options.playerVars.controls = 1;\n          this.options.playerVars.autoplay = 0;\n        }\n  \n      }\n  \n      this.setAsLoading();\n  \n      if (theme.config.youTubeReady) {\n        this.init();\n      } else {\n        theme.LibraryLoader.load('youtubeSdk');\n        document.addEventListener('youTubeReady', this.init.bind(this));\n      }\n    }\n  \n    YouTube.prototype = Object.assign({}, YouTube.prototype, {\n      init: function() {\n        this.videoPlayer = new YT.Player(this.divId, this.options);\n      },\n  \n      onVideoPlayerReady: function(evt) {\n        this.iframe = document.getElementById(this.divId); // iframe once YT loads\n        this.iframe.setAttribute('tabindex', '-1');\n  \n        if (this.options.style !== 'sound') {\n          evt.target.mute();\n        }\n  \n        // pause when out of view\n        var observer = new IntersectionObserver((entries, observer) => {\n          entries.forEach(entry => {\n            if (entry.isIntersecting) {\n              this.play();\n            } else {\n              this.pause();\n            }\n          });\n        }, {rootMargin: '0px 0px 50px 0px'});\n  \n        observer.observe(this.iframe);\n      },\n  \n      onVideoStateChange: function(evt) {\n        switch (evt.data) {\n          case -1: // unstarted\n            // Handle low power state on iOS by checking if\n            // video is reset to unplayed after attempting to buffer\n            if (this.attemptedToPlay) {\n              this.setAsLoaded();\n              this.enableInteraction();\n            }\n            break;\n          case 0: // ended, loop it\n            this.play(evt);\n            break;\n          case 1: // playing\n            this.setAsLoaded();\n            break;\n          case 3: // buffering\n            this.attemptedToPlay = true;\n            break;\n        }\n      },\n  \n      setAsLoading: function() {\n        if (!this.parent) return;\n        this.parent.classList.add(classes.loading);\n      },\n  \n      setAsLoaded: function() {\n        if (!this.parent) return;\n        this.parent.classList.remove(classes.loading);\n        this.parent.classList.add(classes.loaded);\n        if (Shopify && Shopify.designMode) {\n          if (window.AOS) {AOS.refreshHard()}\n        }\n      },\n  \n      enableInteraction: function() {\n        if (!this.parent) return;\n        this.parent.classList.add(classes.interactable);\n      },\n  \n      play: function() {\n        if (this.videoPlayer && typeof this.videoPlayer.playVideo === 'function') {\n          this.videoPlayer.playVideo();\n        }\n      },\n  \n      pause: function() {\n        if (this.videoPlayer && typeof this.videoPlayer.pauseVideo === 'function') {\n          this.videoPlayer.pauseVideo();\n        }\n      },\n  \n      destroy: function() {\n        if (this.videoPlayer && typeof this.videoPlayer.destroy === 'function') {\n          this.videoPlayer.destroy();\n        }\n      }\n    });\n  \n    return YouTube;\n  })();\n  \n  // Prevent vertical scroll while using flickity sliders\n  (function() {\n    var e = !1;\n    var t;\n  \n    document.body.addEventListener('touchstart', function(i) {\n      if (!i.target.closest('.flickity-slider')) {\n        return e = !1;\n        void 0;\n      }\n      e = !0;\n      t = {\n        x: i.touches[0].pageX,\n        y: i.touches[0].pageY\n      }\n    })\n  \n    document.body.addEventListener('touchmove', function(i) {\n      if (e && i.cancelable) {\n        var n = {\n          x: i.touches[0].pageX - t.x,\n          y: i.touches[0].pageY - t.y\n        };\n        Math.abs(n.x) > Flickity.defaults.dragThreshold && i.preventDefault()\n      }\n    }, { passive: !1 })\n  })();\n  \n\n  /**\n   * Ajax Renderer\n   * -----------------------------------------------------------------------------\n   * Render sections without reloading the page.\n   * @param {Object[]} sections - The section to update on render.\n   * @param {string} sections[].sectionId - The ID of the section from Shopify.\n   * @param {string} sections[].nodeId - The ID of the DOM node to replace.\n   * @param {Function} sections[].onReplace (optional) - The custom render function.\n   * @param {boolean} debug - Output logs to console for debugging.\n   *\n   */\n  \n  theme.AjaxRenderer = (function () {\n    function AjaxRenderer({ sections, onReplace, debug } = {}) {\n      this.sections = sections || [];\n      this.cachedSections = [];\n      this.onReplace = onReplace;\n      this.debug = Boolean(debug);\n    }\n  \n    AjaxRenderer.prototype = Object.assign({}, AjaxRenderer.prototype, {\n      renderPage: function (basePath, newParams, updateURLHash = true) {\n        const currentParams = new URLSearchParams(window.location.search);\n        const updatedParams = this.getUpdatedParams(currentParams, newParams)\n  \n        const sectionRenders = this.sections.map(section => {\n  \n          const url = `${basePath}?section_id=${section.sectionId}&${updatedParams.toString()}`;\n          const cachedSectionUrl = cachedSection => cachedSection.url === url;\n  \n          return this.cachedSections.some(cachedSectionUrl)\n            ? this.renderSectionFromCache(cachedSectionUrl, section)\n            : this.renderSectionFromFetch(url, section);\n        });\n  \n        if (updateURLHash) this.updateURLHash(updatedParams);\n  \n        return Promise.all(sectionRenders);\n      },\n  \n      renderSectionFromCache: function (url, section) {\n        const cachedSection = this.cachedSections.find(url);\n  \n        this.log(`[AjaxRenderer] rendering from cache: url=${cachedSection.url}`);\n        this.renderSection(cachedSection.html, section);\n        return Promise.resolve(section);\n      },\n  \n      renderSectionFromFetch: function (url, section) {\n        this.log(`[AjaxRenderer] redering from fetch: url=${url}`);\n  \n        return new Promise((resolve, reject) => {\n          fetch(url)\n            .then(response => response.text())\n            .then(responseText => {\n              const html = responseText;\n              this.cachedSections = [...this.cachedSections, { html, url }];\n              this.renderSection(html, section);\n              resolve(section);\n            })\n            .catch(err => reject(err));\n        });\n      },\n  \n      renderSection: function (html, section) {\n        this.log(\n          `[AjaxRenderer] rendering section: section=${JSON.stringify(section)}`,\n        );\n  \n        const newDom = new DOMParser().parseFromString(html, 'text/html');\n        if (this.onReplace) {\n          this.onReplace(newDom, section);\n        } else {\n          if (typeof section.nodeId === 'string') {\n            var newContentEl = newDom.getElementById(section.nodeId);\n            if (!newContentEl) {\n              return;\n            }\n  \n            document.getElementById(section.nodeId).innerHTML =\n              newContentEl.innerHTML;\n          } else {\n            section.nodeId.forEach(id => {\n              document.getElementById(id).innerHTML =\n                newDom.getElementById(id).innerHTML;\n            });\n          }\n        }\n  \n        return section;\n      },\n  \n      getUpdatedParams: function (currentParams, newParams) {\n        const clone = new URLSearchParams(currentParams);\n        const preservedParams = ['sort_by', 'q', 'options[prefix]', 'type'];\n  \n        // Find what params need to be removed\n        // delete happens first as we cannot specify keys based off of values\n        for (const [key, value] of clone.entries()) {\n          if (!newParams.getAll(key).includes(value) && !preservedParams.includes(key)) {\n            clone.delete(key);\n          };\n        }\n  \n        // Find what params need to be added\n        for (const [key, value] of newParams.entries()) {\n          if (!clone.getAll(key).includes(value) && value !== '') {\n            clone.append(key, value);\n          }\n        }\n  \n        return clone;\n      },\n  \n      updateURLHash: function (searchParams) {\n        history.pushState(\n          {},\n          '',\n          `${window.location.pathname}${\n            searchParams && '?'.concat(searchParams)\n          }`,\n        );\n      },\n  \n      log: function (...args) {\n        if (this.debug) {\n          console.log(...args);\n        }\n      },\n    });\n  \n    return AjaxRenderer;\n  })();\n  \n  if (window.Shopify && window.Shopify.theme && navigator && navigator.sendBeacon && window.Shopify.designMode) {\n    navigator.sendBeacon('https://api.archetypethemes.co/api/beacon', new URLSearchParams({\n      shop: window.Shopify.shop,\n      themeName: window.theme && window.theme.settings && `${window.theme.settings.themeName} v${window.theme.settings.themeVersion}`,\n      role: window.Shopify.theme.role,\n      route: window.location.pathname,\n      themeId: window.Shopify.theme.id,\n      themeStoreId: window.Shopify.theme.theme_store_id || 0,\n      isThemeEditor: !!window.Shopify.designMode\n    }))\n  }\n  theme.cart = {\n    getCart: function() {\n      var url = ''.concat(theme.routes.cart, '?t=').concat(Date.now());\n      return fetch(url, {\n        credentials: 'same-origin',\n        method: 'GET'\n      }).then(response => response.json());\n    },\n  \n    getCartProductMarkup: function() {\n      var url = ''.concat(theme.routes.cartPage, '?t=').concat(Date.now());\n  \n      url = url.indexOf('?') === -1 ? (url + '?view=ajax') : (url + '&view=ajax');\n  \n      return fetch(url, {\n        credentials: 'same-origin',\n        method: 'GET'\n      })\n      .then(response => response.text())\n      .catch(e => console.error(e));\n    },\n  \n    changeItem: function(key, qty) {\n  \n      return this._updateCart({\n        url: ''.concat(theme.routes.cartChange, '?t=').concat(Date.now()),\n        data: JSON.stringify({\n          id: key,\n          quantity: qty\n        })\n      })\n    },\n  \n    _updateCart: function(params) {\n      return fetch(params.url, {\n        method: 'POST',\n        body: params.data,\n        credentials: 'same-origin',\n        headers: {\n          'Content-Type': 'application/json',\n          'X-Requested-With': 'XMLHttpRequest',\n          'Accept': 'application/json'\n        }\n      })\n      .then(response => { return response.text() })\n      .then(cart => { return cart; });\n    },\n  \n    updateAttribute: function(key, value) {\n      return this._updateCart({\n        url: '/cart/update.js',\n        data: JSON.stringify({\n          attributes: {\n            [key]: theme.cart.attributeToString(value)\n          }\n        })\n      });\n    },\n  \n    updateNote: function(note) {\n      return this._updateCart({\n        url: '/cart/update.js',\n        data: JSON.stringify({\n          note: theme.cart.attributeToString(note)\n        })\n      });\n    },\n  \n    attributeToString: function(attribute) {\n      if ((typeof attribute) !== 'string') {\n        attribute += '';\n        if (attribute === 'undefined') {\n          attribute = '';\n        }\n      }\n      return attribute.trim();\n    }\n  }\n  \n  /*============================================================================\n    CartForm\n    - Prevent checkout when terms checkbox exists\n    - Listen to quantity changes, rebuild cart (both widget and page)\n  ==============================================================================*/\n  theme.CartForm = (function() {\n    var selectors = {\n      products: '[data-products]',\n      qtySelector: '.js-qty__wrapper',\n      discounts: '[data-discounts]',\n      savings: '[data-savings]',\n      subTotal: '[data-subtotal]',\n  \n      cartBubble: '.cart-link__bubble',\n      cartNote: '[name=\"note\"]',\n      termsCheckbox: '.cart__terms-checkbox',\n      checkoutBtn: '.cart__checkout'\n    };\n  \n    var classes = {\n      btnLoading: 'btn--loading'\n    };\n  \n    var config = {\n      requiresTerms: false\n    };\n  \n    function CartForm(form) {\n      if (!form) {\n        return;\n      }\n  \n      this.form = form;\n      this.wrapper = form.parentNode;\n      this.location = form.dataset.location;\n      this.namespace = '.cart-' + this.location;\n      this.products = form.querySelector(selectors.products)\n      this.submitBtn = form.querySelector(selectors.checkoutBtn);\n  \n      this.discounts = form.querySelector(selectors.discounts);\n      this.savings = form.querySelector(selectors.savings);\n      this.subtotal = form.querySelector(selectors.subTotal);\n      this.termsCheckbox = form.querySelector(selectors.termsCheckbox);\n      this.noteInput = form.querySelector(selectors.cartNote);\n  \n      this.cartItemsUpdated = false;\n  \n      if (this.termsCheckbox) {\n        config.requiresTerms = true;\n      }\n  \n      this.init();\n    }\n  \n    CartForm.prototype = Object.assign({}, CartForm.prototype, {\n      init: function() {\n        this.initQtySelectors();\n  \n        document.addEventListener('cart:quantity' + this.namespace, this.quantityChanged.bind(this));\n  \n        this.form.on('submit' + this.namespace, this.onSubmit.bind(this));\n  \n        if (this.noteInput) {\n          this.noteInput.addEventListener('change', function() {\n            var newNote = this.value;\n            theme.cart.updateNote(newNote);\n          });\n        }\n  \n        // Dev-friendly way to build the cart\n        document.addEventListener('cart:build', function() {\n          this.buildCart();\n        }.bind(this));\n      },\n  \n      reInit: function() {\n        this.initQtySelectors();\n      },\n  \n      onSubmit: function(evt) {\n        this.submitBtn.classList.add(classes.btnLoading);\n  \n        /*\n          Checks for drawer or cart open class on body element\n          and then stops the form from being submitted. We are also\n          checking against a custom property, this.cartItemsUpdated = false.\n  \n          Error is handled in the quantityChanged method\n  \n          For Expanse/Fetch/Gem quick add, if an error is present it is alerted\n          through the add to cart fetch request in quick-add.js.\n  \n          Custom property this.cartItemsUpdated = false is reset in cart-drawer.js for\n          Expanse/Fetch/Gem when using quick add\n        */\n  \n        if (document.documentElement.classList.contains('js-drawer-open') && this.cartItemsUpdated ||\n          document.documentElement.classList.contains('cart-open') && this.cartItemsUpdated) {\n          this.submitBtn.classList.remove(classes.btnLoading);\n          evt.preventDefault();\n          return false;\n        }\n  \n        if (config.requiresTerms) {\n          if (this.termsCheckbox.checked) {\n            // continue to checkout\n          } else {\n            alert(theme.strings.cartTermsConfirmation);\n            this.submitBtn.classList.remove(classes.btnLoading)\n            evt.preventDefault();\n            return false;\n          }\n        }\n      },\n  \n      /*============================================================================\n        Query cart page to get markup\n      ==============================================================================*/\n      _parseProductHTML: function(text) {\n        const html = document.createElement('div');\n        html.innerHTML = text;\n  \n        return {\n          items: html.querySelector('.cart__items'),\n          discounts: html.querySelector('.cart__discounts')\n        }\n      },\n  \n      buildCart: function() {\n        theme.cart.getCartProductMarkup().then(this.cartMarkup.bind(this));\n      },\n  \n      cartMarkup: function(text) {\n        var markup = this._parseProductHTML(text);\n        var items = markup.items;\n        var count = parseInt(items.dataset.count);\n        var subtotal = items.dataset.cartSubtotal;\n        var savings = items.dataset.cartSavings;\n  \n        this.updateCartDiscounts(markup.discounts);\n        this.updateSavings(savings);\n  \n        if (count > 0) {\n          this.wrapper.classList.remove('is-empty');\n        } else {\n          this.wrapper.classList.add('is-empty');\n        }\n  \n        this.updateCount(count);\n  \n        // Append item markup\n        this.products.innerHTML = '';\n        this.products.append(items);\n  \n        // Update subtotal\n        this.subtotal.innerHTML = theme.Currency.formatMoney(subtotal, theme.settings.moneyFormat);\n  \n        this.reInit();\n  \n        if (window.AOS) { AOS.refreshHard() }\n  \n        if (Shopify && Shopify.StorefrontExpressButtons) {\n          Shopify.StorefrontExpressButtons.initialize();\n        }\n      },\n  \n      updateCartDiscounts: function(markup) {\n        if (!this.discounts) {\n          return;\n        }\n        this.discounts.innerHTML = '';\n        this.discounts.append(markup);\n      },\n  \n      /*============================================================================\n        Quantity handling\n      ==============================================================================*/\n      initQtySelectors: function() {\n        this.form.querySelectorAll(selectors.qtySelector).forEach(el => {\n          var selector = new theme.QtySelector(el, {\n            namespace: this.namespace,\n            isCart: true\n          });\n        });\n      },\n  \n      quantityChanged: function(evt) {\n        var key = evt.detail[0];\n        var qty = evt.detail[1];\n        var el = evt.detail[2];\n  \n        if (!key || !qty) {\n          return;\n        }\n  \n        // Disable qty selector so multiple clicks can't happen while loading\n        if (el) {\n          el.classList.add('is-loading');\n        }\n  \n        theme.cart.changeItem(key, qty)\n          .then(function(cart) {\n  \n            const parsedCart = JSON.parse(cart);\n  \n            if (parsedCart.status === 422) {\n              alert(parsedCart.message);\n            } else {\n              const updatedItem = parsedCart.items.find(item => item.key === key);\n  \n              // Update cartItemsUpdated property on object so we can reference later\n              if (updatedItem && (evt.type === 'cart:quantity.cart-cart-drawer' || evt.type === 'cart:quantity.cart-header')) {\n                this.cartItemsUpdated = true;\n              }\n  \n              if ((updatedItem && evt.type === 'cart:quantity.cart-cart-drawer') || (updatedItem && evt.type === 'cart:quantity.cart-header')) {\n                if (updatedItem.quantity !== qty) {\n                }\n                // Reset property on object so that checkout button will work as usual\n                this.cartItemsUpdated = false;\n              }\n  \n              if (parsedCart.item_count > 0) {\n                this.wrapper.classList.remove('is-empty');\n              } else {\n                this.wrapper.classList.add('is-empty');\n              }\n            }\n  \n            this.buildCart();\n  \n            document.dispatchEvent(new CustomEvent('cart:updated', {\n              detail: {\n                cart: parsedCart\n              }\n            }));\n          }.bind(this))\n          .catch(function(XMLHttpRequest){});\n      },\n  \n      /*============================================================================\n        Update elements of the cart\n      ==============================================================================*/\n      updateSubtotal: function(subtotal) {\n        this.form.querySelector(selectors.subTotal).innerHTML = theme.Currency.formatMoney(subtotal, theme.settings.moneyFormat);\n      },\n  \n      updateSavings: function(savings) {\n        if (!this.savings) {\n          return;\n        }\n  \n        if (savings > 0) {\n          var amount = theme.Currency.formatMoney(savings, theme.settings.moneyFormat);\n          this.savings.classList.remove('hide');\n          this.savings.innerHTML = theme.strings.cartSavings.replace('[savings]', amount);\n        } else {\n          this.savings.classList.add('hide');\n        }\n      },\n  \n      updateCount: function(count) {\n        var countEls = document.querySelectorAll('.cart-link__bubble-num');\n  \n        if (countEls.length) {\n          countEls.forEach(el => {\n            el.innerText = count;\n          });\n        }\n  \n        // show/hide bubble(s)\n        var bubbles = document.querySelectorAll(selectors.cartBubble);\n        if (bubbles.length) {\n          if (count > 0) {\n            bubbles.forEach(b => {\n              b.classList.add('cart-link__bubble--visible');\n            });\n          } else {\n            bubbles.forEach(b => {\n              b.classList.remove('cart-link__bubble--visible');\n            });\n          }\n        }\n      }\n    });\n  \n    return CartForm;\n  })();\n  \n  // Either collapsible containers all acting individually,\n  // or tabs that can only have one open at a time\n  theme.collapsibles = (function() {\n    var selectors = {\n      trigger: '.collapsible-trigger',\n      module: '.collapsible-content',\n      moduleInner: '.collapsible-content__inner',\n      tabs: '.collapsible-trigger--tab'\n    };\n  \n    var classes = {\n      hide: 'hide',\n      open: 'is-open',\n      autoHeight: 'collapsible--auto-height',\n      tabs: 'collapsible-trigger--tab'\n    };\n  \n    var namespace = '.collapsible';\n  \n    var isTransitioning = false;\n  \n    function init(scope) {\n      var el = scope ? scope : document;\n      el.querySelectorAll(selectors.trigger).forEach(trigger => {\n        var state = trigger.classList.contains(classes.open);\n        trigger.setAttribute('aria-expanded', state);\n  \n        trigger.off('click' + namespace);\n        trigger.on('click' + namespace, toggle);\n      });\n    }\n  \n    function toggle(evt) {\n      if (isTransitioning) {\n        return;\n      }\n  \n      isTransitioning = true;\n  \n      var el = evt.currentTarget;\n      var isOpen = el.classList.contains(classes.open);\n      var isTab = el.classList.contains(classes.tabs);\n      var moduleId = el.getAttribute('aria-controls');\n      var container = document.getElementById(moduleId);\n  \n      if (!moduleId) {\n        moduleId = el.dataset.controls;\n      }\n  \n      // No ID, bail\n      if (!moduleId) {\n        return;\n      }\n  \n      // If container=null, there isn't a matching ID.\n      // Check if data-id is set instead. Could be multiple.\n      // Select based on being in the same parent div.\n      if (!container) {\n        var multipleMatches = document.querySelectorAll('[data-id=\"' + moduleId + '\"]');\n        if (multipleMatches.length > 0) {\n          container = el.parentNode.querySelector('[data-id=\"' + moduleId + '\"]');\n        }\n      }\n  \n      if (!container) {\n        isTransitioning = false;\n        return;\n      }\n  \n      var height = container.querySelector(selectors.moduleInner).offsetHeight;\n      var isAutoHeight = container.classList.contains(classes.autoHeight);\n      var parentCollapsibleEl = container.parentNode.closest(selectors.module);\n      var childHeight = height;\n  \n      if (isTab) {\n        if(isOpen) {\n          isTransitioning = false;\n          return;\n        }\n  \n        var newModule;\n        document.querySelectorAll(selectors.tabs + '[data-id=\"'+ el.dataset.id +'\"]').forEach(el => {\n          el.classList.remove(classes.open);\n          newModule = document.querySelector('#' + el.getAttribute('aria-controls'));\n          setTransitionHeight(newModule, 0, true);\n        });\n      }\n  \n      // If isAutoHeight, set the height to 0 just after setting the actual height\n      // so the closing animation works nicely\n      if (isOpen && isAutoHeight) {\n        setTimeout(function() {\n          height = 0;\n          setTransitionHeight(container, height, isOpen, isAutoHeight);\n        }, 0);\n      }\n  \n      if (isOpen && !isAutoHeight) {\n        height = 0;\n      }\n  \n      el.setAttribute('aria-expanded', !isOpen);\n      if (isOpen) {\n        el.classList.remove(classes.open);\n      } else {\n        el.classList.add(classes.open);\n      }\n  \n      setTransitionHeight(container, height, isOpen, isAutoHeight);\n  \n      // If we are in a nested collapsible element like the mobile nav,\n      // also set the parent element's height\n      if (parentCollapsibleEl) {\n        var parentHeight = parentCollapsibleEl.style.height;\n  \n        if (isOpen && parentHeight === 'auto') {\n          childHeight = 0; // Set childHeight to 0 if parent is initially opened\n        }\n  \n        var totalHeight = isOpen\n                        ? parentCollapsibleEl.offsetHeight - childHeight\n                        : height + parentCollapsibleEl.offsetHeight;\n  \n        setTransitionHeight(parentCollapsibleEl, totalHeight, false, false);\n      }\n    }\n  \n    function setTransitionHeight(container, height, isOpen, isAutoHeight) {\n      container.classList.remove(classes.hide);\n      theme.utils.prepareTransition(container, function() {\n  \n        container.style.height = height+'px';\n        if (isOpen) {\n          container.classList.remove(classes.open);\n        } else {\n          container.classList.add(classes.open);\n        }\n      });\n  \n      if (!isOpen && isAutoHeight) {\n        var o = container;\n        window.setTimeout(function() {\n          o.css('height','auto');\n          isTransitioning = false;\n        }, 500);\n      } else {\n        isTransitioning = false;\n      }\n    }\n  \n    return {\n      init: init\n    };\n  })();\n  \n  // Shopify-built select-like popovers for currency and language selection\n  theme.Disclosure = (function() {\n    var selectors = {\n      disclosureForm: '[data-disclosure-form]',\n      disclosureList: '[data-disclosure-list]',\n      disclosureToggle: '[data-disclosure-toggle]',\n      disclosureInput: '[data-disclosure-input]',\n      disclosureOptions: '[data-disclosure-option]'\n    };\n  \n    var classes = {\n      listVisible: 'disclosure-list--visible'\n    };\n  \n    function Disclosure(disclosure) {\n      this.container = disclosure;\n      this._cacheSelectors();\n      this._setupListeners();\n    }\n  \n    Disclosure.prototype = Object.assign({}, Disclosure.prototype, {\n      _cacheSelectors: function() {\n        this.cache = {\n          disclosureForm: this.container.closest(selectors.disclosureForm),\n          disclosureList: this.container.querySelector(selectors.disclosureList),\n          disclosureToggle: this.container.querySelector(\n            selectors.disclosureToggle\n          ),\n          disclosureInput: this.container.querySelector(\n            selectors.disclosureInput\n          ),\n          disclosureOptions: this.container.querySelectorAll(\n            selectors.disclosureOptions\n          )\n        };\n      },\n  \n      _setupListeners: function() {\n        this.eventHandlers = this._setupEventHandlers();\n  \n        this.cache.disclosureToggle.addEventListener(\n          'click',\n          this.eventHandlers.toggleList\n        );\n  \n        this.cache.disclosureOptions.forEach(function(disclosureOption) {\n          disclosureOption.addEventListener(\n            'click',\n            this.eventHandlers.connectOptions\n          );\n        }, this);\n  \n        this.container.addEventListener(\n          'keyup',\n          this.eventHandlers.onDisclosureKeyUp\n        );\n  \n        this.cache.disclosureList.addEventListener(\n          'focusout',\n          this.eventHandlers.onDisclosureListFocusOut\n        );\n  \n        this.cache.disclosureToggle.addEventListener(\n          'focusout',\n          this.eventHandlers.onDisclosureToggleFocusOut\n        );\n  \n        document.body.addEventListener('click', this.eventHandlers.onBodyClick);\n      },\n  \n      _setupEventHandlers: function() {\n        return {\n          connectOptions: this._connectOptions.bind(this),\n          toggleList: this._toggleList.bind(this),\n          onBodyClick: this._onBodyClick.bind(this),\n          onDisclosureKeyUp: this._onDisclosureKeyUp.bind(this),\n          onDisclosureListFocusOut: this._onDisclosureListFocusOut.bind(this),\n          onDisclosureToggleFocusOut: this._onDisclosureToggleFocusOut.bind(this)\n        };\n      },\n  \n      _connectOptions: function(event) {\n        event.preventDefault();\n  \n        this._submitForm(event.currentTarget.dataset.value);\n      },\n  \n      _onDisclosureToggleFocusOut: function(event) {\n        var disclosureLostFocus =\n          this.container.contains(event.relatedTarget) === false;\n  \n        if (disclosureLostFocus) {\n          this._hideList();\n        }\n      },\n  \n      _onDisclosureListFocusOut: function(event) {\n        var childInFocus = event.currentTarget.contains(event.relatedTarget);\n  \n        var isVisible = this.cache.disclosureList.classList.contains(\n          classes.listVisible\n        );\n  \n        if (isVisible && !childInFocus) {\n          this._hideList();\n        }\n      },\n  \n      _onDisclosureKeyUp: function(event) {\n        if (event.which !== 27) return;\n        this._hideList();\n        this.cache.disclosureToggle.focus();\n      },\n  \n      _onBodyClick: function(event) {\n        var isOption = this.container.contains(event.target);\n        var isVisible = this.cache.disclosureList.classList.contains(\n          classes.listVisible\n        );\n  \n        if (isVisible && !isOption) {\n          this._hideList();\n        }\n      },\n  \n      _submitForm: function(value) {\n        this.cache.disclosureInput.value = value;\n        this.cache.disclosureForm.submit();\n      },\n  \n      _hideList: function() {\n        this.cache.disclosureList.classList.remove(classes.listVisible);\n        this.cache.disclosureToggle.setAttribute('aria-expanded', false);\n      },\n  \n      _toggleList: function() {\n        var ariaExpanded =\n          this.cache.disclosureToggle.getAttribute('aria-expanded') === 'true';\n        this.cache.disclosureList.classList.toggle(classes.listVisible);\n        this.cache.disclosureToggle.setAttribute('aria-expanded', !ariaExpanded);\n      },\n  \n      destroy: function() {\n        this.cache.disclosureToggle.removeEventListener(\n          'click',\n          this.eventHandlers.toggleList\n        );\n  \n        this.cache.disclosureOptions.forEach(function(disclosureOption) {\n          disclosureOption.removeEventListener(\n            'click',\n            this.eventHandlers.connectOptions\n          );\n        }, this);\n  \n        this.container.removeEventListener(\n          'keyup',\n          this.eventHandlers.onDisclosureKeyUp\n        );\n  \n        this.cache.disclosureList.removeEventListener(\n          'focusout',\n          this.eventHandlers.onDisclosureListFocusOut\n        );\n  \n        this.cache.disclosureToggle.removeEventListener(\n          'focusout',\n          this.eventHandlers.onDisclosureToggleFocusOut\n        );\n  \n        document.body.removeEventListener(\n          'click',\n          this.eventHandlers.onBodyClick\n        );\n      }\n    });\n  \n    return Disclosure;\n  })();\n  \n  theme.Drawers = (function() {\n    function Drawers(id, name) {\n      this.config = {\n        id: id,\n        close: '.js-drawer-close',\n        open: '.js-drawer-open-' + name,\n        openClass: 'js-drawer-open',\n        closingClass: 'js-drawer-closing',\n        activeDrawer: 'drawer--is-open',\n        namespace: '.drawer-' + name\n      };\n  \n      this.nodes = {\n        page: document.querySelector('#MainContent')\n      };\n  \n      this.drawer = document.querySelector('#' + id);\n      this.isOpen = false;\n  \n      if (!this.drawer) {\n        return;\n      }\n  \n      this.init();\n    }\n  \n    Drawers.prototype = Object.assign({}, Drawers.prototype, {\n      init: function() {\n        // Setup open button(s)\n        document.querySelectorAll(this.config.open).forEach(openBtn => {\n          openBtn.setAttribute('aria-expanded', 'false');\n          openBtn.addEventListener('click', this.open.bind(this));\n        });\n  \n        this.drawer.querySelector(this.config.close).addEventListener('click', this.close.bind(this));\n  \n        // Close modal if a drawer is opened\n        document.addEventListener('modalOpen', function() {\n          this.close();\n        }.bind(this));\n      },\n  \n      open: function(evt, returnFocusEl) {\n        if (evt) {\n          evt.preventDefault();\n        }\n  \n        if (this.isOpen) {\n          return;\n        }\n  \n        // Without this the drawer opens, the click event bubbles up to $nodes.page which closes the drawer.\n        if (evt && evt.stopPropagation) {\n          evt.stopPropagation();\n          // save the source of the click, we'll focus to this on close\n          evt.currentTarget.setAttribute('aria-expanded', 'true');\n          this.activeSource = evt.currentTarget;\n        } else if (returnFocusEl) {\n          returnFocusEl.setAttribute('aria-expanded', 'true');\n          this.activeSource = returnFocusEl;\n        }\n  \n        theme.utils.prepareTransition(this.drawer, function() {\n          this.drawer.classList.add(this.config.activeDrawer);\n        }.bind(this));\n  \n        document.documentElement.classList.add(this.config.openClass);\n        this.isOpen = true;\n  \n        theme.a11y.trapFocus({\n          container: this.drawer,\n          namespace: 'drawer_focus'\n        });\n  \n        document.dispatchEvent(new CustomEvent('drawerOpen'));\n        document.dispatchEvent(new CustomEvent('drawerOpen.' + this.config.id));\n  \n        this.bindEvents();\n      },\n  \n      close: function(evt) {\n        if (!this.isOpen) {\n          return;\n        }\n  \n        // Do not close if click event came from inside drawer\n        if (evt) {\n          if (evt.target.closest('.js-drawer-close')) {\n            // Do not close if using the drawer close button\n          } else if (evt.target.closest('.drawer')) {\n            return;\n          }\n        }\n  \n        // deselect any focused form elements\n        document.activeElement.blur();\n  \n        theme.utils.prepareTransition(this.drawer, function() {\n          this.drawer.classList.remove(this.config.activeDrawer);\n        }.bind(this));\n  \n        document.documentElement.classList.remove(this.config.openClass);\n        document.documentElement.classList.add(this.config.closingClass);\n  \n        window.setTimeout(function() {\n          document.documentElement.classList.remove(this.config.closingClass);\n          if (this.activeSource && this.activeSource.getAttribute('aria-expanded')) {\n            this.activeSource.setAttribute('aria-expanded', 'false');\n            this.activeSource.focus();\n          }\n        }.bind(this), 500);\n  \n        this.isOpen = false;\n  \n        theme.a11y.removeTrapFocus({\n          container: this.drawer,\n          namespace: 'drawer_focus'\n        });\n  \n        this.unbindEvents();\n      },\n  \n      bindEvents: function() {\n        // Clicking out of drawer closes it\n        window.on('click' + this.config.namespace, function(evt) {\n          this.close(evt)\n          return;\n        }.bind(this));\n  \n        // Pressing escape closes drawer\n        window.on('keyup' + this.config.namespace, function(evt) {\n          if (evt.keyCode === 27) {\n            this.close();\n          }\n        }.bind(this));\n  \n        theme.a11y.lockMobileScrolling(this.config.namespace, this.nodes.page);\n      },\n  \n      unbindEvents: function() {\n        window.off('click' + this.config.namespace);\n        window.off('keyup' + this.config.namespace);\n  \n        theme.a11y.unlockMobileScrolling(this.config.namespace, this.nodes.page);\n      }\n    });\n  \n    return Drawers;\n  })();\n  \n  theme.Modals = (function() {\n    function Modal(id, name, options) {\n      var defaults = {\n        close: '.js-modal-close',\n        open: '.js-modal-open-' + name,\n        openClass: 'modal--is-active',\n        closingClass: 'modal--is-closing',\n        bodyOpenClass: ['modal-open'],\n        bodyOpenSolidClass: 'modal-open--solid',\n        bodyClosingClass: 'modal-closing',\n        closeOffContentClick: true\n      };\n  \n      this.id = id;\n      this.modal = document.getElementById(id);\n  \n      if (!this.modal) {\n        return false;\n      }\n  \n      this.modalContent = this.modal.querySelector('.modal__inner');\n  \n      this.config = Object.assign(defaults, options);\n      this.modalIsOpen = false;\n      this.focusOnOpen = this.config.focusIdOnOpen ? document.getElementById(this.config.focusIdOnOpen) : this.modal;\n      this.isSolid = this.config.solid;\n  \n      this.init();\n    }\n  \n    Modal.prototype.init = function() {\n      document.querySelectorAll(this.config.open).forEach(btn => {\n        btn.setAttribute('aria-expanded', 'false');\n        btn.addEventListener('click', this.open.bind(this));\n      });\n  \n      this.modal.querySelectorAll(this.config.close).forEach(btn => {\n        btn.addEventListener('click', this.close.bind(this));\n      });\n  \n      // Close modal if a drawer is opened\n      document.addEventListener('drawerOpen', function() {\n        this.close();\n      }.bind(this));\n    };\n  \n    Modal.prototype.open = function(evt) {\n      // Keep track if modal was opened from a click, or called by another function\n      var externalCall = false;\n  \n      // don't open an opened modal\n      if (this.modalIsOpen) {\n        return;\n      }\n  \n      // Prevent following href if link is clicked\n      if (evt) {\n        evt.preventDefault();\n      } else {\n        externalCall = true;\n      }\n  \n      // Without this, the modal opens, the click event bubbles up to $nodes.page\n      // which closes the modal.\n      if (evt && evt.stopPropagation) {\n        evt.stopPropagation();\n        // save the source of the click, we'll focus to this on close\n        this.activeSource = evt.currentTarget.setAttribute('aria-expanded', 'true');\n      }\n  \n      if (this.modalIsOpen && !externalCall) {\n        this.close();\n      }\n  \n      this.modal.classList.add(this.config.openClass);\n  \n      document.documentElement.classList.add(...this.config.bodyOpenClass);\n  \n      if (this.isSolid) {\n        document.documentElement.classList.add(this.config.bodyOpenSolidClass);\n      }\n  \n      this.modalIsOpen = true;\n  \n      // Delay trap focus to ensure elements are seen by screen readers\n      setTimeout(() => {\n        theme.a11y.trapFocus({\n          container: this.modal,\n          elementToFocus: this.focusOnOpen,\n          namespace: 'modal_focus'\n        });\n      }, 100);\n  \n  \n      document.dispatchEvent(new CustomEvent('modalOpen'));\n      document.dispatchEvent(new CustomEvent('modalOpen.' + this.id));\n  \n      this.bindEvents();\n    };\n  \n    Modal.prototype.close = function(evt) {\n      // don't close a closed modal\n      if (!this.modalIsOpen) {\n        return;\n      }\n  \n      // Do not close modal if click happens inside modal content\n      if (evt) {\n        if (evt.target.closest('.js-modal-close')) {\n          // Do not close if using the modal close button\n        } else if (evt.target.closest('.modal__inner')) {\n          return;\n        }\n      }\n  \n      // deselect any focused form elements\n      document.activeElement.blur();\n  \n      this.modal.classList.remove(this.config.openClass);\n      this.modal.classList.add(this.config.closingClass);\n  \n      document.documentElement.classList.remove(...this.config.bodyOpenClass);\n      document.documentElement.classList.add(this.config.bodyClosingClass);\n  \n      window.setTimeout(function() {\n        document.documentElement.classList.remove(this.config.bodyClosingClass);\n        this.modal.classList.remove(this.config.closingClass);\n        if (this.activeSource && this.activeSource.getAttribute('aria-expanded')) {\n          this.activeSource.setAttribute('aria-expanded', 'false').focus();\n        }\n      }.bind(this), 500); // modal close css transition\n  \n      if (this.isSolid) {\n        document.documentElement.classList.remove(this.config.bodyOpenSolidClass);\n      }\n  \n      this.modalIsOpen = false;\n  \n      theme.a11y.removeTrapFocus({\n        container: this.modal,\n        namespace: 'modal_focus'\n      });\n  \n      document.dispatchEvent(new CustomEvent('modalClose.' + this.id));\n  \n      this.unbindEvents();\n    };\n  \n    Modal.prototype.bindEvents = function() {\n      window.on('keyup.modal', function(evt) {\n        if (evt.keyCode === 27) {\n          this.close();\n        }\n      }.bind(this));\n  \n      if (this.config.closeOffContentClick) {\n        // Clicking outside of the modal content also closes it\n        this.modal.on('click.modal', this.close.bind(this));\n      }\n    };\n  \n    Modal.prototype.unbindEvents = function() {\n      document.documentElement.off('.modal');\n  \n      if (this.config.closeOffContentClick) {\n        this.modal.off('.modal');\n      }\n    };\n  \n    return Modal;\n  })();\n  \n  window.onpageshow = function(evt) {\n    // Removes unload class when returning to page via history\n    if (evt.persisted) {\n      document.body.classList.remove('unloading');\n      document.querySelectorAll('.cart__checkout').forEach(el => {\n        el.classList.remove('btn--loading');\n      });\n    }\n  };\n  \n  // Used in Motion, Fetch, Gem and Expanse to fade between pages.\n  // initialize in theme.js with theme.pageTransitions();\n  theme.pageTransitions = function() {\n    if (document.body.dataset.transitions === 'true') {\n  \n      // Hack test to fix Safari page cache issue.\n      // window.onpageshow doesn't always run when navigating\n      // back to the page, so the unloading class remains, leaving\n      // a white page. Setting a timeout to remove that class when leaving\n      // the page actually finishes running when they come back.\n      if (!!navigator.userAgent.match(/Version\\/[\\d\\.]+.*Safari/)) {\n        document.querySelectorAll('a').forEach(a => {\n          window.setTimeout(function() {\n            document.body.classList.remove('unloading');\n          }, 1200);\n        });\n      }\n  \n      // Disable the page transition feature on some links\n      // by adding class `js-no-transition`\n      document.querySelectorAll('a.hero__slide-link, a[href^=\"mailto:\"], a[href^=\"#\"], a[target=\"_blank\"], a[href*=\"youtube.com/watch\"], a[href*=\"youtu.be/\"], a[href*=\"player.vimeo.com/video/\"], a[href*=\"vimeo.com/\"], a[download]').forEach(el => {\n        el.classList.add('js-no-transition');\n      });\n  \n      // Add class `unloading` to body for page transition on all\n      // anchor tags, unless they have `js-no-transition` class\n      document.querySelectorAll('a:not(.js-no-transition)').forEach(el => {\n        el.addEventListener('click', function(evt) {\n          if (evt.metaKey) return true;\n          evt.preventDefault();\n          document.body.classList.add('unloading');\n          var src = el.getAttribute('href');\n          window.setTimeout(function() {\n            location.href = src;\n          }, 50);\n        });\n      });\n  \n      // Close the mobile nav drawer after clicking on a nav link\n      document.querySelectorAll('a.mobile-nav__link').forEach(el => {\n        el.addEventListener('click', function() {\n          theme.NavDrawer.close();\n        })\n      });\n    }\n  };\n  \n  if (typeof window.noUiSlider === 'undefined') {\n    throw new Error('theme.PriceRange is missing vendor noUiSlider: // =require vendor/nouislider.js');\n  }\n  \n  theme.PriceRange = (function () {\n    var defaultStep = 10;\n    var selectors = {\n      priceRange: '.price-range',\n      priceRangeSlider: '.price-range__slider',\n      priceRangeInputMin: '.price-range__input-min',\n      priceRangeInputMax: '.price-range__input-max',\n      priceRangeDisplayMin: '.price-range__display-min',\n      priceRangeDisplayMax: '.price-range__display-max',\n    };\n  \n    function PriceRange(container, {onChange, onUpdate, ...sliderOptions} = {}) {\n      this.container = container;\n      this.onChange = onChange;\n      this.onUpdate = onUpdate;\n      this.sliderOptions = sliderOptions || {};\n  \n      return this.init();\n    }\n  \n    PriceRange.prototype = Object.assign({}, PriceRange.prototype, {\n      init: function () {\n        if (!this.container.classList.contains('price-range')) {\n          throw new Error('You must instantiate PriceRange with a valid container')\n        }\n  \n        this.formEl = this.container.closest('form');\n        this.sliderEl = this.container.querySelector(selectors.priceRangeSlider);\n        this.inputMinEl = this.container.querySelector(selectors.priceRangeInputMin);\n        this.inputMaxEl = this.container.querySelector(selectors.priceRangeInputMax);\n        this.displayMinEl = this.container.querySelector(selectors.priceRangeDisplayMin);\n        this.displayMaxEl = this.container.querySelector(selectors.priceRangeDisplayMax);\n  \n        this.minRange = parseFloat(this.container.dataset.min) || 0;\n        this.minValue = parseFloat(this.container.dataset.minValue) || 0;\n        this.maxRange = parseFloat(this.container.dataset.max) || 100;\n        this.maxValue = parseFloat(this.container.dataset.maxValue) || this.maxRange;\n  \n        return this.createPriceRange();\n      },\n  \n      createPriceRange: function () {\n        if (this.sliderEl && this.sliderEl.noUiSlider && typeof this.sliderEl.noUiSlider.destroy === 'function') {\n          this.sliderEl.noUiSlider.destroy();\n        }\n  \n        var slider = noUiSlider.create(this.sliderEl, {\n          connect: true,\n          step: defaultStep,\n          ...this.sliderOptions,\n          // Do not allow overriding these options\n          start: [this.minValue, this.maxValue],\n          range: {\n            min: this.minRange,\n            max: this.maxRange,\n          },\n        });\n  \n        slider.on('update', values => {\n          this.displayMinEl.innerHTML = theme.Currency.formatMoney(\n            values[0],\n            theme.settings.moneyFormat,\n          );\n          this.displayMaxEl.innerHTML = theme.Currency.formatMoney(\n            values[1],\n            theme.settings.moneyFormat,\n          );\n  \n          if (this.onUpdate) {\n            this.onUpdate(values);\n          }\n        });\n  \n        slider.on('change', values => {\n          this.inputMinEl.value = values[0];\n          this.inputMaxEl.value = values[1];\n  \n          if (this.onChange) {\n            const formData = new FormData(this.formEl);\n            this.onChange(formData);\n          }\n        });\n  \n        return slider;\n      },\n    });\n  \n    return PriceRange;\n  })();\n  \n  theme.AjaxProduct = (function() {\n    var status = {\n      loading: false\n    };\n  \n    function ProductForm(form, submit, args) {\n      this.form = form;\n      this.args = args;\n  \n      var submitSelector = submit ? submit : '.add-to-cart';\n  \n      if (this.form) {\n        this.addToCart = form.querySelector(submitSelector);\n        this.form.addEventListener('submit', this.addItemFromForm.bind(this));\n      }\n    };\n  \n    ProductForm.prototype = Object.assign({}, ProductForm.prototype, {\n      addItemFromForm: function(evt, callback){\n        evt.preventDefault();\n  \n        if (status.loading) {\n          return;\n        }\n  \n        // Loading indicator on add to cart button\n        this.addToCart.classList.add('btn--loading');\n  \n        status.loading = true;\n  \n        var data = theme.utils.serialize(this.form);\n  \n        fetch(theme.routes.cartAdd, {\n          method: 'POST',\n          body: data,\n          credentials: 'same-origin',\n          headers: {\n            'Content-Type': 'application/x-www-form-urlencoded',\n            'X-Requested-With': 'XMLHttpRequest'\n          }\n        })\n        .then(response => response.json())\n        .then(function(data) {\n          if (data.status === 422) {\n            this.error(data);\n          } else {\n            var product = data;\n            this.success(product);\n          }\n  \n          status.loading = false;\n          this.addToCart.classList.remove('btn--loading');\n  \n          // Reload page if adding product from a section on the cart page\n          if (document.body.classList.contains('template-cart')) {\n            window.scrollTo(0, 0);\n            location.reload();\n          }\n        }.bind(this));\n      },\n  \n      success: function(product) {\n        var errors = this.form.querySelector('.errors');\n        if (errors) {\n          errors.remove();\n        }\n  \n        if (theme.settings.cartType === 'page') {\n          window.location = theme.routes.cartPage;\n        }\n  \n        this.form.dispatchEvent(new CustomEvent('ajaxProduct:added', {\n          detail: {\n            product: product,\n            addToCartBtn: this.addToCart\n          },\n          bubbles: true\n        }));\n  \n        if (this.args && this.args.scopedEventId) {\n          document.dispatchEvent(new CustomEvent('ajaxProduct:added:' + this.args.scopedEventId, {\n            detail: {\n              product: product,\n              addToCartBtn: this.addToCart\n            }\n          }));\n        }\n      },\n  \n      error: function(error) {\n        if (!error.description) {\n          console.warn(error);\n          return;\n        }\n  \n        var errors = this.form.querySelector('.errors');\n        if (errors) {\n          errors.remove();\n        }\n  \n        var errorDiv = document.createElement('div');\n        errorDiv.classList.add('errors', 'text-center');\n  \n        if (typeof error.description === 'object') {\n          errorDiv.textContent = error.message;\n        } else {\n          errorDiv.textContent = error.description;\n        }\n  \n        this.form.append(errorDiv);\n  \n        this.form.dispatchEvent(new CustomEvent('ajaxProduct:error', {\n          detail: {\n            errorMessage: error.description\n          },\n          bubbles: true\n        }));\n  \n        if (this.args && this.args.scopedEventId) {\n          document.dispatchEvent(new CustomEvent('ajaxProduct:error:' + this.args.scopedEventId, {\n            detail: {\n              errorMessage: error.description\n            }\n          }));\n        }\n      }\n    });\n  \n    return ProductForm;\n  })();\n  \n  theme.ProductMedia = (function() {\n    var modelJsonSections = {};\n    var models = {};\n    var xrButtons = {};\n  \n    var selectors = {\n      mediaGroup: '[data-product-single-media-group]',\n      xrButton: '[data-shopify-xr]'\n    };\n  \n    function init(modelViewerContainers, sectionId) {\n      modelJsonSections[sectionId] = {\n        loaded: false\n      };\n  \n      modelViewerContainers.forEach(function(container, index) {\n        var mediaId = container.dataset.mediaId;\n        var modelViewerElement = container.querySelector('model-viewer');\n        var modelId = modelViewerElement.dataset.modelId;\n  \n        if (index === 0) {\n          var mediaGroup = container.closest(selectors.mediaGroup);\n          var xrButton = mediaGroup.querySelector(selectors.xrButton);\n          xrButtons[sectionId] = {\n            element: xrButton,\n            defaultId: modelId\n          };\n        }\n  \n        models[mediaId] = {\n          modelId: modelId,\n          sectionId: sectionId,\n          container: container,\n          element: modelViewerElement\n        };\n  \n      });\n  \n      window.Shopify.loadFeatures([\n        {\n          name: 'shopify-xr',\n          version: '1.0',\n          onLoad: setupShopifyXr\n        },\n        {\n          name: 'model-viewer-ui',\n          version: '1.0',\n          onLoad: setupModelViewerUi\n        }\n      ]);\n  \n      theme.LibraryLoader.load('modelViewerUiStyles');\n    }\n  \n    function setupShopifyXr(errors) {\n      if (errors) return;\n  \n      if (!window.ShopifyXR) {\n        document.addEventListener('shopify_xr_initialized', function() {\n          setupShopifyXr();\n        });\n        return;\n      }\n  \n      for (var sectionId in modelJsonSections) {\n        if (modelJsonSections.hasOwnProperty(sectionId)) {\n          var modelSection = modelJsonSections[sectionId];\n  \n          if (modelSection.loaded) continue;\n  \n          var modelJson = document.querySelector('#ModelJson-' + sectionId);\n  \n          window.ShopifyXR.addModels(JSON.parse(modelJson.innerHTML));\n          modelSection.loaded = true;\n        }\n      }\n      window.ShopifyXR.setupXRElements();\n    }\n  \n    function setupModelViewerUi(errors) {\n      if (errors) return;\n  \n      for (var key in models) {\n        if (models.hasOwnProperty(key)) {\n          var model = models[key];\n          if (!model.modelViewerUi && Shopify) {\n            model.modelViewerUi = new Shopify.ModelViewerUI(model.element);\n          }\n          setupModelViewerListeners(model);\n        }\n      }\n    }\n  \n    function setupModelViewerListeners(model) {\n      var xrButton = xrButtons[model.sectionId];\n  \n      model.container.addEventListener('mediaVisible', function(event) {\n        xrButton.element.setAttribute('data-shopify-model3d-id', model.modelId);\n        if (theme.config.isTouch) return;\n        if (!event.detail.autoplayMedia) return;\n        model.modelViewerUi.play();\n      });\n  \n      model.container.addEventListener('mediaHidden', function() {\n        xrButton.element.setAttribute('data-shopify-model3d-id', xrButton.defaultId);\n        model.modelViewerUi.pause();\n      });\n  \n      model.container.addEventListener('xrLaunch', function() {\n        model.modelViewerUi.pause();\n      });\n    }\n  \n    function removeSectionModels(sectionId) {\n      for (var key in models) {\n        if (models.hasOwnProperty(key)) {\n          var model = models[key];\n          if (model.sectionId === sectionId) {\n            delete models[key];\n          }\n        }\n      }\n      delete modelJsonSections[sectionId];\n    }\n  \n    return {\n      init: init,\n      removeSectionModels: removeSectionModels\n    };\n  })();\n  \n  theme.QtySelector = (function() {\n    var selectors = {\n      input: '.js-qty__num',\n      plus: '.js-qty__adjust--plus',\n      minus: '.js-qty__adjust--minus'\n    };\n  \n    function QtySelector(el, options) {\n      this.wrapper = el;\n      this.plus = el.querySelector(selectors.plus);\n      this.minus = el.querySelector(selectors.minus);\n      this.input = el.querySelector(selectors.input);\n      this.minValue = this.input.getAttribute('min') || 1;\n  \n      var defaults = {\n        namespace: null,\n        isCart: false,\n        key: this.input.dataset.id\n      };\n  \n      this.options = Object.assign({}, defaults, options);\n  \n      this.init();\n    }\n  \n    QtySelector.prototype = Object.assign({}, QtySelector.prototype, {\n      init: function() {\n        this.plus.addEventListener('click', function() {\n          var qty = this._getQty();\n          this._change(qty + 1);\n        }.bind(this));\n  \n        this.minus.addEventListener('click', function() {\n          var qty = this._getQty();\n          this._change(qty - 1);\n        }.bind(this));\n  \n        this.input.addEventListener('change', function(evt) {\n          this._change(this._getQty());\n        }.bind(this));\n      },\n  \n      _getQty: function() {\n        var qty = this.input.value;\n        if((parseFloat(qty) == parseInt(qty)) && !isNaN(qty)) {\n          // We have a valid number!\n        } else {\n          // Not a number. Default to 1.\n          qty = 1;\n        }\n        return parseInt(qty);\n      },\n  \n      _change: function(qty) {\n        if (qty <= this.minValue) {\n          qty = this.minValue;\n        }\n  \n        this.input.value = qty;\n  \n        if (this.options.isCart) {\n          document.dispatchEvent(new CustomEvent('cart:quantity' + this.options.namespace, {\n              detail: [this.options.key, qty, this.wrapper]\n          }));\n        }\n      }\n    });\n  \n    return QtySelector;\n  })();\n  \n  theme.initQuickShop = function() {\n    var ids = [];\n    var products = document.querySelectorAll('.grid-product');\n  \n    if (!products.length || !theme.settings.quickView) {\n      return;\n    }\n  \n    products.forEach(product => {\n      product.addEventListener('mouseover', productMouseover);\n      product.addEventListener('focusin', productMouseover);\n    });\n  \n    function productMouseover(evt) {\n      var el = evt.currentTarget;\n      // No quick view on mobile breakpoint\n      if (!theme.config.bpSmall) {\n        el.removeEventListener('mouseover', productMouseover);\n        el.removeEventListener('focusin', productMouseover);\n        if (!el || !el.dataset.productId) {\n          // Onboarding product, no real data\n          return;\n        }\n        var productId = el.dataset.productId;\n        var handle = el.dataset.productHandle;\n        var btn = el.querySelector('.quick-product__btn');\n        theme.preloadProductModal(handle, productId, btn);\n      }\n    }\n  };\n  \n  theme.preloadProductModal = function(handle, productId, btn) {\n    var holder = document.getElementById('QuickShopHolder-' + handle);\n    var url = theme.routes.home + '/products/' + handle + '?view=modal';\n  \n    // remove double `/` in case shop might have /en or language in URL\n    url = url.replace('//', '/');\n  \n    fetch(url)\n    .then(response => response.text())\n    .then(text => {\n      const html = document.createElement('div');\n      html.innerHTML = text;\n      const div = html.querySelector('.product-section[data-product-handle=\"'+handle+'\"]');\n  \n      if (!holder) {\n        return;\n      }\n  \n      holder.innerHTML = '';\n      holder.append(div);\n  \n      // Setup quick view modal\n      var modalId = 'QuickShopModal-' + productId;\n      var name = 'quick-modal-' + productId;\n      new theme.Modals(modalId, name);\n  \n      // Register product template inside quick view\n      theme.sections.register('product', theme.Product, holder);\n  \n      // Register collapsible elements\n      theme.collapsibles.init();\n  \n      // Register potential video modal links (when video has sound)\n      theme.videoModal();\n  \n      if (btn) {\n        btn.classList.remove('quick-product__btn--not-ready');\n      }\n    });\n  }\n  \n  // theme.Slideshow handles all flickity based sliders\n  // Child navigation is only setup to work on product images\n  theme.Slideshow = (function() {\n    var classes = {\n      animateOut: 'animate-out',\n      isPaused: 'is-paused',\n      isActive: 'is-active'\n    };\n  \n    var selectors = {\n      allSlides: '.slideshow__slide',\n      currentSlide: '.is-selected',\n      wrapper: '.slideshow-wrapper',\n      pauseButton: '.slideshow__pause'\n    };\n  \n    var productSelectors = {\n      thumb: '.product__thumb-item:not(.hide)',\n      links: '.product__thumb-item:not(.hide) a',\n      arrow: '.product__thumb-arrow'\n    };\n  \n    var defaults = {\n      adaptiveHeight: false,\n      autoPlay: false,\n      avoidReflow: false, // custom by Archetype\n      childNav: null, // element. Custom by Archetype instead of asNavFor\n      childNavScroller: null, // element\n      childVertical: false,\n      dragThreshold: 7,\n      fade: false,\n      friction: 0.8,\n      initialIndex: 0,\n      pageDots: false,\n      pauseAutoPlayOnHover: false,\n      prevNextButtons: false,\n      rightToLeft: theme.config.rtl,\n      selectedAttraction: 0.14,\n      setGallerySize: true,\n      wrapAround: true\n    };\n  \n    function slideshow(el, args) {\n      this.el = el;\n      this.args = Object.assign({}, defaults, args);\n  \n      // Setup listeners as part of arguments\n      this.args.on = {\n        ready: this.init.bind(this),\n        change: this.slideChange.bind(this),\n        settle: this.afterChange.bind(this)\n      };\n  \n      if (this.args.childNav) {\n        this.childNavEls = this.args.childNav.querySelectorAll(productSelectors.thumb);\n        this.childNavLinks = this.args.childNav.querySelectorAll(productSelectors.links);\n        this.arrows = this.args.childNav.querySelectorAll(productSelectors.arrow);\n        if (this.childNavLinks.length) {\n          this.initChildNav();\n        }\n      }\n  \n      if (this.args.avoidReflow) {\n        avoidReflow(el);\n      }\n  \n      this.slideshow = new Flickity(el, this.args);\n  \n      // Prevent dragging on the product slider from triggering a zoom on product images\n      if (el.dataset.zoom && el.dataset.zoom === 'true') {\n        this.slideshow.on('dragStart', () => {\n          this.slideshow.slider.style.pointerEvents = 'none';\n  \n          // With fade enabled, we also need to adjust the pointerEvents on the selected slide\n          if (this.slideshow.options.fade) {\n            this.slideshow.slider.querySelector('.is-selected').style.pointerEvents = 'none';\n          }\n        });\n        this.slideshow.on('dragEnd', () => {\n          this.slideshow.slider.style.pointerEvents = 'auto';\n  \n          // With fade enabled, we also need to adjust the pointerEvents on the selected slide\n          if (this.slideshow.options.fade) {\n            this.slideshow.slider.querySelector('.is-selected').style.pointerEvents = 'auto';\n          }\n        });\n      }\n  \n      if (this.args.autoPlay) {\n        var wrapper = el.closest(selectors.wrapper);\n        this.pauseBtn = wrapper.querySelector(selectors.pauseButton);\n        if (this.pauseBtn) {\n          this.pauseBtn.addEventListener('click', this._togglePause.bind(this));\n        }\n      }\n  \n      // Reset dimensions on resize\n      window.on('resize', theme.utils.debounce(300, function() {\n        this.resize();\n      }.bind(this)));\n  \n      // Set flickity-viewport height to first element to\n      // avoid awkward page reflows while initializing.\n      // Must be added in a `style` tag because element does not exist yet.\n      // Slideshow element must have an ID\n      function avoidReflow(el) {\n        if (!el.id) return;\n        var firstChild = el.firstChild;\n        while(firstChild != null && firstChild.nodeType == 3){ // skip TextNodes\n          firstChild = firstChild.nextSibling;\n        }\n        var style = document.createElement('style');\n        style.innerHTML = `#${el.id} .flickity-viewport{height:${firstChild.offsetHeight}px}`;\n        document.head.appendChild(style);\n      }\n    }\n  \n    slideshow.prototype = Object.assign({}, slideshow.prototype, {\n      init: function(el) {\n        this.currentSlide = this.el.querySelector(selectors.currentSlide);\n  \n        // Optional onInit callback\n        if (this.args.callbacks && this.args.callbacks.onInit) {\n          if (typeof this.args.callbacks.onInit === 'function') {\n            this.args.callbacks.onInit(this.currentSlide);\n          }\n        }\n  \n        if (window.AOS) { AOS.refresh() }\n      },\n  \n      slideChange: function(index) {\n        // Outgoing fade styles\n        if (this.args.fade && this.currentSlide) {\n          this.currentSlide.classList.add(classes.animateOut);\n          this.currentSlide.addEventListener('transitionend', function() {\n            this.currentSlide.classList.remove(classes.animateOut);\n          }.bind(this));\n        }\n  \n        // Match index with child nav\n        if (this.args.childNav) {\n          this.childNavGoTo(index);\n        }\n  \n        // Optional onChange callback\n        if (this.args.callbacks && this.args.callbacks.onChange) {\n          if (typeof this.args.callbacks.onChange === 'function') {\n            this.args.callbacks.onChange(index);\n          }\n        }\n  \n        // Show/hide arrows depending on selected index\n        if (this.arrows && this.arrows.length) {\n          this.arrows[0].classList.toggle('hide', index === 0);\n          this.arrows[1].classList.toggle('hide', index === (this.childNavLinks.length - 1));\n        }\n      },\n      afterChange: function(index) {\n        // Remove all fade animation classes after slide is done\n        if (this.args.fade) {\n          this.el.querySelectorAll(selectors.allSlides).forEach(slide => {\n            slide.classList.remove(classes.animateOut);\n          });\n        }\n  \n        this.currentSlide = this.el.querySelector(selectors.currentSlide);\n  \n        // Match index with child nav (in case slider height changed first)\n        if (this.args.childNav) {\n          this.childNavGoTo(this.slideshow.selectedIndex);\n        }\n      },\n      destroy: function() {\n        if (this.args.childNav && this.childNavLinks.length) {\n          this.childNavLinks.forEach(a => {\n            a.classList.remove(classes.isActive);\n          });\n        }\n  \n        this.slideshow.destroy();\n      },\n      reposition: function() {\n        this.slideshow.reposition();\n      },\n      _togglePause: function() {\n        if (this.pauseBtn.classList.contains(classes.isPaused)) {\n          this.pauseBtn.classList.remove(classes.isPaused);\n          this.slideshow.playPlayer();\n        } else {\n          this.pauseBtn.classList.add(classes.isPaused);\n          this.slideshow.pausePlayer();\n        }\n      },\n      resize: function() {\n        this.slideshow.resize();\n      },\n      play: function() {\n        this.slideshow.playPlayer();\n      },\n      pause: function() {\n        this.slideshow.pausePlayer();\n      },\n      goToSlide: function(i) {\n        this.slideshow.select(i);\n      },\n      setDraggable: function(enable) {\n        this.slideshow.options.draggable = enable;\n        this.slideshow.updateDraggable();\n      },\n  \n      initChildNav: function() {\n        this.childNavLinks[this.args.initialIndex].classList.add('is-active');\n  \n        // Setup events\n        this.childNavLinks.forEach((link, i) => {\n          // update data-index because image-set feature may be enabled\n          link.setAttribute('data-index', i);\n  \n          link.addEventListener('click', function(evt) {\n            evt.preventDefault();\n            this.goToSlide(this.getChildIndex(evt.currentTarget))\n          }.bind(this));\n          link.addEventListener('focus', function(evt) {\n            this.goToSlide(this.getChildIndex(evt.currentTarget))\n          }.bind(this));\n          link.addEventListener('keydown', function(evt) {\n            if (evt.keyCode === 13) {\n              this.goToSlide(this.getChildIndex(evt.currentTarget))\n            }\n          }.bind(this));\n        });\n  \n        // Setup optional arrows\n        if (this.arrows.length) {\n          this.arrows.forEach(arrow => {\n            arrow.addEventListener('click', this.arrowClick.bind(this));\n          });;\n        }\n      },\n  \n      getChildIndex: function(target) {\n        return parseInt(target.dataset.index);\n      },\n  \n      childNavGoTo: function(index) {\n        this.childNavLinks.forEach(a => {\n          a.blur();\n          a.classList.remove(classes.isActive);\n        });\n  \n        var el = this.childNavLinks[index];\n        el.classList.add(classes.isActive);\n  \n        if (!this.args.childNavScroller) {\n          return;\n        }\n  \n        if (this.args.childVertical) {\n          var elTop = el.offsetTop;\n          this.args.childNavScroller.scrollTop = elTop - 100;\n        } else {\n          var elLeft = el.offsetLeft;\n          this.args.childNavScroller.scrollLeft = elLeft - 100;\n        }\n      },\n  \n      arrowClick: function(evt) {\n        if (evt.currentTarget.classList.contains('product__thumb-arrow--prev')) {\n          this.slideshow.previous();\n        } else {\n          this.slideshow.next();\n        }\n      }\n    });\n  \n    return slideshow;\n  })();\n  \n  /*============================================================================\n    VariantAvailability\n    - Cross out sold out or unavailable variants\n    - To disable, use the Variant Picker Block setting\n    - Required markup:\n      - class=variant-input-wrap to wrap select or button group\n      - class=variant-input to wrap button/label\n  ==============================================================================*/\n  \n  theme.VariantAvailability = (function() {\n    var classes = {\n      disabled: 'disabled'\n    };\n  \n    function availability(args) {\n      this.type = args.type;\n      this.variantsObject = args.variantsObject;\n      this.currentVariantObject = args.currentVariantObject;\n      this.container = args.container;\n      this.namespace = args.namespace;\n  \n      this.init();\n    }\n  \n    availability.prototype = Object.assign({}, availability.prototype, {\n      init: function() {\n        this.container.on('variantChange' + this.namespace, this.setAvailability.bind(this));\n  \n        // Set default state based on current selected variant\n        this.setInitialAvailability();\n      },\n  \n      // Create a list of all options. If any variant exists and is in stock with that option, it's considered available\n      createAvailableOptionsTree(variants, currentlySelectedValues) {\n        // Reduce variant array into option availability tree\n        return variants.reduce((options, variant) => {\n  \n          // Check each option group (e.g. option1, option2, option3) of the variant\n          Object.keys(options).forEach(index => {\n  \n            if (variant[index] === null) return;\n  \n            let entry = options[index].find(option => option.value === variant[index]);\n  \n            if (typeof entry === 'undefined') {\n              // If option has yet to be added to the options tree, add it\n              entry = {value: variant[index], soldOut: true}\n              options[index].push(entry);\n            }\n  \n            const currentOption1 = currentlySelectedValues.find(({value, index}) => index === 'option1')\n            const currentOption2 = currentlySelectedValues.find(({value, index}) => index === 'option2')\n  \n            switch (index) {\n              case 'option1':\n                // Option1 inputs should always remain enabled based on all available variants\n                entry.soldOut = entry.soldOut && variant.available ? false : entry.soldOut;\n                break;\n              case 'option2':\n                // Option2 inputs should remain enabled based on available variants that match first option group\n                if (currentOption1 && variant['option1'] === currentOption1.value) {\n                  entry.soldOut = entry.soldOut && variant.available ? false : entry.soldOut;\n                }\n              case 'option3':\n                // Option 3 inputs should remain enabled based on available variants that match first and second option group\n                if (\n                  currentOption1 && variant['option1'] === currentOption1.value\n                  && currentOption2 && variant['option2'] === currentOption2.value\n                ) {\n                  entry.soldOut = entry.soldOut && variant.available ? false : entry.soldOut;\n                }\n            }\n          })\n  \n          return options;\n        }, { option1: [], option2: [], option3: []})\n      },\n  \n      setInitialAvailability: function() {\n        this.container.querySelectorAll('.variant-input-wrap').forEach(group => {\n          this.disableVariantGroup(group);\n        });\n  \n        const currentlySelectedValues = this.currentVariantObject.options.map((value,index) => {return {value, index: `option${index+1}`}})\n        const initialOptions = this.createAvailableOptionsTree(this.variantsObject, currentlySelectedValues, this.currentVariantObject);\n  \n        for (var [option, values] of Object.entries(initialOptions)) {\n          this.manageOptionState(option, values);\n        }\n      },\n  \n      setAvailability: function(evt) {\n  \n        const {value: lastSelectedValue, index: lastSelectedIndex, currentlySelectedValues, variant} = evt.detail;\n  \n        // Object to hold all options by value.\n        // This will be what sets a button/dropdown as\n        // sold out or unavailable (not a combo set as purchasable)\n        const valuesToManage = this.createAvailableOptionsTree(this.variantsObject, currentlySelectedValues, variant, lastSelectedIndex, lastSelectedValue)\n  \n        // Loop through all option levels and send each\n        // value w/ args to function that determines to show/hide/enable/disable\n        for (var [option, values] of Object.entries(valuesToManage)) {\n          this.manageOptionState(option, values, lastSelectedValue);\n        }\n      },\n  \n      manageOptionState: function(option, values) {\n        var group = this.container.querySelector('.variant-input-wrap[data-index=\"'+ option +'\"]');\n  \n        // Loop through each option value\n        values.forEach(obj => {\n          this.enableVariantOption(group, obj);\n        });\n      },\n  \n      enableVariantOption: function(group, obj) {\n        // Selecting by value so escape it\n        var value = obj.value.replace(/([ #;&,.+*~\\':\"!^$[\\]()=>|\\/@])/g,'\\\\$1');\n  \n        if (this.type === 'dropdown') {\n          if (obj.soldOut) {\n            group.querySelector('option[value=\"'+ value +'\"]').disabled = true;\n          } else {\n            group.querySelector('option[value=\"'+ value +'\"]').disabled = false;\n          }\n        } else {\n          var buttonGroup = group.querySelector('.variant-input[data-value=\"'+ value +'\"]');\n          var input = buttonGroup.querySelector('input');\n          var label = buttonGroup.querySelector('label');\n  \n          // Variant exists - enable & show variant\n          input.classList.remove(classes.disabled);\n          label.classList.remove(classes.disabled);\n  \n          // Variant sold out - cross out option (remains selectable)\n          if (obj.soldOut) {\n            input.classList.add(classes.disabled);\n            label.classList.add(classes.disabled);\n          }\n        }\n      },\n  \n      disableVariantGroup: function(group) {\n        if (this.type === 'dropdown') {\n          group.querySelectorAll('option').forEach(option => {\n            option.disabled = true;\n          });\n        } else {\n          group.querySelectorAll('input').forEach(input => {\n            input.classList.add(classes.disabled);\n          });\n          group.querySelectorAll('label').forEach(label => {\n            label.classList.add(classes.disabled);\n          });\n        }\n      }\n  \n    });\n  \n    return availability;\n  })();\n  \n  // Video modal will auto-initialize for any anchor link that points to YouTube\n  // MP4 videos must manually be enabled with:\n  //   - .product-video-trigger--mp4 (trigger button)\n  //   - .product-video-mp4-sound video player element (cloned into modal)\n  //     - see media.liquid for example of this\n  theme.videoModal = function() {\n    var youtubePlayer;\n    var vimeoPlayer;\n  \n    var videoHolderId = 'VideoHolder';\n    var selectors = {\n      youtube: 'a[href*=\"youtube.com/watch\"], a[href*=\"youtu.be/\"]',\n      vimeo: 'a[href*=\"player.vimeo.com/player/\"], a[href*=\"vimeo.com/\"]',\n      mp4Trigger: '.product-video-trigger--mp4',\n      mp4Player: '.product-video-mp4-sound'\n    };\n  \n    var youtubeTriggers = document.querySelectorAll(selectors.youtube);\n    var vimeoTriggers = document.querySelectorAll(selectors.vimeo);\n    var mp4Triggers = document.querySelectorAll(selectors.mp4Trigger);\n  \n    if (!youtubeTriggers.length && !vimeoTriggers.length && !mp4Triggers.length) {\n      return;\n    }\n  \n    var videoHolderDiv = document.getElementById(videoHolderId);\n  \n    if (youtubeTriggers.length) {\n      theme.LibraryLoader.load('youtubeSdk');\n    }\n  \n    if (vimeoTriggers.length) {\n      theme.LibraryLoader.load('vimeo', window.vimeoApiReady);\n    }\n  \n    var modal = new theme.Modals('VideoModal', 'video-modal', {\n      closeOffContentClick: true,\n      bodyOpenClass: ['modal-open', 'video-modal-open'],\n      solid: true\n    });\n  \n    youtubeTriggers.forEach(btn => {\n      btn.addEventListener('click', triggerYouTubeModal);\n    });\n  \n    vimeoTriggers.forEach(btn => {\n      btn.addEventListener('click', triggerVimeoModal);\n    });\n  \n    mp4Triggers.forEach(btn => {\n      btn.addEventListener('click', triggerMp4Modal);\n    });\n  \n    document.addEventListener('modalClose.VideoModal', closeVideoModal);\n  \n    function triggerYouTubeModal(evt) {\n      // If not already loaded, treat as normal link\n      if (!theme.config.youTubeReady) {\n        return;\n      }\n  \n      evt.preventDefault();\n      emptyVideoHolder();\n  \n      modal.open(evt);\n  \n      var videoId = getYoutubeVideoId(evt.currentTarget.getAttribute('href'));\n      youtubePlayer = new theme.YouTube(\n        videoHolderId,\n        {\n          videoId: videoId,\n          style: 'sound',\n          events: {\n            onReady: onYoutubeReady\n          }\n        }\n      );\n    }\n  \n    function triggerVimeoModal(evt) {\n      // If not already loaded, treat as normal link\n      if (!theme.config.vimeoReady) {\n        return;\n      }\n  \n      evt.preventDefault();\n      emptyVideoHolder();\n  \n      modal.open(evt);\n  \n      var videoId = evt.currentTarget.dataset.videoId;\n      var videoLoop = evt.currentTarget.dataset.videoLoop;\n      vimeoPlayer = new theme.VimeoPlayer(\n        videoHolderId,\n        videoId,\n        {\n          style: 'sound',\n          loop: videoLoop,\n        }\n      );\n    }\n  \n    function triggerMp4Modal(evt) {\n      emptyVideoHolder();\n  \n      var el = evt.currentTarget;\n      var player = el.parentNode.querySelector(selectors.mp4Player);\n  \n      // Clone video element and place it in the modal\n      var playerClone = player.cloneNode(true);\n      playerClone.classList.remove('hide');\n  \n      videoHolderDiv.append(playerClone);\n      modal.open(evt);\n  \n      // Play new video element\n      videoHolderDiv.querySelector('video').play();\n    }\n  \n    function onYoutubeReady(evt) {\n      evt.target.unMute();\n      evt.target.playVideo();\n    }\n  \n    function getYoutubeVideoId(url) {\n      var regExp = /^.*((youtu.be\\/)|(v\\/)|(\\/u\\/\\w\\/)|(embed\\/)|(watch\\?))\\??v?=?([^#\\&\\?]*).*/;\n      var match = url.match(regExp);\n      return (match&&match[7].length==11)? match[7] : false;\n    }\n  \n    function emptyVideoHolder() {\n      videoHolderDiv.innerHTML = '';\n    }\n  \n    function closeVideoModal() {\n      if (youtubePlayer && typeof youtubePlayer.destroy === 'function') {\n        youtubePlayer.destroy();\n      } else if (vimeoPlayer && typeof vimeoPlayer.destroy === 'function') {\n        vimeoPlayer.destroy();\n      } else {\n        emptyVideoHolder();\n      }\n    }\n  };\n  \n  \n  /*============================================================================\n    ToolTip\n  ==============================================================================*/\n  \n  class ToolTip extends HTMLElement {\n    constructor() {\n      super();\n      this.el = this;\n      this.inner = this.querySelector('[data-tool-tip-inner]');\n      this.closeButton = this.querySelector('[data-tool-tip-close]');\n      this.toolTipContent = this.querySelector('[data-tool-tip-content]');\n      this.toolTipTitle = this.querySelector('[data-tool-tip-title]');\n  \n      this.triggers = document.querySelectorAll('[data-tool-tip-trigger]');\n  \n      document.addEventListener('tooltip:open', e => {\n        this._open(e.detail.context, e.detail.content);\n      });\n    }\n  \n    _open(context, insertedHtml) {\n      this.toolTipContent.innerHTML = insertedHtml;\n  \n      // Ensure we set a title for product availability\n      if (context != 'store-availability') {\n        this.toolTipTitle.remove();\n      }\n  \n      this._lockScrolling();\n  \n      if (this.closeButton) {\n        this.closeButton.on('click' + '.tooltip-close', () => {\n          this._close();\n        });\n      }\n  \n      document.documentElement.on('click' + '.tooltip-outerclick', event => {\n        if (this.el.dataset.toolTipOpen === 'true' && !this.inner.contains(event.target)) this._close();\n      });\n  \n      document.documentElement.on('keydown' + '.tooltip-esc', event => {\n        if (event.code === 'Escape') this._close();\n      });\n  \n      this.el.dataset.toolTipOpen = true;\n      this.el.dataset.toolTip = context;\n    }\n  \n    _close() {\n      this.toolTipContent.innerHTML = '';\n      this.el.dataset.toolTipOpen = 'false';\n      this.el.dataset.toolTip = '';\n  \n      this._unlockScrolling();\n  \n      this.closeButton.off('click' + '.tooltip-close');\n      document.documentElement.off('click' + '.tooltip-outerclick');\n      document.documentElement.off('keydown' + '.tooltip-esc');\n    }\n  \n    _lockScrolling() {\n      theme.a11y.trapFocus({\n        container: this.el,\n        namespace: 'tooltip_focus'\n      });\n  \n      theme.a11y.lockMobileScrolling();\n      document.documentElement.classList.add('modal-open');\n    }\n  \n    _unlockScrolling() {\n      theme.a11y.removeTrapFocus({\n        container: this.el,\n        namespace: 'tooltip_focus'\n      });\n  \n      theme.a11y.unlockMobileScrolling();\n      document.documentElement.classList.remove('modal-open');\n    }\n  }\n  \n  customElements.define('tool-tip', ToolTip);\n  \n  /*============================================================================\n    ToolTipTrigger\n  ==============================================================================*/\n  \n  class ToolTipTrigger extends HTMLElement {\n    constructor() {\n      super();\n      this.el = this;\n      this.toolTipContent = this.querySelector('[data-tool-tip-content]');\n      this.init();\n    }\n  \n    init() {\n      const toolTipOpen = new CustomEvent('tooltip:open', {\n        detail: {\n          context: this.dataset.toolTip,\n          content: this.toolTipContent.innerHTML\n        },\n        bubbles: true\n      });\n  \n      this.el.addEventListener('click', e => {\n        e.stopPropagation();\n        this.dispatchEvent(toolTipOpen);\n      });\n    }\n  }\n  \n  customElements.define('tool-tip-trigger', ToolTipTrigger);\n  \n  /*============================================================================\n    NewsletterReminder\n  ==============================================================================*/\n  \n  class NewsletterReminder extends HTMLElement {\n    constructor() {\n      super();\n      this.closeBtn = this.querySelector('[data-close-button]');\n      this.popupTrigger = this.querySelector('[data-message]');\n  \n      this.id = this.dataset.sectionId;\n      this.newsletterId = `NewsletterPopup-${ this.id }`;\n      this.cookie = Cookies.get(`newsletter-${this.id}`);\n      this.cookieName = `newsletter-${this.id}`;\n      this.secondsBeforeShow = this.dataset.delaySeconds;\n      this.expiry = parseInt(this.dataset.delayDays);\n      this.modal = new theme.Modals(`NewsletterPopup-${this.newsletterId}`, 'newsletter-popup-modal');\n  \n      this.init();\n    }\n  \n    init() {\n      document.addEventListener('shopify:block:select', (evt) => {\n        if (evt.detail.sectionId === this.id) {\n          this.show(0, true)\n        }\n      });\n  \n      document.addEventListener('shopify:block:deselect', (evt) => {\n        if (evt.detail.sectionId === this.id) {\n          this.hide();\n        }\n      });\n  \n      document.addEventListener(`modalOpen.${this.newsletterId}`, () => this.hide());\n      document.addEventListener(`modalClose.${this.newsletterId}`, () => this.show());\n      document.addEventListener(`newsletter:openReminder`, () => this.show(0));\n  \n      this.closeBtn.addEventListener('click', () => {\n        this.hide();\n        Cookies.set(this.cookieName, 'opened', { path: '/', expires: this.expiry });\n      });\n  \n      this.popupTrigger.addEventListener('click', () => {\n        const reminderOpen = new CustomEvent('reminder:openNewsletter', { bubbles: true });\n        this.dispatchEvent(reminderOpen);\n  \n        this.hide();\n      });\n    }\n  \n    show(time = this.secondsBeforeShow, forceOpen = false) {\n      const reminderAppeared = (sessionStorage.getItem('reminderAppeared') === 'true');\n  \n      if (!reminderAppeared) {\n        setTimeout(() => {\n          this.dataset.enabled = 'true';\n          sessionStorage.setItem('reminderAppeared', true);\n        }, time * 1000);\n      }\n    }\n  \n    hide() {\n      this.dataset.enabled = 'false';\n    }\n  }\n  \n  customElements.define('newsletter-reminder', NewsletterReminder);\n  \n  /*============================================================================\n    ParallaxImage\n  ==============================================================================*/\n  \n  class ParallaxImage extends HTMLElement {\n    constructor() {\n      super();\n      this.parallaxImage = this.querySelector('[data-parallax-image]');\n      this.windowInnerHeight = window.innerHeight;\n      this.isActive = false;\n      this.timeout = null;\n      this.directionMap = {\n        right: 0,\n        top: 90,\n        left: 180,\n        bottom: 270\n      }\n      this.directionMultipliers = {\n        0: [  1,  0 ],\n        90: [  0, -1 ],\n        180: [ -1,  0 ],\n        270: [  0,  1 ]\n      }\n  \n      this.init();\n      window.addEventListener('scroll', () => this.scrollHandler());\n    }\n  \n    getParallaxInfo() {\n      const { width, height, top } = this.parallaxImage.getBoundingClientRect();\n      let element = this.parallaxImage;\n      let multipliers;\n      let { angle, movement } = element.dataset;\n  \n      let movementPixels = angle === 'top' ? Math.ceil(height * (parseFloat(movement) / 100)) : Math.ceil(width * (parseFloat(movement) / 100));\n  \n      // angle has shorthands \"top\", \"left\", \"bottom\" and \"right\"\n      // nullish coalescing. using `||` here would fail for `0`\n      angle = this.directionMap[angle] ?? parseFloat(angle);\n  \n      // fallback if undefined\n      // NaN is the only value that doesn't equal itself\n      if (angle !== angle) angle = 270; // move to bottom (default parallax effect)\n      if (movementPixels !== movementPixels) movementPixels = 100; // 100px\n  \n      // check if angle is located in top half and/or left half\n      angle %= 360;\n      if (angle < 0) angle += 360\n  \n      const toLeft = angle > 90 && angle < 270;\n      const toTop  = angle < 180;\n  \n      element.style[toLeft ? 'left' : 'right'] = 0;\n      element.style[toTop  ? 'top' : 'bottom'] = 0;\n  \n      // if it's not a perfectly horizontal or vertical movement, get cos and sin\n      if (angle % 90) {\n        const radians = angle * Math.PI / 180\n        multipliers = [ Math.cos(radians), Math.sin(radians) * -1 ] // only sin has to be inverted\n      } else {\n        multipliers = this.directionMultipliers[angle];\n      }\n  \n      // increase width and height according to movement and multipliers\n      if (multipliers[0]) element.style.width  = `calc(100% + ${movementPixels * Math.abs(multipliers[0])}px)`;\n      if (multipliers[1]) element.style.height = `calc(100% + ${movementPixels * Math.abs(multipliers[1])}px)`;\n  \n      return {\n        element,\n        movementPixels,\n        multipliers,\n        top,\n        height\n      }\n    }\n  \n    init() {\n      const { element, movementPixels, multipliers, top, height } = this.getParallaxInfo();;\n  \n      const scrolledInContainer = this.windowInnerHeight - top;\n      const scrollArea = this.windowInnerHeight + height;\n      const progress = scrolledInContainer / scrollArea;\n  \n      if (progress > -0.1 && progress < 1.1) {\n        const position = Math.min(Math.max(progress, 0), 1) * movementPixels;\n        element.style.transform = `translate3d(${position * multipliers[0]}px, ${position * multipliers[1]}px, 0)`;\n      }\n  \n      if (this.isActive) requestAnimationFrame(this.init.bind(this));\n    }\n  \n    scrollHandler() {\n      if (this.isActive) {\n        clearTimeout(this.timeout);\n      } else {\n        this.isActive = true;\n        requestAnimationFrame(this.init.bind(this));\n      }\n  \n      this.timeout = setTimeout(() => this.isActive = false, 20);\n    }\n  }\n  \n  customElements.define('parallax-image', ParallaxImage);\n  \n  /*============================================================================\n    ImageElement\n  ==============================================================================*/\n  \n  class ImageElement extends HTMLElement {\n    constructor() {\n      super();\n  \n      this.init();\n    }\n  \n    init() {\n  \n      const handleIntersection = (entries, observer) => {\n        if (!entries[0].isIntersecting) return;\n  \n        this.removeAnimations();\n  \n        observer.unobserve(this);\n      }\n  \n      // Set an IntersectionObserver to check if the image is nearly in the viewport\n      new IntersectionObserver(handleIntersection.bind(this), {rootMargin: '0px 0px 400px 0px'}).observe(this);\n    }\n  \n    removeAnimations() {\n      // Find the closest image-wrap and remove the animation (fix for streamline image-wrap shimmer)\n      const imageWrap = this.closest('.image-wrap');\n      const skrimWrap = this.closest('.skrim__link');\n  \n      if (imageWrap) {\n        imageWrap.classList.add('loaded');\n      }\n  \n      if (skrimWrap) {\n        skrimWrap.classList.add('loaded');\n      }\n    }\n  }\n  \n  customElements.define('image-element', ImageElement);\n  \n  /*============================================================================\n    PredictiveSearch\n  ==============================================================================*/\n  \n  class PredictiveSearch extends HTMLElement {\n    constructor() {\n      super();\n      this.enabled = this.getAttribute('data-enabled');\n      this.context = this.getAttribute('data-context');\n      this.input = this.querySelector('input[type=\"search\"]');\n      this.predictiveSearchResults = this.querySelector('#predictive-search');\n      this.closeBtn = this.querySelector('.btn--close-search');\n      this.screen = this.querySelector('[data-screen]');\n      this.SearchModal = this.closest('#SearchModal') || null;\n  \n      // Open events\n      document.addEventListener('predictive-search:open', e => {\n        if (e.detail.context !== this.context) return;\n        this.classList.add('is-active');\n  \n        // Wait for opening events to finish then apply focus\n        setTimeout(() => { this.input.focus(); }, 100);\n  \n        document.body.classList.add('predictive-overflow-hidden');\n      });\n  \n      // listen for class change of 'modal--is-active on this.SearchModal\n      if (this.SearchModal) {\n        const observer = new MutationObserver((mutations) => {\n          mutations.forEach((mutation) => {\n            if (mutation.attributeName === 'class') {\n              const modalClass = mutation.target.className;\n              if (modalClass.indexOf('modal--is-active') > -1) {\n                setTimeout(() => { this.input.focus(); }, 100);\n              }\n            }\n          });\n        });\n  \n        observer.observe(this.SearchModal, {\n          attributes: true\n        });\n      }\n  \n      if (this.enabled === 'false') return;\n  \n      // On typing\n      this.input.addEventListener('keydown', () => { this.classList.add('is-active'); });\n  \n      this.input.addEventListener('input', this.debounce((event) => {\n        this.onChange(event);\n      }, 300).bind(this));\n  \n      // Close events\n      document.addEventListener('predictive-search:close', () => { this.close(); });\n      document.addEventListener('keydown', (event) => { if (event.keyCode === 27) this.close(); });\n      this.closeBtn.addEventListener('click', e => { e.preventDefault(); this.close(); });\n      this.screen.addEventListener('click', () => { this.close(); });\n    }\n  \n    onChange() {\n      const searchTerm = this.input.value.trim();\n  \n      if (!searchTerm.length) return;\n  \n      this.getSearchResults(searchTerm);\n    }\n  \n    getSearchResults(searchTerm) {\n      const searchObj = {\n        'q': searchTerm,\n        'resources[limit]': 3,\n        'resources[limit_scope]': 'each',\n        'resources[options][unavailable_products]': 'last'\n      };\n  \n      const params = this.paramUrl(searchObj);\n  \n      fetch(`${theme.routes.predictiveSearch}?${params}&section_id=search-results`)\n        .then((response) => {\n          if (!response.ok) {\n            const error = new Error(response.status);\n            this.close();\n            throw error;\n          }\n  \n          return response.text();\n        })\n        .then((text) => {\n          const resultsMarkup = new DOMParser().parseFromString(text, 'text/html').querySelector('#shopify-section-search-results').innerHTML;\n          this.predictiveSearchResults.innerHTML = resultsMarkup;\n          this.open();\n  \n          AOS.refreshHard();\n        })\n        .catch((error) => {\n          this.close();\n          throw error;\n        });\n    }\n  \n    open() {\n      this.predictiveSearchResults.style.display = 'block';\n    }\n  \n    close() {\n      this.predictiveSearchResults.style.display = 'none';\n      this.predictiveSearchResults.innerHTML = '';\n      this.classList.remove('is-active');\n      document.body.classList.remove('predictive-overflow-hidden');\n  \n      document.dispatchEvent(new CustomEvent('predictive-search:close-all'));\n    }\n  \n    debounce(fn, wait) {\n      let t;\n      return (...args) => {\n        clearTimeout(t);\n        t = setTimeout(() => fn.apply(this, args), wait);\n      };\n    }\n  \n    paramUrl(obj) {\n      return Object.keys(obj).map(function(key) {\n        return key + '=' + encodeURIComponent(obj[key]);\n      }).join('&')\n    }\n  }\n  \n  customElements.define('predictive-search', PredictiveSearch);\n  \n  class RecipientForm extends HTMLElement {\n    constructor() {\n      super();\n      this.checkboxInput = this.querySelector(`#Recipient-Checkbox-${ this.dataset.sectionId }`);\n      this.emailInput = this.querySelector(`#Recipient-email-${ this.dataset.sectionId }`);\n      this.nameInput = this.querySelector(`#Recipient-name-${ this.dataset.sectionId }`);\n      this.messageInput = this.querySelector(`#Recipient-message-${ this.dataset.sectionId }`);\n      this.dateInput = this.querySelector(`#Recipient-send-on-${ this.dataset.sectionId }`);\n      this.addEventListener('change', () => this.onChange());\n      this.recipientFields = this.querySelector('.recipient-fields');\n  \n      this.checkboxInput.addEventListener('change', () => {\n        this.recipientFields.style.display = this.checkboxInput.checked ? 'block' : 'none';\n      });\n    }\n  \n    connectedCallback() {\n      document.addEventListener('ajaxProduct:error', (event) => {\n        const productVariantID = event.target.querySelector('[name=\"id\"]').value;\n        if (productVariantID === this.dataset.productVariantId) {\n          this.displayErrorMessage(event.detail.errorMessage);\n        }\n      });\n  \n      document.addEventListener('ajaxProduct:added', (event) => {\n        const productVariantID = event.target.querySelector('[name=\"id\"]').value;\n        if (productVariantID === this.dataset.productVariantId) {\n          this.clearInputFields();\n          this.clearErrorMessage();\n        }\n      });\n    }\n  \n    onChange() {\n      if (!this.checkboxInput.checked) {\n        this.clearInputFields();\n        this.clearErrorMessage();\n      }\n    }\n  \n    clearInputFields() {\n      this.querySelectorAll('.field__input').forEach(el => el.value = '');\n    }\n  \n    displayErrorMessage(body) {\n      this.clearErrorMessage();\n      if (body) {\n        return Object.entries(body).forEach(([key, value]) => {\n          const inputElement = this[`${key}Input`];\n          if (!inputElement) return;\n  \n          inputElement.setAttribute('aria-invalid', true);\n          inputElement.classList.add('field__input--error');\n        });\n      }\n    }\n  \n    clearErrorMessage() {\n      this.querySelectorAll('.field__input').forEach(inputElement => {\n        inputElement.setAttribute('aria-invalid', false);\n        inputElement.removeAttribute('aria-describedby');\n        inputElement.classList.remove('field__input--error');\n      });\n    }\n  };\n  \n  customElements.define('recipient-form', RecipientForm);\n  \n\n  theme.announcementBar = (function() {\n    var selectors = {\n      bar: '.announcement',\n      text: '.announcement__text',\n      closeBtn: '.announcement__close'\n    };\n  \n    var classes = {\n      opening: 'announcement--opening',\n      closed: 'announcement--closed'\n    };\n  \n    var config = {\n      namespace: '.announcementBar'\n    };\n  \n    function init() {\n      // If no close button, no JS needed\n      if (!document.querySelector(selectors.closeBtn)) {\n        return;\n      }\n  \n      if (theme.config.hasSessionStorage && sessionStorage[announcementBarText()] !== 'hidden') {\n        window.setTimeout(function() {\n          announcementBarShow();\n        }, 2000);\n      }\n  \n      // Probably in the editor, so show it anyway\n      if (!theme.config.hasSessionStorage) {\n        window.setTimeout(function() {\n          announcementBarShow();\n        }, 2000);\n      }\n  \n      document.querySelector(selectors.closeBtn).addEventListener('click', announcementBarClose);\n  \n      window.on('resize' + config.namespace, theme.utils.debounce(500, announcementBarHeight));\n    }\n  \n    function unload() {\n      window.off('resize' + config.namespace);\n    }\n  \n    function announcementBarShow() {\n      document.querySelector(selectors.bar).classList.remove(classes.closed);\n      announcementBarHeight();\n    }\n  \n    function announcementBarHeight() {\n      var barHeight = document.querySelector(selectors.text).clientHeight;\n      document.querySelector(selectors.bar).classList.add(classes.opening);\n      document.querySelector(selectors.bar).style.maxHeight = barHeight + 'px';\n    }\n  \n    function announcementBarClose() {\n      if (theme.config.hasSessionStorage) {\n        sessionStorage.setItem(announcementBarText(), 'hidden');\n      }\n  \n      document.querySelector(selectors.bar).classList.add(classes.closed);\n    }\n  \n    function announcementBarText() {\n      return document.querySelector(selectors.text).dataset.text;\n    }\n  \n    return {\n      init: init,\n      unload: unload\n    };\n  })();\n  \n  theme.articleImages = function() {\n    var wrappers = document.querySelectorAll('.rte--indented-images');\n  \n    if (!wrappers.length) {\n      return;\n    }\n  \n    wrappers.forEach(wrapper => {\n      wrapper.querySelectorAll('img').forEach(image => {\n        var attr = image.getAttribute('style');\n        // Check if undefined for float: none\n        if (!attr || attr == 'float: none;') {\n          // Remove grid-breaking styles if image is not wider than parent\n          if (image.width < wrapper.offsetWidth) {\n            image.classList.add('rte__no-indent');\n          }\n        }\n      });\n    });\n  };\n  \n  theme.CartDrawer = (function() {\n    var selectors = {\n      drawer: '#CartDrawer',\n      form: '#CartDrawerForm'\n    };\n  \n    function CartDrawer() {\n      this.form = document.querySelector(selectors.form);\n      this.drawer = new theme.Drawers('CartDrawer', 'cart');\n  \n      this.init();\n    }\n  \n    CartDrawer.prototype = Object.assign({}, CartDrawer.prototype, {\n      init: function() {\n        this.cartForm = new theme.CartForm(this.form);\n        this.cartForm.buildCart();\n  \n        document.addEventListener('ajaxProduct:added', function(evt) {\n          this.cartForm.buildCart();\n          this.open();\n        }.bind(this));\n  \n        // Dev-friendly way to open cart\n        document.addEventListener('cart:open', this.open.bind(this));\n        document.addEventListener('cart:close', this.close.bind(this));\n      },\n  \n      open: function() {\n        this.drawer.open();\n  \n        setTimeout(function() {\n          theme.a11y.trapFocus({\n            container: this.drawer,\n            elementToFocus: this.form,\n            namespace: 'cartdrawer_focus'\n          });\n        }, 100);\n  \n      },\n  \n      close: function() {\n        this.drawer.close();\n  \n        theme.a11y.removeTrapFocus({\n          container: this.drawer,\n          namespace: 'cartdrawer_focus'\n        });\n      }\n    });\n  \n    return CartDrawer;\n  })();\n  \n  theme.customerTemplates = function() {\n    checkUrlHash();\n    initEventListeners();\n    resetPasswordSuccess();\n    customerAddressForm();\n  \n    function checkUrlHash() {\n      var hash = window.location.hash;\n  \n      // Allow deep linking to recover password form\n      if (hash === '#recover') {\n        toggleRecoverPasswordForm();\n      }\n    }\n  \n    function toggleRecoverPasswordForm() {\n      var passwordForm = document.getElementById('RecoverPasswordForm').classList.toggle('hide');\n      var loginForm = document.getElementById('CustomerLoginForm').classList.toggle('hide');\n    }\n  \n    function initEventListeners() {\n      // Show reset password form\n      var recoverForm = document.getElementById('RecoverPassword');\n      if (recoverForm) {\n        recoverForm.addEventListener('click', function(evt) {\n          evt.preventDefault();\n          toggleRecoverPasswordForm();\n        });\n      }\n  \n      // Hide reset password form\n      var hideRecoverPassword = document.getElementById('HideRecoverPasswordLink');\n      if (hideRecoverPassword) {\n        hideRecoverPassword.addEventListener('click', function(evt) {\n          evt.preventDefault();\n          toggleRecoverPasswordForm();\n        });\n      }\n    }\n  \n    function resetPasswordSuccess() {\n      var formState = document.querySelector('.reset-password-success');\n  \n      // check if reset password form was successfully submitted\n      if (!formState) {\n        return;\n      }\n  \n      // show success message\n      document.getElementById('ResetSuccess').classList.remove('hide');\n    }\n  \n    function customerAddressForm() {\n      var newAddressForm = document.getElementById('AddressNewForm');\n      var addressForms = document.querySelectorAll('.js-address-form');\n  \n      if (!newAddressForm || !addressForms.length) {\n        return;\n      }\n  \n      // Country/province selector can take a short time to load\n      setTimeout(function() {\n        document.querySelectorAll('.js-address-country').forEach(el => {\n          var countryId = el.dataset.countryId;\n          var provinceId = el.dataset.provinceId;\n          var provinceContainerId = el.dataset.provinceContainerId;\n  \n          new Shopify.CountryProvinceSelector(\n            countryId,\n            provinceId,\n            {\n              hideElement: provinceContainerId\n            }\n          );\n        });\n      }, 1000);\n  \n      // Toggle new/edit address forms\n      document.querySelectorAll('.address-new-toggle').forEach(el => {\n        el.addEventListener('click', function() {\n          newAddressForm.classList.toggle('hide');\n        });\n      });\n  \n      document.querySelectorAll('.address-edit-toggle').forEach(el => {\n        el.addEventListener('click', function(evt) {\n          var formId = evt.currentTarget.dataset.formId;\n          document.getElementById('EditAddress_' + formId).classList.toggle('hide');\n        });\n      });\n  \n      document.querySelectorAll('.address-delete').forEach(el => {\n        el.addEventListener('click', function(evt) {\n          var formId = evt.currentTarget.dataset.formId;\n          var confirmMessage = evt.currentTarget.dataset.confirmMessage;\n  \n          if (confirm(confirmMessage || 'Are you sure you wish to delete this address?')) {\n            if (Shopify) {\n              Shopify.postLink('/account/addresses/' + formId, {parameters: {_method: 'delete'}});\n            }\n          }\n        })\n      });\n    }\n  };\n  \n  theme.headerNav = (function() {\n    var selectors = {\n      wrapper: '#HeaderWrapper',\n      siteHeader: '#SiteHeader',\n      searchBtn: '.js-search-header',\n      closeSearch: '#SearchClose',\n      searchContainer: '.site-header__search-container',\n      logo: '#LogoContainer img',\n      navItems: '.site-nav__item',\n      navLinks: '.site-nav__link',\n      navDropdown: '.site-nav__dropdown',\n      navLinksWithDropdown: '.site-nav__link--has-dropdown',\n      navDropdownLinks: '.site-nav__dropdown-link--second-level',\n      navDetails: '.site-nav__details',\n    };\n  \n    var classes = {\n      hasDropdownClass: 'site-nav--has-dropdown',\n      hasSubDropdownClass: 'site-nav__deep-dropdown-trigger',\n      dropdownActive: 'is-focused'\n    };\n  \n    var config = {\n      namespace: '.siteNav',\n      wrapperOverlayed: false,\n      overlayedClass: 'is-light',\n      overlayEnabledClass: 'header-wrapper--overlay',\n      stickyEnabled: false,\n      stickyActive: false,\n      stickyClass: 'site-header--stuck',\n      stickyHeaderWrapper: 'StickyHeaderWrap',\n      openTransitionClass: 'site-header--opening',\n      lastScroll: 0\n    };\n  \n    // Elements used in resize functions, defined in init\n    var wrapper;\n    var siteHeader;\n  \n    function init() {\n      wrapper = document.querySelector(selectors.wrapper);\n      siteHeader = document.querySelector(selectors.siteHeader);\n  \n      config.stickyEnabled = (siteHeader.dataset.sticky === 'true');\n      if (config.stickyEnabled) {\n        config.wrapperOverlayed = wrapper.classList.contains(config.overlayedClass);\n        stickyHeader();\n      }\n  \n      theme.settings.overlayHeader = (siteHeader.dataset.overlay === 'true');\n      // Disable overlay header if on collection template with no collection image\n      if (theme.settings.overlayHeader && Shopify && Shopify.designMode) {\n        if (document.body.classList.contains('template-collection') && !document.querySelector('.collection-hero')) {\n          this.disableOverlayHeader();\n        }\n      }\n  \n      menuDetailsHandler();\n      searchDrawer();\n    }\n  \n    // If the header setting to overlay the menu on the collection image\n    // is enabled but the collection setting is disabled, we need to undo\n    // the init of the sticky nav\n    function disableOverlayHeader() {\n      wrapper.classList.remove(config.overlayEnabledClass);\n      wrapper.classList.remove(config.overlayedClass);\n      config.wrapperOverlayed = false;\n    }\n  \n    function stickyHeader() {\n      config.lastScroll = 0;\n  \n      var wrapWith = document.createElement('div');\n      wrapWith.id = config.stickyHeaderWrapper;\n      theme.utils.wrap(siteHeader, wrapWith);\n  \n      stickyHeaderInitialPosition(siteHeader);\n      stickyHeaderHeight();\n  \n      window.on('resize' + config.namespace, theme.utils.debounce(50, stickyHeaderHeight));\n      window.on('scroll' + config.namespace, theme.utils.throttle(20, stickyHeaderScroll));\n  \n      // This gets messed up in the editor, so here's a fix\n      if (Shopify && Shopify.designMode) {\n        setTimeout(function() {\n          stickyHeaderHeight();\n        }, 250);\n      }\n    }\n  \n    function stickyHeaderInitialPosition(header) {\n      const headerParent = header.closest('.shopify-section-group-header-group');\n      const parentNextSibling = headerParent.nextElementSibling;\n  \n      // if parentNextSibling has same class as headerParent, then header is above announcement bar\n      if (parentNextSibling && parentNextSibling.classList.contains('shopify-section-group-header-group')) {\n        // get height of announcement bar and set header wrapper top to that value\n        const nextSiblingHeight = parentNextSibling.offsetHeight;\n        document.querySelector(selectors.wrapper).style.top = nextSiblingHeight + 'px';\n      }\n    }\n  \n    function stickyHeaderHeight() {\n      if (!config.stickyEnabled) {\n        return;\n      }\n  \n      var h = siteHeader.offsetHeight;\n      var stickyHeader = document.querySelector('#' + config.stickyHeaderWrapper);\n      stickyHeader.style.height = h + 'px';\n    }\n  \n    function stickyHeaderScroll() {\n      if (!config.stickyEnabled) {\n        return;\n      }\n  \n      requestAnimationFrame(scrollHandler);\n  \n      config.lastScroll = window.scrollY;\n    }\n  \n    function scrollHandler() {\n      if (window.scrollY > 250) {\n        if (config.stickyActive) {\n          return;\n        }\n  \n        config.stickyActive = true;\n  \n        siteHeader.classList.add(config.stickyClass);\n        if (config.wrapperOverlayed) {\n          wrapper.classList.remove(config.overlayedClass);\n        }\n  \n        // Add open transition class after element is set to fixed\n        // so CSS animation is applied correctly\n        setTimeout(function() {\n          siteHeader.classList.add(config.openTransitionClass);\n        }, 100);\n      } else {\n        if (!config.stickyActive) {\n          return;\n        }\n  \n        config.stickyActive = false;\n  \n        siteHeader.classList.remove(config.openTransitionClass);\n        siteHeader.classList.remove(config.stickyClass);\n        if (config.wrapperOverlayed) {\n          wrapper.classList.add(config.overlayedClass);\n        }\n      }\n    }\n  \n    function searchDrawer() {\n      document.querySelectorAll(selectors.searchBtn).forEach(btn => {\n        btn.addEventListener('click', function(evt) {\n          evt.preventDefault();\n          evt.stopPropagation();\n          document.dispatchEvent(new CustomEvent('predictive-search:open', {\n            detail: {\n              context: 'header'\n            },\n            bubbles: true\n          }));\n  \n          // add is-active class to .site-header__search-container\n          document.querySelector(selectors.searchContainer).classList.add('is-active');\n        });\n      });\n  \n      document.addEventListener('predictive-search:close-all', function() {\n        closeSearchDrawer();\n      });\n    }\n  \n    function closeSearchDrawer(evt) {\n      // Do not close if click event came from inside drawer\n      if (evt) {\n        // evt.path is non-standard, so have fallback\n        var path = evt.path || (evt.composedPath && evt.composedPath());\n        for (var i = 0; i < path.length; i++) {\n          if (path[i].classList) {\n            if (path[i].classList.contains('site-header__search-btn')) {\n              break;\n            }\n  \n            if (path[i].classList.contains('site-header__search-container')) {\n              return;\n            }\n          }\n        }\n      }\n  \n      // deselect any focused form elements\n      document.activeElement.blur();\n  \n      document.documentElement.classList.add('js-drawer-closing');\n      document.documentElement.classList.remove('js-drawer-open', 'js-drawer-open--search');\n  \n      window.setTimeout(function() {\n        document.documentElement.classList.remove('js-drawer-closing');\n      }.bind(this), 500);\n  \n      var container = document.querySelector(selectors.searchContainer);\n      theme.utils.prepareTransition(container, function() {\n        container.classList.remove('is-active');\n      }.bind(this));\n    }\n  \n    function menuDetailsHandler() {\n      const navDetails = document.querySelectorAll(selectors.navDetails);\n  \n      navDetails.forEach((navDetail) => {\n        const summary = navDetail.querySelector('summary');\n  \n        // if the navDetail is open, then close it when the user clicks outside of it\n        document.addEventListener('click', (evt) => {\n  \n          if (navDetail.hasAttribute('open') && !navDetail.contains(evt.target)) {\n            navDetail.removeAttribute('open');\n            summary.setAttribute('aria-expanded', 'false');\n          } else {\n            if (navDetail.hasAttribute('open')) {\n              summary.setAttribute('aria-expanded', 'false');\n            } else {\n              summary.setAttribute('aria-expanded', 'true');\n            }\n          }\n        });\n      });\n    }\n  \n    return {\n      init: init,\n      disableOverlayHeader: disableOverlayHeader\n    };\n  })();\n  \n\n  /*============================================================================\n    Age Verification Popup\n  ==============================================================================*/\n  \n  class AgeVerificationPopup extends HTMLElement {\n    constructor() {\n      super();\n  \n      this.cookieName = this.id;\n      this.cookie = Cookies.get(this.cookieName);\n  \n      this.classes = {\n        activeContent: 'age-verification-popup__content--active',\n        inactiveContent: 'age-verification-popup__content--inactive',\n        inactiveDeclineContent: 'age-verification-popup__decline-content--inactive',\n        activeDeclineContent: 'age-verification-popup__decline-content--active',\n      }\n  \n      this.declineButton = this.querySelector('[data-age-verification-popup-decline-button]');\n      this.declineContent = this.querySelector('[data-age-verification-popup-decline-content]');\n      this.content = this.querySelector('[data-age-verification-popup-content]');\n      this.returnButton = this.querySelector('[data-age-verification-popup-return-button]');\n      this.exitButton = this.querySelector('[data-age-verification-popup-exit-button]');\n      this.backgroundImage = this.querySelector('[data-background-image]');\n      this.mobileBackgroundImage = this.querySelector('[data-mobile-background-image]');\n  \n      if (Shopify.designMode) {\n        document.addEventListener('shopify:section:select', (event) => {\n          if (event.detail.sectionId === this.dataset.sectionId) {\n            this.init();\n          }\n        })\n  \n        document.addEventListener('shopify:section:load', (event) => {\n          if (event.detail.sectionId === this.dataset.sectionId) {\n            this.init();\n  \n            // If 'Test mode' is enabled, remove the cookie we've set\n            if (this.dataset.testMode === 'true' && this.cookie) {\n              Cookies.remove(this.cookieName);\n            }\n  \n            // Check session storage if user was editing on the second view\n            const secondViewVisited = sessionStorage.getItem(this.id);\n  \n            if (!secondViewVisited) return;\n  \n            this.showDeclineContent();\n          }\n        })\n  \n        document.addEventListener('shopify:section:unload', (event) => {\n          if (event.detail.sectionId === this.dataset.sectionId) {\n            this.modal.close();\n          }\n        })\n      }\n  \n      // Age verification popup will only be hidden if test mode is disabled AND\n      // either a cookie exists OR visibility is toggled in the editor\n      if ((this.cookie) && this.dataset.testMode === 'false') return;\n  \n      this.init();\n    }\n  \n    init() {\n      this.modal = new theme.Modals(this.id, 'age-verification-popup-modal', {\n        closeOffContentClick: false\n      });\n  \n      if (this.backgroundImage) {\n        this.backgroundImage.style.display = 'block';\n      }\n  \n      if (theme.config.bpSmall && this.mobileBackgroundImage) {\n        this.mobileBackgroundImage.style.display = 'block';\n      }\n  \n      this.modal.open();\n  \n      theme.a11y.lockMobileScrolling(`#${this.id}`, document.querySelector('#MainContent'));\n  \n      if (this.declineButton) {\n        this.declineButton.addEventListener('click', (e) => {\n          e.preventDefault();\n          this.showDeclineContent();\n  \n          // If in editor, save to session storage to indicate that user has moved on to the second view\n          // Allows view to persist while making changes in the editor\n          if (Shopify.designMode) {\n            sessionStorage.setItem(this.id, 'second-view');\n          }\n        });\n      }\n  \n      if (this.returnButton) {\n        this.returnButton.addEventListener('click', (e) => {\n          e.preventDefault();\n          this.hideDeclineContent();\n  \n          // Remove data from session storage so second view doesn't persist\n          const secondViewVisited = sessionStorage.getItem(this.id);\n  \n          if (Shopify.designMode && secondViewVisited) {\n            sessionStorage.removeItem(this.id);\n          }\n        })\n      }\n  \n      if (this.exitButton) {\n        this.exitButton.addEventListener('click', (e) => {\n          e.preventDefault();\n  \n          // We don't want to set a cookie if in test mode\n          if (this.dataset.testMode === 'false') {\n            Cookies.set(this.cookieName, 'entered', { expires: 30, sameSite: 'none', secure: true });\n          }\n  \n          if (this.backgroundImage) {\n            this.backgroundImage.style.display = 'none';\n          }\n  \n          if (theme.config.bpSmall && this.mobileBackgroundImage) {\n            this.mobileBackgroundImage.style.display = 'none';\n          }\n  \n          this.modal.close();\n  \n          theme.a11y.unlockMobileScrolling(`#${this.id}`, document.querySelector('#MainContent'));\n        })\n      }\n    }\n  \n    showDeclineContent() {\n      this.declineContent.classList.remove(this.classes.inactiveDeclineContent);\n      this.declineContent.classList.add(this.classes.activeDeclineContent);\n  \n      this.content.classList.add(this.classes.inactiveContent);\n      this.content.classList.remove(this.classes.activeContent);\n    }\n  \n    hideDeclineContent() {\n      this.declineContent.classList.add(this.classes.inactiveDeclineContent);\n      this.declineContent.classList.remove(this.classes.activeDeclineContent);\n  \n      this.content.classList.remove(this.classes.inactiveContent);\n      this.content.classList.add(this.classes.activeContent);\n    }\n  }\n  \n  customElements.define('age-verification-popup', AgeVerificationPopup);\n  \n  \n  \n  theme.Maps = (function() {\n    var config = {\n      zoom: 14\n    };\n    var apiStatus = null;\n    var mapsToLoad = [];\n  \n    var errors = {};\n  \n    var selectors = {\n      section: '[data-section-type=\"map\"]',\n      map: '[data-map]',\n      mapOverlay: '.map-section__overlay'\n    };\n  \n    // Global function called by Google on auth errors.\n    // Show an auto error message on all map instances.\n    window.gm_authFailure = function() {\n      if (!Shopify.designMode) {\n        return;\n      }\n  \n      document.querySelectorAll(selectors.section).forEach(section => {\n        section.classList.add('map-section--load-error');\n      });\n  \n      document.querySelectorAll(selectors.map).forEach(map => {\n        map.parentNode.removeChild(map);\n      });\n  \n      window.mapError(theme.strings.authError);\n    };\n  \n    window.mapError = function(error) {\n      var message = document.createElement('div');\n      message.classList.add('map-section__error', 'errors', 'text-center');\n      message.innerHTML = error;\n      document.querySelectorAll(selectors.mapOverlay).forEach(overlay => {\n        overlay.parentNode.prepend(message);\n      });\n      document.querySelectorAll('.map-section__link').forEach(link => {\n        link.classList.add('hide');\n      });\n    };\n  \n    function Map(container) {\n      this.container = container;\n      this.sectionId = this.container.getAttribute('data-section-id');\n      this.namespace = '.map-' + this.sectionId;\n      this.map = container.querySelector(selectors.map);\n      this.key = this.map.dataset.apiKey;\n  \n      errors = {\n        addressNoResults: theme.strings.addressNoResults,\n        addressQueryLimit: theme.strings.addressQueryLimit,\n        addressError: theme.strings.addressError,\n        authError: theme.strings.authError\n      };\n  \n      if (!this.key) {\n        return;\n      }\n  \n      theme.initWhenVisible({\n        element: this.container,\n        callback: this.prepMapApi.bind(this),\n        threshold: 20\n      });\n    }\n  \n    // API has loaded, load all Map instances in queue\n    function initAllMaps() {\n      mapsToLoad.forEach(instance => {\n        instance.createMap();\n      });\n    }\n  \n    function geolocate(map) {\n      var geocoder = new google.maps.Geocoder();\n  \n      if (!map) {\n        return;\n      }\n  \n      var address = map.dataset.addressSetting;\n  \n      var deferred = new Promise((resolve, reject) => {\n        geocoder.geocode({ address: address }, function(results, status) {\n          if (status !== google.maps.GeocoderStatus.OK) {\n            reject(status);\n          }\n          resolve(results);\n        });\n      });\n  \n      return deferred;\n    }\n  \n    Map.prototype = Object.assign({}, Map.prototype, {\n      prepMapApi: function() {\n        if (apiStatus === 'loaded') {\n          this.createMap();\n        } else {\n          mapsToLoad.push(this);\n  \n          if (apiStatus !== 'loading') {\n            apiStatus = 'loading';\n            if (typeof window.google === 'undefined' || typeof window.google.maps === 'undefined' ) {\n  \n              var script = document.createElement('script');\n              script.onload = function () {\n                apiStatus = 'loaded';\n                initAllMaps();\n              };\n              script.src = 'https://maps.googleapis.com/maps/api/js?key=' + this.key;\n              document.head.appendChild(script);\n            }\n          }\n        }\n      },\n  \n      createMap: function() {\n        var mapDiv = this.map;\n  \n        return geolocate(mapDiv)\n          .then(\n            function(results) {\n              var mapOptions = {\n                zoom: config.zoom,\n                backgroundColor: 'none',\n                center: results[0].geometry.location,\n                draggable: false,\n                clickableIcons: false,\n                scrollwheel: false,\n                disableDoubleClickZoom: true,\n                disableDefaultUI: true\n              };\n  \n              var map = (this.map = new google.maps.Map(mapDiv, mapOptions));\n              var center = (this.center = map.getCenter());\n  \n              var marker = new google.maps.Marker({\n                map: map,\n                position: map.getCenter()\n              });\n  \n              google.maps.event.addDomListener(\n                window,\n                'resize',\n                theme.utils.debounce(250, function() {\n                  google.maps.event.trigger(map, 'resize');\n                  map.setCenter(center);\n                  mapDiv.removeAttribute('style');\n                })\n              );\n  \n              if (Shopify.designMode) {\n                if (window.AOS) { AOS.refreshHard() }\n              }\n            }.bind(this)\n          )\n          .catch(function(status) {\n            var errorMessage;\n  \n            switch (status) {\n              case 'ZERO_RESULTS':\n                errorMessage = errors.addressNoResults;\n                break;\n              case 'OVER_QUERY_LIMIT':\n                errorMessage = errors.addressQueryLimit;\n                break;\n              case 'REQUEST_DENIED':\n                errorMessage = errors.authError;\n                break;\n              default:\n                errorMessage = errors.addressError;\n                break;\n            }\n  \n            // Show errors only to merchant in the editor.\n            if (Shopify.designMode) {\n              window.mapError(errorMessage);\n            }\n          });\n      },\n  \n      onUnload: function() {\n        if (this.map.length === 0) {\n          return;\n        }\n        // Causes a harmless JS error when a section without an active map is reloaded\n        if (google && google.maps && google.maps.event) {\n          google.maps.event.clearListeners(this.map, 'resize');\n        }\n      }\n    });\n  \n    return Map;\n  })();\n  \n  theme.NewsletterPopup = (function () {\n    function NewsletterPopup(container) {\n      this.container = container;\n      var sectionId = this.container.getAttribute('data-section-id');\n  \n      this.cookieName = 'newsletter-' + sectionId;\n      this.cookie = Cookies.get(this.cookieName);\n  \n      if (!container) {\n        return;\n      }\n  \n      // Prevent popup on Shopify robot challenge page\n      if (window.location.pathname === '/challenge') {\n        return;\n      }\n  \n      // Prevent popup on password page\n      if (window.location.pathname === '/password') {\n        return;\n      }\n  \n      this.data = {\n        secondsBeforeShow: container.dataset.delaySeconds,\n        daysBeforeReappear: container.dataset.delayDays,\n        hasReminder: container.dataset.hasReminder,\n        testMode: container.dataset.testMode\n      };\n  \n      this.modal = new theme.Modals('NewsletterPopup-' + sectionId, 'newsletter-popup-modal');\n  \n      // Set cookie if optional button is clicked\n      var btn = container.querySelector('.popup-cta a');\n      if (btn) {\n        btn.addEventListener('click', function () {\n          this.closePopup(true);\n        }.bind(this));\n      }\n  \n      // Open modal if errors or success message exist\n      if (container.querySelector('.errors') || container.querySelector('.note--success')) {\n        this.modal.open();\n      }\n  \n      // Set cookie as opened if success message\n      if (container.querySelector('.note--success')) {\n        this.closePopup(true);\n        return;\n      }\n  \n      document.addEventListener('modalClose.' + container.id, this.closePopup.bind(this));\n  \n      if (!this.cookie) {\n        this.initPopupDelay();\n      }\n  \n      // Open modal if triggered by newsletter reminder\n      document.addEventListener('reminder:openNewsletter', () => {\n        this.modal.open();\n      });\n    }\n  \n    NewsletterPopup.prototype = Object.assign({}, NewsletterPopup.prototype, {\n      initPopupDelay: function () {\n        if (this.data.testMode === 'true') {\n          return;\n        }\n        setTimeout(function () {\n          const newsletterAppeared = (sessionStorage.getItem('newsletterAppeared') === 'true');\n          if (newsletterAppeared) {\n            const openReminder = new CustomEvent('newsletter:openReminder', { bubbles: true });\n            this.container.dispatchEvent(openReminder);\n          } else {\n            this.modal.open();\n            sessionStorage.setItem('newsletterAppeared', true);\n          }\n  \n        }.bind(this), this.data.secondsBeforeShow * 1000);\n      },\n  \n      closePopup: function (success) {\n        // Remove a cookie in case it was set in test mode\n        if (this.data.testMode === 'true') {\n          Cookies.remove(this.cookieName, { path: '/' });\n          return;\n        }\n  \n        var expiry = success ? 200 : this.data.daysBeforeReappear;\n        var hasReminder = (this.data.hasReminder === 'true');\n        var reminderAppeared = (sessionStorage.getItem('reminderAppeared') === 'true');\n  \n        if (hasReminder && reminderAppeared) {\n          Cookies.set(this.cookieName, 'opened', { path: '/', expires: expiry });\n        } else if(!hasReminder) {\n          Cookies.set(this.cookieName, 'opened', { path: '/', expires: expiry });\n        }\n      },\n  \n      onLoad: function () {\n        this.modal.open();\n      },\n  \n      onSelect: function () {\n        this.modal.open();\n      },\n  \n      onDeselect: function () {\n        this.modal.close();\n      },\n  \n      onBlockSelect: function () {\n        this.modal.close();\n      },\n  \n      onBlockDeselect: function () {\n        this.modal.open();\n      },\n  \n      onUnload: function() {\n        this.modal.close();\n      }\n    });\n  \n    return NewsletterPopup;\n  })();\n  \n  theme.PasswordHeader = (function() {\n    function PasswordHeader() {\n      this.init();\n    }\n  \n    PasswordHeader.prototype = Object.assign({}, PasswordHeader.prototype, {\n      init: function() {\n        if (!document.querySelector('#LoginModal')) {\n          return;\n        }\n  \n        var passwordModal = new theme.Modals('LoginModal', 'login-modal', {\n          focusIdOnOpen: 'password',\n          solid: true\n        });\n  \n        // Open modal if errors exist\n        if (document.querySelectorAll('.errors').length) {\n          passwordModal.open();\n        }\n      }\n    });\n  \n    return PasswordHeader;\n  })();\n  \n  theme.Photoswipe = (function() {\n    var selectors = {\n      trigger: '.js-photoswipe__zoom',\n      images: '.photoswipe__image',\n      slideshowTrack: '.flickity-viewport ',\n      activeImage: '.is-selected'\n    };\n  \n    function Photoswipe(container, sectionId) {\n      this.container = container;\n      this.sectionId = sectionId;\n      this.namespace = '.photoswipe-' + this.sectionId;\n      this.gallery;\n      this.images;\n      this.items;\n      this.inSlideshow = false;\n  \n      if (!container || container.dataset.zoom === 'false') {\n        return;\n      }\n  \n      this.init();\n    }\n  \n    Photoswipe.prototype = Object.assign({}, Photoswipe.prototype, {\n      init: function() {\n        this.container.querySelectorAll(selectors.trigger).forEach(trigger => {\n          trigger.on('click' + this.namespace, this.triggerClick.bind(this));\n        });\n      },\n  \n      triggerClick: function(evt) {\n        // Streamline changes between a slideshow and\n        // stacked images, so recheck if we are still\n        // working with a slideshow when initializing zoom\n        if (this.container.dataset && this.container.dataset.hasSlideshow === 'true') {\n          this.inSlideshow = true;\n        } else {\n          this.inSlideshow = false;\n        }\n  \n        this.items = this.getImageData();\n  \n        var image = this.inSlideshow ? this.container.querySelector(selectors.activeImage) : evt.currentTarget;\n  \n        var index = this.inSlideshow ? this.getChildIndex(image) : image.dataset.index;\n  \n        this.initGallery(this.items, index);\n      },\n  \n      // Because of image set feature, need to get index based on location in parent\n      getChildIndex: function(el) {\n        var i = 0;\n        while( (el = el.previousSibling) != null ) {\n          i++;\n        }\n  \n        // 1-based index required\n        return i + 1;\n      },\n  \n      getImageData: function() {\n        this.images = this.inSlideshow\n                        ? this.container.querySelectorAll(selectors.slideshowTrack + selectors.images)\n                        : this.container.querySelectorAll(selectors.images);\n  \n        var items = [];\n        var options = {};\n  \n        this.images.forEach(el => {\n          var item = {\n            msrc: el.currentSrc || el.src,\n            src: el.getAttribute('data-photoswipe-src'),\n            w: el.getAttribute('data-photoswipe-width'),\n            h: el.getAttribute('data-photoswipe-height'),\n            el: el,\n            initialZoomLevel: 0.5\n          }\n  \n          items.push(item);\n        });\n  \n        return items;\n      },\n  \n      initGallery: function(items, index) {\n        var pswpElement = document.querySelectorAll('.pswp')[0];\n  \n        var options = {\n          allowPanToNext: false,\n          captionEl: false,\n          closeOnScroll: false,\n          counterEl: false,\n          history: false,\n          index: index - 1,\n          pinchToClose: false,\n          preloaderEl: false,\n          scaleMode: 'zoom',\n          shareEl: false,\n          tapToToggleControls: false,\n          getThumbBoundsFn: function(index) {\n            var pageYScroll = window.pageYOffset || document.documentElement.scrollTop;\n            var thumbnail = items[index].el;\n            var rect = thumbnail.getBoundingClientRect();\n            return {x:rect.left, y:rect.top + pageYScroll, w:rect.width};\n          }\n        }\n  \n        this.gallery = new PhotoSwipe(pswpElement, PhotoSwipeUI_Default, items, options);\n        this.gallery.listen('afterChange', this.afterChange.bind(this));\n        this.gallery.init();\n  \n        this.preventiOS15Scrolling();\n      },\n  \n      afterChange: function() {\n        var index = this.gallery.getCurrentIndex();\n        this.container.dispatchEvent(new CustomEvent('photoswipe:afterChange', {\n          detail: {\n            index: index\n          }\n        }));\n      },\n  \n      syncHeight: function() {\n        document.documentElement.style.setProperty(\n          \"--window-inner-height\", \n          `${window.innerHeight}px`\n        );\n      },\n  \n      // Fix poached from https://gist.github.com/dimsemenov/0b8c255c0d87f2989e8ab876073534ea\n      preventiOS15Scrolling: function() {\n        let initialScrollPos;\n  \n        if (!/iPhone|iPad|iPod/i.test(window.navigator.userAgent)) return; \n        \n        this.syncHeight();\n              \n        // Store scroll position to restore it later\n        initialScrollPos = window.scrollY;\n        \n        // Add class to root element when PhotoSwipe opens\n        document.documentElement.classList.add('pswp-open-in-ios');\n  \n        window.addEventListener('resize', this.syncHeight);\n      \n        this.gallery.listen('destroy', () => {\n          document.documentElement.classList.remove('pswp-open-in-ios');\n          window.scrollTo(0, initialScrollPos);\n        });\n      }\n    });\n  \n    return Photoswipe;\n  })();\n  \n  \n  /*============================================================================\n    ProductRecommendations\n  ==============================================================================*/\n  \n  class ProductRecommendations extends HTMLElement {\n    constructor() {\n      super();\n      this.el = this;\n      this.url = this.dataset.url;\n      this.intent = this.dataset.intent;\n      this.placeholder = this.querySelector('.product-recommendations-placeholder');\n      this.productResults =  this.querySelector('.grid-product');\n      this.sectionId = this.dataset.sectionId;\n      this.blockId = this.dataset.blockId;\n  \n      document.addEventListener('recommendations:loaded', (e) => {\n        this.colorImages = this.el.querySelectorAll('.grid-product__color-image');\n        if (this.colorImages.length) {\n          this.swatches = this.el.querySelectorAll('.color-swatch--with-image');\n          this.colorSwatchHovering();\n        }\n      });\n    }\n  \n    connectedCallback() {\n      fetch(this.url)\n        .then(response => response.text())\n        .then(text => {\n  \n        const html = document.createElement('div');\n        html.innerHTML = text;\n        const recommendations = html.querySelector('.product-recommendations');\n  \n        if (!recommendations) {\n          this.el.classList.add('hide');\n          if (AOS) { AOS.refreshHard() }\n          return;\n        }\n  \n        this.placeholder.innerHTML = '';\n        this.placeholder.innerHTML = recommendations.innerHTML;\n  \n        theme.reinitProductGridItem(this.el);\n  \n        this.slideshow = this.querySelector('[data-slideshow]');\n  \n        if (this.slideshow) {\n          this.setupSlider();\n        }\n  \n        document.dispatchEvent(new CustomEvent('recommendations:loaded', {\n          detail: {\n            section: this.el,\n            intent: this.intent\n          }\n        }));\n  \n        })\n        .catch(e => {\n          console.error(e);\n        });\n    }\n  \n    setupSlider() {\n      const controlType = this.slideshow.dataset.controls;\n      const perSlide = parseFloat(this.slideshow.dataset.perSlide);\n      const count = parseFloat(this.slideshow.dataset.count);\n  \n      let prevNextButtons = false;\n      let pageDots = true;\n  \n      if (controlType === 'arrows') {\n        pageDots = false;\n        prevNextButtons = true;\n      }\n  \n      if (perSlide < count) {\n        this.flickity = new theme.Slideshow(this.slideshow, {\n          prevNextButtons,\n          pageDots,\n          adaptiveHeight: true,\n          wrapAround: false,\n        });\n      }\n    }\n  \n    colorSwatchHovering() {\n      this.swatches.forEach(swatch => {\n        swatch.addEventListener('mouseenter', function() {\n          this.setActiveColorImage(swatch);\n        }.bind(this));\n  \n        swatch.addEventListener('touchstart', function(evt) {\n          evt.preventDefault();\n          this.setActiveColorImage(swatch);\n        }.bind(this), {passive: true});\n  \n        swatch.addEventListener('mouseleave', function() {\n          this.removeActiveColorImage(swatch);\n        }.bind(this));\n      });\n    }\n  \n    setActiveColorImage(swatch) {\n      const id = swatch.dataset.variantId;\n      const image = swatch.dataset.variantImage;\n  \n      // Unset all active swatch images\n      this.colorImages.forEach(el => {\n        el.classList.remove('is-active');\n      });\n  \n      // Unset all active swatches\n      this.swatches.forEach(el => {\n        el.classList.remove('is-active');\n      });\n  \n      // Set active image and swatch\n      const imageEl = this.el.querySelector(`.grid-product__color-image--${id}`);\n  \n      imageEl.style.backgroundImage = 'url(' + image + ')';\n      imageEl.classList.add('is-active');\n      swatch.classList.add('is-active');\n  \n      // Update product grid item href with variant URL\n      const variantUrl = swatch.dataset.url;\n      const gridItem = swatch.closest('.grid-item__link');\n      gridItem.setAttribute('href', variantUrl);\n    }\n  \n    removeActiveColorImage(swatch) {\n      const id = swatch.dataset.variantId;\n      this.el.querySelector(`.grid-product__color-image--${id}`).classList.remove('is-active');\n    }\n  }\n  \n  customElements.define('product-recommendations', ProductRecommendations);\n  \n  theme.SlideshowSection = (function() {\n  \n    var selectors = {\n      parallaxContainer: '.parallax-container'\n    };\n  \n    function SlideshowSection(container) {\n      this.container = container;\n      var sectionId = container.getAttribute('data-section-id');\n      this.slideshow = container.querySelector('#Slideshow-' + sectionId);\n      this.namespace = '.' + sectionId;\n  \n      this.initialIndex = 0;\n  \n      if (!this.slideshow) { return }\n  \n      // Get shopify-created div that section markup lives in,\n      // then get index of it inside its parent\n      var sectionEl = container.parentElement;\n      var sectionIndex = [].indexOf.call(sectionEl.parentElement.children, sectionEl);\n  \n      if (sectionIndex === 0) {\n        this.init();\n      } else {\n        theme.initWhenVisible({\n          element: this.container,\n          callback: this.init.bind(this)\n        });\n      }\n  \n    }\n  \n    SlideshowSection.prototype = Object.assign({}, SlideshowSection.prototype, {\n      init: function() {\n        var slides = this.slideshow.querySelectorAll('.slideshow__slide');\n  \n        this.slideshow.classList.remove('loading', 'loading--delayed');\n        this.slideshow.classList.add('loaded');\n  \n        if (slides.length > 1) {\n          var sliderArgs = {\n            prevNextButtons: this.slideshow.hasAttribute('data-arrows'),\n            pageDots: this.slideshow.hasAttribute('data-dots'),\n            fade: true,\n            setGallerySize: false,\n            initialIndex: this.initialIndex,\n            autoPlay: this.slideshow.dataset.autoplay === 'true'\n              ? parseInt(this.slideshow.dataset.speed)\n              : false\n          };\n  \n          this.flickity = new theme.Slideshow(this.slideshow, sliderArgs);\n        } else {\n          // Add loaded class to first slide\n          slides[0].classList.add('is-selected');\n        }\n      },\n  \n      forceReload: function() {\n        this.onUnload();\n        this.init();\n      },\n  \n      onUnload: function() {\n        if (this.flickity && typeof this.flickity.destroy === 'function') {\n          this.flickity.destroy();\n        }\n      },\n  \n      onDeselect: function() {\n        if (this.flickity && typeof this.flickity.play === 'function') {\n          this.flickity.play();\n        }\n      },\n  \n      onBlockSelect: function(evt) {\n        var slide = this.slideshow.querySelector('.slideshow__slide--' + evt.detail.blockId)\n        var index = parseInt(slide.dataset.index);\n  \n        if (this.flickity && typeof this.flickity.pause === 'function') {\n          this.flickity.goToSlide(index);\n          this.flickity.pause();\n        } else {\n          // If section reloads, slideshow might not have been setup yet, wait a second and try again\n          this.initialIndex = index;\n          setTimeout(function() {\n            if (this.flickity && typeof this.flickity.pause === 'function') {\n              this.flickity.pause();\n            }\n          }.bind(this), 1000);\n        }\n      },\n  \n      onBlockDeselect: function() {\n        if (this.flickity && typeof this.flickity.play === 'function') {\n          if (this.flickity.args.autoPlay) {\n            this.flickity.play();\n          }\n        }\n      }\n    });\n  \n    return SlideshowSection;\n  })();\n  \n  theme.StoreAvailability = (function() {\n    var selectors = {\n      drawerOpenBtn: '.js-drawer-open-availability',\n      modalOpenBtn: '.js-modal-open-availability',\n      productTitle: '[data-availability-product-title]'\n    };\n  \n    function StoreAvailability(container) {\n      this.container = container;\n      this.baseUrl = container.dataset.baseUrl;\n      this.productTitle = container.dataset.productName;\n    }\n  \n    StoreAvailability.prototype = Object.assign({}, StoreAvailability.prototype, {\n      updateContent: function(variantId) {\n        var variantSectionUrl =\n          this.baseUrl +\n          '/variants/' +\n          variantId +\n          '/?section_id=store-availability';\n  \n        var self = this;\n  \n        fetch(variantSectionUrl)\n          .then(function(response) {\n            return response.text();\n          })\n          .then(function(html) {\n            if (html.trim() === '') {\n              this.container.innerHTML = '';\n              return;\n            }\n  \n            self.container.innerHTML = html;\n            self.container.innerHTML = self.container.firstElementChild.innerHTML;\n  \n            // Setup drawer if have open button\n            if (self.container.querySelector(selectors.drawerOpenBtn)) {\n              self.drawer = new theme.Drawers('StoreAvailabilityDrawer', 'availability');\n            }\n  \n            // Setup modal if have open button\n            if (self.container.querySelector(selectors.modalOpenBtn)) {\n              self.modal = new theme.Modals('StoreAvailabilityModal', 'availability');\n            }\n  \n            var title = self.container.querySelector(selectors.productTitle);\n            if (title) {\n              title.textContent = self.productTitle;\n            }\n          });\n      }\n    });\n  \n    return StoreAvailability;\n  })();\n  \n  theme.VideoSection = (function() {\n    var selectors = {\n      videoParent: '.video-parent-section'\n    };\n  \n    function videoSection(container) {\n      this.container = container;\n      this.sectionId = container.getAttribute('data-section-id');\n      this.namespace = '.video-' + this.sectionId;\n      this.videoObject;\n  \n      theme.initWhenVisible({\n        element: this.container,\n        callback: this.init.bind(this),\n        threshold: 500\n      });\n    }\n  \n    videoSection.prototype = Object.assign({}, videoSection.prototype, {\n      init: function() {\n        var dataDiv = this.container.querySelector('.video-div');\n        if (!dataDiv) {\n          return;\n        }\n        var type = dataDiv.dataset.type;\n  \n        switch(type) {\n          case 'youtube':\n            var videoId = dataDiv.dataset.videoId;\n            this.initYoutubeVideo(videoId);\n            break;\n          case 'vimeo':\n            var videoId = dataDiv.dataset.videoId;\n            this.initVimeoVideo(videoId);\n            break;\n          case 'mp4':\n            this.initMp4Video();\n            break;\n        }\n      },\n  \n      initYoutubeVideo: function(videoId) {\n        this.videoObject = new theme.YouTube(\n          'YouTubeVideo-' + this.sectionId,\n          {\n            videoId: videoId,\n            videoParent: selectors.videoParent\n          }\n        );\n      },\n  \n      initVimeoVideo: function(videoId) {\n        this.videoObject = new theme.VimeoPlayer(\n          'Vimeo-' + this.sectionId,\n          videoId,\n          {\n            videoParent: selectors.videoParent\n          }\n        );\n      },\n  \n      initMp4Video: function() {\n        var mp4Video = 'Mp4Video-' + this.sectionId;\n        var mp4Div = document.getElementById(mp4Video);\n        var parent = mp4Div.closest(selectors.videoParent);\n  \n        if (mp4Div) {\n          parent.classList.add('loaded');\n  \n          var playPromise = document.querySelector('#' + mp4Video).play();\n  \n          // Edge does not return a promise (video still plays)\n          if (playPromise !== undefined) {\n            playPromise.then(function() {\n                // playback normal\n              }).catch(function() {\n                mp4Div.setAttribute('controls', '');\n                parent.classList.add('video-interactable');\n              });\n          }\n        }\n      },\n  \n      onUnload: function(evt) {\n        var sectionId = evt.target.id.replace('shopify-section-', '');\n        if (this.videoObject && typeof this.videoObject.destroy === 'function') {\n          this.videoObject.destroy();\n        }\n      }\n    });\n  \n    return videoSection;\n  })();\n  \n  /*============================================================================\n    CountdownTimer\n  ==============================================================================*/\n  \n  class CountdownTimer extends HTMLElement {\n    constructor() {\n      super();\n      this.el = this;\n      this.display = this.querySelector('[data-time-display]');\n      this.block = this.closest('.countdown__block--timer');\n      this.year = this.el.dataset.year;\n      this.month = this.el.dataset.month;\n      this.day = this.el.dataset.day;\n      this.hour = this.el.dataset.hour;\n      this.minute = this.el.dataset.minute;\n      this.daysPlaceholder = this.querySelector('[date-days-placeholder]');\n      this.hoursPlaceholder = this.querySelector('[date-hours-placeholder]');\n      this.minutesPlaceholder = this.querySelector('[date-minutes-placeholder]');\n      this.secondsPlaceholder = this.querySelector('[date-seconds-placeholder]');\n      this.messagePlaceholder = this.querySelector('[data-message-placeholder]');\n      this.hideTimerOnComplete = this.el.dataset.hideTimer;\n      this.completeMessage = this.el.dataset.completeMessage;\n  \n      this.timerComplete = false;\n  \n      this.init();\n    }\n  \n    init() {\n      setInterval(() => {\n        if (!this.timerComplete) {\n          this._calculate();\n        }\n      }, 1000);\n  \n    }\n  \n    _calculate() {\n      // Find time difference and convert to integer\n      const timeDifference = +new Date(`${this.month}/${this.day}/${this.year} ${this.hour}:${this.minute}:00`).getTime() - +new Date().getTime();\n      // If time difference is greater than 0, calculate remaining time\n      if (timeDifference > 0) {\n        const intervals = {\n          days: Math.floor(timeDifference / (1000 * 60 * 60 * 24)),\n          hours: Math.floor((timeDifference / (1000 * 60 * 60)) % 24),\n          minutes: Math.floor((timeDifference / 1000 / 60) % 60),\n          seconds: Math.floor((timeDifference / 1000) % 60),\n        };\n  \n        this.daysPlaceholder.innerHTML = intervals.days;\n        this.hoursPlaceholder.innerHTML = intervals.hours;\n        this.minutesPlaceholder.innerHTML = intervals.minutes;\n        this.secondsPlaceholder.innerHTML = intervals.seconds;\n  \n        setTimeout(() => {\n          this.display.classList.add('countdown__display--loaded');\n        }, 1);\n      } else {\n        if (this.completeMessage && this.messagePlaceholder) {\n          this.messagePlaceholder.classList.add('countdown__timer-message--visible');\n        }\n  \n        if (this.hideTimerOnComplete === 'true') {\n          this.display.classList.remove('countdown__display--visible');\n          this.display.classList.add('countdown__display--hidden');\n        }\n  \n        if (!this.completeMessage && this.hideTimerOnComplete === 'true') {\n          this.block.classList.add('countdown__block--hidden');\n        }\n  \n        this.timerComplete = true;\n      }\n    }\n  }\n  \n  customElements.define('countdown-timer', CountdownTimer);\n  \n  /*============================================================================\n    HotSpots\n  ==============================================================================*/\n  \n  class HotSpots extends HTMLElement {\n    constructor() {\n      super();\n      this.el = this;\n      this.buttons = this.querySelectorAll('[data-button]');\n      this.hotspotBlocks = this.querySelectorAll('[data-hotspot-block]');\n      this.blockContainer = this.querySelector('[data-block-container]');\n      this.colorImages = this.querySelectorAll('.grid-product__color-image');\n      this.colorSwatches = this.querySelectorAll('.color-swatch--with-image');\n  \n      this._bindEvents();\n      this._setupQuickShop();\n  \n      if (this.colorImages.length) {\n        this._colorSwatchHovering();\n      }\n    }\n  \n    _colorSwatchHovering() {\n      this.colorSwatches.forEach(swatch => {\n        swatch.addEventListener('mouseenter', function() {\n          this._setActiveColorImage(swatch);\n        }.bind(this));\n  \n        swatch.addEventListener('touchstart', function(evt) {\n          evt.preventDefault();\n          this._setActiveColorImage(swatch);\n        }.bind(this), {passive: true});\n  \n        swatch.addEventListener('mouseleave', function() {\n          this._removeActiveColorImage(swatch);\n        }.bind(this));\n      });\n    }\n  \n    _setActiveColorImage(swatch) {\n      var id = swatch.dataset.variantId;\n      var image = swatch.dataset.variantImage;\n  \n      // Unset all active swatch images\n      this.colorImages.forEach(el => {\n        el.classList.remove('is-active');\n      });\n  \n      // Unset all active swatches\n      this.colorSwatches.forEach(el => {\n        el.classList.remove('is-active');\n      });\n  \n      // Set active image and swatch\n      var imageEl = this.el.querySelector('.grid-product__color-image--' + id);\n      imageEl.style.backgroundImage = 'url(' + image + ')';\n      imageEl.classList.add('is-active');\n      swatch.classList.add('is-active');\n  \n      // Update product grid item href with variant URL\n      var variantUrl = swatch.dataset.url;\n      var gridItem = swatch.closest('.grid-item__link');\n  \n      if (gridItem) gridItem.setAttribute('href', variantUrl);\n    }\n  \n    _removeActiveColorImage(swatch) {\n      const id = swatch.dataset.variantId;\n      this.querySelector(`.grid-product__color-image--${id}`).classList.remove('is-active');\n    }\n  \n    /* Setup event listeners */\n    _bindEvents() {\n      this.buttons.forEach(button => {\n        const id = button.dataset.button;\n  \n        button.on('click', e => {\n          e.preventDefault();\n          e.stopPropagation();\n          this._showContent(id);\n        });\n      });\n  \n      // Display active hotspot block on theme editor select\n      document.addEventListener('shopify:block:select', (e) => {\n        const blockId = e.detail.blockId;\n        this._showContent(`${blockId}`);\n      });\n    }\n  \n    /* Toggle sidebar content */\n    _showContent(id) {\n      // Hide all hotspotBlock\n      // Show the hotspotBlock with the id\n      this.hotspotBlocks.forEach((block) => {\n        if (block.dataset.hotspotBlock === id) {\n          block.classList.add('is-active');\n        } else {\n          block.classList.remove('is-active');\n        }\n      });\n    }\n  \n    _setupQuickShop() {\n      if (this.querySelectorAll('[data-block-type=\"product\"]').length > 0) {\n        // Ensure we are utilizing the right version of QuickShop based off of theme\n        if (typeof theme.QuickShop === 'function') {\n          new theme.QuickShop(this.blockContainer);\n        } else if (typeof theme.initQuickShop === 'function') {\n          theme.initQuickShop();\n        }\n  \n        if (typeof theme.QuickAdd === 'function') {\n          new theme.QuickAdd(this.blockContainer);\n        }\n      }\n    }\n  }\n  \n  customElements.define('hot-spots', HotSpots);\n  \n  /*============================================================================\n    ImageCompare\n  ==============================================================================*/\n  \n  class ImageCompare extends HTMLElement {\n    constructor() {\n      super();\n      this.el = this;\n      this.sectionId = this.dataset.sectionId;\n      this.button = this.querySelector('[data-button]');\n      this.draggableContainer = this.querySelector('[data-draggable]');\n      this.primaryImage = this.querySelector('[data-primary-image]');\n      this.secondaryImage = this.querySelector('[data-secondary-image]');\n  \n      this.calculateSizes();\n  \n      this.active = false;\n      this.currentX = 0;\n      this.initialX = 0;\n      this.xOffset = 0;\n  \n      this.buttonOffset = this.button.offsetWidth / 2;\n  \n      this.el.addEventListener(\"touchstart\", this.dragStart, false);\n      this.el.addEventListener(\"touchend\", this.dragEnd, false);\n      this.el.addEventListener(\"touchmove\", this.drag, false);\n  \n      this.el.addEventListener(\"mousedown\", this.dragStart, false);\n      this.el.addEventListener(\"mouseup\", this.dragEnd, false);\n      this.el.addEventListener(\"mousemove\", this.drag, false);\n  \n      window.on('resize', theme.utils.debounce(250, () => { this.calculateSizes(true)}));\n  \n      document.addEventListener('shopify:section:load', event => {\n        if (event.detail.sectionId === this.sectionId && this.primaryImage !== null) {\n          this.calculateSizes();\n        }\n      });\n    }\n  \n    calculateSizes(hasResized = false) {\n      this.active = false;\n      this.currentX = 0;\n      this.initialX = 0;\n      this.xOffset = 0;\n  \n      this.buttonOffset = this.button.offsetWidth / 2;\n  \n      this.elWidth = this.el.offsetWidth;\n  \n      this.button.style.transform = `translate(-${this.buttonOffset}px, -50%)`;\n  \n      if (this.primaryImage) {\n        this.primaryImage.style.width = `${this.elWidth}px`;\n      }\n  \n      if (hasResized) this.draggableContainer.style.width = `${this.elWidth/2}px`;\n    }\n  \n    dragStart(e) {\n      if (e.type === \"touchstart\") {\n        this.initialX = e.touches[0].clientX - this.xOffset;\n      } else {\n        this.initialX = e.clientX - this.xOffset;\n      }\n  \n      if (e.target === this.button) {\n        this.active = true;\n      }\n    }\n  \n    dragEnd(e) {\n      this.initialX = this.currentX;\n  \n      this.active = false;\n    }\n  \n    drag(e) {\n      if (this.active) {\n  \n        e.preventDefault();\n  \n        if (e.type === \"touchmove\") {\n          this.currentX = e.touches[0].clientX - this.initialX;\n        } else {\n          this.currentX = e.clientX - this.initialX;\n        }\n  \n        this.xOffset = this.currentX;\n        this.setTranslate(this.currentX, this.button);\n      }\n    }\n  \n    setTranslate(xPos, el) {\n      let newXpos = xPos - this.buttonOffset;\n      let newVal = (this.elWidth/2) + xPos;\n  \n      const boundaryPadding = 50;\n      const XposMin = (this.elWidth/2 + this.buttonOffset) * -1;\n      const XposMax = this.elWidth/2 - this.buttonOffset;\n  \n      // Set boundaries for dragging\n      if (newXpos < (XposMin + boundaryPadding)) {\n        newXpos = XposMin + boundaryPadding;\n        newVal = boundaryPadding\n      } else if (newXpos > (XposMax - boundaryPadding)) {\n        newXpos = XposMax - boundaryPadding;\n        newVal = this.elWidth - boundaryPadding;\n      }\n  \n      el.style.transform = `translate(${newXpos}px, -50%)`;\n      this.draggableContainer.style.width = `${newVal}px`;\n    }\n  }\n  \n  customElements.define('image-compare', ImageCompare);\n  \n\n  theme.Blog = (function() {\n  \n    function Blog(container) {\n      this.tagFilters();\n    }\n  \n    Blog.prototype = Object.assign({}, Blog.prototype, {\n      tagFilters: function() {\n        var filterBy = document.getElementById('BlogTagFilter');\n  \n        if (!filterBy) {\n          return;\n        }\n  \n        filterBy.addEventListener('change', function() {\n          location.href = filterBy.value;\n        });\n      }\n    });\n  \n    return Blog;\n  })();\n  \n  theme.CollectionSwitcher = (function() {\n    var selectors = {\n      trigger: '.collection-switcher__trigger',\n      collection: '.collection-switcher__collection',\n      slider: '.collection-switcher__collection-grid'\n    };\n  \n    var sliderArgs = {\n      adaptiveHeight: true,\n      avoidReflow: true,\n      autoPlay: false,\n      cellAlign: 'left',\n      fade: false,\n      prevNextButtons: true,\n      setGallerySize: true,\n      wrapAround: false\n    };\n  \n    function CollectionSwitcher(container) {\n      this.container = container;\n      this.sectionId = this.container.getAttribute('data-section-id');\n      this.slideshows = container.querySelectorAll(selectors.slider);\n      this.namespace = '.switcher-' + this.sectionId;\n      this.flickity = {};\n      this.activeIndex = 0;\n  \n      theme.initWhenVisible({\n        element: this.container,\n        callback: this.init.bind(this),\n        threshold: 300\n      });\n    }\n  \n    CollectionSwitcher.prototype = Object.assign({}, CollectionSwitcher.prototype, {\n      init: function() {\n        this.container.querySelectorAll(selectors.trigger)\n        this.container.querySelectorAll(selectors.trigger).forEach(trigger => {\n          trigger.on('click', this.switch.bind(this));\n        });\n  \n        if (!this.slideshows.length) { return }\n  \n        this.config = {\n          perRow: this.container.getAttribute('data-per-row'),\n          perRowMobile: 2 // fixed always\n        };\n  \n        this.initSliders();\n  \n        document.addEventListener('matchSmall', function() {\n          this.initSliders();\n        }.bind(this));\n  \n        document.addEventListener('unmatchSmall', function() {\n          this.initSliders();\n        }.bind(this));\n      },\n  \n      initSliders: function() {\n        // Make sure both sliders are visible so flickity inits properly\n        this.container.querySelectorAll(selectors.collection).forEach(collection => {\n          collection.classList.remove('hide');\n        });\n  \n        sliderArgs.groupCells = theme.config.bpSmall ? this.config.perRowMobile : this.config.perRow;\n  \n        this.slideshows.forEach(function(slideshow, i) {\n          if (this.flickity[i] && typeof this.flickity[i].destroy === 'function') {\n            this.flickity[i].destroy();\n          }\n  \n          this.flickity[i] = new theme.Slideshow(slideshow, sliderArgs);\n  \n          // Hide non-active collection after flickity setup\n          if (i !== this.activeIndex) {\n            slideshow.closest(selectors.collection).classList.add('hide');\n          }\n  \n        }.bind(this));\n  \n        if (AOS) {\n          AOS.refresh();\n        }\n      },\n  \n      switch: function(evt) {\n        evt.preventDefault();\n  \n        var containerId = evt.currentTarget.getAttribute('aria-controls');\n        var newContainer = document.getElementById(containerId);\n        this.activeIndex = parseInt(newContainer.dataset.index);\n  \n        this.container.querySelectorAll(selectors.trigger).forEach(trigger => {\n          trigger.classList.remove('is-active');\n        });\n  \n        evt.currentTarget.classList.add('is-active');\n  \n        // Hide collections, show new one\n        this.container.querySelectorAll(selectors.collection).forEach(collection => {\n          collection.classList.add('hide');\n        });\n  \n        newContainer.classList.remove('hide');\n  \n  \n        if (this.flickity[this.activeIndex] && typeof this.flickity[this.activeIndex].resize === 'function') {\n          this.flickity[this.activeIndex].resize();\n        }\n      },\n  \n      destroy: function() {\n        if (this.flickity && typeof this.flickity.destroy === 'function') {\n          this.flickity.destroy();\n        }\n      },\n  \n      onUnload: function() {\n        this.destroy();\n      }\n  \n    });\n  \n    return CollectionSwitcher;\n  })();\n  \n  theme.CollectionSidebar = (function() {\n    var selectors = {\n      sidebar: '#CollectionSidebar',\n    };\n  \n    function CollectionSidebar(container) {\n      this.container = container.querySelector(selectors.sidebar);\n    }\n  \n    CollectionSidebar.prototype = Object.assign({}, CollectionSidebar.prototype, {\n      init: function() {\n        // Do not load when no sidebar exists\n        if (!this.container) {\n          return;\n        }\n  \n        this.onUnload();\n  \n        theme.FilterDrawer = new theme.Drawers('FilterDrawer', 'collection-filters', true);\n      },\n  \n      forceReload: function() {\n        this.init();\n      },\n  \n      onSelect: function() {\n        if (theme.FilterDrawer && (drawerStyle || theme.config.bpSmall)) {\n          theme.FilterDrawer.open();\n        }\n      },\n  \n      onDeselect: function() {\n        if (theme.FilterDrawer) {\n          theme.FilterDrawer.close();\n        }\n      },\n  \n      onUnload: function() {\n        if (theme.FilterDrawer) {\n          theme.FilterDrawer.close();\n        }\n      }\n    });\n  \n    return CollectionSidebar;\n  })();\n  \n  theme.Collection = (function() {\n    var isAnimating = false;\n    var hasLoadedBefore = false;\n  \n    var selectors = {\n      sortSelect: '#SortBy',\n      hero: '.collection-hero',\n      title: '.collection-title',\n      sidebar: '#CollectionSidebar',\n  \n      // filter selectors\n      activeTagList: '.tag-list--active-tags',\n      tags: '.tag-list input',\n      activeTags: '.tag-list a',\n      tagsForm: '.filter-form',\n      filters: '.collection-filter',\n      filterSidebar: '.collapsible-content--sidebar',\n      trigger: '.collapsible-trigger',\n      priceRange: '.price-range',\n    };\n  \n    var classes = {\n      activeTag: 'tag--active',\n      removeTagParent: 'tag--remove',\n      filterSidebar: 'collapsible-content--sidebar',\n      isOpen: 'is-open',\n    };\n  \n    function Collection(container) {\n      this.container = container;\n      this.sectionId = container.getAttribute('data-section-id');\n      this.namespace = '.collection-' + this.sectionId;\n  \n      var heroImageContainer = container.querySelector('.collection-hero');\n  \n      if (heroImageContainer) {\n        if (hasLoadedBefore) {\n          this.checkIfNeedReload();\n        }\n  \n        heroImageContainer.classList.remove('loading', 'loading--delayed');\n        heroImageContainer.classList.add('loaded');\n  \n      } else if (theme.settings.overlayHeader) {\n        theme.headerNav.disableOverlayHeader();\n      }\n  \n      this.sidebar = new theme.CollectionSidebar(container);\n  \n      // Ajax loader for filters\n      this.ajaxRenderer = new theme.AjaxRenderer({\n        sections: [\n          {\n            sectionId: this.sectionId,\n            nodeId: ['CollectionAjaxContent', 'FilterDrawerTrigger', 'FilterDrawer'],\n          },\n        ],\n        onReplace: this.onReplaceAjaxContent.bind(this),\n      });\n  \n      this.init();\n    }\n  \n    Collection.prototype = Object.assign({}, Collection.prototype, {\n      init: function() {\n        this.bindBackButton();\n        this.sidebar.init();\n        this.sortSelect = this.container.querySelector(selectors.sortSelect);\n  \n        if (this.sortSelect) {\n          this.defaultSort = this.getDefaultSortValue();\n          this.sortSelect.addEventListener('change', this.onSortChange.bind(this));\n        }\n  \n        this.initPriceRange();\n  \n        document.querySelectorAll(selectors.activeTags).forEach(tag => {\n          tag.addEventListener('click', this.onTagClick.bind(this));\n        });\n  \n        document.querySelectorAll(selectors.tagsForm).forEach(form => {\n          form.addEventListener('input', this.onFormSubmit.bind(this));\n        });\n  \n        hasLoadedBefore = true;\n      },\n  \n      onTagClick: function(evt) {\n        const tag = evt.currentTarget;\n  \n        if (tag.classList.contains('no-ajax')) {\n          return;\n        }\n  \n        evt.preventDefault();\n  \n        if (isAnimating) {\n          return;\n        }\n  \n        isAnimating = true;\n  \n        const parent = tag.parentNode;\n        const newUrl = new URL(tag.href);\n  \n        this.renderActiveTag(parent, tag);\n        this.startLoading();\n        this.renderCollectionPage(newUrl.searchParams);\n      },\n  \n      onFormSubmit: function(evt) {\n        const tag = evt.target;\n  \n        // Do not ajax-load collection links\n        if (tag.classList.contains('no-ajax')) {\n          return;\n        }\n  \n        evt.preventDefault();\n  \n        if (isAnimating) {\n          return;\n        }\n  \n        isAnimating = true;\n  \n        const parent = tag.closest('li');\n        const formEl = tag.closest('form');\n        const formData = new FormData(formEl);\n  \n        this.renderActiveTag(parent, tag);\n        this.startLoading();\n        this.renderFromFormData(formData);\n      },\n  \n      renderActiveTag: function(parent, el) {\n        const textEl = parent.querySelector('.tag__text');\n  \n        if (parent.classList.contains(classes.activeTag)) {\n          parent.classList.remove(classes.activeTag);\n        } else {\n          parent.classList.add(classes.activeTag);\n  \n          // If adding a tag, show new tag right away.\n          // Otherwise, remove it before ajax finishes\n          if (el.closest('li').classList.contains(classes.removeTagParent)) {\n            parent.remove();\n          } else {\n            // Append new tag in both drawer and sidebar\n            document.querySelectorAll(selectors.activeTagList).forEach(list => {\n              const newTag = document.createElement('li');\n              const newTagLink = document.createElement('a');\n              newTag.classList.add('tag', 'tag--remove');\n              newTagLink.classList.add('btn', 'btn--small');\n              newTagLink.innerText = textEl.innerText;\n              newTag.appendChild(newTagLink);\n  \n              list.appendChild(newTag);\n            });\n          }\n        }\n      },\n  \n      renderFromFormData: function(formData) {\n        const searchParams = new URLSearchParams(formData);\n        this.renderCollectionPage(searchParams);\n      },\n  \n      renderCollectionPage: function(searchParams, updateURLHash = true) {\n        this.ajaxRenderer\n          .renderPage(window.location.pathname, searchParams, updateURLHash)\n          .then(() => {\n            document.dispatchEvent(new CustomEvent('collection:reloaded'));\n            isAnimating = false;\n          });\n      },\n  \n      initPriceRange: function() {\n        const priceRangeEls = document.querySelectorAll(selectors.priceRange)\n        priceRangeEls.forEach((el) => new theme.PriceRange(el, {\n          // onChange passes in formData\n          onChange: this.renderFromFormData.bind(this),\n        }));\n      },\n  \n      getSortValue: function() {\n        return this.sortSelect.value || this.defaultSort;\n      },\n  \n      getDefaultSortValue: function() {\n        return this.sortSelect.getAttribute('data-default-sortby');\n      },\n  \n      onSortChange: function() {\n        this.queryParams = new URLSearchParams(window.location.search);\n  \n        this.queryParams.set('sort_by', this.getSortValue());\n        this.queryParams.delete('page'); // Delete if it exists\n  \n        window.location.search = this.queryParams.toString();\n      },\n  \n      fetchOpenCollasibleFilters: function() {\n        return Array.from(\n          document.querySelectorAll(\n            `${selectors.sidebar} ${selectors.trigger}.${classes.isOpen}`,\n          ),\n        ).map(trigger => trigger.dataset.collapsibleId);\n      },\n  \n      onReplaceAjaxContent: function(newDom, section) {\n        const openCollapsibleIds = this.fetchOpenCollasibleFilters();\n  \n        openCollapsibleIds.forEach(selector => {\n          newDom\n            .querySelectorAll(`[data-collapsible-id=${selector}]`)\n            .forEach(this.openCollapsible);\n        });\n  \n        if (typeof section.nodeId === 'string') {\n          var newContentEl = newDom.getElementById(section.nodeId);\n          if (!newContentEl) {\n            return;\n          }\n          document.getElementById(section.nodeId).innerHTML =\n            newContentEl.innerHTML;\n        } else {\n          section.nodeId.forEach(id => {\n            document.getElementById(id).innerHTML =\n              newDom.getElementById(id).innerHTML;\n          });\n        }\n  \n        this.reInit(newDom);\n      },\n  \n      openCollapsible: function(el) {\n        if (el.classList.contains(classes.filterSidebar)) {\n          el.style.height = 'auto';\n        }\n  \n        el.classList.add(classes.isOpen);\n      },\n  \n      reInit: function(doc) {\n        // Reload collection template (it can be anywhere in the sections.instance array)\n        for (var i = 0; i < theme.sections.instances.length; i++) {\n          var instance = theme.sections.instances[i];\n          if (instance['type'] === 'collection-template') {\n            instance.forceReload();\n          }\n        }\n  \n        // Update collection title\n        var title = doc.querySelector(selectors.title)\n        if (doc && title) {\n          document.querySelector(selectors.title).innerText = title.innerText;;\n        }\n  \n        this.initPriceRange();\n        theme.reinitProductGridItem();\n      },\n  \n      forceReload: function() {\n        this.onUnload();\n        this.init();\n      },\n  \n      onUnload: () => {},\n  \n      // A liquid variable in the header needs a full page refresh\n      // if the collection header hero image setting is enabled\n      // and the header is set to sticky. Only necessary in the editor.\n      checkIfNeedReload: function() {\n        if (!Shopify.designMode) {\n          return;\n        }\n  \n        if (theme.settings.overlayHeader) {\n          var header = document.querySelector('.header-wrapper');\n          if (!header.classList.contains('header-wrapper--overlay')) {\n            location.reload();\n          }\n        }\n      },\n  \n      bindBackButton: function() {\n        // Ajax page on back button\n        window.off('popstate' + this.namespace);\n        window.on('popstate' + this.namespace, function(state) {\n          if (state) {\n            const newUrl = new URL(window.location.href);\n            this.renderCollectionPage(newUrl.searchParams, false);\n          }\n        }.bind(this));\n      },\n  \n      startLoading: function() {\n        this.container.querySelectorAll('.grid-product').forEach(item => {\n          item.classList.add('unload');\n        });\n      },\n    });\n  \n    return Collection;\n  })();\n  \n  theme.FadingImages = (function() {\n  \n    var classes = {\n      activeImage: 'active-image',\n      finishedImage: 'finished-image',\n      activeTitles: 'active-titles',\n      finishedTitles: 'finished-titles',\n      compensation: 'compensation'\n    };\n  \n    function FadingImages(container) {\n      this.container = container;\n      var sectionId = container.getAttribute('data-section-id');\n      var namespace = this.namespace = '.fading-images-' + sectionId;\n  \n      if (!container) {\n        return;\n      }\n  \n      this.imageInterval;\n      this.titleInterval;\n  \n      this.data = {\n        interval: container.dataset.interval,\n        block_count: container.dataset.count,\n        finish_interval: 1000,\n        timer_offset: 400,\n        active_image: 1,\n        active_title: 1,\n        removed_compensation: false\n      };\n  \n      theme.initWhenVisible({\n        element: this.container,\n        callback: this.init.bind(this)\n      });\n    }\n  \n    FadingImages.prototype = Object.assign({}, FadingImages.prototype, {\n      init: function() {\n        var imageContainer = this.container.querySelector('.fading-images');\n        imageContainer.classList.remove('loading', 'loading--delayed');\n        imageContainer.classList.add('loaded');\n  \n        this.allTitles = this.container.querySelectorAll('.fading-images-overlay__titles');\n  \n        // pause when out of view\n        var observer = new IntersectionObserver((entries, observer) => {\n          entries.forEach(entry => {\n            if (entry.isIntersecting) {\n              this.startImages();\n              this.startTitles();\n            } else {\n              clearInterval(this.imageInterval);\n              clearInterval(this.titleInterval);\n            }\n          });\n        }, {rootMargin: '0px 0px 0px 0px'});\n  \n        observer.observe(this.container);\n      },\n  \n      nextImage: function() {\n        var activeImage = this.container.querySelector('.fading-images__item-wrapper[data-slide-index=\"' + this.data.active_image + '\"]');\n  \n        if (!this.data.removed_compensation) {\n          activeImage.classList.remove(classes.compensation);\n          this.data.removed_compensation = true;\n        }\n  \n        activeImage.classList.remove(classes.activeImage);\n        activeImage.classList.add(classes.finishedImage);\n  \n        var target_image = this.data.active_image;\n        window.setTimeout(function() {\n          activeImage.classList.remove(classes.finishedImage);\n        }, this.data.finish_interval);\n  \n        this.data.active_image++;\n        if (this.data.active_image > this.data.block_count) {\n          this.data.active_image = 1;\n        }\n  \n        var nextImage = this.container.querySelector('.fading-images__item-wrapper[data-slide-index=\"' + this.data.active_image + '\"]');\n  \n        nextImage.classList.add(classes.activeImage);\n      },\n  \n      nextTitle: function() {\n        this.allTitles.forEach(title => {\n          title.classList.remove(classes.activeTitles);\n          title.classList.add(classes.finishedTitles);\n        });\n  \n        this.data.active_title++;\n        if (this.data.active_title > this.data.block_count) {\n          this.data.active_title = 1;\n        }\n  \n        var target_title = this.data.active_title;\n        window.setTimeout(function() {\n          var slide = this.container.querySelector('.fading-images__item-wrapper[data-slide-index=\"' + target_title + '\"]');\n          var newText1 = slide.getAttribute('data-slide-title1');\n          var newText2 = slide.getAttribute('data-slide-title2');\n  \n          this.container.querySelector('.fading-images-overlay__title--1').textContent = newText1;\n          var textTwoContainer = this.container.querySelector('.fading-images-overlay__title--2');\n          if (textTwoContainer) {\n            textTwoContainer.textContent = newText2;\n          }\n  \n          this.allTitles.forEach(title => {\n            title.classList.remove(classes.finishedTitles);\n            title.classList.add(classes.activeTitles);\n          });\n  \n        }.bind(this), this.data.finish_interval - 200);\n      },\n  \n      startImages: function() {\n        // Prep and show first image\n        var firstImage = this.container.querySelector('.fading-images__item-wrapper[data-slide-index=\"' + this.data.active_image + '\"]');\n        firstImage.classList.add(classes.activeImage);\n        firstImage.classList.add(classes.compensation);\n  \n        // Begin timer\n        window.setTimeout(function() {\n          this.imageInterval = setInterval(this.nextImage.bind(this), this.data.interval);\n        }.bind(this), this.data.timer_offset);\n      },\n  \n      startTitles: function() {\n        // Prep and show first titles\n        var target_title = this.data.active_title;\n  \n        window.setTimeout(function() {\n          var slide = this.container.querySelector('.fading-images__item-wrapper[data-slide-index=\"' + target_title + '\"]');\n          var newText1 = slide.getAttribute('data-slide-title1');\n          var newText2 = slide.getAttribute('data-slide-title2');\n  \n          this.container.querySelector('.fading-images-overlay__title--1').textContent = newText1;\n          var textTwoContainer = this.container.querySelector('.fading-images-overlay__title--2');\n          if (textTwoContainer) {\n            textTwoContainer.textContent = newText2;\n          }\n  \n          this.allTitles.forEach(title => {\n            title.classList.add(classes.activeTitles);\n          });\n        }.bind(this), 750);\n  \n        // Begin timer\n        this.titleInterval = setInterval(this.nextTitle.bind(this), this.data.interval);\n      }\n    });\n  \n    return FadingImages;\n  })();\n  \n  theme.FooterSection = (function() {\n    var selectors = {\n      locale: 'FooterLocale',\n      currency: 'FooterCurrency'\n    };\n  \n    function FooterSection(container) {\n      this.container = container;\n      this.localeDisclosure = null;\n      this.currencyDisclosure = null;\n  \n      this.init();\n    }\n  \n    FooterSection.prototype = Object.assign({}, FooterSection.prototype, {\n      init: function() {\n        var localeEl = document.getElementById(selectors.locale);\n        var currencyEl = document.getElementById(selectors.currency);\n  \n        if (localeEl) {\n          this.localeDisclosure = new theme.Disclosure(localeEl);\n        }\n  \n        if (currencyEl) {\n          this.currencyDisclosure = new theme.Disclosure(currencyEl);\n        }\n  \n        // Re-hook up collapsible box triggers\n        theme.collapsibles.init(this.container);\n      },\n  \n      onUnload: function() {\n        if (this.localeDisclosure) {\n          this.localeDisclosure.destroy();\n        }\n  \n        if (this.currencyDisclosure) {\n          this.currencyDisclosure.destroy();\n        }\n      }\n    });\n  \n    return FooterSection;\n  })();\n  \n  theme.HeaderSection = (function() {\n    function HeaderSection(container) {\n      this.init();\n    }\n  \n    HeaderSection.prototype = Object.assign({}, HeaderSection.prototype, {\n      init: function() {\n        // Reload any slideshow if header is reloaded to make sure\n        // sticky header works as expected\n        // (can be anywhere in sections.instance array)\n        if (Shopify && Shopify.designMode) {\n          for (var i = 0; i < theme.sections.instances.length; i++) {\n            var instance = theme.sections.instances[i];\n            if (instance['type'] === 'slideshow-section') {\n              instance.forceReload();\n            }\n          }\n        }\n  \n        theme.headerNav.init();\n        theme.announcementBar.init();\n        this.initDrawers();\n        this.hoverMenu();\n      },\n  \n      initDrawers: function() {\n        theme.NavDrawer = new theme.Drawers('NavDrawer', 'nav');\n        if (theme.settings.cartType === 'drawer') {\n          if (!document.body.classList.contains('template-cart')) {\n            new theme.CartDrawer();\n          }\n        }\n  \n        theme.collapsibles.init(document.getElementById('NavDrawer'));\n      },\n  \n      hoverMenu: function() {\n        const detailsEl = document.querySelectorAll('[data-section-type=\"header\"] details[data-hover=\"true\"]');\n  \n        detailsEl.forEach((detail) => {\n          const summary = detail.querySelector('summary');\n          const summaryLink = summary.dataset.link;\n  \n          summary.addEventListener('click', e => {\n            e.preventDefault();\n            window.location.href = summaryLink;\n          });\n  \n          // if detail has :focus-within\n          detail.addEventListener('focusin', () => {\n            if (!detail.hasAttribute('open')) {\n  \n              // close all other details\n              detailsEl.forEach((detail) => {\n                detail.removeAttribute('open');\n                detail.setAttribute('aria-expanded', 'false');\n              });\n  \n              detail.setAttribute('open', '');\n              detail.setAttribute('aria-expanded', 'true');\n            }\n          });\n  \n          detail.addEventListener('focusout', () => {\n            if (detail.hasAttribute('open') && !detail.matches(':focus-within')) {\n              detail.removeAttribute('open');\n              detail.setAttribute('aria-expanded', 'false');\n            }\n          });\n  \n          detail.addEventListener('mouseover', () => {\n            if (!detail.hasAttribute('open')) {\n              detail.setAttribute('open', '');\n              detail.setAttribute('aria-expanded', 'true');\n            }\n          });\n  \n          detail.addEventListener('mouseleave', () => {\n            if (detail.hasAttribute('open')) {\n              detail.removeAttribute('open');\n              detail.setAttribute('aria-expanded', 'false');\n            }\n          });\n        });\n      },\n  \n      onUnload: function() {\n        theme.NavDrawer.close();\n        theme.announcementBar.unload();\n      }\n    });\n  \n    return HeaderSection;\n  })();\n  \n  theme.Product = (function() {\n    var videoObjects = {};\n  \n    var classes = {\n      onSale: 'sale-price',\n      disabled: 'disabled',\n      isModal: 'is-modal',\n      loading: 'loading',\n      loaded: 'loaded',\n      hidden: 'hide',\n      interactable: 'video-interactable',\n      visuallyHide: 'visually-invisible',\n      lowInventory: 'inventory--low',\n    };\n  \n    var selectors = {\n      productVideo: '.product__video',\n      videoParent: '.product__video-wrapper',\n      slide: '.product-main-slide',\n      currentSlide: '.is-selected',\n      startingSlide: '.starting-slide',\n      variantType: '.variant-wrapper',\n      blocks: '[data-product-blocks]',\n      blocksHolder: '[data-blocks-holder]',\n      dynamicVariantsEnabled: '[data-dynamic-variants-enabled]',\n    };\n  \n    function Product(container) {\n      this.container = container;\n      var sectionId = this.sectionId = container.getAttribute('data-section-id');\n      var productId = this.productId = container.getAttribute('data-product-id');\n  \n      this.inModal = (container.dataset.modal === 'true');\n      this.modal;\n  \n      this.settings = {\n        enableHistoryState: container.dataset.history || false,\n        namespace: '.product-' + sectionId,\n        inventory: false,\n        inventoryThreshold: 10,\n        modalInit: false,\n        hasImages: true,\n        imageSetName: null,\n        imageSetIndex: null,\n        currentImageSet: null,\n        imageSize: '620x',\n        currentSlideIndex: 0,\n        videoLooping: container.dataset.videoLooping\n      };\n  \n      // Overwrite some settings when loaded in modal\n      if (this.inModal) {\n        this.settings.enableHistoryState = false;\n        this.settings.namespace = '.product-' + sectionId + '-modal';\n        this.modal = document.getElementById('QuickShopModal-' + productId);\n      }\n  \n      this.selectors = {\n        variantsJson: '[data-variant-json]',\n        currentVariantJson: '[data-current-variant-json]',\n        form: '.product-single__form',\n  \n        media: '[data-product-media-type-model]',\n        closeMedia: '.product-single__close-media',\n        photoThumbs: '[data-product-thumb]',\n        thumbSlider: '[data-product-thumbs]',\n        thumbScroller: '.product__thumbs--scroller',\n        mainSlider: '[data-product-photos]',\n        imageContainer: '[data-product-images]',\n        productImageMain: '[data-product-image-main]',\n  \n        priceWrapper: '[data-product-price-wrap]',\n        price: '[data-product-price]',\n        comparePrice: '[data-compare-price]',\n        priceA11y: '[data-a11y-price]',\n        comparePriceA11y: '[data-compare-price-a11y]',\n        unitWrapper: '[data-unit-price-wrapper]',\n        unitPrice: '[data-unit-price]',\n        unitPriceBaseUnit: '[data-unit-base]',\n        sku: '[data-sku]',\n        inventory: '[data-product-inventory]',\n        incomingInventory: '[data-incoming-inventory]',\n        colorLabel: '[data-variant-color-label]',\n  \n        addToCart: '[data-add-to-cart]',\n        addToCartText: '[data-add-to-cart-text]',\n  \n        originalSelectorId: '[data-product-select]',\n  \n        singleOptionSelector: '[data-variant-input]',\n        dynamicVariantsEnabled: '[data-dynamic-variants-enabled]',\n        variantColorSwatch: '.variant__input--color-swatch',\n  \n        availabilityContainer: '[data-store-availability-holder]'\n      };\n  \n      this.cacheElements();\n  \n      this.firstProductImage = this.cache.mainSlider.querySelector('img');\n  \n      if (!this.firstProductImage) {\n        this.settings.hasImages = false;\n      }\n  \n      var dataSetEl = this.cache.mainSlider.querySelector('[data-set-name]');\n      if (dataSetEl) {\n        this.settings.imageSetName = dataSetEl.dataset.setName;\n      }\n  \n      this.init();\n    }\n  \n    Product.prototype = Object.assign({}, Product.prototype, {\n      init: function() {\n        if (this.inModal) {\n          this.container.classList.add(classes.isModal);\n          document.addEventListener('modalOpen.QuickShopModal-' + this.productId, this.openModalProduct.bind(this));\n          document.addEventListener('modalClose.QuickShopModal-' + this.productId, this.closeModalProduct.bind(this));\n        }\n  \n        if (!this.inModal) {\n          this.formSetup();\n          this.productSetup();\n          this.videoSetup();\n          this.initProductSlider();\n          this.customMediaListners();\n        }\n      },\n  \n      cacheElements: function() {\n        this.cache = {\n          form: this.container.querySelector(this.selectors.form),\n          mainSlider: this.container.querySelector(this.selectors.mainSlider),\n          thumbSlider: this.container.querySelector(this.selectors.thumbSlider),\n          thumbScroller: this.container.querySelector(this.selectors.thumbScroller),\n          productImageMain: this.container.querySelector(this.selectors.productImageMain),\n  \n          // Price-related\n          priceWrapper: this.container.querySelector(this.selectors.priceWrapper),\n          comparePriceA11y: this.container.querySelector(this.selectors.comparePriceA11y),\n          comparePrice: this.container.querySelector(this.selectors.comparePrice),\n          price: this.container.querySelector(this.selectors.price),\n          priceA11y: this.container.querySelector(this.selectors.priceA11y)\n        };\n      },\n  \n      onUnload: function() {\n        theme.ProductMedia.removeSectionModels(this.sectionId);\n  \n        if (this.flickity && typeof this.flickity.destroy === 'function') {\n          this.flickity.destroy();\n        }\n      },\n  \n      formSetup: function() {\n        this.initQtySelector();\n        this.initAjaxProductForm();\n        this.availabilitySetup();\n        this.initVariants();\n      },\n  \n      availabilitySetup: function() {\n        var container = this.container.querySelector(this.selectors.availabilityContainer);\n        if (container) {\n          this.storeAvailability = new theme.StoreAvailability(container);\n        }\n      },\n  \n      productSetup: function() {\n        this.setImageSizes();\n        this.initImageZoom();\n        this.initModelViewerLibraries();\n        this.initShopifyXrLaunch();\n        theme.collapsibles.init(this.container);\n      },\n  \n      setImageSizes: function() {\n        if (!this.settings.hasImages) {\n          return;\n        }\n  \n        // Get srcset image src, works on most modern browsers\n        // otherwise defaults to settings.imageSize\n        var currentImage = this.firstProductImage.currentSrc;\n  \n        if (currentImage) {\n          this.settings.imageSize = theme.Images.imageSize(currentImage);\n        }\n      },\n  \n      initVariants: function() {\n        var variantJson = this.container.querySelector(this.selectors.variantsJson);\n  \n        if (!variantJson) {\n          return;\n        }\n  \n        this.variantsObject = JSON.parse(variantJson.innerHTML);\n        var dynamicVariantsEnabled = !!this.container.querySelector(selectors.dynamicVariantsEnabled)\n  \n        var options = {\n          container: this.container,\n          enableHistoryState: this.settings.enableHistoryState,\n          singleOptionSelector: this.selectors.singleOptionSelector,\n          originalSelectorId: this.selectors.originalSelectorId,\n          variants: this.variantsObject,\n          dynamicVariantsEnabled\n        };\n  \n        this.variants = new theme.Variants(options);\n  \n        this.container.querySelectorAll(this.selectors.variantColorSwatch).forEach(swatch => {\n          swatch.addEventListener('change', function(evt) {\n            var el = evt.currentTarget;\n            var color = el.dataset.colorName;\n            var index = el.dataset.colorIndex;\n            this.updateColorName(color, index);\n          }.bind(this));\n        });\n  \n        // Product availability on page load\n        if (this.storeAvailability) {\n          var variant_id = this.variants.currentVariant ? this.variants.currentVariant.id : this.variants.variants[0].id;\n  \n          this.storeAvailability.updateContent(variant_id);\n          this.container.on('variantChange' + this.settings.namespace, this.updateAvailability.bind(this));\n        }\n  \n        this.container.on('variantChange' + this.settings.namespace, this.updateCartButton.bind(this));\n        this.container.on('variantImageChange' + this.settings.namespace, this.updateVariantImage.bind(this));\n        this.container.on('variantPriceChange' + this.settings.namespace, this.updatePrice.bind(this));\n        this.container.on('variantUnitPriceChange' + this.settings.namespace, this.updateUnitPrice.bind(this));\n  \n        if (this.container.querySelector(this.selectors.sku)) {\n          this.container.on('variantSKUChange' + this.settings.namespace, this.updateSku.bind(this));\n        }\n  \n        var inventoryEl = this.container.querySelector(this.selectors.inventory);\n        if (inventoryEl) {\n          this.settings.inventory = true;\n          this.settings.inventoryThreshold = inventoryEl.dataset.threshold;\n  \n          // Update inventory on page load\n          this.updateInventory({ detail: { variant: this.variants.currentVariant } });\n  \n          this.container.on('variantChange' + this.settings.namespace, this.updateInventory.bind(this));\n        }\n  \n        // Update individual variant availability on each selection\n        if (dynamicVariantsEnabled) {\n          var currentVariantJson = this.container.querySelector(this.selectors.currentVariantJson);\n  \n          if (currentVariantJson) {\n            var variantType = this.container.querySelector(selectors.variantType);\n  \n            if (variantType) {\n              new theme.VariantAvailability({\n                container: this.container,\n                namespace: this.settings.namespace,\n                type: variantType.dataset.type,\n                variantsObject: this.variantsObject,\n                currentVariantObject: JSON.parse(currentVariantJson.innerHTML)\n              });\n            }\n          }\n        }\n  \n        // image set names variant change listeners\n        if (this.settings.imageSetName) {\n          var variantWrapper = this.container.querySelector('.variant-input-wrap[data-handle=\"'+this.settings.imageSetName+'\"]');\n          if (variantWrapper) {\n            this.settings.imageSetIndex = variantWrapper.dataset.index;\n            this.container.on('variantChange' + this.settings.namespace, this.updateImageSet.bind(this))\n          } else {\n            this.settings.imageSetName = null;\n          }\n        }\n      },\n  \n      /*============================================================================\n        Variant change methods\n      ==============================================================================*/\n      updateColorName: function(color, index) {\n        // Updates on radio button change, not variant.js\n        this.container.querySelector(this.selectors.colorLabel + `[data-index=\"${index}\"`).textContent = color;\n      },\n  \n      initQtySelector: function() {\n        this.container.querySelectorAll('.js-qty__wrapper').forEach(el => {\n          new theme.QtySelector(el, {\n            namespace: '.product'\n          });\n        });\n      },\n  \n      initAjaxProductForm: function() {\n        new theme.AjaxProduct(this.cache.form);\n      },\n  \n      updateCartButton: function(evt) {\n        var variant = evt.detail.variant;\n        var cartBtn = this.container.querySelector(this.selectors.addToCart);\n        var cartBtnText = this.container.querySelector(this.selectors.addToCartText);\n  \n        if (!cartBtn) return;\n  \n        if (variant) {\n          if (variant.available) {\n            // Available, enable the submit button and change text\n            cartBtn.classList.remove(classes.disabled);\n            cartBtn.disabled = false;\n            var defaultText = cartBtnText.dataset.defaultText;\n            cartBtnText.textContent = defaultText;\n          } else {\n            // Sold out, disable the submit button and change text\n            cartBtn.classList.add(classes.disabled);\n            cartBtn.disabled = true;\n            cartBtnText.textContent = theme.strings.soldOut;\n          }\n        } else {\n          // The variant doesn't exist, disable submit button\n          cartBtn.classList.add(classes.disabled);\n          cartBtn.disabled = true;\n          cartBtnText.textContent = theme.strings.unavailable;\n        }\n      },\n  \n      updatePrice: function(evt) {\n        var variant = evt.detail.variant;\n  \n        if (variant) {\n          // Regular price\n          this.cache.price.innerHTML = theme.Currency.formatMoney(variant.price, theme.settings.moneyFormat);\n  \n          // Sale price, if necessary\n          if (variant.compare_at_price > variant.price) {\n            this.cache.comparePrice.innerHTML = theme.Currency.formatMoney(variant.compare_at_price, theme.settings.moneyFormat);\n            this.cache.priceWrapper.classList.remove(classes.hidden);\n            this.cache.price.classList.add(classes.onSale);\n            this.cache.comparePriceA11y.setAttribute('aria-hidden', 'false');\n            this.cache.priceA11y.setAttribute('aria-hidden', 'false');\n          } else {\n            if (this.cache.priceWrapper) {\n              this.cache.priceWrapper.classList.add(classes.hidden);\n            }\n            this.cache.price.classList.remove(classes.onSale);\n            if (this.cache.comparePriceA11y) {\n              this.cache.comparePriceA11y.setAttribute('aria-hidden', 'true');\n            }\n            this.cache.priceA11y.setAttribute('aria-hidden', 'true');\n          }\n        }\n      },\n  \n      updateUnitPrice: function(evt) {\n        var variant = evt.detail.variant;\n  \n        if (variant && variant.unit_price) {\n          this.container.querySelector(this.selectors.unitPrice).innerHTML = theme.Currency.formatMoney(variant.unit_price, theme.settings.moneyFormat);\n          this.container.querySelector(this.selectors.unitPriceBaseUnit).innerHTML = theme.Currency.getBaseUnit(variant);\n          this.container.querySelector(this.selectors.unitWrapper).classList.remove(classes.visuallyHide);\n        } else {\n          this.container.querySelector(this.selectors.unitWrapper).classList.add(classes.visuallyHide);\n        }\n      },\n  \n      imageSetArguments: function(variant) {\n        var variant = variant ? variant : (this.variants ? this.variants.currentVariant : null);\n        if (!variant) return;\n  \n        var setValue = this.settings.currentImageSet = this.getImageSetName(variant[this.settings.imageSetIndex]);\n        var set = this.settings.imageSetName + '_' + setValue;\n  \n        // Always start on index 0\n        this.settings.currentSlideIndex = 0;\n  \n        // Return object that adds cellSelector to mainSliderArgs\n        return {\n          cellSelector: '[data-group=\"'+set+'\"]',\n          imageSet: set,\n          initialIndex: this.settings.currentSlideIndex\n        }\n      },\n  \n      updateImageSet: function(evt) {\n        // If called directly, use current variant\n        var variant = evt ? evt.detail.variant : (this.variants ? this.variants.currentVariant : null);\n        if (!variant) {\n          return;\n        }\n  \n        var setValue = this.getImageSetName(variant[this.settings.imageSetIndex]);\n  \n        // Already on the current image group\n        if (this.settings.currentImageSet === setValue) {\n          return;\n        }\n  \n        this.initProductSlider(variant);\n      },\n  \n      // Show/hide thumbnails based on current image set\n      updateImageSetThumbs: function(set) {\n        this.cache.thumbSlider.querySelectorAll('.product__thumb-item').forEach(thumb => {\n          thumb.classList.toggle(classes.hidden, thumb.dataset.group !== set);\n        });\n      },\n  \n      getImageSetName: function(string) {\n        return string.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/-$/, '').replace(/^-/, '');\n      },\n  \n      updateSku: function(evt) {\n        var variant = evt.detail.variant;\n        var newSku = '';\n  \n        if (variant) {\n          if (variant.sku) {\n            newSku = variant.sku;\n          }\n  \n          this.container.querySelector(this.selectors.sku).textContent = newSku;\n        }\n      },\n  \n      updateInventory: function(evt) {\n        var variant = evt.detail.variant;\n  \n        // Override to display in stock message for sold out variants with policy set to continue\n        // Must be set to true in order to display in stock message for sold out variants\n        const inStockForOOSAndContinueSelling = false;\n  \n        if (!variant) {\n          // Variant is unavailable\n          // So we want to hide both the inventory quantity + incoming transfer notice\n          this.toggleInventoryQuantity('hidden', false);\n          this.toggleIncomingInventory(false);\n          return;\n        }\n  \n        // Inventory management is nil\n        // So we want to hide the low inventory message but show an In stock status\n        // And hide the incoming transfer notice\n        if (!variant.inventory_management) {\n          this.toggleInventoryQuantity('visible', false);\n          this.toggleIncomingInventory(false);\n          return;\n        }\n  \n        if (variant.inventory_management === 'shopify' && window.inventories && window.inventories[this.productId]) {\n          const variantInventoryObject = window.inventories[this.productId][variant.id];\n  \n          const { quantity, policy, incoming, next_incoming_date } = variantInventoryObject || {};\n  \n          this.toggleInventoryQuantity(undefined, quantity);\n  \n          if (inStockForOOSAndContinueSelling) {\n            if (quantity <= 0 && policy === 'continue') {\n              this.toggleInventoryQuantity('visible', false);\n              this.toggleIncomingInventory(false);\n              return;\n            }\n          }\n  \n          if ((incoming && !variant.available) || (quantity <= 0 && policy === 'continue')) {\n            this.toggleIncomingInventory(true, next_incoming_date, policy);\n          } else {\n            this.toggleIncomingInventory(false);\n          }\n        }\n      },\n  \n      updateAvailability: function(evt) {\n        var variant = evt.detail.variant;\n        if (!variant) {\n          return;\n        }\n  \n        this.storeAvailability.updateContent(variant.id);\n      },\n  \n      toggleInventoryQuantity: function(state = undefined, quantity) {\n        const productInventoryEl = this.container.querySelector(this.selectors.inventory);\n        const inventorySalesPoint = productInventoryEl.closest('.sales-point');\n  \n        if (state && state === 'hidden') {\n          // variant is unavailable\n          // hide and return\n          if (inventorySalesPoint) {\n            inventorySalesPoint.classList.add(classes.hidden);\n          }\n  \n          return;\n        }\n  \n        let showLowInventoryMessage = false;\n  \n        // Check if we should show low inventory message\n        if (parseInt(quantity) <= parseInt(this.settings.inventoryThreshold) && parseInt(quantity) > 0) {\n          showLowInventoryMessage = true;\n        }\n  \n        if (parseInt(quantity) > 0 || (state && state === 'visible')) {\n          if (showLowInventoryMessage) {\n            productInventoryEl.parentNode.classList.add(classes.lowInventory);\n            if (quantity > 1) {\n              productInventoryEl.textContent = theme.strings.otherStockLabel.replace('[count]', quantity);\n            } else {\n              productInventoryEl.textContent = theme.strings.oneStockLabel.replace('[count]', quantity);\n            }\n          } else {\n            productInventoryEl.parentNode.classList.remove(classes.lowInventory);\n            productInventoryEl.textContent = theme.strings.inStockLabel;\n          }\n  \n          if (inventorySalesPoint) {\n            inventorySalesPoint.classList.remove(classes.hidden);\n          }\n  \n        } else {\n          if (inventorySalesPoint) {\n            inventorySalesPoint.classList.add(classes.hidden);\n          }\n        }\n      },\n  \n      toggleIncomingInventory: function(showIncomingInventory, incomingInventoryDate, policy) {\n  \n        const incomingInventoryEl = this.container.querySelector(this.selectors.incomingInventory);\n        const incomingInventoryIcon = incomingInventoryEl.querySelector('.icon-and-text');\n  \n        if (!incomingInventoryEl) return;\n  \n        const incomingInventoryBlockEnabled = incomingInventoryEl.dataset.enabled === 'true';\n        const textEl = incomingInventoryEl.querySelector('.js-incoming-text');\n  \n        // If incoming inventory block is disabled, hide it\n        if (!incomingInventoryBlockEnabled) {\n          incomingInventoryEl.classList.add(classes.hidden);\n          return;\n        }\n  \n        if (showIncomingInventory) {\n          if (incomingInventoryDate) {\n            textEl.textContent = theme.strings.willBeInStockAfter.replace('[date]', incomingInventoryDate);\n            incomingInventoryEl.classList.remove(classes.hidden);\n          } else {\n            textEl.textContent = theme.strings.waitingForStock;\n            incomingInventoryEl.classList.remove(classes.hidden);\n          }\n  \n          // When OOS and incoming inventory and continue selling disabled, update icon to low inventory\n          if (incomingInventoryIcon) {\n            if (policy !== 'continue') {\n              incomingInventoryIcon.classList.add(classes.lowInventory);\n            } else {\n              incomingInventoryIcon.classList.remove(classes.lowInventory);\n            }\n          }\n  \n        } else {\n          incomingInventoryEl.classList.add(classes.hidden);\n        }\n      },\n  \n      /*============================================================================\n        Product videos\n      ==============================================================================*/\n      videoSetup: function() {\n        var productVideos = this.cache.mainSlider.querySelectorAll(selectors.productVideo);\n  \n        if (!productVideos.length) {\n          return false;\n        }\n  \n        productVideos.forEach(vid => {\n          var type = vid.dataset.videoType;\n          if (type === 'youtube') {\n            this.initYoutubeVideo(vid);\n          } else if (type === 'vimeo') {\n            this.initVimeoVideo(vid);\n          } else if (type === 'mp4') {\n            this.initMp4Video(vid);\n          }\n        });\n      },\n  \n      initYoutubeVideo: function(div) {\n        videoObjects[div.id] = new theme.YouTube(\n          div.id,\n          {\n            videoId: div.dataset.videoId,\n            videoParent: selectors.videoParent,\n            autoplay: false, // will handle this in callback\n            style: div.dataset.videoStyle,\n            loop: div.dataset.videoLoop,\n            events: {\n              onReady: this.youtubePlayerReady.bind(this),\n              onStateChange: this.youtubePlayerStateChange.bind(this)\n            }\n          }\n        );\n      },\n  \n      initVimeoVideo: function(div) {\n        videoObjects[div.id] = new theme.VimeoPlayer(\n          div.id,\n          div.dataset.videoId,\n          {\n            videoParent: selectors.videoParent,\n            autoplay: false,\n            style: div.dataset.videoStyle,\n            loop: div.dataset.videoLoop,\n          }\n        )\n      },\n  \n      // Comes from YouTube SDK\n      // Get iframe ID with evt.target.getIframe().id\n      // Then access product video players with videoObjects[id]\n      youtubePlayerReady: function(evt) {\n        var iframeId = evt.target.getIframe().id;\n  \n        if (!videoObjects[iframeId]) {\n          // No youtube player data\n          return;\n        }\n  \n        var obj = videoObjects[iframeId];\n        var player = obj.videoPlayer;\n  \n        if (obj.options.style !== 'sound') {\n          player.mute();\n        }\n  \n        obj.parent.classList.remove('loading');\n        obj.parent.classList.add('loaded');\n        obj.parent.classList.add('video-interactable'); // Previously, video was only interactable after slide change\n  \n        // If we have an element, it is in the visible/first slide,\n        // and is muted, play it\n        if (this._isFirstSlide(iframeId) && obj.options.style !== 'sound') {\n          player.playVideo();\n        }\n      },\n  \n      _isFirstSlide: function(id) {\n        return this.cache.mainSlider.querySelector(selectors.startingSlide + ' ' + '#' + id);\n      },\n  \n      youtubePlayerStateChange: function(evt) {\n        var iframeId = evt.target.getIframe().id;\n        var obj = videoObjects[iframeId];\n  \n        switch (evt.data) {\n          case -1: // unstarted\n            // Handle low power state on iOS by checking if\n            // video is reset to unplayed after attempting to buffer\n            if (obj.attemptedToPlay) {\n              obj.parent.classList.add('video-interactable');\n            }\n            break;\n          case 0: // ended\n            if (obj && obj.options.loop === 'true') {\n              obj.videoPlayer.playVideo();\n            }\n            break;\n          case 3: // buffering\n            obj.attemptedToPlay = true;\n            break;\n        }\n      },\n  \n      initMp4Video: function(div) {\n        videoObjects[div.id] = {\n          id: div.id,\n          type: 'mp4'\n        };\n  \n        if (this._isFirstSlide(div.id)) {\n          this.playMp4Video(div.id);\n        }\n      },\n  \n      stopVideos: function() {\n        for (var [id, vid] of Object.entries(videoObjects)) {\n          if (vid.videoPlayer) {\n            if (typeof vid.videoPlayer.stopVideo === 'function') {\n              vid.videoPlayer.stopVideo(); // YouTube player\n            }\n          } else if (vid.type === 'mp4') {\n            this.stopMp4Video(vid.id); // MP4 player\n          }\n        }\n      },\n  \n      _getVideoType: function(video) {\n        return video.getAttribute('data-video-type');\n      },\n  \n      _getVideoDivId: function(video) {\n        return video.id;\n      },\n  \n      playMp4Video: function(id) {\n        var player = this.container.querySelector('#' + id);\n        var playPromise = player.play();\n  \n        if (playPromise !== undefined) {\n          playPromise.then(function() {\n            // Playing as expected\n          })\n          .catch(function(error) {\n            // Likely low power mode on iOS, show controls\n            player.setAttribute('controls', '');\n            player.closest(selectors.videoParent).setAttribute('data-video-style', 'unmuted');\n          });\n        }\n      },\n  \n      stopMp4Video: function(id) {\n        var player = this.container.querySelector('#' + id);\n        if (player && typeof player.pause === 'function') {\n          player.pause();\n        }\n      },\n  \n      /*============================================================================\n        Product images\n      ==============================================================================*/\n      initImageZoom: function() {\n        var container = this.container.querySelector(this.selectors.imageContainer);\n        if (!container) {\n          return;\n        }\n        var imageZoom = new theme.Photoswipe(container, this.sectionId);\n        container.addEventListener('photoswipe:afterChange', function(evt) {\n          if (this.flickity) {\n            this.flickity.goToSlide(evt.detail.index);\n          }\n        }.bind(this));\n      },\n  \n      getThumbIndex: function(target) {\n        return target.dataset.index;\n      },\n  \n      updateVariantImage: function(evt) {\n        var variant = evt.detail.variant;\n        var sizedImgUrl = theme.Images.getSizedImageUrl(variant.featured_media.preview_image.src, this.settings.imageSize);\n  \n        var newImage = this.container.querySelector('.product__thumb[data-id=\"' + variant.featured_media.id + '\"]');\n        var imageIndex = this.getThumbIndex(newImage);\n  \n        // If there is no index, slider is not initalized\n        if (typeof imageIndex === 'undefined') {\n          return;\n        }\n  \n        // Go to that variant image's slide\n        if (this.flickity) {\n          this.flickity.goToSlide(imageIndex);\n        }\n      },\n  \n      initProductSlider: function(variant) {\n        // Stop if only a single image, but add active class to first slide\n        if (this.cache.mainSlider.querySelectorAll(selectors.slide).length <= 1) {\n          var slide = this.cache.mainSlider.querySelector(selectors.slide);\n          if (slide) {\n            slide.classList.add('is-selected');\n          }\n          return;\n        }\n  \n        // Destroy slider in preparation of new initialization\n        if (this.flickity && typeof this.flickity.destroy === 'function') {\n          this.flickity.destroy();\n        }\n  \n        // If variant argument exists, slideshow is reinitializing because of the\n        // image set feature enabled and switching to a new group.\n        // currentSlideIndex\n        if (!variant) {\n          var activeSlide = this.cache.mainSlider.querySelector(selectors.startingSlide);\n          this.settings.currentSlideIndex = this._slideIndex(activeSlide);\n        }\n  \n        var mainSliderArgs = {\n          dragThreshold: 25,\n          adaptiveHeight: true,\n          avoidReflow: true,\n          initialIndex: this.settings.currentSlideIndex,\n          childNav: this.cache.thumbSlider,\n          childNavScroller: this.cache.thumbScroller,\n          childVertical: this.cache.thumbSlider.dataset.position === 'beside',\n          wrapAround: false,\n          callbacks: {\n            onInit: this.onSliderInit.bind(this),\n            onChange: this.onSlideChange.bind(this)\n          }\n        };\n  \n        // Override default settings if image set feature enabled\n        if (this.settings.imageSetName) {\n          var imageSetArgs = this.imageSetArguments(variant);\n          mainSliderArgs = Object.assign({}, mainSliderArgs, imageSetArgs);\n          this.updateImageSetThumbs(mainSliderArgs.imageSet);\n        }\n  \n        this.flickity = new theme.Slideshow(this.cache.mainSlider, mainSliderArgs);\n      },\n  \n      onSliderInit: function(slide) {\n        // If slider is initialized with image set feature active,\n        // initialize any videos/media when they are first slide\n        if (this.settings.imageSetName) {\n          this.prepMediaOnSlide(slide);\n        }\n      },\n  \n      onSlideChange: function(index) {\n        if (!this.flickity) return;\n  \n        var prevSlide = this.cache.mainSlider.querySelector('.product-main-slide[data-index=\"'+this.settings.currentSlideIndex+'\"]');\n  \n        // If imageSetName exists, use a more specific selector\n        var nextSlide = this.settings.imageSetName ?\n                        this.cache.mainSlider.querySelectorAll('.flickity-slider .product-main-slide')[index] :\n                        this.cache.mainSlider.querySelector('.product-main-slide[data-index=\"'+index+'\"]');\n  \n        prevSlide.setAttribute('tabindex', '-1');\n        nextSlide.setAttribute('tabindex', 0);\n  \n        // Pause any existing slide video/media\n        this.stopMediaOnSlide(prevSlide);\n  \n        // Prep next slide video/media\n        this.prepMediaOnSlide(nextSlide);\n  \n        // Update current slider index\n        this.settings.currentSlideIndex = index;\n      },\n  \n      stopMediaOnSlide(slide) {\n        // Stop existing video\n        var video = slide.querySelector(selectors.productVideo);\n        if (video) {\n          var videoType = this._getVideoType(video);\n          var videoId = this._getVideoDivId(video);\n          if (videoType === 'youtube') {\n            if (videoObjects[videoId].videoPlayer) {\n              videoObjects[videoId].videoPlayer.stopVideo();\n              return;\n            }\n          } else if (videoType === 'mp4') {\n            this.stopMp4Video(videoId);\n            return;\n          }\n        }\n  \n        // Stop existing media\n        var currentMedia = slide.querySelector(this.selectors.media);\n        if (currentMedia) {\n          currentMedia.dispatchEvent(\n            new CustomEvent('mediaHidden', {\n              bubbles: true,\n              cancelable: true\n            })\n          );\n        }\n      },\n  \n      prepMediaOnSlide(slide) {\n        var video = slide.querySelector(selectors.productVideo);\n        if (video) {\n          this.flickity.reposition();\n          var videoType = this._getVideoType(video);\n          var videoId = this._getVideoDivId(video);\n          if (videoType === 'youtube') {\n            if (videoObjects[videoId].videoPlayer && videoObjects[videoId].options.style !== 'sound') {\n              videoObjects[videoId].videoPlayer.playVideo();\n              return;\n            }\n          } else if (videoType === 'mp4') {\n            this.playMp4Video(videoId);\n          }\n        }\n  \n        var nextMedia = slide.querySelector(this.selectors.media);\n        if (nextMedia) {\n          nextMedia.dispatchEvent(\n            new CustomEvent('mediaVisible', {\n              bubbles: true,\n              cancelable: true\n            })\n          );\n          slide.querySelector('.shopify-model-viewer-ui__button').setAttribute('tabindex', 0);\n          slide.querySelector('.product-single__close-media').setAttribute('tabindex', 0);\n        }\n      },\n  \n      _slideIndex: function(el) {\n        return el.getAttribute('data-index');\n      },\n  \n      /*============================================================================\n        Products when in quick view modal\n      ==============================================================================*/\n      openModalProduct: function() {\n        var initialized = false;\n  \n        if (!this.settings.modalInit) {\n          this.blocksHolder = this.container.querySelector(selectors.blocksHolder);\n          var url = this.blocksHolder.dataset.url;\n  \n          fetch(url).then(function(response) {\n            return response.text();\n          }).then(function(html) {\n            var parser = new DOMParser();\n            var doc = parser.parseFromString(html, 'text/html');\n            var blocks = doc.querySelector(selectors.blocks);\n  \n            // Because the same product could be opened in quick view\n            // on the page we load the form elements from, we need to\n            // update any `id`, `for`, and `form` attributes\n            blocks.querySelectorAll('[id]').forEach(el => {\n              // Update input `id`\n              var val = el.getAttribute('id');\n              el.setAttribute('id', val + '-modal');\n  \n              // Update related label if it exists\n              var label = blocks.querySelector(`[for=\"${val}\"]`);\n              if (label) {\n                label.setAttribute('for', val + '-modal');\n              }\n  \n              // Update any collapsible elements\n              var collapsibleTrigger = blocks.querySelector(`[aria-controls=\"${val}\"]`);\n              if (collapsibleTrigger) {\n                collapsibleTrigger.setAttribute('aria-controls', val + '-modal');\n              }\n            });\n  \n            // Update any elements with `form` attribute.\n            // Form element already has `-modal` appended\n            var form = blocks.querySelector(this.selectors.form);\n            if (form) {\n              var formId = form.getAttribute('id');\n              blocks.querySelectorAll('[form]').forEach(el => {\n                el.setAttribute('form', formId);\n              });\n            }\n  \n            this.blocksHolder.innerHTML = '';\n            this.blocksHolder.append(blocks);\n            this.blocksHolder.classList.add('product-form-holder--loaded');\n  \n            this.cacheElements();\n  \n            this.formSetup();\n            this.updateModalProductInventory();\n  \n            if (Shopify && Shopify.PaymentButton) {\n              Shopify.PaymentButton.init();\n            }\n  \n            // Re-hook up collapsible box triggers\n            theme.collapsibles.init(this.container);\n  \n            document.dispatchEvent(new CustomEvent('quickview:loaded', {\n              detail: {\n                productId: this.productId\n              }\n            }));\n          }.bind(this));\n  \n          this.productSetup();\n          this.videoSetup();\n  \n          // Enable product slider in quick view\n          // 1. with image sets enabled, make sure we have this.variants before initializing\n          // 2. initialize normally, form data not required\n          if (this.settings.imageSetName) {\n            if (this.variants) {\n              this.initProductSlider();\n            } else {\n              document.addEventListener('quickview:loaded', function(evt) {\n                if (evt.detail.productId === this.productId) {\n                  this.initProductSlider();\n                }\n              }.bind(this));\n            }\n          } else {\n            this.initProductSlider();\n          }\n          this.customMediaListners();\n          this.settings.modalInit = true;\n        } else {\n          initialized = true;\n        }\n  \n        AOS.refreshHard();\n  \n        document.dispatchEvent(new CustomEvent('quickview:open', {\n          detail: {\n            initialized: initialized,\n            productId: this.productId\n          }\n        }));\n      },\n  \n      // Recommended products load via JS and don't add variant inventory to the\n      // global variable that we later check. This function scrapes a data div\n      // to get that info and manually add the values.\n      updateModalProductInventory: function() {\n        window.inventories = window.inventories || {};\n        this.container.querySelectorAll('.js-product-inventory-data').forEach(el => {\n          var productId = el.dataset.productId;\n          window.inventories[productId] = {};\n  \n          el.querySelectorAll('.js-variant-inventory-data').forEach(el => {\n            window.inventories[productId][el.dataset.id] = {\n              'quantity': el.dataset.quantity,\n              'policy': el.dataset.policy,\n              'incoming': el.dataset.incoming,\n              'next_incoming_date': el.dataset.date\n            }\n          });\n        });\n      },\n  \n      closeModalProduct: function() {\n        this.stopVideos();\n      },\n  \n      /*============================================================================\n        Product media (3D)\n      ==============================================================================*/\n      initModelViewerLibraries: function() {\n        var modelViewerElements = this.container.querySelectorAll(this.selectors.media);\n        if (modelViewerElements.length < 1) return;\n  \n        theme.ProductMedia.init(modelViewerElements, this.sectionId);\n      },\n  \n      initShopifyXrLaunch: function() {\n        document.addEventListener(\n          'shopify_xr_launch',\n          function() {\n            var currentMedia = this.container.querySelector(\n              this.selectors.productMediaWrapper +\n                ':not(.' +\n                self.classes.hidden +\n                ')'\n            );\n            currentMedia.dispatchEvent(\n              new CustomEvent('xrLaunch', {\n                bubbles: true,\n                cancelable: true\n              })\n            );\n          }.bind(this)\n        );\n      },\n  \n      customMediaListners: function() {\n        document.querySelectorAll(this.selectors.closeMedia).forEach(el => {\n          el.addEventListener('click', function() {\n            var slide = this.cache.mainSlider.querySelector(selectors.currentSlide);\n            var media = slide.querySelector(this.selectors.media);\n            if (media) {\n              media.dispatchEvent(\n                new CustomEvent('mediaHidden', {\n                  bubbles: true,\n                  cancelable: true\n                })\n              );\n            }\n          }.bind(this))\n        });\n  \n        var modelViewers = this.container.querySelectorAll('model-viewer');\n        if (modelViewers.length) {\n          modelViewers.forEach(el => {\n            el.addEventListener('shopify_model_viewer_ui_toggle_play', function(evt) {\n              this.mediaLoaded(evt);\n            }.bind(this));\n  \n            el.addEventListener('shopify_model_viewer_ui_toggle_pause', function(evt) {\n              this.mediaUnloaded(evt);\n            }.bind(this));\n          });\n        }\n      },\n  \n      mediaLoaded: function(evt) {\n        this.container.querySelectorAll(this.selectors.closeMedia).forEach(el => {\n          el.classList.remove(classes.hidden);\n        });\n  \n        if (this.flickity) {\n          this.flickity.setDraggable(false);\n        }\n      },\n  \n      mediaUnloaded: function(evt) {\n        this.container.querySelectorAll(this.selectors.closeMedia).forEach(el => {\n          el.classList.add(classes.hidden);\n        });\n  \n        if (this.flickity) {\n          this.flickity.setDraggable(true);\n        }\n      }\n    });\n  \n    return Product;\n  })();\n  \n  theme.Testimonials = (function() {\n    var defaults = {\n      adaptiveHeight: true,\n      avoidReflow: true,\n      pageDots: true,\n      prevNextButtons: false\n    };\n  \n    function Testimonials(container) {\n      this.container = container;\n      var sectionId = container.getAttribute('data-section-id');\n      this.slideshow = container.querySelector('#Testimonials-' + sectionId);\n      this.namespace = '.testimonial-' + sectionId;\n  \n      if (!this.slideshow) { return }\n  \n      theme.initWhenVisible({\n        element: this.container,\n        callback: this.init.bind(this),\n        threshold: 600\n      });\n    }\n  \n    Testimonials.prototype = Object.assign({}, Testimonials.prototype, {\n      init: function() {\n        // Do not wrap when only a few blocks\n        if (this.slideshow.dataset.count <= 3) {\n          defaults.wrapAround = false;\n        }\n  \n        this.flickity = new theme.Slideshow(this.slideshow, defaults);\n  \n        // Autoscroll to next slide on load to indicate more blocks\n        if (this.slideshow.dataset.count > 3) {\n          setTimeout(function() {\n            this.flickity.goToSlide(1);\n          }.bind(this), 1000);\n        }\n      },\n  \n      onUnload: function() {\n        if (this.flickity && typeof this.flickity.destroy === 'function') {\n          this.flickity.destroy();\n        }\n      },\n  \n      onDeselect: function() {\n        if (this.flickity && typeof this.flickity.play === 'function') {\n          this.flickity.play();\n        }\n      },\n  \n      onBlockSelect: function(evt) {\n        var slide = this.slideshow.querySelector('.testimonials-slide--' + evt.detail.blockId)\n        var index = parseInt(slide.dataset.index);\n  \n        if (this.flickity && typeof this.flickity.pause === 'function') {\n          this.flickity.goToSlide(index);\n          this.flickity.pause();\n        }\n      },\n  \n      onBlockDeselect: function() {\n        if (this.flickity && typeof this.flickity.play === 'function') {\n          this.flickity.play();\n        }\n      }\n    });\n  \n    return Testimonials;\n  })();\n  \n\n  theme.isSessionStorageSupported = function() {\n    // Return false if we are in an iframe without access to sessionStorage\n    if (window.self !== window.top) {\n      return false;\n    }\n\n    var testKey = 'test';\n    var storage = window.sessionStorage;\n    try {\n      storage.setItem(testKey, '1');\n      storage.removeItem(testKey);\n      return true;\n    } catch (error) {\n      return false;\n    }\n  };\n\n  theme.reinitProductGridItem = function(scope) {\n    if (AOS) {AOS.refreshHard()}\n\n    if (!document.documentElement.classList.contains('modal-open')) {\n      theme.initQuickShop();\n    }\n\n    // Re-hook up collapsible box triggers\n    theme.collapsibles.init();\n  };\n\n  /*============================================================================\n    Things that don't require DOM to be ready\n  ==============================================================================*/\n  theme.config.hasSessionStorage = theme.isSessionStorageSupported();\n  AOS.init({\n    easing: 'ease-out-quad',\n    once: true,\n    offset: 60,\n    disableMutationObserver: true\n  });\n\n  // Trigger events when going between breakpoints\n  theme.config.bpSmall = matchMedia(theme.config.mediaQuerySmall).matches;\n  matchMedia(theme.config.mediaQuerySmall).addListener(function(mql) {\n    if (mql.matches) {\n      theme.config.bpSmall = true;\n      document.dispatchEvent(new CustomEvent('matchSmall'));\n    }\n    else {\n      theme.config.bpSmall = false;\n      document.dispatchEvent(new CustomEvent('unmatchSmall'));\n    }\n  });\n\n  /*============================================================================\n    Things that require DOM to be ready\n  ==============================================================================*/\n  function DOMready(callback) {\n    if (document.readyState != 'loading') callback();\n    else document.addEventListener('DOMContentLoaded', callback);\n  }\n\n  // Load generic JS. Also reinitializes when sections are\n  // added, edited, or removed in Shopify's editor\n  theme.initGlobals = function() {\n    theme.collapsibles.init();\n    theme.videoModal();\n  }\n\n  DOMready(function(){\n    theme.sections = new theme.Sections();\n\n    theme.sections.register('slideshow-section', theme.SlideshowSection);\n    theme.sections.register('header', theme.HeaderSection);\n    theme.sections.register('footer', theme.FooterSection);\n    theme.sections.register('product', theme.Product);\n    theme.sections.register('password-header', theme.PasswordHeader);\n    theme.sections.register('collection-switcher', theme.CollectionSwitcher);\n    theme.sections.register('map', theme.Maps);\n    theme.sections.register('blog', theme.Blog);\n    theme.sections.register('newsletter-popup', theme.NewsletterPopup);\n    theme.sections.register('video-section', theme.VideoSection);\n    theme.sections.register('photoswipe', theme.Photoswipe);\n    theme.sections.register('store-availability', theme.StoreAvailability);\n    theme.sections.register('fading-images', theme.FadingImages);\n    theme.sections.register('testimonials', theme.Testimonials);\n    theme.sections.register('background-image', theme.BackgroundImage);\n    theme.sections.register('collection-template', theme.Collection);\n\n    theme.initGlobals();\n    theme.initQuickShop();\n    theme.rteInit();\n    theme.articleImages();\n\n    if (document.body.classList.contains('template-cart')) {\n      var cartPageForm = document.getElementById('CartPageForm');\n      if (cartPageForm) {\n        new theme.CartForm(cartPageForm);\n      }\n    }\n\n    if (theme.settings.isCustomerTemplate) {\n      theme.customerTemplates();\n    }\n\n    theme.pageTransitions();\n\n    document.dispatchEvent(new CustomEvent('page:loaded'));\n  });\n})();\n"],
  "mappings": "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",
  "names": ["evt", "observer", "el", "data", "index", "stickyHeader", "self", "detail"]
}
