{
  "version": 3,
  "sources": ["/cdn/shop/t/3/assets/theme.js?kkk=84708"],
  "sourcesContent": ["window.theme = window.theme || {};\nwindow.slate = window.slate || {};\n\nwindow.lazySizesConfig = window.lazySizesConfig || {};\nlazySizesConfig.expFactor = 4;\n\n(function($){\n  var $ = jQuery = $;\n\n  slate.utils = {\n    /**\n     * _.defaultTo from lodash\n     * Checks `value` to determine whether a default value should be returned in\n     * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,\n     * or `undefined`.\n     * Source: https://github.com/lodash/lodash/blob/master/defaultTo.js\n     *\n     * @param {*} value - Value to check\n     * @param {*} defaultValue - Default value\n     * @returns {*} - Returns the resolved value\n     */\n    defaultTo: function(value, defaultValue) {\n      return (value == null || value !== value) ? defaultValue : value\n    }\n  };\n  \n  slate.a11y = {\n  \n    /**\n     * Traps the focus in a particular container\n     *\n     * @param {object} options - Options to be used\n     * @param {jQuery} options.$container - Container to trap focus within\n     * @param {jQuery} options.$elementToFocus - Element to be focused when focus leaves container\n     * @param {string} options.namespace - Namespace used for new focus event handler\n     */\n    trapFocus: function(options) {\n      var eventName = options.namespace\n        ? 'focusin.' + options.namespace\n        : 'focusin';\n  \n      if (!options.$elementToFocus) {\n        options.$elementToFocus = options.$container;\n      }\n  \n      options.$container.attr('tabindex', '-1');\n      options.$elementToFocus.focus();\n  \n      $(document).off('focusin');\n  \n      $(document).on(eventName, function(evt) {\n        if (options.$container[0] !== evt.target && !options.$container.has(evt.target).length) {\n          options.$container.focus();\n        }\n      });\n    },\n  \n    /**\n     * Removes the trap of focus in a particular container\n     *\n     * @param {object} options - Options to be used\n     * @param {jQuery} options.$container - Container to trap focus within\n     * @param {string} options.namespace - Namespace used for new focus event handler\n     */\n    removeTrapFocus: function(options) {\n      var eventName = options.namespace\n        ? 'focusin.' + options.namespace\n        : 'focusin';\n  \n      if (options.$container && options.$container.length) {\n        options.$container.removeAttr('tabindex');\n      }\n  \n      $(document).off(eventName);\n    },\n  \n  \n    // Not from Slate, but fit in the a11y category\n    lockMobileScrolling: function(namespace, $element) {\n      if ($element) {\n        var $el = $element;\n      } else {\n        var $el = $(document.documentElement).add('body');\n      }\n      $el.on('touchmove' + namespace, function () {\n        return false;\n      });\n    },\n  \n    unlockMobileScrolling: function(namespace, $element) {\n      if ($element) {\n        var $el = $element;\n      } else {\n        var $el = $(document.documentElement).add('body');\n      }\n      $el.off(namespace);\n    }\n  };\n  \n  theme.Sections = function Sections() {\n    this.constructors = {};\n    this.instances = [];\n  \n    $(document)\n      .on('shopify:section:load', this._onSectionLoad.bind(this))\n      .on('shopify:section:unload', this._onSectionUnload.bind(this))\n      .on('shopify:section:select', this._onSelect.bind(this))\n      .on('shopify:section:deselect', this._onDeselect.bind(this))\n      .on('shopify:block:select', this._onBlockSelect.bind(this))\n      .on('shopify:block:deselect', this._onBlockDeselect.bind(this));\n  };\n  \n  theme.Sections.prototype = $.extend({}, theme.Sections.prototype, {\n    createInstance: function(container, constructor, customScope) {\n      var $container = $(container);\n      var id = $container.attr('data-section-id');\n      var type = $container.attr('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 (customScope) {\n        var instanceExists = this._findInstance(id);\n        if (instanceExists) {\n          return;\n        }\n      }\n  \n      var instance = $.extend(new constructor(container), {\n        id: id,\n        type: type,\n        container: container\n      });\n  \n      this.instances.push(instance);\n    },\n  \n    _onSectionLoad: function(evt, subSection, subSectionId) {\n      if (AOS) {\n        AOS.refreshHard();\n      }\n      var container = subSection ? subSection : $('[data-section-id]', evt.target)[0];\n  \n      if (!container) {\n        return;\n      }\n  \n      this.createInstance(container);\n  \n      var instance = subSection ? subSectionId : this._findInstance(evt.detail.sectionId);\n  \n      if (!subSection) {\n        this._loadSubSections();\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  \n    _loadSubSections: function() {\n      if (AOS) {\n        AOS.refreshHard();\n      }\n      $('[data-subsection]').each(function(evt, el) {\n        this._onSectionLoad(null, el, $(el).data('section-id'));\n      }.bind(this));\n    },\n  \n    _onSectionUnload: function(evt) {\n      var instance = this._removeInstance(evt.detail.sectionId);\n      if (instance && typeof instance.onUnload === 'function') {\n        instance.onUnload(evt);\n      }\n    },\n  \n    _onSelect: function(evt) {\n      var instance = this._findInstance(evt.detail.sectionId);\n  \n      if (instance && typeof instance.onSelect === 'function') {\n        instance.onSelect(evt);\n      }\n    },\n  \n    _onDeselect: function(evt) {\n      var instance = this._findInstance(evt.detail.sectionId);\n  \n      if (instance && typeof instance.onDeselect === 'function') {\n        instance.onDeselect(evt);\n      }\n    },\n  \n    _onBlockSelect: function(evt) {\n      var instance = this._findInstance(evt.detail.sectionId);\n  \n      if (instance && typeof instance.onBlockSelect === 'function') {\n        instance.onBlockSelect(evt);\n      }\n    },\n  \n    _onBlockDeselect: function(evt) {\n      var instance = this._findInstance(evt.detail.sectionId);\n  \n      if (instance && typeof instance.onBlockDeselect === 'function') {\n        instance.onBlockDeselect(evt);\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    register: function(type, constructor, $scope) {\n      var afterLoad = false;\n      this.constructors[type] = constructor;\n      var $sections = $('[data-section-type=' + type + ']');\n  \n      if ($scope) {\n        $sections = $('[data-section-type=' + type + ']', $scope);\n      }\n  \n      $sections.each(function(index, container) {\n        this.createInstance(container, constructor, $scope);\n      }.bind(this));\n    }\n  });\n  \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   *\n   * Alternatives\n   * - Accounting.js - http://openexchangerates.github.io/accounting.js/\n   *\n   */\n  \n  theme.Currency = (function() {\n    var moneyFormat = '$';\n  \n    function formatMoney(cents, format) {\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 = slate.utils.defaultTo(precision, 2);\n        thousands = slate.utils.defaultTo(thousands, ',');\n        decimal = slate.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          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          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    return {\n      formatMoney: formatMoney\n    }\n  })();\n  \n  \n  /**\n   * Image Helper Functions\n   * -----------------------------------------------------------------------------\n   * A collection of functions that help with basic image operations.\n   *\n   */\n  \n  theme.Images = (function() {\n  \n    /**\n     * Find the Shopify image attribute size\n     *\n     * @param {string} src\n     * @returns {null}\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     * @param src\n     * @param size\n     * @returns {*}\n     */\n    function getSizedImageUrl(src, size) {\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    return {\n      imageSize: imageSize,\n      getSizedImageUrl: getSizedImageUrl,\n      removeProtocol: removeProtocol\n    };\n  })();\n  \n  slate.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.currentVariant = this._getVariantFromOptions();\n  \n      $(this.singleOptionSelector, this.$container).on('change', this._onSelectChange.bind(this));\n    }\n  \n    Variants.prototype = $.extend({}, Variants.prototype, {\n  \n      _getCurrentOptions: function() {\n        var currentOptions = $.map($(this.singleOptionSelector, this.$container), function(element) {\n          var $element = $(element);\n          var type = $element.attr('type');\n          var currentOption = {};\n  \n          if (type === 'radio' || type === 'checkbox') {\n            if ($element[0].checked) {\n              currentOption.value = $element.val();\n              currentOption.index = $element.data('index');\n  \n              return currentOption;\n            } else {\n              return false;\n            }\n          } else {\n            currentOption.value = $element.val();\n            currentOption.index = $element.data('index');\n  \n            return currentOption;\n          }\n        });\n  \n        // remove any unchecked input values if using radio buttons or checkboxes\n        currentOptions = this._compact(currentOptions);\n  \n        return currentOptions;\n      },\n  \n      _getVariantFromOptions: function() {\n        var selectedValues = this._getCurrentOptions();\n        var variants = this.variants;\n        var found = false;\n  \n        variants.forEach(function(variant) {\n          var match = true;\n          var options = variant.options;\n  \n          selectedValues.forEach(function(option) {\n            // console.log('try to match ' + option.value + ' with ' + variant[option.index]);\n  \n            if (match) {\n              match = (variant[option.index] === option.value);\n            }\n          });\n  \n          if (match) {\n            found = variant;\n          }\n        });\n  \n        return found || null;\n      },\n  \n      _onSelectChange: function() {\n        var variant = this._getVariantFromOptions();\n  \n        this.$container.trigger({\n          type: 'variantChange',\n          variant: variant\n        });\n  \n        if (!variant) {\n          return;\n        }\n  \n        this._updateMasterSelect(variant);\n        this._updateImages(variant);\n        this._updatePrice(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        var variantImage = variant.featured_image || {};\n        var currentVariantImage = this.currentVariant.featured_image || {};\n  \n        if (!variant.featured_image || variantImage.src === currentVariantImage.src) {\n          return;\n        }\n  \n        this.$container.trigger({\n          type: 'variantImageChange',\n          variant: variant\n        });\n      },\n  \n      _updatePrice: function(variant) {\n        if (variant.price === this.currentVariant.price && variant.compare_at_price === this.currentVariant.compare_at_price) {\n          return;\n        }\n  \n        this.$container.trigger({\n          type: 'variantPriceChange',\n          variant: variant\n        });\n      },\n  \n      _updateSKU: function(variant) {\n        if (variant.sku === this.currentVariant.sku) {\n          return;\n        }\n  \n        this.$container.trigger({\n          type: 'variantSKUChange',\n          variant: variant\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        $(this.originalSelectorId, this.$container).val(variant.id);\n      },\n  \n      // _.compact from lodash\n      // https://github.com/lodash/lodash/blob/4d4e452ade1e78c7eb890968d851f837be37e429/compact.js\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  \n    return Variants;\n  })();\n  \n  slate.rte = {\n    init: function() {\n      slate.rte.wrapTable();\n      slate.rte.wrapVideo();\n      slate.rte.imageLinks();\n    },\n  \n    wrapTable: function() {\n      $('.rte table').wrap('<div class=\"table-wrapper\"></div>');\n    },\n  \n    wrapVideo: function() {\n      var $iframeVideo = $('.rte iframe[src*=\"youtube.com/embed\"], .rte iframe[src*=\"player.vimeo\"]');\n      var $iframeReset = $iframeVideo.add('iframe#admin_bar_iframe');\n  \n      $iframeVideo.each(function () {\n        // Add wrapper to make video responsive\n        if (!$(this).parents('.video-wrapper').length) {\n          $(this).wrap('<div class=\"video-wrapper\"></div>');\n        }\n      });\n  \n      $iframeReset.each(function () {\n        // Re-set 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        // Need to specifically target video and admin bar\n        this.src = this.src;\n      });\n    },\n  \n    // Remove CSS that adds animated underline under image links\n    imageLinks: function() {\n      $('.rte a img').parent().addClass('rte__image');\n    }\n  };\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 = $('#' + id);\n  \n      if (!this.$modal.length) {\n        return false;\n      }\n  \n      this.nodes = {\n        $parent: $('html').add('body'),\n        $modalContent: this.$modal.find('.modal__inner')\n      };\n  \n      this.config = $.extend(defaults, options);\n      this.modalIsOpen = false;\n      this.$focusOnOpen = this.config.focusOnOpen ? $(this.config.focusOnOpen) : this.$modal;\n      this.isSolid = this.config.solid;\n  \n      this.init();\n    }\n  \n    Modal.prototype.init = function() {\n      var $openBtn = $(this.config.open);\n  \n      // Add aria controls\n      $openBtn.attr('aria-expanded', 'false');\n  \n      $(this.config.open).on('click', this.open.bind(this));\n      this.$modal.find(this.config.close).on('click', this.close.bind(this));\n  \n      // Close modal if a drawer is opened\n      $('body').on('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);\n      }\n  \n      if (this.modalIsOpen && !externalCall) {\n        this.close();\n      }\n  \n      this.$modal\n        .prepareTransition()\n        .addClass(this.config.openClass);\n      this.nodes.$parent.addClass(this.config.bodyOpenClass);\n  \n      if (this.isSolid) {\n        this.nodes.$parent.addClass(this.config.bodyOpenSolidClass);\n      }\n  \n      this.modalIsOpen = true;\n  \n      slate.a11y.trapFocus({\n        $container: this.$modal,\n        $elementToFocus: this.$focusOnOpen,\n        namespace: 'modal_focus'\n      });\n  \n      if (this.$activeSource && this.$activeSource.attr('aria-expanded')) {\n        this.$activeSource.attr('aria-expanded', 'true');\n      }\n  \n      $('body').trigger('modalOpen.' + this.id);\n  \n      this.bindEvents();\n    };\n  \n    Modal.prototype.close = function() {\n      // don't close a closed modal\n      if (!this.modalIsOpen) {\n        return;\n      }\n  \n      // deselect any focused form elements\n      $(document.activeElement).trigger('blur');\n  \n      this.$modal\n        .prepareTransition()\n        .removeClass(this.config.openClass)\n        .addClass(this.config.closingClass);\n      this.nodes.$parent.removeClass(this.config.bodyOpenClass);\n      this.nodes.$parent.addClass(this.config.bodyClosingClass);\n      var o = this;\n      window.setTimeout(function() {\n        o.nodes.$parent.removeClass(o.config.bodyClosingClass);\n        o.$modal.removeClass(o.config.closingClass);\n      }, 500); // modal close css transition\n  \n      if (this.isSolid) {\n        this.nodes.$parent.removeClass(this.config.bodyOpenSolidClass);\n      }\n  \n      this.modalIsOpen = false;\n  \n      slate.a11y.removeTrapFocus({\n        $container: this.$modal,\n        namespace: 'modal_focus'\n      });\n  \n      if (this.$activeSource && this.$activeSource.attr('aria-expanded')) {\n        this.$activeSource.attr('aria-expanded', 'false').focus();\n      }\n  \n      $('body').trigger('modalClose.' + this.id);\n  \n      this.unbindEvents();\n    };\n  \n    Modal.prototype.bindEvents = function() {\n      // Pressing escape closes modal\n      this.nodes.$parent.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        // Exception to above: clicking anywhere on the modal content will NOT close it\n        this.nodes.$modalContent.on('click.modal', function(evt) {\n          evt.stopImmediatePropagation();\n        });\n      }\n    };\n  \n    Modal.prototype.unbindEvents = function() {\n      this.nodes.$parent.off('.modal');\n  \n      if (this.config.closeOffContentClick) {\n        this.$modal.off('.modal');\n        this.nodes.$modalContent.off('.modal');\n      }\n    };\n  \n    return Modal;\n  })();\n  \n  theme.Drawers = (function() {\n    function Drawer(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        parent: $(document.documentElement).add('body'),\n        page: $('#MainContent')\n      };\n  \n      this.$drawer = $('#' + id);\n  \n      if (!this.$drawer.length) {\n        return false;\n      }\n  \n      this.isOpen = false;\n      this.init();\n    };\n  \n    Drawer.prototype = $.extend({}, Drawer.prototype, {\n      init: function() {\n        var $openBtn = $(this.config.open);\n  \n        // Add aria controls\n        $openBtn.attr('aria-expanded', 'false');\n  \n        $openBtn.on('click', this.open.bind(this));\n        this.$drawer.find(this.config.close).on('click', this.close.bind(this));\n      },\n  \n      open: function(evt) {\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          this.$activeSource = $(evt.currentTarget);\n        }\n  \n        this.$drawer.prepareTransition().addClass(this.config.activeDrawer);\n  \n        this.$nodes.parent.addClass(this.config.openClass);\n        this.isOpen = true;\n  \n        slate.a11y.trapFocus({\n          $container: this.$drawer,\n          namespace: 'drawer_focus'\n        });\n  \n        $('body').trigger('drawerOpen.' + this.config.id);\n  \n        if (this.$activeSource && this.$activeSource.attr('aria-expanded')) {\n          this.$activeSource.attr('aria-expanded', 'true');\n        }\n  \n        this.bindEvents();\n      },\n  \n      close: function() {\n        if (!this.isOpen) {\n          return;\n        }\n  \n        // deselect any focused form elements\n        $(document.activeElement).trigger('blur');\n  \n        this.$drawer.prepareTransition().removeClass(this.config.activeDrawer);\n  \n        this.$nodes.parent.removeClass(this.config.openClass);\n        this.$nodes.parent.addClass(this.config.closingClass);\n        var o = this;\n        window.setTimeout(function() {\n          o.$nodes.parent.removeClass(o.config.closingClass);\n        }, 500);\n  \n        this.isOpen = false;\n  \n        slate.a11y.removeTrapFocus({\n          $container: this.$drawer,\n          namespace: 'drawer_focus'\n        });\n  \n        if (this.$activeSource && this.$activeSource.attr('aria-expanded')) {\n          this.$activeSource.attr('aria-expanded', 'false');\n        }\n  \n        this.unbindEvents();\n      },\n  \n      bindEvents: function() {\n        slate.a11y.lockMobileScrolling(this.config.namespace, this.$nodes.page);\n  \n        // Clicking out of drawer closes it\n        this.$nodes.page.on('click' + this.config.namespace, function () {\n          this.close();\n          return false;\n        }.bind(this));\n  \n        // Pressing escape closes drawer\n        this.$nodes.parent.on('keyup' + this.config.namespace, function(evt) {\n          if (evt.keyCode === 27) {\n            this.close();\n          }\n        }.bind(this));\n      },\n  \n      unbindEvents: function() {\n        slate.a11y.unlockMobileScrolling(this.config.namespace, this.$nodes.page);\n        this.$nodes.parent.off(this.config.namespace);\n        this.$nodes.page.off(this.config.namespace);\n      }\n    });\n  \n    return Drawer;\n  })();\n  \n  theme.cart = {\n    getCart: function() {\n      return $.getJSON('/cart.js');\n    },\n  \n    changeItem: function(key, qty) {\n      return this._updateCart({\n        type: 'POST',\n        url: '/cart/change.js',\n        data: 'quantity=' + qty + '&id=' + key,\n        dataType: 'json'\n      });\n    },\n  \n    addItemFromForm: function(data) {\n      return this._updateCart({\n        type: 'POST',\n        url: '/cart/add.js',\n        data: data,\n        dataType: 'json'\n      });\n    },\n  \n    _updateCart: function(params) {\n      return $.ajax(params)\n        .then(function(cart) {\n          return cart;\n        }.bind(this))\n    },\n  \n    updateNote: function(note) {\n      var params = {\n        type: 'POST',\n        url: '/cart/update.js',\n        data: 'note=' + theme.cart.attributeToString(note),\n        dataType: 'json',\n        success: function(cart) {},\n        error: function(XMLHttpRequest, textStatus) {}\n      };\n  \n      $.ajax(params);\n    },\n  \n    attributeToString: function(attribute) {\n      if ((typeof attribute) !== 'string') {\n        attribute += '';\n        if (attribute === 'undefined') {\n          attribute = '';\n        }\n      }\n      return $.trim(attribute);\n    }\n  }\n  \n  $(function() {\n    // Add a loading indicator on the cart checkout button (/cart and drawer)\n    $('body').on('click', '.cart__checkout', function() {\n      $(this).addClass('btn--loading');\n    });\n  \n    $('body').on('change', 'textarea[name=\"note\"]', function() {\n      var newNote = $(this).val();\n      theme.cart.updateNote(newNote);\n    });\n  \n  \n    // Custom JS to prevent checkout without confirming terms and conditions\n    $('body').on('click', '.cart__checkout--ajax', function(evt) {\n      if ($('#CartAgree').is(':checked')) {\n      } else {\n        alert(theme.strings.cartTermsConfirmation);\n        $(this).removeClass('btn--loading');\n        return false;\n      }\n    });\n  \n    $('body').on('click', '.cart__checkout--page', function(evt) {\n      if ($('#CartPageAgree').is(':checked')) {\n      } else {\n        alert(theme.strings.cartTermsConfirmation);\n        $(this).removeClass('btn--loading');\n        return false;\n      }\n    });\n  });\n  \n  theme.QtySelector = (function() {\n    var classes = {\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.$input = $el.find(classes.input);\n      this.$plus = $el.find(classes.plus);\n      this.$minus = $el.find(classes.minus);\n      this.minValue = this.$input.attr('min') || 1;\n  \n      var defaults = {\n        namespace: null,\n        key: this.$input.data('id')\n      };\n  \n      this.options = $.extend(defaults, options);\n  \n      this.initEventListeners();\n    };\n  \n    QtySelector.prototype = $.extend({}, QtySelector.prototype, {\n      initEventListeners: function() {\n        this.$plus.on('click', function() {\n          var qty = this.validateQty(this.$input.val());\n          this.addQty(qty);\n        }.bind(this));\n  \n        this.$minus.on('click', function() {\n          var qty = this.validateQty(this.$input.val());\n          this.subtractQty(qty);\n        }.bind(this));\n  \n        this.$input.on('change', function() {\n          var qty = this.validateQty(this.$input.val());\n          this.changeQty(qty);\n        }.bind(this));\n      },\n  \n      addQty: function(number) {\n        var qty = number + 1;\n        this.changeQty(qty);\n      },\n  \n      subtractQty: function(number) {\n        var qty = number - 1;\n        if (qty <= this.minValue) {\n          qty = this.minValue;\n        }\n        this.changeQty(qty);\n      },\n  \n      changeQty: function(qty) {\n        this.$input.val(qty);\n        $('body').trigger('qty' + this.options.namespace, [this.options.key, qty]);\n      },\n  \n      validateQty: function(number) {\n        if((parseFloat(number) == parseInt(number)) && !isNaN(number)) {\n          // We have a valid number!\n        } else {\n          // Not a number. Default to 1.\n          number = 1;\n        }\n        return parseInt(number);\n      }\n    });\n  \n    return QtySelector;\n  })();\n  \n  theme.CartDrawer = (function() {\n    var config = {\n      namespace: '.ajaxcart'\n    };\n  \n    var selectors = {\n      drawer: '#CartDrawer',\n      container: '#CartContainer',\n      template: '#CartTemplate',\n      fixedFooter: '.drawer__footer--fixed',\n      fixedInnerContent: '.drawer__inner--has-fixed-footer',\n      cartBubble: '.cart-link__bubble'\n    };\n  \n    function CartDrawer() {\n      this.status = {\n        loaded: false,\n        loading: false\n      };\n  \n      this.drawer = new theme.Drawers('CartDrawer', 'cart');\n  \n      // Prep handlebars template\n      var source = $(selectors.template).html();\n      this.template = Handlebars.compile(source);\n  \n      // Build cart on page load so it's ready in the drawer\n      theme.cart.getCart().then(this.buildCart.bind(this));\n  \n      this.initEventListeners();\n    };\n  \n    CartDrawer.prototype = $.extend({}, CartDrawer.prototype, {\n      initEventListeners: function() {\n        $('body').on('updateCart' + config.namespace, this.initQtySelectors.bind(this));\n        $('body').on('updateCart' + config.namespace, this.sizeFooter.bind(this));\n        $('body').on('updateCart' + config.namespace, this.updateCartNotification.bind(this));\n        $('body').on('drawerOpen.CartDrawer', this.sizeFooter.bind(this));\n  \n        $(window).on('resize' + config.namespace, $.debounce(150, this.sizeFooter.bind(this)));\n  \n        $('body').on('added.ajaxProduct', function() {\n          theme.cart.getCart().then(function(cart) {\n            this.buildCart(cart, true);\n          }.bind(this));\n        }.bind(this));\n      },\n  \n      buildCart: function(cart, openDrawer) {\n        this.loading(true);\n        this.emptyCart();\n  \n        if (cart.item_count === 0) {\n          $(selectors.container).append('<p class=\"appear-animation appear-delay-3\">' + theme.strings.cartEmpty +'</p>');\n        } else {\n          var items = [];\n          var item = {};\n          var data = {};\n          var animation_row = 1;\n  \n          $.each(cart.items, function(index, product) {\n  \n            var prodImg;\n            if (product.image !== null) {\n              prodImg = product.image.replace(/(\\.[^.]*)$/, \"_180x$1\");\n            } else {\n              prodImg = '//cdn.shopify.com/s/assets/admin/no-image-medium-cc9732cb976dd349a0df1d39816fbcc7.gif';\n            }\n  \n            if (product.properties !== null) {\n              $.each(product.properties, function(key, value) {\n                if (key.charAt(0) === '_' || !value) {\n                   delete product.properties[key];\n                 }\n              });\n            }\n  \n            // If we have line-item discount, add formattedAmount to discount object\n            var amount = 0;\n            if (product.line_level_discount_allocations.length !== 0) {\n              for (var discount in product.line_level_discount_allocations) {\n                amount = product.line_level_discount_allocations[discount].amount;\n  \n                product.line_level_discount_allocations[discount].formattedAmount = theme.Currency.formatMoney(amount, theme.settings.moneyFormat);\n              }\n            }\n  \n            animation_row+=2;\n  \n            item = {\n              key: product.key,\n              url: product.url,\n              img: prodImg,\n              animationRow: animation_row,\n              name: product.product_title,\n              variation: product.variant_title,\n              properties: product.properties,\n              itemQty: product.quantity,\n              price: theme.Currency.formatMoney(product.price, theme.settings.moneyFormat),\n              discountedPrice: theme.Currency.formatMoney((product.price - (product.total_discount/product.quantity)), theme.settings.moneyFormat),\n              discounts: product.line_level_discount_allocations,\n              discountsApplied: product.line_level_discount_allocations.length === 0 ? false : true,\n              vendor: product.vendor\n            };\n  \n            items.push(item);\n          });\n  \n          animation_row+=2;\n  \n          // If we have cart discount, add a formattedAmount to the discount object\n          var cartAmount = 0;\n          if (cart.cart_level_discount_applications.length !== 0) {\n            for (var cartDiscount in cart.cart_level_discount_applications) {\n              cartAmount = cart.cart_level_discount_applications[cartDiscount].total_allocated_amount;\n  \n              cart.cart_level_discount_applications[cartDiscount].formattedAmount = theme.Currency.formatMoney(cartAmount,theme.settings.moneyFormat);\n            }\n          }\n  \n          data = {\n            items: items,\n            note: cart.note,\n            lastAnimationRow: animation_row,\n            cartDiscounts: cart.cart_level_discount_applications,\n            cartDiscountsApplied: cart.cart_level_discount_applications.length === 0 ? false : true,\n            totalPrice: theme.Currency.formatMoney(cart.total_price, theme.settings.moneyFormat)\n          };\n  \n          $(selectors.container).append(this.template(data));\n        }\n  \n        this.status.loaded = true;\n        this.loading(false);\n  \n        if (theme.settings.currenciesEnabled) {\n          theme.currencySwitcher.ajaxrefresh();\n        }\n  \n        $('body').trigger('updateCart' + config.namespace, cart);\n  \n        if (window.Shopify && Shopify.StorefrontExpressButtons) {\n          Shopify.StorefrontExpressButtons.initialize();\n  \n          // Resize footer after arbitrary delay for buttons to load\n          setTimeout(function() {\n            this.sizeFooter();\n          }.bind(this), 800);\n        }\n  \n        // If specifically asked, open the cart drawer (only happens after product added from form)\n        if (openDrawer === true) {\n          this.drawer.open();\n        }\n      },\n  \n      initQtySelectors: function() {\n        $(selectors.container).find('.js-qty__wrapper').each(function(index, el) {\n          var selector = new theme.QtySelector($(el), {\n            namespace: '.cart-drawer'\n          });\n        }.bind(this));\n  \n        $('body').on('qty.cart-drawer', this.updateItem.bind(this));\n      },\n  \n      updateItem: function(evt, key, qty) {\n        if (this.status.loading) {\n          return;\n        }\n  \n        this.loading(true);\n  \n        theme.cart.changeItem(key, qty)\n          .then(function(cart) {\n            this.updateSuccess(cart);\n          }.bind(this))\n          .catch(function(XMLHttpRequest) {\n            this.updateError(XMLHttpRequest)\n          }.bind(this))\n          .always(function() {\n            this.loading(false);\n          }.bind(this));\n      },\n  \n      loading: function(state) {\n        this.status.loading = state;\n  \n        if (state) {\n          $(selectors.container).addClass('is-loading');\n        } else {\n          $(selectors.container).removeClass('is-loading');\n        }\n      },\n  \n      emptyCart: function() {\n        $(selectors.container).empty();\n      },\n  \n      updateSuccess: function(cart) {\n        this.buildCart(cart)\n      },\n  \n      updateError: function(XMLHttpRequest) {\n        if (XMLHttpRequest.responseJSON && XMLHttpRequest.responseJSON.description) {\n          console.warn(XMLHttpRequest.responseJSON.description);\n        }\n      },\n  \n      // Update elements after cart is updated\n      sizeFooter: function() {\n        // Stop if our drawer doesn't have a fixed footer\n        if (!$(selectors.drawer).hasClass('drawer--has-fixed-footer')) {\n          return;\n        }\n  \n        // Elements are reprinted regularly so selectors are not cached\n        var $cartFooter = $(selectors.drawer).find(selectors.fixedFooter).removeAttr('style');\n        var $cartInner = $(selectors.drawer).find(selectors.fixedInnerContent).removeAttr('style');\n        var cartFooterHeight = $cartFooter.outerHeight();\n  \n        $cartInner.css('bottom', cartFooterHeight);\n        $cartFooter.css('height', cartFooterHeight);\n      },\n  \n      updateCartNotification: function(evt, cart) {\n        if (cart.items.length > 0) {\n          $(selectors.cartBubble).addClass('cart-link__bubble--visible');\n        } else {\n          $(selectors.cartBubble).removeClass('cart-link__bubble--visible');\n        }\n      }\n    });\n  \n    return CartDrawer;\n  })();\n  \n  theme.AjaxProduct = (function() {\n    var status = {\n      loading: false\n    };\n  \n    function ProductForm($form) {\n      this.$form = $form;\n      this.$addToCart = this.$form.find('.add-to-cart');\n  \n      if (this.$form.length) {\n        this.$form.on('submit', this.addItemFromForm.bind(this));\n      }\n    };\n  \n    ProductForm.prototype = $.extend({}, ProductForm.prototype, {\n      addItemFromForm: function(evt, callback){\n        evt.preventDefault();\n  \n        if (status.loading) {\n          console.warn('already adding item to cart | bail');\n          return;\n        }\n  \n        // Loading indicator on add to cart button\n        this.$addToCart.addClass('btn--loading');\n  \n        status.loading = true;\n  \n        var data = this.$form.serialize();\n  \n        theme.cart.addItemFromForm(data)\n          .then(function(product) {\n            this.success(product);\n          }.bind(this))\n          .catch(function(XMLHttpRequest) {\n            this.error(XMLHttpRequest)\n          }.bind(this))\n          .always(function() {\n            status.loading = false;\n            this.$addToCart.removeClass('btn--loading');\n          }.bind(this));\n      },\n  \n      success: function(product) {\n        this.$form.find('.errors').remove();\n        $('body').trigger('added.ajaxProduct');\n      },\n  \n      error: function(XMLHttpRequest) {\n        this.$form.find('.errors').remove();\n  \n        if (XMLHttpRequest.responseJSON && XMLHttpRequest.responseJSON.description) {\n          console.warn(XMLHttpRequest.responseJSON.description);\n  \n          this.$form.prepend('<div class=\"errors text-center\">' + XMLHttpRequest.responseJSON.description + '</div>');\n        }\n      }\n    });\n  \n    return ProductForm;\n  })();\n  \n  theme.collapsibles = (function() {\n  \n    var selectors = {\n      trigger: '.collapsible-trigger',\n      module: '.collapsible-content',\n      moduleInner: '.collapsible-content__inner'\n    };\n  \n    var classes = {\n      hide: 'hide',\n      open: 'is-open',\n      autoHeight: 'collapsible--auto-height'\n    };\n  \n    var namespace = '.collapsible';\n  \n    var isTransitioning = false;\n  \n    function init() {\n      $(selectors.trigger).each(function() {\n        var $el = $(this);\n        var state = $el.hasClass(classes.open);\n        $el.attr('aria-expanded', state);\n      });\n  \n      // Event listeners (hack for modals)\n      $('body, .modal__inner')\n        .off(namespace)\n        .on('click' + namespace, selectors.trigger, function() {\n        if (isTransitioning) {\n          return;\n        }\n  \n        isTransitioning = true;\n  \n        var $el = $(this);\n        var isOpen = $el.hasClass(classes.open);\n        var moduleId = $el.attr('aria-controls');\n        var $module = $('#' + moduleId);\n        var height = $module.find(selectors.moduleInner).outerHeight();\n        var isAutoHeight = $el.hasClass(classes.autoHeight);\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($module, height, isOpen, isAutoHeight);\n          }, 0);\n        }\n  \n        if (isOpen && !isAutoHeight) {\n          height = 0;\n        }\n  \n        $el\n          .attr('aria-expanded', !isOpen)\n          .toggleClass(classes.open, !isOpen);\n  \n        setTransitionHeight($module, height, isOpen, isAutoHeight);\n      });\n    }\n  \n    function setTransitionHeight($module, height, isOpen, isAutoHeight) {\n      $module\n        .removeClass(classes.hide)\n        .prepareTransition()\n        .css('height', height)\n        .toggleClass(classes.open, !isOpen);\n  \n      if (!isOpen && isAutoHeight) {\n        var o = $module;\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  theme.headerNav = (function() {\n  \n    var $parent = $(document.documentElement).add('body');\n    var $page = $('#MainContent');\n    var selectors = {\n      wrapper: '.header-wrapper',\n      siteHeader: '.site-header',\n      searchBtn: '.js-search-header',\n      closeSearch: '.js-search-header-close',\n      searchContainer: '.site-header__search-container',\n      logoContainer: '.site-header__logo',\n      logo: '.site-header__logo img',\n      navigation: '.site-navigation',\n      navContainerWithLogo: '.header-item--logo',\n      navItems: '.site-nav__item',\n      navLinks: '.site-nav__link',\n      navLinksWithDropdown: '.site-nav__link--has-dropdown',\n      navDropdownLinks: '.site-nav__dropdown-link--second-level'\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      stickyEnabled: false,\n      stickyActive: false,\n      stickyClass: 'site-header--stuck',\n      openTransitionClass: 'site-header--opening',\n      lastScroll: 0\n    };\n  \n    // Elements used in resize functions, defined in init\n    var $window;\n    var $navContainerWithLogo;\n    var $logoContainer;\n    var $nav;\n    var $wrapper;\n    var $siteHeader;\n  \n    function init() {\n      $window = $(window);\n      $navContainerWithLogo = $(selectors.navContainerWithLogo);\n      $logoContainer = $(selectors.logoContainer);\n      $nav = $(selectors.navigation);\n      $wrapper = $(selectors.wrapper);\n      $siteHeader = $(selectors.siteHeader);\n  \n      config.stickyEnabled = $siteHeader.data('sticky');\n      if (config.stickyEnabled) {\n        config.wrapperOverlayed = $wrapper.hasClass(config.overlayedClass);\n        stickyHeader();\n      }\n  \n      accessibleDropdowns();\n      searchDrawer();\n  \n      $window.on('load' + config.namespace, resizeLogo);\n      $window.on('resize' + config.namespace, $.debounce(150, resizeLogo));\n    }\n  \n    function unload() {\n      $(window).off(config.namespace);\n      $(selectors.searchBtn).off(config.namespace);\n      $(selectors.closeSearch).off(config.namespace);\n      $parent.off(config.namespace);\n      $(selectors.navLinks).off(config.namespace);\n      $(selectors.navDropdownLinks).off(config.namespace);\n    }\n  \n    function searchDrawer() {\n      $(selectors.searchBtn).on('click' + config.namespace, function(evt) {\n        evt.preventDefault();\n        openSearchDrawer();\n      });\n  \n      $(selectors.closeSearch).on('click' + config.namespace, function() {\n        closeSearchDrawer();\n      });\n    }\n  \n    function openSearchDrawer() {\n      $(selectors.searchContainer).addClass('is-active');\n      $parent.addClass('js-drawer-open js-drawer-open--search');\n  \n      slate.a11y.trapFocus({\n        $container: $(selectors.searchContainer),\n        namespace: 'header_search',\n        $elementToFocus: $(selectors.searchContainer).find('input')\n      });\n  \n      // If sticky is enabled, scroll to top on mobile when close to it\n      // so you don't get an invisible search box\n      if (theme.config.bpSmall && config.stickyEnabled && config.lastScroll < 300) {\n        window.scrollTo(0,0);\n      }\n  \n      // Bind events\n      slate.a11y.lockMobileScrolling(config.namespace);\n  \n      // Clicking out of container closes it\n      $page.on('click' + config.namespace, function () {\n        closeSearchDrawer();\n        return false;\n      });\n  \n      $parent.on('keyup' + config.namespace, function(evt) {\n        if (evt.keyCode === 27) {\n          closeSearchDrawer();\n        }\n      });\n    }\n  \n    function closeSearchDrawer() {\n      // deselect any focused form elements\n      $(document.activeElement).trigger('blur');\n  \n      $parent.removeClass('js-drawer-open js-drawer-open--search').off(config.namespace);\n      $(selectors.searchContainer).removeClass('is-active');\n  \n      slate.a11y.removeTrapFocus({\n        $container: $(selectors.searchContainer),\n        namespace: 'header_search'\n      });\n  \n      slate.a11y.unlockMobileScrolling(config.namespace);\n      $page.off('click' + config.namespace);\n      $parent.off('keyup' + config.namespace);\n    }\n  \n    function resizeLogo() {\n      // Using .each() as there can be a reversed logo too\n      $(selectors.logo).each(function() {\n        var $el = $(this),\n            logoWidthOnScreen = $el.width(),\n            containerWidth = $el.closest('.grid__item').width();\n        // If image exceeds container, let's make it smaller\n        if (logoWidthOnScreen > containerWidth) {\n          $el.css('maxWidth', containerWidth);\n        }\n        else {\n          $el.removeAttr('style');\n        }\n      });\n    }\n  \n    function accessibleDropdowns() {\n      var hasActiveDropdown = false;\n      var hasActiveSubDropdown = false;\n      var closeOnClickActive = false;\n  \n      // Touch devices open dropdown on first click, navigate to link on second\n      if (theme.config.isTouch) {\n        $(selectors.navLinksWithDropdown).on('touchend' + config.namespace, function(evt) {\n          var $el = $(this);\n          var $parentItem = $el.parent();\n          if (!$parentItem.hasClass(classes.dropdownActive)) {\n            evt.preventDefault();\n            closeDropdowns();\n            openFirstLevelDropdown($el);\n          } else {\n            window.location.replace($el.attr('href'));\n          }\n        });\n  \n        $(selectors.navDropdownLinks).on('touchend' + config.namespace, function(evt) {\n          var $el = $(this);\n          var $parentItem = $el.parent();\n  \n          // Open third level menu or go to link based on active state\n          if ($parentItem.hasClass(classes.hasSubDropdownClass)) {\n            if (!$parentItem.hasClass(classes.dropdownActive)) {\n              evt.preventDefault();\n              closeThirdLevelDropdown();\n              openSecondLevelDropdown($el);\n            } else {\n              window.location.replace($el.attr('href'));\n            }\n          } else {\n            // No third level nav, go to link\n            window.location.replace($el.attr('href'));\n          }\n        });\n      }\n  \n      // Open/hide top level dropdowns\n      $(selectors.navLinks).on('focusin mouseover' + config.namespace, function() {\n        if (hasActiveDropdown) {\n          closeSecondLevelDropdown();\n        }\n  \n        if (hasActiveSubDropdown) {\n          closeThirdLevelDropdown();\n        }\n  \n        openFirstLevelDropdown($(this));\n      });\n  \n      // Force remove focus on sitenav links because focus sometimes gets stuck\n      $(selectors.navLinks).on('mouseleave' + config.namespace, function() {\n        closeDropdowns();\n      });\n  \n      // Open/hide sub level dropdowns\n      $(selectors.navDropdownLinks).on('focusin' + config.namespace, function() {\n        closeThirdLevelDropdown();\n        openSecondLevelDropdown($(this), true);\n      });\n  \n      // Private dropdown methods\n      function openFirstLevelDropdown($el) {\n        var $parentItem = $el.parent();\n        if ($parentItem.hasClass(classes.hasDropdownClass)) {\n          $parentItem.addClass(classes.dropdownActive);\n          hasActiveDropdown = true;\n        }\n  \n        if (!theme.config.isTouch) {\n          if (!closeOnClickActive) {\n            var eventType = theme.config.isTouch ? 'touchend' : 'click';\n            closeOnClickActive = true;\n            $('body').on(eventType + config.namespace, function() {\n              closeDropdowns();\n              $('body').off(config.namespace);\n              closeOnClickActive = false;\n            });\n          }\n        }\n      }\n  \n      function openSecondLevelDropdown($el, skipCheck) {\n        var $parentItem = $el.parent();\n        if ($parentItem.hasClass(classes.hasSubDropdownClass) || skipCheck) {\n          $parentItem.addClass(classes.dropdownActive);\n          hasActiveSubDropdown = true;\n        }\n      }\n  \n      function closeDropdowns() {\n        closeSecondLevelDropdown();\n        closeThirdLevelDropdown();\n      }\n  \n      function closeSecondLevelDropdown() {\n        $(selectors.navItems).removeClass(classes.dropdownActive);\n      }\n  \n      function closeThirdLevelDropdown() {\n        $(selectors.navDropdownLinks).parent().removeClass(classes.dropdownActive);\n      }\n    }\n  \n    function stickyHeader() {\n      config.lastScroll = 0;\n      $siteHeader.wrap('<div class=\"site-header-sticky\"></div>');\n  \n      stickyHeaderHeight();\n      $window.on('resize' + config.namespace, $.debounce(50, stickyHeaderHeight));\n      $window.on('scroll' + config.namespace, $.throttle(15, 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 stickyHeaderHeight() {\n      var $stickyHeader = $('.site-header-sticky').css('height', $siteHeader.outerHeight(true));\n    }\n  \n    function stickyHeaderScroll() {\n      var scroll = $window.scrollTop();\n      var threshold = 250;\n  \n      if (scroll > threshold) {\n        if (config.stickyActive) {\n          return;\n        }\n  \n        config.stickyActive = true;\n  \n        $siteHeader.addClass(config.stickyClass);\n        if (config.wrapperOverlayed) {\n          $wrapper.removeClass(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.addClass(config.openTransitionClass);\n        }, 100);\n      } else {\n        if (!config.stickyActive) {\n          return;\n        }\n  \n        config.stickyActive = false;\n  \n        $siteHeader.removeClass(config.openTransitionClass).removeClass(config.stickyClass);\n        if (config.wrapperOverlayed) {\n          $wrapper.addClass(config.overlayedClass);\n        }\n      }\n  \n      config.lastScroll = scroll;\n    }\n  \n    return {\n      init: init,\n      unload: unload\n    };\n  })();\n  \n  theme.articleImages = (function() {\n  \n    var cache = {};\n  \n    function init() {\n      cache.$rteImages = $('.rte--indented-images');\n  \n      if (!cache.$rteImages.length) {\n        return;\n      }\n  \n      $(window).on('load', setImages);\n    }\n  \n    function setImages() {\n      cache.$rteImages.find('img').each(function() {\n        var $el = $(this);\n        var attr = $el.attr('style');\n  \n        // Check if undefined or float: none\n        if (!attr || attr == 'float: none;') {\n          // Remove grid-breaking styles if image isn't wider than parent\n          if ($el.width() < cache.$rteImages.width()) {\n            $el.addClass('rte__no-indent');\n          }\n        }\n      });\n    }\n  \n    return {\n      init: init\n    };\n  })();\n  \n  theme.Slideshow = (function() {\n    this.$slideshow = null;\n  \n    var classes = {\n      next: 'is-next',\n      init: 'is-init',\n      wrapper: 'slideshow-wrapper',\n      slideshow: 'slideshow',\n      currentSlide: 'slick-current',\n      pauseButton: 'slideshow__pause',\n      isPaused: 'is-paused'\n    };\n  \n    function slideshow(el, args) {\n      this.$slideshow = $(el);\n      this.$wrapper = this.$slideshow.closest('.' + classes.wrapper);\n      this.$pause = this.$wrapper.find('.' + classes.pauseButton);\n  \n      this.settings = {\n        accessibility: true,\n        arrows: args.arrows ? true : false,\n        dots: args.dots ? true : false,\n        draggable: true,\n        touchThreshold: 5,\n        pauseOnHover: false,\n        autoplay: this.$slideshow.data('autoplay'),\n        autoplaySpeed: this.$slideshow.data('speed')\n      };\n  \n      this.$slideshow.on('init', this.init.bind(this));\n  \n      this.$slideshow.slick(this.settings);\n  \n      this.$pause.on('click', this._togglePause.bind(this));\n    }\n  \n    slideshow.prototype = $.extend({}, slideshow.prototype, {\n      init: function(event, obj) {\n        this.$slideshowList = obj.$list;\n        this.$slickDots = obj.$dots;\n        this.$allSlides = obj.$slides;\n        this.slideCount = obj.slideCount;\n  \n        this.$slideshow.addClass(classes.init);\n        this._a11y();\n        this._clonedLazyloading();\n      },\n      destroy: function() {\n        this.$slideshow.slick('unslick');\n      },\n  \n      // Playback\n      _play: function() {\n        this.$slideshow.slick('slickPause');\n        $(classes.pauseButton).addClass('is-paused');\n      },\n      _pause: function() {\n        this.$slideshow.slick('slickPlay');\n        $(classes.pauseButton).removeClass('is-paused');\n      },\n      _togglePause: function() {\n        var slideshowSelector = this._getSlideshowId(this.$pause);\n        if (this.$pause.hasClass(classes.isPaused)) {\n          this.$pause.removeClass(classes.isPaused);\n          $(slideshowSelector).slick('slickPlay');\n        } else {\n          this.$pause.addClass(classes.isPaused);\n          $(slideshowSelector).slick('slickPause');\n        }\n      },\n  \n      // Helpers\n      _getSlideshowId: function($el) {\n        return '#Slideshow-' + $el.data('id');\n      },\n      _activeSlide: function() {\n        return this.$slideshow.find('.slick-active');\n      },\n      _currentSlide: function() {\n        return this.$slideshow.find('.slick-current');\n      },\n      _nextSlide: function(index) {\n        return this.$slideshow.find('.slideshow__slide[data-slick-index=\"' + index + '\"]');\n      },\n  \n      // a11y fixes\n      _a11y: function() {\n        var $list = this.$slideshowList;\n        var autoplay = this.settings.autoplay;\n  \n        if (!$list) {\n          return;\n        }\n  \n        // Remove default Slick aria-live attr until slider is focused\n        $list.removeAttr('aria-live');\n  \n        // When an element in the slider is focused\n        // pause slideshow and set aria-live\n        $(classes.wrapper).on('focusin', function(evt) {\n          if (!$(classes.wrapper).has(evt.target).length) {\n            return;\n          }\n  \n          $list.attr('aria-live', 'polite');\n          if (autoplay) {\n            this._pause();\n          }\n        }.bind(this));\n  \n        // Resume autoplay\n        $(classes.wrapper).on('focusout', function(evt) {\n          if (!$(classes.wrapper).has(evt.target).length) {\n            return;\n          }\n  \n          $list.removeAttr('aria-live');\n          if (autoplay) {\n            this._play();\n          }\n        }.bind(this));\n      },\n  \n      // Make sure lazyloading works on cloned slides\n      _clonedLazyloading: function() {\n        var $slideshow = this.$slideshow;\n  \n        $slideshow.find('.slick-slide').each(function(index, el) {\n          var $slide = $(el);\n          if ($slide.hasClass('slick-cloned')) {\n            var slideId = $slide.data('id');\n            var $slideImg = $slide.find('.hero__image').removeClass('lazyloading').addClass('lazyloaded');\n  \n            // Get inline style attribute from non-cloned slide with arbitrary timeout\n            // so the image is loaded\n            setTimeout(function() {\n              var loadedImageStyle = $slideshow.find('.slideshow__slide--' + slideId + ':not(.slick-cloned) .hero__image').attr('style');\n  \n              if (loadedImageStyle) {\n                $slideImg.attr('style', loadedImageStyle);\n              }\n  \n            }, this.settings.autoplaySpeed / 1.5);\n  \n          }\n        }.bind(this));\n      }\n    });\n  \n    return slideshow;\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 (!$(selectors.closeBtn).length) {\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      $(selectors.closeBtn).on('click', function(evt) {\n        evt.preventDefault();\n        announcementBarClose();\n      });\n  \n      $(window).on('resize' + config.namespace, $.debounce(150, announcementBarHeight));\n    }\n  \n    function unload() {\n      $(window).off(config.namespace);\n    }\n  \n    function announcementBarShow() {\n      $(selectors.bar).removeClass(classes.closed);\n      announcementBarHeight();\n    }\n  \n    function announcementBarHeight() {\n      var barHeight = $(selectors.text).outerHeight(true);\n      $(selectors.bar).addClass(classes.opening).css({'max-height': barHeight});\n    }\n  \n    function announcementBarClose() {\n      if (theme.config.hasSessionStorage) {\n        sessionStorage.setItem(announcementBarText(), 'hidden');\n      }\n  \n      $(selectors.bar).addClass(classes.closed);\n    }\n  \n    function announcementBarText() {\n      return $(selectors.text).data('text');\n    }\n  \n    return {\n      init: init,\n      unload: unload\n    };\n  })();\n  \n  theme.currencySwitcher = (function() {\n  \n    var selectors = {\n      dataDiv: '#CurrencyData',\n      picker: '.currency-input'\n    };\n  \n    var data = {};\n  \n    function init() {\n      var $dataDiv = $(selectors.dataDiv);\n  \n      if (!$dataDiv.length) {\n        return;\n      }\n  \n      $primaryPicker = $('#CurrencyPicker-header');\n      $drawerPicker = $('#CurrencyPicker-drawer');\n  \n      // Keep all currency pickers in sync\n      $primaryPicker.on('change', function() {\n        $drawerPicker.val($(this).val());\n      });\n  \n      $drawerPicker.on('change', function() {\n        $primaryPicker.val($(this).val());\n      });\n  \n      data = {\n        currency: $dataDiv.data('shop-currency'),\n        default: $dataDiv.data('default-currency'),\n        format: $dataDiv.data('format'),\n        moneyFormat: $dataDiv.data('money-format'),\n        moneyCurrencyFormat: $dataDiv.data('money-currency-format')\n      };\n  \n      Currency.format = data.format;\n  \n      // Rely on the shop's currency format, not Shopify defaults (in case merchant changes it)\n      Currency.money_format[data.currency] = data.moneyFormat;\n      Currency.money_with_currency_format[data.currency] = data.moneyCurrencyFormat;\n  \n      // Fix for customer account page\n      $('span.money span.money').each(function() {\n        $(this).parents('span.money').removeClass('money');\n      });\n  \n      // Save current price\n      $('span.money').each(function() {\n        $(this).attr('data-currency-' + data.currency, $(this).html());\n      });\n  \n      checkCookie();\n  \n      $(selectors.picker).val(Currency.currentCurrency).on('change', refresh);\n    }\n  \n    function refresh() {\n      var newCurrency = $(selectors.picker).val();\n      Currency.convertAll(Currency.currentCurrency, newCurrency);\n    }\n  \n    function ajaxrefresh() {\n      var newCurrency = $(selectors.picker).val();\n      // Ajax cart always returns shop's currency, not what theme settings defines\n      Currency.convertAll(data.currency, newCurrency);\n    }\n  \n    function checkCookie() {\n      var cookieCurrency = Currency.cookie.read();\n  \n      if (cookieCurrency == null) {\n        if (data.currency !== data.default) {\n          Currency.convertAll(data.currency, data.default);\n        }\n        else {\n          Currency.currentCurrency = data.default;\n        }\n      } else if ($(selectors.picker).length && $(selectors.picker).find('option[value=' + cookieCurrency + ']').length === 0) {\n        // If the cookie value does not correspond to any value in the currency dropdown\n        Currency.currentCurrency = data.currency;\n        Currency.cookie.write(data.currency);\n      }\n      else if (cookieCurrency === data.currency) {\n        Currency.currentCurrency = data.currency;\n      }\n      else {\n        Currency.convertAll(data.currency, cookieCurrency);\n      }\n    }\n  \n    return {\n      init: init,\n      refresh: refresh,\n      ajaxrefresh: ajaxrefresh\n    };\n  })();\n  \n  theme.initQuickShop = function(reinit) {\n    var ids = [];\n    var $buttons = $('.quick-product__btn');\n  \n    $buttons.each(function() {\n      var id = $(this).data('product-id');\n      var modalId = 'QuickShopModal-' + id;\n      var name = 'quick-modal-' + id;\n  \n      // If another identical modal exists, remove duplicates\n      if (ids.indexOf(id) > -1) {\n        $('.modal--quick-shop[data-product-id=\"'+ id +'\"]').each(function(i) {\n          if (i > 0) {\n            $(this).remove();\n          }\n        });\n        return;\n      }\n  \n      new theme.Modals(modalId, name);\n      ids.push(id);\n    });\n  };\n  \n  theme.videoModal = function() {\n    var videoModalPlayer = null;\n    var videoOptions = {\n      width: 1280,\n      height: 720,\n      playerVars: {\n        autohide: 0,\n        autoplay: 1,\n        branding: 0,\n        cc_load_policy: 0,\n        fs: 0,\n        iv_load_policy: 3,\n        modestbranding: 1,\n        playsinline: 1,\n        quality: 'hd720',\n        rel: 0,\n        showinfo: 0,\n        wmode: 'opaque'\n      }\n    };\n  \n    var selectors = {\n      triggers: 'a[href*=\"youtube.com/watch\"], a[href*=\"youtu.be/\"]'\n    };\n  \n    if (!$(selectors.triggers).length) {\n      return;\n    }\n  \n    var modal = new theme.Modals('VideoModal', 'video-modal', {\n      closeOffContentClick: true,\n      solid: true\n    });\n  \n    $(selectors.triggers).on('click', triggerYouTubeModal);\n  \n    function triggerYouTubeModal(evt) {\n      evt.preventDefault();\n      window.loadYouTube();\n  \n      if (theme.config.youTubeReady) {\n        startVideoOnClick(evt);\n      } else {\n        $('body').on('youTubeReady', function() {\n          startVideoOnClick(evt);\n        });\n      }\n    }\n  \n    function startVideoOnClick(evt) {\n      var $el = $(evt.currentTarget);\n      var videoId = getYoutubeVideoId($el.attr('href'));\n  \n      var args = $.extend({}, videoOptions, {\n        videoId: videoId\n      });\n  \n      // Disable plays inline on mobile\n      args.playerVars.playsinline = theme.config.bpSmall ? 0 : 1;\n  \n      var videoModalPlayer = new YT.Player('VideoHolder', args);\n      modal.open();\n  \n      $('body').on('modalClose.VideoModal', function() {\n        // Slight timeout so it is destroyed after the modal closes\n        setTimeout(function() {\n          videoModalPlayer.destroy();\n        }, 500); // modal close css transition\n      });\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  \n  \n\n  theme.customerTemplates = (function() {\n  \n    function initEventListeners() {\n      // Show reset password form\n      $('#RecoverPassword').on('click', function(evt) {\n        evt.preventDefault();\n        toggleRecoverPasswordForm();\n      });\n  \n      // Hide reset password form\n      $('#HideRecoverPasswordLink').on('click', function(evt) {\n        evt.preventDefault();\n        toggleRecoverPasswordForm();\n      });\n    }\n  \n    /**\n     *\n     *  Show/Hide recover password form\n     *\n     */\n    function toggleRecoverPasswordForm() {\n      $('#RecoverPasswordForm').toggleClass('hide');\n      $('#CustomerLoginForm').toggleClass('hide');\n    }\n  \n    /**\n     *\n     *  Show reset password success message\n     *\n     */\n    function resetPasswordSuccess() {\n      var $formState = $('.reset-password-success');\n  \n      // check if reset password form was successfully submitted\n      if (!$formState.length) {\n        return;\n      }\n  \n      // show success message\n      $('#ResetSuccess').removeClass('hide');\n    }\n  \n    /**\n     *\n     *  Show/hide customer address forms\n     *\n     */\n    function customerAddressForm() {\n      var $newAddressForm = $('#AddressNewForm');\n      var $addressForms = $('.js-address-form');\n  \n      if (!$newAddressForm.length || !$addressForms.length) {\n        return;\n      }\n  \n      if (Shopify) {\n        $('.js-address-country').each(function() {\n          var $container = $(this);\n          var countryId = $container.data('country-id');\n          var provinceId = $container.data('province-id');\n          var provinceContainerId = $container.data('province-container-id');\n  \n          new Shopify.CountryProvinceSelector(\n            countryId,\n            provinceId,\n            {\n              hideElement: provinceContainerId\n            }\n          );\n        });\n      }\n  \n      // Toggle new/edit address forms\n      $('.address-new-toggle').on('click', function() {\n        $newAddressForm.toggleClass('hide');\n      });\n  \n      $('.address-edit-toggle').on('click', function() {\n        var formId = $(this).data('form-id');\n        $('#EditAddress_' + formId).toggleClass('hide');\n      });\n  \n      $('.address-delete').on('click', function() {\n        var $el = $(this);\n        var formId = $el.data('form-id');\n        var confirmMessage = $el.data('confirm-message');\n  \n        if (confirm(confirmMessage || 'Are you sure you wish to delete this address?')) {\n          Shopify.postLink('/account/addresses/' + formId, {parameters: {_method: 'delete'}});\n        }\n      });\n    }\n  \n    /**\n     *\n     *  Check URL for reset password hash\n     *\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    return {\n      init: function() {\n        checkUrlHash();\n        initEventListeners();\n        resetPasswordSuccess();\n        customerAddressForm();\n      }\n    };\n  })();\n  \n\n  theme.Product = (function() {\n  \n    var classes = {\n      onSale: 'on-sale',\n      disabled: 'disabled',\n      isModal: 'is-modal',\n      loading: 'loading',\n      loaded: 'loaded',\n      interactable: 'video-interactable'\n    };\n  \n    var selectors = {\n      productVideo: '.product__video',\n      videoParent: '.product__video-wrapper',\n      currentSlide: '.slick-current'\n    };\n  \n    var youtubeReady;\n    var videos = {};\n    var youtubePlayers = [];\n    var youtubeVideoOptions = {\n      height: '480',\n      width: '850',\n      playerVars :{\n        autohide: 0,\n        autoplay: 1,\n        branding: 0,\n        cc_load_policy: 0,\n        controls: 0,\n        fs: 0,\n        iv_load_policy: 3,\n        modestbranding: 1,\n        playsinline: 1,\n        quality: 'hd720',\n        rel: 0,\n        showinfo: 0,\n        wmode: 'opaque'\n      },\n      events: {\n        onReady: onVideoPlayerReady,\n        onStateChange: onVideoStateChange\n      }\n    };\n  \n    var vimeoReady;\n    var vimeoPlayers = [];\n    var vimeoVideoOptions = {\n      byline: false,\n      title: false,\n      portrait: false,\n      loop: true\n    };\n  \n    function onVideoPlayerReady(evt) {\n      var $player = $(evt.target.a);\n      var playerId = $player.attr('id');\n      youtubePlayers[playerId] = evt.target; // update stored player\n      var player = youtubePlayers[playerId];\n  \n      setParentAsLoading($player);\n  \n      if (videos[playerId].style === 'muted') {\n        youtubePlayers[playerId].mute().playVideo().pauseVideo();\n      } else {\n        setParentAsLoaded($player);\n      }\n  \n      // If first slide or only photo, start video\n      if ($player.closest(selectors.currentSlide).length || $player.data('image-count') === 1) {\n        if (videos[playerId].style === 'muted') {\n          youtubePlayers[playerId].playVideo();\n          initCheckVisibility(playerId);\n        }\n      }\n    }\n  \n    function initCheckVisibility(playerId) {\n      // Add out of view pausing\n      videoVisibilityCheck(playerId);\n      $(window).on('scroll.' + playerId, {id: playerId}, $.throttle(150, videoVisibilityCheck));\n    }\n  \n    function videoVisibilityCheck(id) {\n      var playerId;\n  \n      if (typeof id === 'string') {\n        playerId = id;\n      } else {\n        // Data comes in as part of the scroll event\n        playerId = id.data.id;\n      }\n  \n      if (theme.isElementVisible($('#' + playerId))) {\n        if (videos[playerId] && videos[playerId].style === 'unmuted') {\n          return;\n        }\n        playVisibleVideo(playerId);\n      } else {\n        pauseHiddenVideo(playerId);\n      }\n    }\n  \n    function playVisibleVideo(id) {\n      if (youtubePlayers[id] && typeof youtubePlayers[id].playVideo === 'function') {\n        youtubePlayers[id].playVideo();\n      }\n    }\n  \n    function pauseHiddenVideo(id) {\n      if (youtubePlayers[id] && typeof youtubePlayers[id].pauseVideo === 'function') {\n        youtubePlayers[id].pauseVideo();\n      }\n    }\n  \n    function onVideoStateChange(evt) {\n      var $player = $(evt.target.a);\n      var playerId = $player.attr('id');\n      var player = youtubePlayers[playerId];\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 (videos[playerId].attemptedToPlay) {\n            setParentAsLoaded($player);\n            setVideoToBeInteractedWith($player);\n          }\n          break;\n        case 0: // ended\n          player.playVideo();\n          break;\n        case 1: // playing\n          setParentAsLoaded($player);\n          break;\n        case 3: // buffering\n          videos[playerId].attemptedToPlay = true;\n          break;\n      }\n    }\n  \n    function setParentAsLoading($el) {\n      $el\n        .closest(selectors.videoParent)\n        .addClass(classes.loading);\n    }\n  \n    function setParentAsLoaded($el) {\n      $el\n        .closest(selectors.videoParent)\n        .removeClass(classes.loading)\n        .addClass(classes.loaded);\n    }\n  \n    function setVideoToBeInteractedWith($el) {\n      $el\n        .closest(selectors.videoParent)\n        .addClass(classes.interactable);\n    }\n  \n    function Product(container) {\n      var $container = this.$container = $(container);\n      var sectionId = this.sectionId = $container.attr('data-section-id');\n  \n      this.inModal = $container.closest('.modal').length;\n      this.$modal;\n  \n      this.settings = {\n        enableHistoryState: $container.data('enable-history-state') || false,\n        namespace: '.product-' + sectionId,\n        inventory: $container.data('inventory') || false,\n        modalInit: false,\n        slickMainInitialized: false,\n        slickThumbInitialized: false,\n        hasImages: true,\n        hasMultipleImages: false,\n        imageSize: '620x'\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 = $('#QuickShopModal-' + sectionId);\n      }\n  \n      this.selectors = {\n        variantsJson: 'VariantsJson-' + sectionId,\n        currentVariantJson: 'CurrentVariantJson-' + sectionId,\n  \n        video: 'ProductVideo-' + sectionId,\n        photoThumbs: '.product__thumb-' + sectionId,\n        thumbSlider: '#ProductThumbs-' + sectionId,\n        mainSlider: '#ProductPhotos-' + sectionId,\n        imageContainer: '[data-product-images]',\n        productImageMain: '.product-image-main--' + sectionId,\n  \n        priceWrapper: '.product__price-wrap-' + sectionId,\n        price: '#ProductPrice-' + sectionId,\n        comparePrice: '#ComparePrice-' + sectionId,\n        priceA11y: '#PriceA11y-' + sectionId,\n        comparePriceA11y: '#ComparePriceA11y-' + sectionId,\n        sku: '#Sku-' + sectionId,\n        inventory: '#ProductInventory-' + sectionId,\n  \n        addToCart: '#AddToCart-' + sectionId,\n        addToCartText: '#AddToCartText-' + sectionId,\n  \n        originalSelectorId: '#ProductSelect-' + sectionId,\n        singleOptionSelector: '.variant__input-' + sectionId,\n        variantColorSwatch: '.variant__input--color-swatch-' + sectionId,\n  \n        modalFormHolder: '#ProductFormHolder-' + sectionId,\n        formContainer: '#AddToCartForm-' + sectionId\n      };\n  \n      this.$mainSlider = $(this.selectors.mainSlider);\n      this.$thumbSlider = $(this.selectors.thumbSlider);\n      this.$firstProductImage = this.$mainSlider.find('img').first();\n  \n      if (!this.$firstProductImage.length) {\n        this.settings.hasImages = false;\n      }\n  \n      this.init();\n    }\n  \n    Product.prototype = $.extend({}, Product.prototype, {\n      init: function() {\n        if (this.inModal) {\n          this.$container.addClass(classes.isModal);\n          $('body')\n            .off('modalOpen.QuickShopModal-' + this.sectionId)\n            .off('modalClose.QuickShopModal-' + this.sectionId);\n          $('body').on('modalOpen.QuickShopModal-' + this.sectionId, this.openModalProduct.bind(this));\n          $('body').on('modalClose.QuickShopModal-' + this.sectionId, this.closeModalProduct.bind(this));\n        }\n  \n        if (!this.inModal) {\n          this.stringOverrides();\n          this.formSetup();\n          this.productSetup();\n  \n          this.checkIfVideos();\n          this.createImageCarousels();\n        }\n      },\n  \n      formSetup: function() {\n        // Determine how to handle variant availability selectors\n        if (theme.settings.dynamicVariantsEnable) {\n          if (theme.settings.dynamicVariantType === 'dropdown') {\n            this.$variantSelectors = {\n              all: $(this.selectors.formContainer).find('select'),\n              selected: $(this.selectors.formContainer).find('select')\n            }\n          } else {\n            this.$variantSelectors = {\n              all: $(this.selectors.formContainer).find('input'),\n              selected: $(this.selectors.formContainer).find('input:checked')\n            }\n          }\n        }\n  \n        this.initQtySelector();\n        this.initAjaxProductForm();\n        this.initVariants();\n      },\n  \n      productSetup: function() {\n        this.setImageSizes();\n        this.initImageSwitch();\n        this.initImageZoom();\n      },\n  \n      stringOverrides: function() {\n        theme.productStrings = theme.productStrings || {};\n        $.extend(theme.strings, theme.productStrings);\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[0].currentSrc;\n  \n        if (currentImage) {\n          this.settings.imageSize = theme.Images.imageSize(currentImage);\n        }\n      },\n  \n      initVariants: function() {\n        if (!document.getElementById(this.selectors.variantsJson)) {\n          return;\n        }\n  \n        this.variantsObject = JSON.parse(document.getElementById(this.selectors.variantsJson).innerHTML);\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        };\n  \n        if ($(this.selectors.variantColorSwatch).length) {\n          $(this.selectors.variantColorSwatch).on('change', function(evt) {\n            var $el = $(evt.currentTarget);\n            var color = $el.data('color-name');\n            var index = $el.data('color-index');\n            this.updateColorName(color, index);\n          }.bind(this));\n        }\n  \n        this.variants = new slate.Variants(options);\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        if ($(this.selectors.sku).length) {\n          this.$container.on('variantSKUChange' + this.settings.namespace, this.updateSku.bind(this));\n        }\n        if (this.settings.inventory) {\n          this.$container.on('variantChange' + this.settings.namespace, this.updateInventory.bind(this));\n        }\n  \n        // Update individual variant availability on each selection\n        if (theme.settings.dynamicVariantsEnable && document.getElementById(this.selectors.currentVariantJson)) {\n          this.currentVariantObject = JSON.parse(document.getElementById(this.selectors.currentVariantJson).innerHTML);\n  \n          this.$variantSelectors.all.on('change' + this.settings.namespace, this.updateVariantAvailability.bind(this));\n  \n          // Set default state based on current selected variant\n          this.setCurrentVariantAvailability(this.currentVariantObject, true);\n        }\n      },\n  \n      // Variant change functions\n      updateColorName: function(color, index) {\n        // Updates on radio button change, not variant.js\n        $('#VariantColorLabel-' + this.sectionId + '-' + index).text(color);\n      },\n  \n      setCurrentVariantAvailability: function(variant) {\n        var valuesToEnable = {\n          option1: [],\n          option2: [],\n          option3: []\n        };\n  \n        // Disable all options to start\n        this.disableVariantGroup($(this.selectors.formContainer).find('.variant-input-wrap'));\n  \n        // Combine all available variants\n        var availableVariants = this.variantsObject.filter(function(el) {\n          if (variant.id === el.id) {\n            return false;\n          }\n  \n          // Option 1\n          if (variant.option2 === el.option2 && variant.option3 === el.option3) {\n            return true;\n          }\n  \n          // Option 2\n          if (variant.option1 === el.option1 && variant.option3 === el.option3) {\n            return true;\n          }\n  \n          // Option 3\n          if (variant.option1 === el.option1 && variant.option2 === el.option2) {\n            return true;\n          }\n        });\n  \n  \n        // IE11 can't handle shortform of {variant} so extra step is needed\n        var variantObject = {\n          variant: variant\n        };\n  \n        availableVariants = Object.assign({}, variantObject, availableVariants);\n  \n        // Loop through each available variant to gather variant values\n        for (var property in availableVariants) {\n          if (availableVariants.hasOwnProperty(property)) {\n            var item = availableVariants[property];\n            var option1 = item.option1;\n            var option2 = item.option2;\n            var option3 = item.option3;\n  \n            if (option1) {\n              if (valuesToEnable.option1.indexOf(option1) === -1) {\n                valuesToEnable.option1.push(option1);\n              }\n            }\n            if (option2) {\n              if (valuesToEnable.option2.indexOf(option2) === -1) {\n                valuesToEnable.option2.push(option2);\n              }\n            }\n            if (option3) {\n              if (valuesToEnable.option3.indexOf(option3) === -1) {\n                valuesToEnable.option3.push(option3);\n              }\n            }\n          }\n        }\n  \n        // Have values to enable, separated by option index\n        if (valuesToEnable.option1.length) {\n          this.enableVariantOptionByValue(valuesToEnable.option1, 'option1');\n        }\n        if (valuesToEnable.option2.length) {\n          this.enableVariantOptionByValue(valuesToEnable.option2, 'option2');\n        }\n        if (valuesToEnable.option3.length) {\n          this.enableVariantOptionByValue(valuesToEnable.option3, 'option3');\n        }\n      },\n  \n      updateVariantAvailability: function(evt, value, index) {\n        if (value && index) {\n          var newVal = value;\n          var optionIndex = index;\n        } else {\n          var $el = $(evt.currentTarget);\n          var newVal = $el.val() ? $el.val() : evt.currentTarget.value;\n          var optionIndex = $el.data('index');\n        }\n  \n        var variants = this.variantsObject.filter(function(el) {\n          return el[optionIndex] === newVal;\n        });\n  \n        // Disable all buttons/dropdown options that aren't the current index\n        $(this.selectors.formContainer).find('.variant-input-wrap').each(function(index, el) {\n          var $group = $(el);\n          var currentOptionIndex = $group.data('index');\n  \n          if (currentOptionIndex !== optionIndex) {\n            // Disable all options as a starting point\n            this.disableVariantGroup($group);\n  \n            // Loop through legit available options and enable\n            for (var i = 0; i < variants.length; i++) {\n              this.enableVariantOption($group, variants[i][currentOptionIndex]);\n            }\n          }\n        }.bind(this));\n      },\n  \n      disableVariantGroup: function($group) {\n        if (theme.settings.dynamicVariantType === 'dropdown') {\n          $group.find('option').prop('disabled', true)\n        } else {\n          $group.find('input').prop('disabled', true);\n          $group.find('label').toggleClass('disabled', true);\n        }\n      },\n  \n      enableVariantOptionByValue: function(array, index) {\n        var $group = $(this.selectors.formContainer).find('.variant-input-wrap[data-index=\"'+ index +'\"]');\n  \n        for (var i = 0; i < array.length; i++) {\n          this.enableVariantOption($group, array[i]);\n        }\n      },\n  \n      enableVariantOption: function($group, value) {\n        // Selecting by value so escape it\n        value = value.replace(/([ #;&,.+*~\\':\"!^$[\\]()=>|\\/@])/g,'\\\\$1');\n  \n        if (theme.settings.dynamicVariantType === 'dropdown') {\n          $group.find('option[value=\"'+ value +'\"]').prop('disabled', false);\n        } else {\n          var $buttonGroup = $group.find('.variant-input[data-value=\"'+ value +'\"]');\n          $buttonGroup.find('input').prop('disabled', false);\n          $buttonGroup.find('label').toggleClass('disabled', false);\n        }\n      },\n  \n      updateCartButton: function(evt) {\n        var variant = evt.variant;\n  \n        if (variant) {\n          if (variant.available) {\n            // Available, enable the submit button and change text\n            $(this.selectors.addToCart).removeClass(classes.disabled).prop('disabled', false);\n            $(this.selectors.addToCartText).html(theme.strings.addToCart);\n          } else {\n            // Sold out, disable the submit button and change text\n            $(this.selectors.addToCart).addClass(classes.disabled).prop('disabled', true);\n            $(this.selectors.addToCartText).html(theme.strings.soldOut);\n          }\n        } else {\n          // The variant doesn't exist, disable submit button\n          $(this.selectors.addToCart).addClass(classes.disabled).prop('disabled', true);\n          $(this.selectors.addToCartText).html(theme.strings.unavailable);\n        }\n      },\n  \n      updatePrice: function(evt) {\n        var variant = evt.variant;\n  \n        if (variant) {\n          // Regular price\n          $(this.selectors.price).html(theme.Currency.formatMoney(variant.price, theme.settings.moneyFormat)).show();\n  \n          // Sale price, if necessary\n          if (variant.compare_at_price > variant.price) {\n            $(this.selectors.comparePrice).html(theme.Currency.formatMoney(variant.compare_at_price, theme.settings.moneyFormat));\n            $(this.selectors.priceWrapper).removeClass('hide');\n            $(this.selectors.price).addClass(classes.onSale);\n            $(this.selectors.comparePriceA11y).attr('aria-hidden', 'false');\n            $(this.selectors.priceA11y).attr('aria-hidden', 'false');\n          } else {\n            $(this.selectors.priceWrapper).addClass('hide');\n            $(this.selectors.price).removeClass(classes.onSale);\n            $(this.selectors.comparePriceA11y).attr('aria-hidden', 'true');\n            $(this.selectors.priceA11y).attr('aria-hidden', 'true');\n          }\n  \n          if (theme.settings.currenciesEnabled) {\n            theme.currencySwitcher.ajaxrefresh();\n          }\n        }\n      },\n  \n      updateSku: function(evt) {\n        var variant = evt.variant;\n        var newSku = '';\n  \n        if (variant) {\n          if (variant.sku) {\n            newSku = variant.sku;\n          }\n  \n          $(this.selectors.sku).html(newSku);\n        }\n      },\n  \n      updateInventory: function(evt) {\n        var variant = evt.variant;\n        var showInventory = false;\n        var quantity = 0;\n        var $inventoryLabel = $(this.selectors.inventory);\n  \n        if (variant && variant.inventory_management === 'shopify') {\n          showInventory = true;\n          quantity = window.inventories[this.sectionId][variant.id];\n  \n          if (quantity === 0) {\n            showInventory = false;\n          }\n        }\n  \n        if (!showInventory) {\n          $inventoryLabel.addClass('hide');\n        } else {\n          $inventoryLabel\n            .removeClass('hide')\n            .text(theme.strings.stockLabel.replace('[count]', quantity));\n        }\n      },\n  \n      updateVariantImage: function(evt) {\n        var variant = evt.variant;\n        var sizedImgUrl = theme.Images.getSizedImageUrl(variant.featured_image.src, this.settings.imageSize);\n  \n        var $newImage = $('.product__thumb[data-id=\"' + variant.featured_image.id + '\"]');\n        var imageIndex = this._slideIndex($newImage.closest('.product__thumb-item'));\n  \n        // If there is no index, slider is not initalized\n        if (typeof imageIndex === 'undefined') {\n          return;\n        }\n  \n        this.$mainSlider.slick('slickGoTo', imageIndex);\n      },\n  \n      // Image/thumbnail toggling\n      initImageSwitch: function() {\n        if (!$(this.selectors.photoThumbs).length) {\n          return;\n        }\n  \n        var self = this;\n  \n        $(this.selectors.photoThumbs).on('click', function(evt) {\n          evt.preventDefault();\n        });\n      },\n  \n      initImageZoom: function() {\n        var $container = $(this.selectors.imageContainer, this.$container);\n        var imageZoom = new theme.Photoswipe($container[0], this.sectionId);\n      },\n  \n      checkIfVideos: function() {\n        var $productVideos = this.$mainSlider.find(selectors.productVideo);\n  \n        // Stop if there are 0 videos\n        if (!$productVideos.length) {\n          return false;\n        }\n  \n        var videoTypes = [];\n  \n        $productVideos.each(function() {\n          var type = $(this).data('video-type');\n  \n          if (videoTypes.indexOf(type) < 0) {\n            videoTypes.push(type);\n          }\n        });\n  \n        // Load YouTube API if not already loaded\n        if (videoTypes.indexOf('youtube') > -1) {\n          if (!theme.config.youTubeReady) {\n            window.loadYouTube();\n            $('body').on('youTubeReady' + this.settings.namespace, function() {\n              this.loadYoutubeVideos($productVideos);\n            }.bind(this));\n          } else {\n            this.loadYoutubeVideos($productVideos);\n          }\n        }\n  \n        // Load Vimeo API if not already loaded\n        if (videoTypes.indexOf('vimeo') > -1) {\n          if (!vimeoReady) {\n            window.loadVimeo();\n            $('body').on('vimeoReady' + this.settings.namespace, function() {\n              this.loadVimeoVideos($productVideos);\n            }.bind(this))\n          } else {\n            this.loadVimeoVideos($productVideos);\n          }\n        }\n  \n        // Add mp4 video players\n        if (videoTypes.indexOf('mp4') > -1) {\n          this.loadMp4Videos($productVideos);\n        }\n  \n        return videoTypes;\n      },\n  \n      loadMp4Videos: function($videos) {\n        $videos.each(function() {\n          var $el = $(this);\n          if ($el.data('video-type') != 'mp4') {\n            return;\n          }\n  \n          var id = $el.attr('id');\n          var videoId = $el.data('video-id');\n  \n          videos[this.id] = {\n            type: 'mp4',\n            divId: id,\n            style: $el.data('video-style')\n          };\n        });\n      },\n  \n      loadVimeoVideos: function($videos) {\n        $videos.each(function() {\n          var $el = $(this);\n          if ($el.data('video-type') != 'vimeo') {\n            return;\n          }\n  \n          var id = $el.attr('id');\n          var videoId = $el.data('video-id');\n  \n          videos[this.id] = {\n            type: 'vimeo',\n            divId: id,\n            id: videoId,\n            style: $el.data('video-style'),\n            width: $el.data('video-width'),\n            height: $el.data('video-height')\n          };\n        });\n  \n        // Create a new player for each Vimeo video\n        for (var key in videos) {\n          if (videos[key].type != 'vimeo') {\n            continue;\n          }\n  \n          var args = $.extend({}, vimeoVideoOptions, videos[key]);\n          vimeoPlayers[key] = new Vimeo.Player(videos[key].divId, args);\n        }\n  \n        vimeoReady = true;\n      },\n  \n      autoplayVimeoVideo: function(id) {\n        // Do not autoplay on mobile though\n        if (!theme.config.bpSmall) {\n          this.requestToPlayVimeoVideo(id);\n        } else {\n          // Set as loaded on mobile so you can see the image\n          var $player = $('#' + id);\n          setParentAsLoaded($player);\n        }\n      },\n  \n      requestToPlayVimeoVideo: function(id) {\n        // The slider may initialize and attempt to play the video before\n        // the API is even ready, because it sucks.\n  \n        var $player = $('#' + id);\n        setParentAsLoading($player);\n  \n        if (!vimeoReady) {\n          // Wait for the trigger, then play it\n          $('body').on('vimeoReady' + this.settings.namespace, function() {\n            this.playVimeoVideo(id);\n          }.bind(this))\n          return;\n        }\n  \n        this.playVimeoVideo(id);\n      },\n  \n      playVimeoVideo: function(id) {\n        vimeoPlayers[id].play();\n  \n        if (videos[id].style === 'muted') {\n          vimeoPlayers[id].setVolume(0);\n        }\n  \n        var $player = $('#' + id);\n        setParentAsLoaded($player);\n      },\n  \n      stopVimeoVideo: function(id) {\n        if (!theme.config.vimeoReady) {\n          return;\n        }\n  \n        if (id) {\n          vimeoPlayers[id].pause();\n        } else {\n          for (key in vimeoPlayers) {\n            if (typeof vimeoPlayers[key].pause === 'function') {\n              vimeoPlayers[key].pause();\n            }\n          }\n        }\n      },\n  \n      loadYoutubeVideos: function($videos) {\n        $videos.each(function() {\n          var $el = $(this);\n          if ($el.data('video-type') != 'youtube') {\n            return;\n          }\n  \n          var id = $el.attr('id');\n          var videoId = $el.data('youtube-id');\n  \n          videos[this.id] = {\n            type: 'youtube',\n            id: id,\n            videoId: videoId,\n            style: $el.data('video-style'),\n            width: $el.data('video-width'),\n            height: $el.data('video-height'),\n            attemptedToPlay: false\n          };\n        });\n  \n        // Create a player for each YouTube video\n        for (var key in videos) {\n          if (videos[key].type === 'youtube') {\n            if (videos.hasOwnProperty(key)) {\n              var args = $.extend({}, youtubeVideoOptions, videos[key]);\n  \n              if (args.style === 'muted') {\n                // default youtubeVideoOptions, no need to change anything\n              } else {\n                args.playerVars.controls = 1;\n                args.playerVars.autoplay = 0;\n              }\n  \n              youtubePlayers[key] = new YT.Player(key, args);\n            }\n          }\n        }\n  \n        youtubeReady = true;\n      },\n  \n      requestToPlayYoutubeVideo: function(id, forcePlay) {\n        if (!theme.config.youTubeReady) {\n          return;\n        }\n  \n        var $player = $('#' + id);\n        setParentAsLoading($player);\n  \n        // If video is requested too soon, player might not be ready.\n        // Set arbitrary timeout to request it again in a second\n        if (typeof youtubePlayers[id].playVideo != 'function') {\n          var o = this;\n          setTimeout(function() {\n            o.playYoutubeVideo(id, forcePlay);\n          }, 1000);\n          return;\n        }\n  \n        this.playYoutubeVideo(id, forcePlay);\n      },\n  \n      playYoutubeVideo: function (id, forcePlay) {\n        var $player = $('#' + id);\n        setParentAsLoaded($player);\n        if (typeof youtubePlayers[id].playVideo === 'function') {\n          youtubePlayers[id].playVideo();\n        }\n  \n        // forcePlay is sent as true from beforeSlideChange so the visibility\n        // check isn't fooled by the next slide positioning\n        if (!forcePlay) {\n          initCheckVisibility(id);\n        }\n      },\n  \n      stopYoutubeVideo: function(id) {\n        if (!theme.config.youTubeReady) {\n          return;\n        }\n  \n        if (id && youtubePlayers[id]) {\n          if (typeof youtubePlayers[id].pauseVideo === 'function') {\n            youtubePlayers[id].pauseVideo();\n          }\n          $(window).off('scroll.' + id);\n        } else {\n          for (key in youtubePlayers) {\n            if (typeof youtubePlayers[key].pauseVideo === 'function') {\n              youtubePlayers[key].pauseVideo();\n              $(window).off('scroll.' + key);\n            }\n          }\n        }\n      },\n  \n      playMp4Video: function(id) {\n        var $player = $('#' + id);\n        setParentAsLoaded($player);\n  \n        $player[0].play();\n      },\n  \n      stopMp4Video: function(id) {\n        if (id) {\n          $('#' + id)[0].pause();\n        } else {\n          // loop through all mp4 videos to stop them\n          for (var key in videos) {\n            if (videos[key].type === 'mp4') {\n              var player = $('#' + videos[key].divId)[0];\n              if (typeof player.pause === 'function') {\n                player.pause();\n              }\n            }\n          }\n        }\n      },\n  \n      createImageCarousels: function() {\n        if (!this.$thumbSlider.length || $(this.selectors.photoThumbs).length < 2) {\n          // Single product image. Init video if it exists\n          var $video = $(this.selectors.productImageMain).find(selectors.productVideo);\n          if ($video.length) {\n            this.initVideo($video);\n          }\n  \n          return;\n        }\n  \n        this.settings.hasMultipleImages = true;\n  \n        // Set starting slide (for both sliders)\n        var $activeSlide = this.$mainSlider.find('.starting-slide');\n        var startIndex = this._slideIndex($activeSlide);\n  \n        // Lame way to prevent duplicate event listeners\n        this.$mainSlider.off('init');\n        this.$mainSlider.off('beforeChange');\n        this.$mainSlider.on('init', this.mainSlideInit.bind(this));\n        this.$mainSlider.on('beforeChange', this.beforeSlideChange.bind(this));\n        this.$thumbSlider.on('init', this.thumbSlideInit.bind(this));\n  \n        var thumbnailsVertical = this.$thumbSlider.data('position') === 'beside' ? true : false;\n  \n        this.$mainSlider.slick({\n          adaptiveHeight: thumbnailsVertical ? false : true,\n          asNavFor: this.selectors.thumbSlider,\n          infinite: false,\n          arrows: false,\n          dots: false,\n          initialSlide: startIndex\n        });\n  \n        this.$thumbSlider.slick({\n          asNavFor: this.selectors.mainSlider,\n          slidesToShow: thumbnailsVertical ? 3 : 5,\n          slidesToScroll: 1,\n          arrows: false,\n          dots: false,\n          vertical: thumbnailsVertical,\n          verticalSwiping: thumbnailsVertical,\n          focusOnSelect: true,\n          infinite: false,\n          customHeightMatching: thumbnailsVertical,\n          customSlideAdvancement: true,\n          initialSlide: startIndex\n        });\n  \n        // Too many thumbnails can cause the AOS calculations to be off\n        // so refresh that when the slider is ready\n        if (AOS) {\n          AOS.refresh();\n        }\n      },\n  \n      destroyImageCarousels: function() {\n        if (this.$mainSlider && this.settings.slickMainInitialized) {\n          this.$mainSlider.slick('unslick');\n          this.settings.slickMainInitialized = false;\n        }\n  \n        if (this.$thumbSlider && this.settings.slickThumbInitialized) {\n          this.$thumbSlider.slick('unslick');\n          this.settings.slickThumbInitialized = false;\n        }\n  \n        this.settings.slickMainInitialized = false;\n        this.settings.slickThumbInitialized = false;\n      },\n  \n      mainSlideInit: function(event, slick) {\n        var $slider = slick.$slider;\n        var $currentSlide = $slider.find(selectors.currentSlide);\n        var $video = $currentSlide.find(selectors.productVideo);\n  \n        this.settings.slickMainInitialized = true;\n  \n        if (!$video.length) {\n          return;\n        }\n  \n        this.initVideo($video);\n      },\n  \n      thumbSlideInit: function(event, slick) {\n        this.settings.slickThumbInitialized = true;\n      },\n  \n      initVideo: function($video) {\n        var videoType = $video.data('video-type');\n        var divId = $video.attr('id');\n  \n        if (videoType === 'mp4' && videos[divId].style === 'muted') {\n          this.playMp4Video(divId);\n        }\n  \n        if (videoType === 'youtube') {\n          if (youtubeReady && videos[divId].style === 'muted') {\n            this.requestToPlayYoutubeVideo(divId);\n          }\n        }\n  \n        if (videoType === 'vimeo') {\n          if (vimeoReady) {\n            this.playOrShowVimeo(divId);\n          } else {\n            $('body').on('vimeoReady' + this.settings.namespace, function() {\n              this.playOrShowVimeo(divId);\n            }.bind(this))\n          }\n        }\n  \n        // Hacky way to trigger resetting the slider layout in modals\n        if (this.inModal) {\n          this.resizeSlides();\n        }\n      },\n  \n      stopVideo: function(id, type) {\n        if (!id) {\n          this.stopYoutubeVideo();\n          this.stopVimeoVideo();\n          this.stopMp4Video();\n        }\n  \n        if (type === 'youtube') {\n          this.stopYoutubeVideo(id);\n        }\n  \n        if (type === 'mp4') {\n          this.stopMp4Video(id);\n        }\n  \n        if (type === 'vimeo') {\n          this.stopVimeoVideo(id);\n        }\n      },\n  \n      playOrShowVimeo: function(id) {\n        if (videos[id] && videos[id].style === 'muted') {\n          this.autoplayVimeoVideo(id);\n        } else if (videos[id] && videos[id].style === 'unmuted') {\n          setParentAsLoaded($('#' + id));\n        }\n      },\n  \n      getVideoType: function($video) {\n        return $video.data('video-type');\n      },\n  \n      getVideoId: function($video) {\n        return $video.attr('id');\n      },\n  \n      beforeSlideChange: function(event, slick, currentSlide, nextSlide) {\n        var $slider = slick.$slider;\n        var $currentSlide = $slider.find(selectors.currentSlide);\n        var $prevVideo = $currentSlide.find('.product__video');\n        var $nextSlide = $slider.find('.slick-slide[data-slick-index=\"' + nextSlide + '\"]');\n        var $nextVideo = $nextSlide.find('.product__video');\n  \n        // Pause any existing slide video\n        if (currentSlide !== nextSlide && $prevVideo.length) {\n          var prevVideoType = this.getVideoType($prevVideo);\n          var prevVideoId = this.getVideoId($prevVideo);\n  \n          if (prevVideoId) {\n            this.stopVideo(prevVideoId, prevVideoType);\n          }\n        }\n  \n        // Prep next slide video\n        if ($nextVideo.length) {\n          var nextVideoType = this.getVideoType($nextVideo);\n          var nextVideoId = this.getVideoId($nextVideo);\n  \n          // Prep Vimeo with a backup in case the API isn't ready\n          if (nextVideoId && nextVideoType === 'vimeo') {\n            if (vimeoReady) {\n              if (videos[nextVideoId] && videos[nextVideoId].style === 'muted') {\n                this.autoplayVimeoVideo(nextVideoId);\n              }\n            } else {\n              $('body').on('vimeoReady' + this.settings.namespace, function() {\n                if (videos[nextVideoId] && videos[nextVideoId].style === 'muted') {\n                  this.autoplayVimeoVideo(nextVideoId);\n                }\n              }.bind(this))\n            }\n          }\n  \n          // Prep YouTube with a backup in case API isn't ready\n          if (nextVideoId && nextVideoType === 'youtube') {\n            if (youtubeReady) {\n              if (videos[nextVideoId] && videos[nextVideoId].style === 'muted') {\n                this.requestToPlayYoutubeVideo(nextVideoId, true);\n              }\n            } else {\n              $('body').on('youTubeReady' + this.settings.namespace, function() {\n                if (videos[nextVideoId] && videos[nextVideoId].style === 'muted') {\n                  this.requestToPlayYoutubeVideo(nextVideoId, true);\n                }\n              }.bind(this))\n            }\n          }\n  \n          // Autoplay muted MP4 videos\n          if (nextVideoId && videos[nextVideoId] && videos[nextVideoId].style === 'muted') {\n            if (nextVideoType === 'mp4') {\n              this.playMp4Video(nextVideoId);\n            }\n          }\n  \n          // Set unmuted videos to loaded state\n          if (nextVideoId && videos[nextVideoId] && videos[nextVideoId].style != 'muted') {\n            setParentAsLoaded($('#' + nextVideoId));\n          }\n        }\n      },\n  \n      resizeSlides: function() {\n        if (!this.settings.hasMultipleImages) {\n          return;\n        }\n  \n        $(window).trigger('resize.slick');\n        setTimeout(function() {\n          if (this.$mainSlider && this.settings.slickMainInitialized) {\n            this.$mainSlider.slick('setPosition');\n          }\n          if (this.$thumbSlider && this.settings.slickThumbInitialized) {\n            this.$thumbSlider.slick('setPosition');\n          }\n        }.bind(this), 500); // same timing as modal open transition\n      },\n  \n      _slideIndex: function($el) {\n        return $el.data('index');\n      },\n  \n      initQtySelector: function() {\n        this.$container.find('.js-qty__wrapper').each(function() {\n          new theme.QtySelector($(this), {\n            namespace: '.product'\n          });\n        });\n      },\n  \n      initAjaxProductForm: function() {\n        if (theme.settings.cartType === 'drawer') {\n          new theme.AjaxProduct($(this.selectors.formContainer));\n        }\n      },\n  \n      openModalProduct: function() {\n        if (!this.settings.modalInit) {\n          var $formHolder = $(this.selectors.modalFormHolder);\n          var url = $formHolder.data('url');\n          url = url + '?view=ajax';\n  \n          $formHolder.load(url + ' #AddToCartForm-' + this.sectionId, function() {\n            this.formSetup();\n            if (Shopify.PaymentButton) {\n              Shopify.PaymentButton.init();\n            }\n          }.bind(this));\n  \n          this.productSetup();\n          this.loadModalContent();\n          this.createImageCarousels();\n          this.settings.modalInit = true;\n        }\n  \n        this.resizeSlides();\n      },\n  \n      closeModalProduct: function() {\n        this.stopVideo();\n        $('body').off(this.settings.namespace);\n        $(window).off(this.settings.namespace);\n      },\n  \n      loadModalContent: function() {\n        // Load videos if they exist\n        var videoTypes = this.checkIfVideos();\n  \n        // Lazyload mp4 videos similar to images\n        if (videoTypes && videoTypes.indexOf('mp4') > -1) {\n          this.$modal.find('.product__video[data-video-type=\"mp4\"]').each(function(i, video) {\n            var $el = $(video);\n            var src = $el.data('video-src');\n            var source = document.createElement('source');\n            source.setAttribute('src', src);\n            $el.append(source);\n          }.bind(this));\n        }\n      },\n  \n      onUnload: function() {\n        this.$container.off(this.settings.namespace);\n        $('body').off(this.settings.namespace);\n        this.destroyImageCarousels();\n      }\n    });\n  \n    return Product;\n  })();\n  \n  theme.Recommendations = (function() {\n  \n    function Recommendations(container) {\n      var $container = this.$container = $(container);\n      var sectionId = this.sectionId = $container.attr('data-section-id');\n  \n      this.selectors = {\n        recommendations: '#Recommendations-' + sectionId,\n        placeholder: '.product-recommendations-placeholder',\n        sectionClass: ' .product-recommendations',\n        productResults: '.grid-product'\n      };\n  \n      this.init();\n    }\n  \n    Recommendations.prototype = $.extend({}, Recommendations.prototype, {\n      init: function() {\n        var $section = $(this.selectors.recommendations);\n  \n        if (!$section.length || $section.data('enable') === false) {\n          return;\n        }\n  \n        var $placeholder = $section.find(this.selectors.placeholder);\n        var id = $section.data('product-id');\n        var limit = $section.data('limit');\n  \n        var url = '/recommendations/products?section_id=product-recommendations&limit='+ limit +'&product_id=' + id;\n  \n        $placeholder.load(url + this.selectors.sectionClass, function(data) {\n          theme.reinitProductGridItem($section);\n          this.updateVariantInventory($section);\n  \n          // If no results, hide the entire section\n          if ($(data).find(this.selectors.sectionClass).find(this.selectors.productResults).length === 0) {\n            $section.addClass('hide');\n          }\n        }.bind(this));\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      updateVariantInventory: function($section) {\n        window.inventories = window.inventories || {};\n  \n        $section.find('.product__inventory-data').each(function() {\n          var $el = $(this);\n          var sectionId = $el.data('section-id');\n          window.inventories[sectionId] = {};\n          $.each($el.data(), function(variant, qty) {\n            window.inventories[sectionId][variant] = qty;\n          })\n        });\n      }\n    });\n  \n    return Recommendations;\n  })();\n  \n  theme.Collection = (function() {\n    var isAnimating = false;\n  \n    var classes = {\n      tags: '.tags',\n      activeTag: 'tag--active'\n    };\n  \n    function Collection(container) {\n      this.container = container;\n      this.sectionId = $(container).attr('data-section-id');\n      this.namespace = '.collection-' + this.sectionId;\n  \n      var $heroImageContainer = $(container).find('.collection-hero');\n      if ($heroImageContainer.length) {\n        theme.loadImageSection($heroImageContainer);\n      }\n  \n      // Ajax pagination\n      $(window).on('popstate', function(state) {\n        if (state) {\n          this.getNewCollectionContent(location.href);\n        }\n      }.bind(this));\n  \n      this.init();\n    }\n  \n    Collection.prototype = $.extend({}, Collection.prototype, {\n      init: function() {\n        // init is called on load and when tags are selected\n        this.$container = $(this.container);\n        this.sectionId = this.$container.attr('data-section-id');\n  \n        this.sortBy();\n        this.sortTags();\n        this.initTagAjax();\n      },\n  \n      initTagAjax: function() {\n        this.$container.on('click' + this.namespace, '.tags a', function(evt) {\n          var $el = $(evt.currentTarget);\n          if ($el.hasClass('no-ajax')) {\n            return;\n          }\n  \n          evt.preventDefault();\n  \n          if (isAnimating) {\n            return;\n          }\n  \n          isAnimating = true;\n  \n          var newUrl = $el.attr('href');\n          $(classes.tags).find('.' + classes.activeTag).removeClass(classes.activeTag);\n          $el.parent().addClass(classes.activeTag);\n          history.pushState({}, '', newUrl);\n          $('.grid-product').addClass('unload');\n          this.getNewCollectionContent(newUrl);\n        }.bind(this));\n      },\n  \n      getNewCollectionContent: function(url) {\n        url = url + '?view=ajax';\n        $('#CollectionAjaxResult').load(url + ' #CollectionAjaxContent', function() {\n          isAnimating = false;\n          this.reInit();\n        }.bind(this));\n      },\n  \n      sortBy: function() {\n        var $sortBy = $('#SortBy');\n  \n        if (!$sortBy.length) {\n          return;\n        }\n  \n        $sortBy.on('change', function() {\n          location.href = '?sort_by=' + $(this).val();\n        });\n      },\n  \n      sortTags: function() {\n        var $sortTags = $('#SortTags');\n  \n        if (!$sortTags.length) {\n          return;\n        }\n  \n        $sortTags.on('change', function() {\n          location.href = $(this).val();\n        });\n      },\n  \n      reInit: function() {\n        // Reload collection template (it can be anywhere in the sections.instance array)\n        for (var i = 0; i < sections.instances.length; i++) {\n          var instance = sections.instances[i];\n          if (instance['type'] === 'collection-template') {\n            instance.forceReload();\n          }\n        }\n  \n        theme.reinitProductGridItem();\n      },\n  \n      forceReload: function() {\n        this.onUnload();\n        this.init();\n      },\n  \n      onUnload: function() {\n        $(window).off(this.namespace);\n        this.$container.off(this.namespace);\n      }\n  \n    });\n  \n    return Collection;\n  })();\n  \n  theme.HeaderSection = (function() {\n  \n    var selectors = {\n      drawer: '#NavDrawer',\n      mobileSubNavToggle: '.mobile-nav__toggle-btn',\n      hasSublist: '.mobile-nav__has-sublist'\n    };\n  \n    var classes = {\n      navExpanded: 'mobile-nav--expanded'\n    };\n  \n    function Header(container) {\n      var $container = this.$container = $(container);\n      var sectionId = this.sectionId = $container.attr('data-section-id');\n  \n      // Reload any slideshow if when the header is reloaded to make sure the\n      // sticky header works as expected (it can be anywhere in the sections.instance array)\n      for (var i = 0; i < sections.instances.length; i++) {\n        var instance = sections.instances[i];\n        if (instance['type'] === 'slideshow-section') {\n          instance.forceReload();\n        }\n      }\n  \n      theme.currencySwitcher.init()\n      this.initDrawers();\n      theme.headerNav.init();\n      theme.announcementBar.init();\n    }\n  \n    Header.prototype = $.extend({}, Header.prototype, {\n      initDrawers: function() {\n        theme.NavDrawer = new theme.Drawers('NavDrawer', 'nav');\n        if (theme.settings.cartType === 'drawer') {\n          new theme.CartDrawer();\n        }\n  \n        this.drawerMenuButtons();\n      },\n  \n      drawerMenuButtons: function() {\n        $(selectors.drawer).find('.js-drawer-close').on('click', function(evt){\n          evt.preventDefault();\n          theme.NavDrawer.close();\n        });\n  \n        var $mobileSubNavToggle = $(selectors.mobileSubNavToggle);\n  \n        $mobileSubNavToggle.attr('aria-expanded', 'false');\n        $mobileSubNavToggle.each(function (i, el) {\n          var $el = $(el);\n          $el.attr('aria-controls', $el.attr('data-aria-controls'));\n        });\n  \n        $mobileSubNavToggle.on('click', function() {\n          var $el = $(this);\n          var currentlyExpanded = $el.attr('aria-expanded');\n          var toggleState = false;\n  \n          // Updated aria-expanded value based on state pre-click\n          if (currentlyExpanded === 'true') {\n            $el.attr('aria-expanded', 'false');\n          } else {\n            $el.attr('aria-expanded', 'true');\n            toggleState = true;\n          }\n  \n          // Toggle class that expands/collapses sublist\n          $el.closest(selectors.hasSublist).toggleClass(classes.navExpanded, toggleState);\n        });\n      },\n  \n      onUnload: function() {\n        theme.NavDrawer.close();\n        theme.headerNav.unload();\n        theme.announcementBar.unload();\n      }\n    });\n  \n    return Header;\n  \n  })();\n  \n  theme.FeaturedContentSection = (function() {\n  \n    function FeaturedContent() {\n      $('.rte').find('a:not(:has(img))').addClass('text-link');\n    }\n  \n    return FeaturedContent;\n  })();\n  \n  theme.slideshows = {};\n  \n  theme.SlideshowSection = (function() {\n  \n    function SlideshowSection(container) {\n      var $container = this.$container = $(container);\n      var $section = $container.parent();\n      var sectionId = $container.attr('data-section-id');\n      var slideshow = this.slideshow = '#Slideshow-' + sectionId;\n  \n      var $imageContainer = $(container).find('.hero');\n      if ($imageContainer.length) {\n        theme.loadImageSection($imageContainer);\n      }\n  \n      this.init();\n    }\n  \n    SlideshowSection.prototype = $.extend({}, SlideshowSection.prototype, {\n      init: function() {\n        var args = {\n          arrows: $(this.slideshow).data('arrows'),\n          dots: $(this.slideshow).data('dots')\n        };\n  \n        theme.slideshows[this.slideshow] = new theme.Slideshow(this.slideshow, args);\n      },\n  \n      forceReload: function() {\n        this.onUnload();\n        this.init();\n      },\n  \n      onUnload: function() {\n        theme.slideshows[this.slideshow].destroy();\n        delete theme.slideshows[this.slideshow];\n      },\n  \n      onSelect: function() {\n        $(this.slideshow).slick('slickPause');\n      },\n  \n      onDeselect: function() {\n        $(this.slideshow).slick('slickPlay');\n      },\n  \n      onBlockSelect: function(evt) {\n        var $slideshow = $(this.slideshow);\n  \n        // Ignore the cloned version\n        var $slide = $('.slideshow__slide--' + evt.detail.blockId + ':not(.slick-cloned)');\n        var slideIndex = $slide.data('slick-index');\n  \n        // Go to selected slide, pause autoplay\n        $slideshow.slick('slickGoTo', slideIndex).slick('slickPause');\n      },\n  \n      onBlockDeselect: function() {\n        $(this.slideshow).slick('slickPlay');\n      }\n    });\n  \n    return SlideshowSection;\n  })();\n  \n  theme.VideoSection = (function() {\n    var youtubeReady;\n    var videos = [];\n    var youtubePlayers = [];\n    var youtubeVideoOptions = {\n      width: 1280,\n      height: 720,\n      playerVars: {\n        autohide: 0,\n        branding: 0,\n        cc_load_policy: 0,\n        controls: 0,\n        fs: 0,\n        iv_load_policy: 3,\n        modestbranding: 1,\n        playsinline: 1,\n        quality: 'hd720',\n        rel: 0,\n        showinfo: 0,\n        wmode: 'opaque'\n      },\n      events: {\n        onReady: onVideoPlayerReady,\n        onStateChange: onVideoStateChange\n      }\n    };\n  \n    var vimeoReady = false;\n    var vimeoVideoOptions = {\n      byline: false,\n      title: false,\n      portrait: false,\n      loop: true\n    };\n  \n    var selectors = {\n      videoParent: '.video-parent-section'\n    };\n  \n    var classes = {\n      loading: 'loading',\n      loaded: 'loaded',\n      interactable: 'video-interactable'\n    };\n  \n    function videoSection(container) {\n      var $container = this.$container = $(container);\n      var sectionId = this.sectionId = $container.attr('data-section-id');\n      var youtubePlayerId = this.youtubePlayerId = 'YouTubeVideo-' + this.sectionId;\n      this.namespace = '.' + youtubePlayerId;\n      var vimeoPlayerId = this.vimeoPlayerId = 'Vimeo-' + this.sectionId;\n      var $vimeoTrigger = this.$vimeoTrigger = $('#VimeoTrigger-' + this.sectionId);\n      var mp4Video = 'Mp4Video-' + this.sectionId;\n  \n      var $youtubeDiv = $('#' + youtubePlayerId);\n      var $vimeoDiv = $('#' + vimeoPlayerId);\n      var $mp4Div = $('#' + mp4Video);\n  \n      this.vimeoPlayer = [];\n  \n      if ($youtubeDiv.length) {\n        this.youtubeVideoId = $youtubeDiv.data('video-id');\n        this.initYoutubeVideo();\n      }\n  \n      if ($vimeoDiv.length) {\n        this.vimeoVideoId = $vimeoDiv.data('video-id');\n        this.initVimeoVideo();\n      }\n  \n      if ($mp4Div.length) {\n        setParentAsLoaded($mp4Div);\n  \n        startMp4Playback(mp4Video).then(function() {\n          // Video played as expected, don't do anything\n        }).catch(function(error) {\n          // Video cannot be played with autoplay, so let\n          // user interact with video element itself\n          setVideoToBeInteractedWith($mp4Div);\n        })\n      }\n    }\n  \n    function startMp4Playback(mp4Video) {\n      return document.querySelector('#' + mp4Video).play();\n    }\n  \n    function onVideoPlayerReady(evt) {\n      var $player = $(evt.target.a);\n      var playerId = $player.attr('id');\n      youtubePlayers[playerId] = evt.target; // update stored player\n      var player = youtubePlayers[playerId];\n  \n      setParentAsLoading($player);\n  \n      youtubePlayers[playerId].mute();\n  \n      // Remove from tabindex because YouTube iframes are annoying and you can focus\n      // on the YouTube logo and it breaks\n      $player.attr('tabindex', '-1');\n  \n      // Add out of view pausing\n      videoVisibilityCheck(playerId);\n      $(window).on('scroll.' + playerId, {id: playerId}, $.throttle(150, videoVisibilityCheck));\n    }\n  \n    function videoVisibilityCheck(id) {\n      var playerId;\n  \n      if (typeof id === 'string') {\n        playerId = id;\n      } else {\n        // Data comes in as part of the scroll event\n        playerId = id.data.id;\n      }\n  \n      if (theme.isElementVisible($('#' + playerId))) {\n        playVisibleVideo(playerId);\n      } else {\n        pauseHiddenVideo(playerId);\n      }\n    }\n  \n    function playVisibleVideo(id) {\n      if (youtubePlayers[id] && typeof youtubePlayers[id].playVideo === 'function') {\n        youtubePlayers[id].playVideo();\n      }\n    }\n  \n    function pauseHiddenVideo(id) {\n      if (youtubePlayers[id] && typeof youtubePlayers[id].pauseVideo === 'function') {\n        youtubePlayers[id].pauseVideo();\n      }\n    }\n  \n    function onVideoStateChange(evt) {\n      var $player = $(evt.target.a);\n      var playerId = $player.attr('id');\n      var player = youtubePlayers[playerId];\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 (videos[playerId].attemptedToPlay) {\n            setParentAsLoaded($player);\n            setVideoToBeInteractedWith($player);\n          }\n          break;\n        case 0: // ended\n          player.playVideo();\n          break;\n        case 1: // playing\n          setParentAsLoaded($player);\n          break;\n        case 3: // buffering\n          videos[playerId].attemptedToPlay = true;\n          break;\n      }\n    }\n  \n    function setParentAsLoading($el) {\n      $el\n        .closest(selectors.videoParent)\n        .addClass(classes.loading);\n    }\n  \n    function setParentAsLoaded($el) {\n      $el\n        .closest(selectors.videoParent)\n        .removeClass(classes.loading)\n        .addClass(classes.loaded);\n    }\n  \n    function setVideoToBeInteractedWith($el) {\n      $el\n        .closest(selectors.videoParent)\n        .addClass(classes.interactable);\n    }\n  \n    videoSection.prototype = $.extend({}, videoSection.prototype, {\n      initYoutubeVideo: function() {\n        videos[this.youtubePlayerId] = {\n          id: this.youtubePlayerId,\n          videoId: this.youtubeVideoId,\n          type: 'youtube',\n          attemptedToPlay: false\n        };\n  \n        if (!youtubeReady) {\n          window.loadYouTube();\n          $('body').on('youTubeReady' + this.namespace, this.loadYoutubeVideo.bind(this));\n        } else {\n          this.loadYoutubeVideo();\n        }\n      },\n  \n      loadYoutubeVideo: function() {\n        var args = $.extend({}, youtubeVideoOptions, videos[this.youtubePlayerId]);\n        args.playerVars.controls = 0;\n        youtubePlayers[this.youtubePlayerId] = new YT.Player(this.youtubePlayerId, args);\n  \n        youtubeReady = true;\n      },\n  \n      initVimeoVideo: function() {\n        videos[this.vimeoPlayerId] = {\n          divId: this.vimeoPlayerId,\n          id: this.vimeoVideoId,\n          type: 'vimeo'\n        };\n  \n        var $player = $('#' + this.vimeoPlayerId);\n        setParentAsLoading($player);\n  \n        // Button to play video on mobile\n        this.$vimeoTrigger.on('click', + this.namespace, function(evt) {\n          // $(evt.currentTarget).addClass('hide');\n          this.requestToPlayVimeoVideo(this.vimeoPlayerId);\n        }.bind(this));\n  \n        if (!vimeoReady) {\n          window.loadVimeo();\n          $('body').on('vimeoReady' + this.namespace, this.loadVimeoVideo.bind(this));\n        } else {\n          this.loadVimeoVideo();\n        }\n      },\n  \n      loadVimeoVideo: function() {\n        var args = $.extend({}, vimeoVideoOptions, videos[this.vimeoPlayerId]);\n        this.vimeoPlayer[this.vimeoPlayerId] = new Vimeo.Player(videos[this.vimeoPlayerId].divId, args);\n  \n        vimeoReady = true;\n  \n        // Only autoplay on larger screens\n        if (!theme.config.bpSmall) {\n          this.requestToPlayVimeoVideo(this.vimeoPlayerId);\n        } else {\n          var $player = $('#' + this.vimeoPlayerId);\n          setParentAsLoaded($player);\n        }\n      },\n  \n      requestToPlayVimeoVideo: function(id) {\n        // The slider may initialize and attempt to play the video before\n        // the API is even ready, because it sucks.\n  \n        if (!vimeoReady) {\n          // Wait for the trigger, then play it\n          $('body').on('vimeoReady' + this.namespace, function() {\n            this.playVimeoVideo(id);\n          }.bind(this))\n          return;\n        }\n  \n        this.playVimeoVideo(id);\n      },\n  \n      playVimeoVideo: function(id) {\n        this.vimeoPlayer[id].play();\n        this.vimeoPlayer[id].setVolume(0);\n  \n        var $player = $('#' + id);\n        setParentAsLoaded($player);\n      },\n  \n      onUnload: function(evt) {\n        var sectionId = evt.target.id.replace('shopify-section-', '');\n        var playerId = 'YouTubeVideo-' + sectionId;\n        youtubePlayers[playerId].destroy();\n        $(window).off('scroll' + this.namespace);\n        $('body').off('vimeoReady' + this.namespace);\n      }\n    });\n  \n    return videoSection;\n  })();\n  \n  theme.Testimonials = (function() {\n    var slideCount = 0;\n    var defaults = {\n      accessibility: true,\n      arrows: false,\n      dots: true,\n      autoplay: false,\n      touchThreshold: 20,\n      slidesToShow: 3,\n      slidesToScroll: 3\n    };\n  \n    function Testimonials(container) {\n      var $container = this.$container = $(container);\n      var sectionId = $container.attr('data-section-id');\n      var wrapper = this.wrapper = '.testimonials-wrapper';\n      var slider = this.slider = '#Testimonials-' + sectionId;\n      var $slider = $(slider);\n  \n      this.sliderActive = false;\n      var mobileOptions = $.extend({}, defaults, {\n        slidesToShow: 1,\n        slidesToScroll: 1,\n        adaptiveHeight: true\n      });\n  \n      slideCount = $slider.data('count');\n  \n      // Override slidesToShow/Scroll if there are not enough blocks\n      if (slideCount < defaults.slidesToShow) {\n        defaults.slidesToShow = slideCount;\n        defaults.slidesToScroll = slideCount;\n      }\n  \n      $slider.on('init', this.a11y.bind(this));\n  \n      if (theme.config.bpSmall) {\n        this.init($slider, mobileOptions);\n      } else {\n        this.init($slider, defaults);\n      }\n  \n      $('body').on('matchSmall', function() {\n        this.init($slider, mobileOptions);\n      }.bind(this));\n  \n      $('body').on('matchLarge', function() {\n        this.init($slider, defaults);\n      }.bind(this));\n    }\n  \n    Testimonials.prototype = $.extend({}, Testimonials.prototype, {\n      onUnload: function() {\n        $(this.slider, this.wrapper).slick('unslick');\n      },\n  \n      onBlockSelect: function(evt) {\n        // Ignore the cloned version\n        var $slide = $('.testimonials-slide--' + evt.detail.blockId + ':not(.slick-cloned)');\n        var slideIndex = $slide.data('slick-index');\n  \n        // Go to selected slide, pause autoplay\n        $(this.slider, this.wrapper).slick('slickGoTo', slideIndex);\n      },\n  \n      init: function(obj, args) {\n        if (this.sliderActive) {\n          obj.slick('unslick');\n          this.sliderActive = false;\n        }\n  \n        obj.slick(args);\n        this.sliderActive = true;\n  \n        if (AOS) {\n          AOS.refresh();\n        }\n      },\n  \n      a11y: function(event, obj) {\n        var $list = obj.$list;\n        var $wrapper = $(this.wrapper, this.$container);\n  \n        // Remove default Slick aria-live attr until slider is focused\n        $list.removeAttr('aria-live');\n  \n        // When an element in the slider is focused set aria-live\n        $wrapper.on('focusin', function(evt) {\n          if ($wrapper.has(evt.target).length) {\n            $list.attr('aria-live', 'polite');\n          }\n        });\n  \n        // Remove aria-live\n        $wrapper.on('focusout', function(evt) {\n          if ($wrapper.has(evt.target).length) {\n            $list.removeAttr('aria-live');\n          }\n        });\n      }\n    });\n  \n    return Testimonials;\n  })();\n  \n  theme.Instagram = (function() {\n    var isInit = false;\n  \n    function Instagram(container) {\n      var $container = this.$container = $(container);\n      var sectionId = $container.attr('data-section-id');\n      this.namespace = '.instagram-' + sectionId;\n      this.$target = $('#Instafeed-' + sectionId);\n  \n      if (!this.$target.length) {\n        return;\n      }\n  \n      this.checkVisibility();\n      $(window).on('scroll' + this.namespace, $.throttle(100, this.checkVisibility.bind(this)));\n    }\n  \n    Instagram.prototype = $.extend({}, Instagram.prototype, {\n      checkVisibility: function() {\n        if (isInit) {\n          $(window).off('scroll' + this.namespace);\n          return;\n        }\n  \n        if (theme.isElementVisible(this.$container)) {\n          this.init();\n        }\n      },\n  \n      init: function() {\n        isInit = true;\n  \n        var userId = this.$target.data('user-id');\n        var clientId = this.$target.data('client-id');\n        var count = parseInt(this.$target.data('count'));\n  \n        // Ask for 2 more images than we'll actually show because\n        // Instagram sometimes doesn't send enough\n        var feed = this.feed = new Instafeed({\n          target: this.$target[0],\n          accessToken: clientId,\n          get: 'user',\n          userId: userId,\n          limit: count + 2,\n          template: '<div class=\"grid__item small--one-half medium-up--one-fifth\"><div class=\"image-wrap\"><a href=\"{{link}}\" target=\"_blank\" style=\"background-image: url({{image}}); display: block; padding-bottom: 100%; background-size: cover; background-position: center;\"></a></div></div>',\n          resolution: 'standard_resolution'\n        });\n  \n        feed.run();\n  \n        this.$target.addClass('instagram-holder--active');\n      }\n    });\n  \n    return Instagram;\n  })();\n  \n  \n  theme.NewsletterPopup = (function() {\n    function NewsletterPopup(container) {\n      var $container = this.$container = $(container);\n      var sectionId = $container.attr('data-section-id');\n      this.cookieName = 'newsletter-' + sectionId;\n  \n      if (!$container.length) {\n        return;\n      }\n  \n      // Prevent popup on Shopify robot challenge page\n      if (window.location.pathname === '/challenge') {\n        return;\n      }\n  \n      this.data = {\n        secondsBeforeShow: $container.data('delay-seconds'),\n        daysBeforeReappear: $container.data('delay-days'),\n        cookie: Cookies.get(this.cookieName),\n        testMode: $container.data('test-mode')\n      };\n  \n      this.modal = new theme.Modals('NewsletterPopup-' + sectionId, 'newsletter-popup-modal');\n  \n      // Open modal if errors or success message exist\n      if ($container.find('.errors').length || $container.find('.note--success').length) {\n        this.modal.open();\n      }\n  \n      // Set cookie as opened if success message\n      if ($container.find('.note--success').length) {\n        this.closePopup(true);\n        return;\n      }\n  \n      $('body').on('modalClose.' + $container.attr('id'), this.closePopup.bind(this));\n  \n      if (!this.data.cookie || this.data.testMode) {\n        this.initPopupDelay();\n      }\n    }\n  \n    NewsletterPopup.prototype = $.extend({}, NewsletterPopup.prototype, {\n      initPopupDelay: function() {\n        setTimeout(function() {\n          this.modal.open();\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) {\n          Cookies.remove(this.cookieName, { path: '/' });\n          return;\n        }\n  \n        var expiry = success ? 200 : this.data.daysBeforeReappear;\n  \n        Cookies.set(this.cookieName, 'opened', { path: '/', expires: expiry });\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      onUnload: function() {}\n    });\n  \n    return NewsletterPopup;\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      var $container = this.$container = $(container);\n      var sectionId = $container.attr('data-section-id');\n      var namespace = this.namespace = '.fading-images-' + sectionId;\n  \n      if (!$container.length) {\n        return;\n      }\n  \n      var $imageContainer = $container.find('.fading-images');\n      theme.loadImageSection($imageContainer);\n  \n      this.data = {\n        isInit: false,\n        interval: $container.data('interval'),\n        block_count: $container.data('count'),\n        finish_interval: 1000,\n        timer_offset: 400,\n        active_image: 1,\n        active_title: 1,\n        removed_compensation: false\n      };\n  \n      this.selectors = {\n        $allTitles: $container.find('.fading-images-overlay__titles')\n      };\n  \n      this.checkVisibility();\n      $(window).on('scroll' + this.namespace, $.throttle(100, this.checkVisibility.bind(this)));\n    }\n  \n    FadingImages.prototype = $.extend({}, FadingImages.prototype, {\n      checkVisibility: function() {\n        if (this.data.isInit) {\n          $(window).off('scroll' + this.namespace);\n          return;\n        }\n  \n        if (theme.isElementVisible(this.$container)) {\n          this.startImages();\n          this.startTitles();\n          this.data.isInit = true;\n        }\n      },\n  \n      nextImage: function() {\n        var $container = this.$container;\n  \n        if (!this.data.removed_compensation) {\n          $container.find('.fading-images__item[data-slide-index=' + this.data.active_image + ']').removeClass(classes.compensation);\n          this.data.removed_compensation = true;\n        }\n  \n        $container\n          .find('.fading-images__item[data-slide-index=' + this.data.active_image + ']')\n          .removeClass(classes.activeImage)\n          .addClass(classes.finishedImage);\n  \n        var target_image = this.data.active_image;\n        window.setTimeout(function() {\n          $container.find('.fading-images__item[data-slide-index=' + target_image + ']').removeClass(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        $container.find('.fading-images__item[data-slide-index=' + this.data.active_image + ']').addClass(classes.activeImage);\n      },\n  \n      nextTitle: function() {\n        var $container = this.$container;\n        var $allTitles = this.selectors.$allTitles;\n  \n        this.selectors.$allTitles.removeClass(classes.activeTitles).addClass(classes.finishedTitles);\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 newText1 = $container.find('.fading-images__item[data-slide-index=' + target_title + ']').attr('data-slide-title1');\n          var newText2 = $container.find('.fading-images__item[data-slide-index=' + target_title + ']').attr('data-slide-title2');\n          $container.find('.fading-images-overlay__title--1').text(newText1);\n          $container.find('.fading-images-overlay__title--2').text(newText2);\n          $allTitles.removeClass(classes.finishedTitles).addClass(classes.activeTitles);\n        }, this.data.finish_interval - 200);\n      },\n  \n      startImages: function() {\n        // Prep and show first image\n        this.$container.find('.fading-images__item[data-slide-index=' + this.data.active_image + ']').addClass(classes.activeImage).addClass(classes.compensation);\n  \n        // Begin timer\n        var o = this;\n        window.setTimeout(function() {\n          var fading_images_timer = window.setInterval(o.nextImage.bind(o), o.data.interval);\n        }, this.data.timer_offset);\n      },\n  \n      startTitles: function() {\n        var $container = this.$container;\n        var $allTitles = this.selectors.$allTitles;\n        // Prep and show first titles\n        var target_title = this.data.active_title;\n        window.setTimeout(function() {\n          var newText1 = $container.find('.fading-images__item[data-slide-index=' + target_title + ']').attr('data-slide-title1');\n          var newText2 = $container.find('.fading-images__item[data-slide-index=' + target_title + ']').attr('data-slide-title2');\n          $container.find('.fading-images-overlay__title--1').text(newText1);\n          $container.find('.fading-images-overlay__title--2').text(newText2);\n          $allTitles.addClass(classes.activeTitles);\n        }, 750);\n  \n        // Begin timer\n        var fading_titles_timer = window.setInterval(this.nextTitle.bind(this), this.data.interval);\n      },\n  \n      onLoad: function() {\n      },\n  \n      onSelect: function() {\n      },\n  \n      onDeselect: function() {\n      },\n  \n      onUnload: function() {\n      }\n    });\n  \n    return FadingImages;\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      addressNoResults: theme.strings.addressNoResults,\n      addressQueryLimit: theme.strings.addressQueryLimit,\n      addressError: theme.strings.addressError,\n      authError: theme.strings.authError\n    };\n  \n    var selectors = {\n      section: '[data-section-type=\"map\"]',\n      map: '[data-map]',\n      mapOverlay: '[data-map-overlay]'\n    };\n  \n    var classes = {\n      mapError: 'map-section--load-error',\n      errorMsg: 'map-section__error errors text-center'\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      $(selectors.section).addClass(classes.mapError);\n      $(selectors.map).remove();\n      $(selectors.mapOverlay).after(\n        '<div class=\"' +\n          classes.errorMsg +\n          '\">' +\n          theme.strings.authError +\n          '</div>'\n      );\n    };\n  \n    function Map(container) {\n      this.$container = $(container);\n      this.sectionId = this.$container.attr('data-section-id');\n      this.namespace = '.map-' + this.sectionId;\n      this.$map = this.$container.find(selectors.map);\n      this.key = this.$map.data('api-key');\n  \n      if (!this.key) {\n        return;\n      }\n  \n      // Lazyload API\n      this.checkVisibility();\n      $(window).on('scroll' + this.namespace, $.throttle(50, this.checkVisibility.bind(this)));\n    }\n  \n    function initAllMaps() {\n      // API has loaded, load all Map instances in queue\n      $.each(mapsToLoad, function(index, instance) {\n        instance.createMap();\n      });\n    }\n  \n    function geolocate($map) {\n      var deferred = $.Deferred();\n      var geocoder = new google.maps.Geocoder();\n      var address = $map.data('address-setting');\n  \n      geocoder.geocode({ address: address }, function(results, status) {\n        if (status !== google.maps.GeocoderStatus.OK) {\n          deferred.reject(status);\n        }\n  \n        deferred.resolve(results);\n      });\n  \n      return deferred;\n    }\n  \n    Map.prototype = $.extend({}, 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              $.getScript(\n                'https://maps.googleapis.com/maps/api/js?key=' + this.key\n              ).then(function() {\n                apiStatus = 'loaded';\n                initAllMaps();\n              });\n            }\n          }\n        }\n      },\n  \n      createMap: function() {\n        var $map = this.$map;\n  \n        return geolocate($map)\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($map[0], 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                $.debounce(250, function() {\n                  google.maps.event.trigger(map, 'resize');\n                  map.setCenter(center);\n                  $map.removeAttr('style');\n                })\n              );\n            }.bind(this)\n          )\n          .fail(function() {\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              $map\n                .parent()\n                .addClass(classes.mapError)\n                .html(\n                  '<div class=\"' +\n                    classes.errorMsg +\n                    '\">' +\n                    errorMessage +\n                    '</div>'\n                );\n            }\n          });\n      },\n  \n      checkVisibility: function() {\n        if (theme.isElementVisible(this.$container, 600)) {\n          this.prepMapApi();\n          $(window).off(this.namespace);\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        google.maps.event.clearListeners(this.map, 'resize');\n      }\n    });\n  \n    return Map;\n  })();\n  \n  theme.Blog = (function() {\n  \n    function Blog(container) {\n      this.tagFilters();\n    }\n  \n    Blog.prototype = $.extend({}, Blog.prototype, {\n      tagFilters: function() {\n        var $filterBy = $('#BlogTagFilter');\n  \n        if (!$filterBy.length) {\n          return;\n        }\n  \n        $filterBy.on('change', function() {\n          location.href = $(this).val();\n        });\n      },\n  \n      onUnload: function() {\n  \n      }\n    });\n  \n    return Blog;\n  })();\n  \n  theme.Photoswipe = (function() {\n    var selectors = {\n      trigger: '.js-photoswipe__zoom',\n      images: '.photoswipe__image',\n      activeImage: '.slick-active .photoswipe__image'\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.inSlideshow = false;\n  \n      if (this.$container.attr('data-zoom') === 'false') {\n        return;\n      }\n  \n      if (this.$container.attr('data-has-slideshow') === 'true') {\n        this.inSlideshow = true;\n      }\n  \n      this.init();\n    }\n  \n    Photoswipe.prototype = $.extend({}, Photoswipe.prototype, {\n      init: function() {\n        var $trigger = this.$container.find(selectors.trigger);\n        this.$images = this.$container.find(selectors.images);\n        var items = this.getImageData();\n  \n        // Init gallery on active image\n        $trigger.on('click' + this.namespace, function(evt) {\n          if (this.inSlideshow) {\n            var index = this.$container.find(selectors.activeImage).data('index');\n          } else {\n            var index = $(evt.currentTarget).data('index');\n          }\n          this.initGallery(items, index);\n        }.bind(this));\n      },\n  \n      getImageData: function() {\n        var haveImages = false;\n        var items = [];\n        var options = {};\n  \n        this.$images.each(function() {\n          var haveImages = true;\n          var smallSrc = $(this).prop('currentSrc') || $(this).prop('src');\n          var item = {\n            msrc: smallSrc,\n            src: $(this).data('photoswipe-src'),\n            w: $(this).data('photoswipe-width'),\n            h: $(this).data('photoswipe-height'),\n            el: $(this)[0],\n            initialZoomLevel: 0.85\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  \n        this.gallery.init();\n        this.gallery.listen('afterChange', this.afterChange.bind(this));\n      },\n  \n      afterChange: function() {\n        if (this.inSlideshow) {\n          var $slideshow = $('#ProductPhotos-' + this.sectionId);\n          if ($slideshow.hasClass('slick-initialized')) {\n            var newIndex = this.gallery.getCurrentIndex();\n            $slideshow.slick('slickGoTo', newIndex);\n          }\n        }\n      }\n    });\n  \n    return Photoswipe;\n  })();\n  \n  \n\n  // Medium breakpoint is also set in theme.scss.liquid and inline throughout some templates.\n  // Do not change values unless you know what you're doing.\n  theme.bp = {};\n  theme.bp.smallUp = 590;\n  theme.bp.small = theme.bp.smallUp - 1;\n\n  theme.config = {\n    bpSmall: false,\n    hasSessionStorage: true,\n    mediaQuerySmall: 'screen and (max-width: '+ theme.bp.small +'px)',\n    mediaQuerySmallUp: 'screen and (min-width: '+ theme.bp.smallUp +'px)',\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  };\n\n  window.onYouTubeIframeAPIReady = function() {\n    theme.config.youTubeReady = true;\n    $('body').trigger('youTubeReady');\n  }\n\n  window.loadYouTube = function() {\n    if (theme.config.youtubeReady) {\n      return;\n    }\n\n    var tag = document.createElement('script');\n    tag.src = \"https://www.youtube.com/iframe_api\";\n    var firstScriptTag = document.getElementsByTagName('script')[0];\n    firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n  }\n\n  window.loadVimeo = function() {\n    if (theme.config.vimeoLoading) {\n      return;\n    }\n\n    if (!theme.config.vimeoReady) {\n      theme.config.vimeoLoading = true;\n      var tag = document.createElement('script');\n      tag.src = \"https://player.vimeo.com/api/player.js\";\n      var firstScriptTag = document.getElementsByTagName('script')[0];\n      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\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          $('body').trigger('vimeoReady');\n        })\n        .fail(function() {\n          // No vimeo API to talk to\n        });\n    }\n  }\n\n  function checkIfVimeoIsReady() {\n    var deferred = $.Deferred();\n    var wait;\n    var timeout;\n\n    wait = setInterval(function() {\n      if (!Vimeo) {\n        return;\n      }\n\n      clearInterval(wait);\n      clearTimeout(timeout);\n      deferred.resolve();\n    }, 500);\n\n    timeout = setTimeout(function() {\n      clearInterval(wait);\n      deferred.reject();\n    }, 4000); // subjective. test up to 8 times over 4 seconds\n\n    return deferred;\n  }\n\n  theme.init = function() {\n    theme.setGlobals();\n    theme.pageTransitions();\n    theme.initQuickShop();\n    theme.videoModal();\n    theme.articleImages.init();\n    theme.customerTemplates.init();\n    theme.collapsibles.init();\n\n    slate.rte.init();\n\n    AOS.init({\n      easing: 'ease-out-quad',\n      once: true,\n      offset: 60,\n      disableMutationObserver: true\n    });\n\n    $(document.documentElement).on('keyup.tab', function(evt) {\n      if (evt.keyCode === 9) {\n        $(document.documentElement).addClass('tab-outline');\n        $(document.documentElement).off('keyup.tab');\n      }\n    });\n  };\n\n  theme.setGlobals = function() {\n    theme.config.hasSessionStorage = theme.isSessionStorageSupported();\n\n    if (theme.config.isTouch) {\n      $('body').addClass('supports-touch');\n    }\n\n    enquire.register(theme.config.mediaQuerySmall, {\n      match: function() {\n        theme.config.bpSmall = true;\n        $('body').trigger('matchSmall');\n      },\n      unmatch: function() {\n        theme.config.bpSmall = false;\n        $('body').trigger('unmatchSmall');\n      }\n    });\n\n    enquire.register(theme.config.mediaQueryMediumUp, {\n      match: function() {\n        $('body').trigger('matchLarge');\n      },\n      unmatch: function() {\n        $('body').trigger('unmatchLarge');\n      }\n    });\n  };\n\n  theme.loadImageSection = function($container) {\n    // Wait until images inside container have lazyloaded class\n    function setAsLoaded() {\n      $container.removeClass('loading loading--delayed').addClass('loaded');\n    }\n\n    function checkForLazyloadedImage() {\n      return $container.find('.lazyloaded').length;\n    }\n\n    // If it has SVGs it's in the onboarding state so set as loaded\n    if ($container.find('svg').length) {\n      setAsLoaded();\n      return;\n    };\n\n    if (checkForLazyloadedImage() > 0) {\n      setAsLoaded();\n      return;\n    }\n\n    var interval = setInterval(function() {\n      if (checkForLazyloadedImage() > 0) {\n        clearInterval(interval);\n        setAsLoaded();\n      }\n    }, 80);\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.isElementVisible = function($el, threshold) {\n    var rect = $el[0].getBoundingClientRect();\n    var windowHeight = window.innerHeight || document.documentElement.clientHeight;\n    threshold = threshold ? threshold : 0;\n\n    return (\n      rect.bottom >= 0 &&\n      rect.right >= 0 &&\n      rect.top <= (windowHeight + threshold) &&\n      rect.left <= (window.innerWidth || document.documentElement.clientWidth)\n    );\n  };\n\n  theme.pageTransitions = function() {\n    if ($('body').data('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        $('a').on('click', function() {\n          window.setTimeout(function() {\n            $('body').removeClass('unloading');\n          }, 1200);\n        });\n      }\n\n      // Add disable transition class to malito, anchor, and YouTube links\n      $('a[href^=\"mailto:\"], a[href^=\"#\"], a[target=\"_blank\"], a[href*=\"youtube.com/watch\"], a[href*=\"youtu.be/\"]').each(function() {\n        $(this).addClass('js-no-transition');\n      });\n\n      $('a:not(.js-no-transition)').bind('click', function(evt) {\n        if (evt.metaKey) return true;\n        evt.preventDefault();\n        $('body').addClass('unloading');\n        var src = $(this).attr('href');\n        window.setTimeout(function() {\n          location.href = src;\n        }, 50);\n      });\n\n      $('a.mobile-nav__link').bind('click', function() {\n        theme.NavDrawer.close();\n      });\n    }\n  };\n\n  theme.reinitProductGridItem = function($scope) {\n    if (AOS) {\n      AOS.refreshHard();\n    }\n\n    // Refresh currency\n    if (theme.settings.currenciesEnabled) {\n      theme.currencySwitcher.ajaxrefresh();\n    }\n\n    // Reload quick shop buttons\n    theme.initQuickShop(true);\n\n    // Refresh reviews app\n    if (window.SPR) {\n      SPR.initDomEls();SPR.loadBadges();\n    }\n\n    // Re-register product templates in quick view modals.\n    // Will not double-register.\n    sections.register('product-template', theme.Product, $scope);\n\n    // Re-hook up collapsible box triggers\n    theme.collapsibles.init();\n  };\n\n  window.onpageshow = function(evt) {\n    // Removes unload class when returning to page via history\n    if (evt.persisted) {\n      $('body').removeClass('unloading');\n    }\n  };\n\n  $(document).ready(function() {\n    theme.init();\n\n    window.sections = new theme.Sections();\n    sections.register('header-section', theme.HeaderSection);\n    sections.register('slideshow-section', theme.SlideshowSection);\n    sections.register('video-section', theme.VideoSection);\n    sections.register('product', theme.Product);\n    sections.register('product-recommendations', theme.Recommendations);\n    sections.register('product-template', theme.Product);\n    sections.register('collection-template', theme.Collection);\n    sections.register('featured-content-section', theme.FeaturedContentSection);\n    sections.register('testimonials', theme.Testimonials);\n    sections.register('instagram', theme.Instagram);\n    sections.register('newsletter-popup', theme.NewsletterPopup);\n    sections.register('fading-images', theme.FadingImages);\n    sections.register('map', theme.Maps);\n    sections.register('blog', theme.Blog);\n    sections.register('photoswipe', theme.Photoswipe);\n  });\n})(theme.jQuery);\n"],
  "mappings": "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",
  "names": ["key", "status", "videoModalPlayer", "index", "haveImages"]
}
