{"version":3,"sources":["webpack:///dynamic-conveyor-carousel-ac259dd6080f85168d62.js","webpack:///webpack/bootstrap 49e3f4ed5eed6f7b6fe0","webpack:///./src/js/lib/dot_indicator.js","webpack:///./src/js/lib/dragger1d.js","webpack:///./components/dynamic-conveyor-carousel/dynamic-conveyor-carousel.js","webpack:///./src/js/lib/tween.js","webpack:///./src/js/lib/nudge_interaction_cue.js","webpack:///./src/js/lib/currency.js","webpack:///./src/js/lib/drag_selector1d.js","webpack:///./src/js/lib/interaction_cue.js","webpack:///./src/js/lib/interaction_cue_hand.png.js","webpack:///./src/js/lib/scheduler.js"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","i","l","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","13","__webpack_exports__","_classCallCheck","instance","Constructor","TypeError","_createClass","defineProperties","target","props","length","descriptor","writable","key","protoProps","staticProps","_Liftoff","Liftoff","_Liftoff$DOMUtils","DOMUtils","createElement","replaceStyle","range","Utils","DotIndicator","count","_ref","_this","this","containerStyle","dotStyle","activeDotStyle","horizontalCarousel","_ref$dotsTopOrBottom","dotsTopOrBottom","undefined","currentIndex","background","verticalCarousel","dotsClasses","dotClasses","push","dotElements","map","classList","style","element","children","setIndex","value","newIndex","oldDotElement","remove","newDotElement","add","14","off","on","transitionEndPromise","clamp","Dragger1D","_ref$isEnabled","isEnabled","_ref$bounds","bounds","min","max","_ref$onDragStart","onDragStart","_ref$onDragMove","onDragMove","_ref$onDragEnd","onDragEnd","_ref$onClick","onClick","_ref$dragAnywhere","dragAnywhere","_ref$transitionMS","transitionMS","_ref$horizontalCarous","_ref$carouselSnapsToS","carouselSnapsToScreen","conveyorImagesTransition","_ref$forConveyor","forConveyor","slideWidth","itemCount","baseSlidePosition","baseFramePosition","basePosition","oldTransitionStyle","defaultStyle","position","top","left","right","bottom","transition","frameElement","width","height","activeSlideStyle","axis","setBounds","resetPosition","dragStartEvents","mousedown touchstart","e","_onStart","_elementEvents","assign","click","_onClick","_windowEvents","mousemove touchmove","_onMove","mouseup touchend mouseleave touchleave","_onEnd","window","index","_resetState","_setElementPosition","newBasePosition","framePosition","_ref2","_ref2$min","Infinity","_ref2$max","_ref3","_this2","_ref3$offset","offset","_ref3$durationMS","durationMS","_ref3$conveyorBorderT","conveyorBorderTransition","elementToNudge","newPosition","oldTransition","matchTarget","then","oldPosition","finally","isDragging","dragDelta","dragStartPosition","setBaseFramePosition","hasDragMoved","notNudgingFrame","transform","_setFramePosition","stopPropagation","pointerEvent","touches","clientX","clientY","_getState","pointerEvents","dragMoved","state","currentDragPosition","dragPosition","145","146","_possibleConstructorReturn","self","ReferenceError","_inherits","subClass","superClass","create","constructor","setPrototypeOf","__proto__","_toConsumableArray","arr","Array","isArray","arr2","from","__WEBPACK_IMPORTED_MODULE_0__src_js_lib_currency__","__WEBPACK_IMPORTED_MODULE_1__src_js_lib_dot_indicator__","__WEBPACK_IMPORTED_MODULE_2__src_js_lib_drag_selector1d__","__WEBPACK_IMPORTED_MODULE_3__src_js_lib_interaction_cue__","__WEBPACK_IMPORTED_MODULE_4__src_js_lib_nudge_interaction_cue__","__WEBPACK_IMPORTED_MODULE_5__src_js_lib_scheduler__","__WEBPACK_IMPORTED_MODULE_6__src_js_lib_tween__","_get","receiver","Function","desc","getOwnPropertyDescriptor","parent","getPrototypeOf","_window$Liftoff","Component","_window$Liftoff$Utils","loadImage","_window$Liftoff$DOMUt","appendChildren","empty","fragmentFromString","currencyAnimationDurationMS","isDigit","char","getNumericalPrice","price","Number","parseFloat","concat","filter","join","getDiscount","product","normalPrice","specialPrice","normal","special","discount","ProductDiscount","discountTextStyle","totalDiscount","startTime","Date","now","tagName","tween","startValue","endValue","easingFn","Easing","EaseOutQuad","start","onUpdate","currentDiscount","textContent","Math","floor","ProductPrice","mainPriceStyle","overriddenPriceStyle","shouldAnimatePrice","mainPrice","overriddenPrice","priceFormatter","mainPriceEl","initAnimation","numericalMainPrice","updatePrice","currentTweenValue","currentTweenDigits","round","renderProductInfo","infoElement","containerClassList","prefixHTML","prefixStyle","suffixHTML","suffixStyle","renderProductImage","productImageSizing","imageURL","backgroundImage","backgroundSize","ProductCarouselSlide","_ref4","_ref4$productSlideCon","productSlideConfig","productImageStyle","productContainerStyle","showPrices","priceInfoConfig","showTitle","titleTextStyle","titleInfoConfig","showDescription","descriptionTextStyle","descriptionInfoConfig","showDiscount","discountInfoConfig","interactionCueHand","title","description","showDiscountWithDefault","getElement","productElement","reset","ProductCarousel","_ref5","products","onProductClick","onProductSelection","interactionCueType","interactionCueInterval","_ref5$interactionCueH","flickInteractionCueHand","attachHandToSlides","productSlides","dragSelector","slidesPerView","onSelection","productSlide","nudgeInteractionCue","nudgeType","intervalMS","nudger","stop","activate","slidesPerConveyorView","ProductConveyorSlide","_ref6","zIndex","eventHandlers","ProductConveyor","_ref7","_ref7$interactionCueH","slide","slideIndex","setInteractionCueHand","setHandForSlide","register","_Component","DynamicConveyorCarousel","config","_this3","hasDragSelected","currentProductIndex","useStaticProducts","productCount","Madlib","getNextProduct","rawProduct","id","image_url","display_price","special_display_price","autoTransitionScheduler","autoScrollDelayMS","callback","_handleAutoTransition","bind","allImageURLs","_ref8","customHandImage","url","Promise","all","parentNode","_this4","el","appendChild","boundingClientRect","getBoundingClientRect","isCarouselInteractive","carouselInteractionCue","isConveyorInteractive","conveyorInteractionCue","showInteractionCueHand","useAutoScroll","interactionCueHandStyle","carousel","_handleDragStart","_stopInteractionCues","_handleProductClick","_handleProductSelection","priceContainerStyle","pricePrefix","pricePrefixStyle","priceSuffix","priceSuffixStyle","titleStyle","titlePrefix","titlePrefixStyle","titleSuffix","titleSuffixStyle","descriptionStyle","descriptionPrefix","descriptionPrefixStyle","descriptionSuffix","descriptionSuffixStyle","discountStyle","discountPrefix","discountPrefixStyle","discountSuffix","discountSuffixStyle","conveyor","activeConveyorSlideStyle","dotIndicator","dotsContainerStyle","spacingPx","verticalSpacing","makeSpacer","showConveyor","showDots","firstProductIndex","_setProductIndex","startInteractionCue","_startInteractionCues","stopInteractionCue","hide","_stopAutoTransitions","indexDelta","_this5","flick","onFlickReady","_transitionProductView","flickDuration","productIndex","mergeClickParams","pid","recordInteraction","handleNavigationClick","_updateGlobalProductIdParam","147","15","_typeof","Symbol","iterator","obj","Tween","forEach","param","end","ease","f","k","callbackMap","arguments","startTS","stopped","update","currentValue","valueNow","requestAnimationFrame","onComplete","elapsed","Linear","EaseInSine","cos","PI","EaseOutSine","sin","EaseInOutSine","EaseInQuad","pow","EaseInOutQuad","EaseInCubic","EaseOutCubic","EaseInOutCubic","19","__WEBPACK_IMPORTED_MODULE_0__scheduler__","nudgeTypeToPx","nudge-up","nudge-down","nudge-left","nudge-right","getNudgeOffsetPx","NudgeInteractionCue","_ref$interactionCueHa","_ref$conveyorBorderTr","scheduler","nudge","flickDistance","flickRotation","xOrY","resolve","setTimeout","show","31","makeCurrencyFormatter","baseStr","numericChars","prefixStr","shift","suffixStr","pop","decimalSeparator","groupSeparatorIndex","groupSeparator","decimalPosition","charShouldBeGroupSeparator","charIndex","charsFromDecimal","charShouldBeDecimalSeparator","intToFormat","strToFormat","String","repeat","formattedDigits","reverse","reduce","reversedFormatted","digitChar","digitIndex","digitsBeforeDecimalCount","32","__WEBPACK_IMPORTED_MODULE_0__dragger1d__","DragSelector1D","_ref$onSelection","slideHeight","widthOrHeight","slideWidthOrHeight","minDivisor","maxDivisor","dragger","_getNearestIndex","getFrameElement","_dragger","apply","setBasePosition","dragState","sign","33","__WEBPACK_IMPORTED_MODULE_0__interaction_cue_hand_png__","runTransitionSequence","InteractionCue","cueImageURL","backgroundRepeat","display","_ref$onFlickReady","_ref$flickDistance","_ref$flickRotation","_ref$flickDuration","_ref$flickGrowth","flickGrowth","_ref$xOrY","transitionTimingFunction","34","5","Scheduler","_ref$leading","leading","isActive","intervalID","setInterval","clearInterval"],"mappings":"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","file":"dynamic-conveyor-carousel-ac259dd6080f85168d62.js","sourcesContent":["/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 145);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 13:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar _Liftoff = Liftoff,\n    _Liftoff$DOMUtils = _Liftoff.DOMUtils,\n    createElement = _Liftoff$DOMUtils.createElement,\n    replaceStyle = _Liftoff$DOMUtils.replaceStyle,\n    range = _Liftoff.Utils.range;\n\nvar DotIndicator = function () {\n  function DotIndicator(count, _ref) {\n    var _this = this;\n\n    var containerStyle = _ref.containerStyle,\n        dotStyle = _ref.dotStyle,\n        activeDotStyle = _ref.activeDotStyle,\n        horizontalCarousel = _ref.horizontalCarousel,\n        _ref$dotsTopOrBottom = _ref.dotsTopOrBottom,\n        dotsTopOrBottom = _ref$dotsTopOrBottom === undefined ? false : _ref$dotsTopOrBottom;\n\n    _classCallCheck(this, DotIndicator);\n\n    this.count = count;\n    this.currentIndex = 0;\n    this.dotStyle = dotStyle;\n    this.activeDotStyle = activeDotStyle;\n    if (!this.activeDotStyle) {\n      this.activeDotStyle = {\n        background: \"#999\"\n      };\n    }\n    this.horizontalCarousel = horizontalCarousel;\n    this.verticalCarousel = horizontalCarousel === false; // explicitly using 'false' for backwards compatibility\n\n    this.dotsClasses = [\"dots\"];\n    this.dotClasses = [\"dot\"];\n    if (horizontalCarousel) {\n      this.dotsClasses.push(\"dots-horizontal-style\");\n      this.dotClasses.push(\"dot-style\");\n    } else if (this.verticalCarousel) {\n      this.dotsClasses.push(dotsTopOrBottom || \"dots-vertical-style-top\");\n      this.dotClasses.push(\"dot-style\");\n    }\n\n    this.dotElements = range(0, count).map(function () {\n      return createElement({\n        classList: _this.dotClasses,\n        style: dotStyle\n      });\n    });\n\n    this.element = createElement({\n      classList: this.dotsClasses,\n      children: this.dotElements,\n      style: containerStyle\n    });\n\n    this.setIndex(0);\n  }\n\n  _createClass(DotIndicator, [{\n    key: \"getElement\",\n    value: function getElement() {\n      return this.element;\n    }\n  }, {\n    key: \"setIndex\",\n    value: function setIndex(newIndex) {\n      if (!(0 <= newIndex && newIndex < this.count)) return;\n\n      var oldDotElement = this.dotElements[this.currentIndex];\n      replaceStyle(oldDotElement, this.dotStyle);\n      oldDotElement.classList.remove(\"active\");\n\n      this.currentIndex = newIndex;\n\n      var newDotElement = this.dotElements[this.currentIndex];\n      replaceStyle(newDotElement, this.dotStyle, this.activeDotStyle);\n      newDotElement.classList.add(\"active\");\n    }\n  }]);\n\n  return DotIndicator;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (DotIndicator);\n\n/***/ }),\n\n/***/ 14:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar _Liftoff = Liftoff,\n    _Liftoff$DOMUtils = _Liftoff.DOMUtils,\n    createElement = _Liftoff$DOMUtils.createElement,\n    off = _Liftoff$DOMUtils.off,\n    on = _Liftoff$DOMUtils.on,\n    transitionEndPromise = _Liftoff$DOMUtils.transitionEndPromise,\n    clamp = _Liftoff.Utils.clamp;\n\nvar Dragger1D = function () {\n  function Dragger1D(_ref) {\n    var _this = this;\n\n    var _ref$isEnabled = _ref.isEnabled,\n        isEnabled = _ref$isEnabled === undefined ? true : _ref$isEnabled,\n        _ref$bounds = _ref.bounds,\n        min = _ref$bounds.min,\n        max = _ref$bounds.max,\n        _ref$onDragStart = _ref.onDragStart,\n        onDragStart = _ref$onDragStart === undefined ? function () {} : _ref$onDragStart,\n        _ref$onDragMove = _ref.onDragMove,\n        onDragMove = _ref$onDragMove === undefined ? function () {} : _ref$onDragMove,\n        _ref$onDragEnd = _ref.onDragEnd,\n        onDragEnd = _ref$onDragEnd === undefined ? function () {} : _ref$onDragEnd,\n        _ref$onClick = _ref.onClick,\n        onClick = _ref$onClick === undefined ? function () {} : _ref$onClick,\n        _ref$dragAnywhere = _ref.dragAnywhere,\n        dragAnywhere = _ref$dragAnywhere === undefined ? false : _ref$dragAnywhere,\n        _ref$transitionMS = _ref.transitionMS,\n        transitionMS = _ref$transitionMS === undefined ? 500 : _ref$transitionMS,\n        children = _ref.children,\n        _ref$horizontalCarous = _ref.horizontalCarousel,\n        horizontalCarousel = _ref$horizontalCarous === undefined ? true : _ref$horizontalCarous,\n        _ref$carouselSnapsToS = _ref.carouselSnapsToScreen,\n        carouselSnapsToScreen = _ref$carouselSnapsToS === undefined ? true : _ref$carouselSnapsToS,\n        conveyorImagesTransition = _ref.conveyorImagesTransition,\n        _ref$forConveyor = _ref.forConveyor,\n        forConveyor = _ref$forConveyor === undefined ? false : _ref$forConveyor,\n        slideWidth = _ref.slideWidth,\n        itemCount = _ref.itemCount;\n\n    _classCallCheck(this, Dragger1D);\n\n    this.itemCount = itemCount;\n    this.baseSlidePosition = false;\n    this.baseFramePosition = false;\n    this.isEnabled = isEnabled;\n    this.forConveyor = forConveyor;\n    this.horizontalCarousel = horizontalCarousel;\n    this.carouselSnapsToScreen = carouselSnapsToScreen;\n    this.conveyorImagesTransition = conveyorImagesTransition;\n    this.onDragStart = onDragStart;\n    this.onDragMove = onDragMove;\n    this.onDragEnd = onDragEnd;\n    this.onClick = onClick;\n    this.transitionMS = transitionMS;\n    this.slideWidth = slideWidth;\n\n    this.basePosition = 0;\n    this.oldTransitionStyle = null;\n    this.defaultStyle = {\n      position: \"absolute\",\n      top: \"0\",\n      left: \"0\",\n      right: \"0\",\n      bottom: \"0\",\n      transition: \"transform \" + transitionMS + \"ms ease-out\"\n    };\n\n    this.element = createElement({\n      style: this.defaultStyle,\n      children: children\n    });\n\n    this.frameElement = createElement({\n      classList: [\"center-frame\"],\n      style: Object.assign({\n        width: slideWidth + \"px\",\n        height: slideWidth + \"px\"\n      }, this.defaultStyle, this.activeSlideStyle)\n    });\n\n    this.axis = this.horizontalCarousel || this.forConveyor ? \"X\" : \"Y\";\n\n    this.setBounds({ min: min, max: max });\n\n    this.resetPosition();\n\n    var dragStartEvents = {\n      \"mousedown touchstart\": function mousedownTouchstart(e) {\n        return _this._onStart(e);\n      }\n    };\n    this._elementEvents = Object.assign({}, dragAnywhere ? {} : dragStartEvents, {\n      click: function click(e) {\n        return _this._onClick(e);\n      }\n    });\n    this._windowEvents = Object.assign({}, dragAnywhere ? dragStartEvents : {}, {\n      \"mousemove touchmove\": function mousemoveTouchmove(e) {\n        return _this._onMove(e);\n      },\n      \"mouseup touchend mouseleave touchleave\": function mouseupTouchendMouseleaveTouchleave(e) {\n        return _this._onEnd(e);\n      }\n    });\n\n    on(this.element, this._elementEvents);\n    on(window, this._windowEvents);\n  }\n\n  _createClass(Dragger1D, [{\n    key: \"getElement\",\n    value: function getElement() {\n      return this.element;\n    }\n  }, {\n    key: \"getFrameElement\",\n    value: function getFrameElement() {\n      return this.frameElement;\n    }\n  }, {\n    key: \"resetPosition\",\n    value: function resetPosition(index) {\n      this._resetState();\n      this._setElementPosition(this.basePosition, index);\n    }\n  }, {\n    key: \"setBasePosition\",\n    value: function setBasePosition(newBasePosition) {\n      this.basePosition = newBasePosition;\n    }\n  }, {\n    key: \"setBaseFramePosition\",\n    value: function setBaseFramePosition(position) {\n      var baseFramePositionUnuset = !this.baseFramePosition && position !== 0;\n      if (baseFramePositionUnuset) {\n        this.baseFramePosition = this.framePosition;\n      }\n    }\n  }, {\n    key: \"setBounds\",\n    value: function setBounds(_ref2) {\n      var _ref2$min = _ref2.min,\n          min = _ref2$min === undefined ? -Infinity : _ref2$min,\n          _ref2$max = _ref2.max,\n          max = _ref2$max === undefined ? Infinity : _ref2$max;\n\n      this.min = min;\n      this.max = max;\n    }\n  }, {\n    key: \"nudge\",\n    value: function nudge(_ref3) {\n      var _this2 = this;\n\n      var _ref3$offset = _ref3.offset,\n          offset = _ref3$offset === undefined ? 0 : _ref3$offset,\n          _ref3$durationMS = _ref3.durationMS,\n          durationMS = _ref3$durationMS === undefined ? 1000 : _ref3$durationMS,\n          _ref3$conveyorBorderT = _ref3.conveyorBorderTransition,\n          conveyorBorderTransition = _ref3$conveyorBorderT === undefined ? false : _ref3$conveyorBorderT;\n\n      this.elementToNudge = conveyorBorderTransition ? this.frameElement : this.element;\n\n      var newPosition = conveyorBorderTransition ? -this.framePosition - offset : this.basePosition - offset;\n\n      var oldTransition = this.elementToNudge.style.transition;\n\n      // NOTE(cory) Divide `durationMS` by 2 because the transition should play out twice.\n      this.elementToNudge.style.transition = \"transform \" + durationMS / 2 + \"ms ease-out\";\n\n      this._setElementPosition(newPosition, false);\n      return transitionEndPromise(this.elementToNudge, { matchTarget: true }).then(function () {\n        var oldPosition = conveyorBorderTransition ? -_this2.baseFramePosition : _this2.basePosition;\n        _this2._setElementPosition(oldPosition, false);\n        return transitionEndPromise(_this2.elementToNudge, { matchTarget: true });\n      }).finally(function () {\n        _this2.elementToNudge.style.transition = oldTransition;\n      });\n    }\n  }, {\n    key: \"clean\",\n    value: function clean() {\n      off(this.element, this._elementEvents);\n      off(window, this._windowEvents);\n    }\n  }, {\n    key: \"_resetState\",\n    value: function _resetState() {\n      this.isDragging = false;\n      if (!this.carouselSnapsToScreen && this.dragDelta) {\n        this.basePosition = clamp(this.dragDelta, this.min, this.max);\n      } else {\n        this.dragStartPosition = null;\n        this.dragDelta = null;\n      }\n      this.baseFramePosition = this.setBaseFramePosition(this.basePosition);\n      this.hasDragMoved = false;\n    }\n  }, {\n    key: \"_setFramePosition\",\n    value: function _setFramePosition(position, index) {\n      var moveFramePosition = this.forConveyor && !this.conveyorImagesTransition;\n      if (moveFramePosition) {\n        // Fix frame position being offset when < 5 products and <= 2 products\n        var notNudgingFrame = index !== false;\n        if (notNudgingFrame) {\n          if (this.itemCount < 5) {\n            index++;\n          }\n          if (this.itemCount <= 2) {\n            index++;\n          }\n        }\n\n        this.framePosition = notNudgingFrame ? this.slideWidth / 2 + this.slideWidth * index : -position;\n\n        this.frameElement.style.transform = \"translate\" + this.axis + \"(\" + this.framePosition + \"px)\";\n        this.setBaseFramePosition(position);\n      }\n    }\n  }, {\n    key: \"_setElementPosition\",\n    value: function _setElementPosition(position, index) {\n      this._setFramePosition(position, index);\n\n      var movingImagePosition = this.conveyorImagesTransition || !this.forConveyor || !this.baseSlidePosition;\n      if (movingImagePosition) {\n        this.baseSlidePosition = position !== 0 ? -position : this.baseSlidePosition;\n\n        this.element.style.transform = \"translate\" + this.axis + \"(\" + -position + \"px)\";\n      }\n    }\n  }, {\n    key: \"_onStart\",\n    value: function _onStart(e) {\n      if (this.isDragging || !this.isEnabled) return;\n\n      // NOTE(cory) Stopping this propagation allows nested dragger targets.  This is necessary when\n      // any dragger uses `dragAnywhere` while another dragger exists.\n      e.stopPropagation();\n\n      var pointerEvent = e.touches != null ? e.touches[0] : e;\n\n      this.isDragging = true;\n      this.dragStartPosition = this.horizontalCarousel ? pointerEvent.clientX : pointerEvent.clientY;\n      this.dragDelta = 0;\n      this.hasDragMoved = false;\n\n      if (this.oldTransitionStyle == null) {\n        this.oldTransitionStyle = this.element.style.transition;\n        this.element.style.transition = \"none\";\n      }\n\n      this.onDragStart(this._getState());\n    }\n  }, {\n    key: \"_onMove\",\n    value: function _onMove(e) {\n      if (!this.isDragging) return;\n\n      this.element.style.pointerEvents = \"none\";\n\n      var pointerEvent = e.touches != null ? e.touches[0] : e;\n      this.dragMoved = this.horizontalCarousel ? pointerEvent.clientX : pointerEvent.clientY;\n      this.dragDelta = this.dragStartPosition - this.dragMoved;\n      if (!this.carouselSnapsToScreen && this.basePosition && !this.forConveyor) {\n        this.dragDelta = this.basePosition + this.dragDelta;\n      }\n      this.hasDragMoved = true;\n\n      var state = this._getState();\n\n      this._setElementPosition(state.currentDragPosition);\n\n      this.onDragMove(state);\n    }\n  }, {\n    key: \"_onEnd\",\n    value: function _onEnd() {\n      if (!this.isDragging) return;\n\n      this.element.style.pointerEvents = null;\n\n      var state = this._getState();\n\n      this._resetState();\n\n      if (this.oldTransitionStyle != null) {\n        this.element.style.transition = this.oldTransitionStyle;\n        this.oldTransitionStyle = null;\n      }\n\n      this.onDragEnd(state);\n    }\n  }, {\n    key: \"_onClick\",\n    value: function _onClick(e) {\n      var state = this._getState();\n      if (state.hasDragMoved) return;\n\n      this.onClick(e, state);\n    }\n  }, {\n    key: \"_getState\",\n    value: function _getState() {\n      var dragPosition = this.carouselSnapsToScreen ? this.basePosition + this.dragDelta : this.dragDelta;\n      return {\n        currentDragPosition: clamp(dragPosition, this.min, this.max),\n        dragStartPosition: this.dragStartPosition,\n        dragDelta: this.dragDelta,\n        hasDragMoved: this.hasDragMoved\n      };\n    }\n  }]);\n\n  return Dragger1D;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Dragger1D);\n\n/***/ }),\n\n/***/ 145:\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(146);\nmodule.exports = __webpack_require__(147);\n\n\n/***/ }),\n\n/***/ 146:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_js_lib_currency__ = __webpack_require__(31);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__src_js_lib_dot_indicator__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__src_js_lib_drag_selector1d__ = __webpack_require__(32);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__src_js_lib_interaction_cue__ = __webpack_require__(33);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__src_js_lib_nudge_interaction_cue__ = __webpack_require__(19);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__src_js_lib_scheduler__ = __webpack_require__(5);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__src_js_lib_tween__ = __webpack_require__(15);\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n\n\n\n\n\n\n\n\nvar _window$Liftoff = window.Liftoff,\n    Component = _window$Liftoff.Component,\n    _window$Liftoff$Utils = _window$Liftoff.Utils,\n    loadImage = _window$Liftoff$Utils.loadImage,\n    range = _window$Liftoff$Utils.range,\n    _window$Liftoff$DOMUt = _window$Liftoff.DOMUtils,\n    appendChildren = _window$Liftoff$DOMUt.appendChildren,\n    createElement = _window$Liftoff$DOMUt.createElement,\n    empty = _window$Liftoff$DOMUt.empty,\n    fragmentFromString = _window$Liftoff$DOMUt.fragmentFromString;\n\n\nvar DEFAULT_VERTICAL_SPACING = \"15px\";\nvar INTERACTION_CUE_TYPE_NONE = \"none\";\n\nvar currencyAnimationDurationMS = 1000;\nvar isDigit = function isDigit(char) {\n  return char >= \"0\" && char <= \"9\";\n};\nvar getNumericalPrice = function getNumericalPrice(price) {\n  // NOTE(Casey): We assume that normal and special prices are formatted similarly (i.e. same number of\n  // fractional parts). With this assumption, we can parse prices for discount calculations just by removing\n  // non-digits.\n  return Number.parseFloat([].concat(_toConsumableArray(price)).filter(function (d) {\n    return isDigit(d);\n  }).join(\"\"));\n};\nvar getDiscount = function getDiscount(product) {\n  var normalPrice = product.normalPrice,\n      specialPrice = product.specialPrice;\n\n  if (specialPrice == null) {\n    return null;\n  }\n\n  var normal = getNumericalPrice(normalPrice);\n  var special = getNumericalPrice(specialPrice);\n\n  var discount = special / normal - 1;\n  if (discount === 0) {\n    return null;\n  }\n\n  return discount;\n};\n\nvar ProductDiscount = function () {\n  function ProductDiscount(_ref) {\n    var product = _ref.product,\n        discountTextStyle = _ref.discountTextStyle;\n\n    _classCallCheck(this, ProductDiscount);\n\n    this.totalDiscount = getDiscount(product);\n    this.startTime = Date.now();\n\n    this.element = this.totalDiscount == null ? null : createElement({\n      tagName: \"span\",\n      style: discountTextStyle,\n      children: [\"0%\"]\n    });\n\n    this.tween = new __WEBPACK_IMPORTED_MODULE_6__src_js_lib_tween__[\"a\" /* default */]({\n      startValue: 0,\n      endValue: this.totalDiscount,\n      durationMS: currencyAnimationDurationMS,\n      easingFn: __WEBPACK_IMPORTED_MODULE_6__src_js_lib_tween__[\"a\" /* default */].Easing.EaseOutQuad\n    });\n  }\n\n  _createClass(ProductDiscount, [{\n    key: \"getElement\",\n    value: function getElement() {\n      return this.element;\n    }\n  }, {\n    key: \"reset\",\n    value: function reset() {\n      var _this = this;\n\n      if (this.totalDiscount == null) return;\n\n      this.tween.start({\n        onUpdate: function onUpdate(currentDiscount) {\n          _this.element.textContent = Math.floor(currentDiscount * 100) + \"%\";\n        }\n      });\n    }\n  }]);\n\n  return ProductDiscount;\n}();\n\nvar ProductPrice = function () {\n  function ProductPrice(_ref2) {\n    var product = _ref2.product,\n        mainPriceStyle = _ref2.mainPriceStyle,\n        overriddenPriceStyle = _ref2.overriddenPriceStyle,\n        shouldAnimatePrice = _ref2.shouldAnimatePrice;\n\n    _classCallCheck(this, ProductPrice);\n\n    var specialPrice = product.specialPrice,\n        normalPrice = product.normalPrice;\n\n    var mainPrice = specialPrice || normalPrice;\n    var overriddenPrice = mainPrice !== normalPrice ? normalPrice : null;\n\n    if (mainPrice == null) {\n      this.element = null;\n      return null;\n    }\n\n    var priceFormatter = shouldAnimatePrice ? Object(__WEBPACK_IMPORTED_MODULE_0__src_js_lib_currency__[\"a\" /* makeCurrencyFormatter */])(mainPrice) : null;\n    this.shouldAnimatePrice = shouldAnimatePrice && mainPrice != null && priceFormatter != null;\n\n    var mainPriceEl = createElement({\n      tagName: \"span\",\n      style: mainPriceStyle,\n      children: [this.shouldAnimatePrice ? 0 : mainPrice]\n    });\n\n    this.element = createElement({\n      tagName: \"span\",\n      children: [overriddenPrice && {\n        tagName: \"span\",\n        style: overriddenPriceStyle,\n        children: [overriddenPrice]\n      }, \" \", mainPriceEl]\n    });\n\n    this.initAnimation(mainPrice, mainPriceEl, priceFormatter);\n  }\n\n  _createClass(ProductPrice, [{\n    key: \"initAnimation\",\n    value: function initAnimation(mainPrice, mainPriceEl, priceFormatter) {\n      if (!this.shouldAnimatePrice) return;\n\n      var numericalMainPrice = getNumericalPrice(mainPrice);\n      this.tween = new __WEBPACK_IMPORTED_MODULE_6__src_js_lib_tween__[\"a\" /* default */]({\n        startValue: 0,\n        endValue: numericalMainPrice,\n        durationMS: currencyAnimationDurationMS,\n        easingFn: __WEBPACK_IMPORTED_MODULE_6__src_js_lib_tween__[\"a\" /* default */].Easing.EaseOutQuad\n      });\n\n      this.updatePrice = function (currentTweenValue) {\n        var currentTweenDigits = Math.round(currentTweenValue);\n        mainPriceEl.textContent = priceFormatter(currentTweenDigits);\n      };\n    }\n  }, {\n    key: \"getElement\",\n    value: function getElement() {\n      return this.element;\n    }\n  }, {\n    key: \"reset\",\n    value: function reset() {\n      if (!this.shouldAnimatePrice) return;\n\n      this.tween.start({\n        onUpdate: this.updatePrice\n      });\n    }\n  }]);\n\n  return ProductPrice;\n}();\n\nvar renderProductInfo = function renderProductInfo(infoElement, _ref3) {\n  var containerClassList = _ref3.containerClassList,\n      containerStyle = _ref3.containerStyle,\n      prefixHTML = _ref3.prefixHTML,\n      prefixStyle = _ref3.prefixStyle,\n      suffixHTML = _ref3.suffixHTML,\n      suffixStyle = _ref3.suffixStyle;\n\n  return createElement({\n    classList: containerClassList,\n    style: containerStyle,\n    children: [!!prefixHTML && {\n      tagName: \"span\",\n      style: prefixStyle,\n      children: [fragmentFromString(prefixHTML)]\n    }, infoElement, \" \", !!suffixHTML && {\n      tagName: \"span\",\n      style: suffixStyle,\n      children: [fragmentFromString(suffixHTML)]\n    }]\n  });\n};\n\nvar renderProductImage = function renderProductImage(product, productImageSizing) {\n  return product.imageURL && {\n    classList: [\"product-image\"],\n    style: {\n      backgroundImage: \"url(\" + product.imageURL + \")\",\n      backgroundSize: productImageSizing\n    }\n  };\n};\n\nvar ProductCarouselSlide = function () {\n  function ProductCarouselSlide(_ref4) {\n    var product = _ref4.product,\n        index = _ref4.index,\n        width = _ref4.width,\n        _ref4$productSlideCon = _ref4.productSlideConfig,\n        productImageStyle = _ref4$productSlideCon.productImageStyle,\n        productContainerStyle = _ref4$productSlideCon.productContainerStyle,\n        productImageSizing = _ref4$productSlideCon.productImageSizing,\n        showPrices = _ref4$productSlideCon.showPrices,\n        mainPriceStyle = _ref4$productSlideCon.mainPriceStyle,\n        overriddenPriceStyle = _ref4$productSlideCon.overriddenPriceStyle,\n        priceInfoConfig = _ref4$productSlideCon.priceInfoConfig,\n        showTitle = _ref4$productSlideCon.showTitle,\n        titleTextStyle = _ref4$productSlideCon.titleTextStyle,\n        titleInfoConfig = _ref4$productSlideCon.titleInfoConfig,\n        showDescription = _ref4$productSlideCon.showDescription,\n        descriptionTextStyle = _ref4$productSlideCon.descriptionTextStyle,\n        descriptionInfoConfig = _ref4$productSlideCon.descriptionInfoConfig,\n        showDiscount = _ref4$productSlideCon.showDiscount,\n        discountTextStyle = _ref4$productSlideCon.discountTextStyle,\n        discountInfoConfig = _ref4$productSlideCon.discountInfoConfig,\n        shouldAnimatePrice = _ref4$productSlideCon.shouldAnimatePrice,\n        interactionCueHand = _ref4.interactionCueHand;\n\n    _classCallCheck(this, ProductCarouselSlide);\n\n    this.discount = new ProductDiscount({ product: product, discountTextStyle: discountTextStyle });\n    this.price = new ProductPrice({\n      product: product,\n      overriddenPriceStyle: overriddenPriceStyle,\n      mainPriceStyle: mainPriceStyle,\n      shouldAnimatePrice: shouldAnimatePrice\n    });\n\n    var title = product.title,\n        description = product.description;\n\n    this.interactionCueHand = interactionCueHand;\n\n    // NOTE(Casey): 'showDiscount' was added after some creatives were\n    // already using this component, so add a default here to ensure\n    // consistent behavior for creatives that were missing this parameter.\n    var showDiscountWithDefault = showDiscount == null ? this.discount.getElement() != null : showDiscount;\n\n    this.productElement = createElement({\n      style: productContainerStyle,\n      children: [{\n        style: productImageStyle,\n        children: [renderProductImage(product, productImageSizing)]\n      }, showDiscountWithDefault && renderProductInfo(this.discount.getElement(), discountInfoConfig), showPrices && renderProductInfo(this.price.getElement(), Object.assign(priceInfoConfig, {\n        containerClassList: [\"product-prices\"]\n      })), showTitle && renderProductInfo(createElement({\n        tagName: \"span\",\n        children: [title],\n        style: titleTextStyle\n      }), titleInfoConfig), showDescription && renderProductInfo(createElement({\n        tagName: \"span\",\n        children: [description],\n        style: descriptionTextStyle\n      }), descriptionInfoConfig)]\n    });\n\n    this.element = createElement({\n      classList: [\"product-slide\"],\n      style: { transform: \"translateX(\" + index * width + \"px)\" },\n      children: [this.productElement]\n    });\n  }\n\n  _createClass(ProductCarouselSlide, [{\n    key: \"getElement\",\n    value: function getElement() {\n      return this.element;\n    }\n  }, {\n    key: \"activate\",\n    value: function activate() {\n      this.discount.reset();\n      this.price.reset();\n      if (this.interactionCueHand != null) {\n        appendChildren(this.productElement, [this.interactionCueHand.getElement()]);\n      }\n    }\n  }]);\n\n  return ProductCarouselSlide;\n}();\n\nvar ProductCarousel = function () {\n  function ProductCarousel(_ref5) {\n    var products = _ref5.products,\n        width = _ref5.width,\n        onDragStart = _ref5.onDragStart,\n        onDragMove = _ref5.onDragMove,\n        onProductClick = _ref5.onProductClick,\n        dragAnywhere = _ref5.dragAnywhere,\n        onProductSelection = _ref5.onProductSelection,\n        interactionCueType = _ref5.interactionCueType,\n        interactionCueInterval = _ref5.interactionCueInterval,\n        _ref5$interactionCueH = _ref5.interactionCueHand,\n        interactionCueHand = _ref5$interactionCueH === undefined ? null : _ref5$interactionCueH,\n        flickInteractionCueHand = _ref5.flickInteractionCueHand,\n        attachHandToSlides = _ref5.attachHandToSlides,\n        productSlideConfig = _ref5.productSlideConfig;\n\n    _classCallCheck(this, ProductCarousel);\n\n    this.products = products;\n    this.width = width;\n    this.currentIndex = null;\n    this.interactionCueHand = interactionCueHand;\n\n    this.productSlides = this.products.map(function (product, index) {\n      return new ProductCarouselSlide({\n        product: product,\n        index: index,\n        width: width,\n        productSlideConfig: productSlideConfig,\n        interactionCueHand: attachHandToSlides ? interactionCueHand : null\n      });\n    });\n\n    this.dragSelector = new __WEBPACK_IMPORTED_MODULE_2__src_js_lib_drag_selector1d__[\"a\" /* default */]({\n      itemCount: products.length,\n      width: width,\n      slidesPerView: 1,\n      onDragStart: onDragStart,\n      onDragMove: onDragMove,\n      onClick: onProductClick,\n      dragAnywhere: dragAnywhere,\n      onSelection: onProductSelection,\n      children: this.productSlides.map(function (productSlide) {\n        return productSlide.getElement();\n      })\n    });\n\n    this.element = createElement({\n      classList: [\"product-carousel\"],\n      children: [this.dragSelector.getElement()]\n    });\n\n    this.nudgeInteractionCue = new __WEBPACK_IMPORTED_MODULE_4__src_js_lib_nudge_interaction_cue__[\"a\" /* default */]({\n      nudgeType: interactionCueType,\n      intervalMS: interactionCueInterval,\n      interactionCueHand: interactionCueHand,\n      flickInteractionCueHand: flickInteractionCueHand,\n      nudger: this.dragSelector\n    });\n  }\n\n  _createClass(ProductCarousel, [{\n    key: \"getElement\",\n    value: function getElement() {\n      return this.element;\n    }\n  }, {\n    key: \"startInteractionCue\",\n    value: function startInteractionCue() {\n      this.nudgeInteractionCue.start();\n    }\n  }, {\n    key: \"stopInteractionCue\",\n    value: function stopInteractionCue() {\n      this.nudgeInteractionCue.stop();\n    }\n  }, {\n    key: \"setIndex\",\n    value: function setIndex(index) {\n      this.currentIndex = index;\n      this.dragSelector.setIndex(index);\n      this.productSlides[index].activate();\n    }\n  }]);\n\n  return ProductCarousel;\n}();\n\nvar slidesPerConveyorView = 6;\n\nvar ProductConveyorSlide = function () {\n  function ProductConveyorSlide(_ref6) {\n    var index = _ref6.index,\n        width = _ref6.width,\n        product = _ref6.product,\n        productImageSizing = _ref6.productImageSizing,\n        onProductSelection = _ref6.onProductSelection;\n\n    _classCallCheck(this, ProductConveyorSlide);\n\n    this.element = createElement({\n      classList: [\"product-slide\"],\n      style: {\n        width: width + \"px\",\n        transform: \"translateX(\" + index * width + \"px)\",\n        // Images to the left are in the front so the hand (positioned to the right of the image) is not\n        // under the image to the right.\n        zIndex: -index\n      },\n      children: [renderProductImage(product, productImageSizing)],\n      eventHandlers: {\n        click: function click() {\n          onProductSelection(index);\n        }\n      }\n    });\n  }\n\n  _createClass(ProductConveyorSlide, [{\n    key: \"getElement\",\n    value: function getElement() {\n      return this.element;\n    }\n  }, {\n    key: \"setInteractionCueHand\",\n    value: function setInteractionCueHand(interactionCueHand) {\n      if (interactionCueHand == null) return;\n      appendChildren(this.element, [interactionCueHand.getElement()]);\n    }\n  }]);\n\n  return ProductConveyorSlide;\n}();\n\nvar ProductConveyor = function () {\n  function ProductConveyor(_ref7) {\n    var _this2 = this;\n\n    var products = _ref7.products,\n        width = _ref7.width,\n        onDragStart = _ref7.onDragStart,\n        onDragMove = _ref7.onDragMove,\n        onProductSelection = _ref7.onProductSelection,\n        interactionCueType = _ref7.interactionCueType,\n        interactionCueInterval = _ref7.interactionCueInterval,\n        _ref7$interactionCueH = _ref7.interactionCueHand,\n        interactionCueHand = _ref7$interactionCueH === undefined ? null : _ref7$interactionCueH,\n        flickInteractionCueHand = _ref7.flickInteractionCueHand,\n        activeSlideStyle = _ref7.activeSlideStyle,\n        productImageSizing = _ref7.productImageSizing;\n\n    _classCallCheck(this, ProductConveyor);\n\n    this.products = products;\n    this.width = width;\n    this.activeSlideStyle = activeSlideStyle;\n    this.currentIndex = null;\n    this.interactionCueHand = interactionCueHand;\n\n    this.slideWidth = width / slidesPerConveyorView;\n    this.productSlides = products.map(function (product, index) {\n      return new ProductConveyorSlide({\n        width: _this2.slideWidth,\n        index: index,\n        product: product,\n        productImageSizing: productImageSizing,\n        onProductSelection: onProductSelection\n      });\n    });\n\n    this.dragSelector = new __WEBPACK_IMPORTED_MODULE_2__src_js_lib_drag_selector1d__[\"a\" /* default */]({\n      itemCount: products.length,\n      width: width,\n      slidesPerView: slidesPerConveyorView,\n      onDragStart: onDragStart,\n      onDragMove: onDragMove,\n      onSelection: onProductSelection,\n      children: this.productSlides.map(function (slide) {\n        return slide.getElement();\n      })\n    });\n\n    this.element = createElement({\n      classList: [\"product-conveyor\"],\n      style: { height: this.slideWidth + \"px\" },\n      children: [this.dragSelector.getElement(), {\n        classList: [\"center-frame\"],\n        style: Object.assign({\n          width: this.slideWidth + \"px\",\n          height: this.slideWidth + \"px\"\n        }, this.activeSlideStyle)\n      }]\n    });\n\n    this.nudgeInteractionCue = new __WEBPACK_IMPORTED_MODULE_4__src_js_lib_nudge_interaction_cue__[\"a\" /* default */]({\n      nudgeType: interactionCueType,\n      intervalMS: interactionCueInterval,\n      interactionCueHand: interactionCueHand,\n      flickInteractionCueHand: flickInteractionCueHand,\n      nudger: this.dragSelector\n    });\n  }\n\n  _createClass(ProductConveyor, [{\n    key: \"getElement\",\n    value: function getElement() {\n      return this.element;\n    }\n  }, {\n    key: \"setHandForSlide\",\n    value: function setHandForSlide(slideIndex) {\n      // NOTE(Casey): We position the hand to the right to avoid interfering with the center frame. The hand\n      // won't appear for the last image.\n      var slide = this.productSlides[slideIndex + 1];\n      if (slide == null) return;\n\n      slide.setInteractionCueHand(this.interactionCueHand);\n    }\n  }, {\n    key: \"startInteractionCue\",\n    value: function startInteractionCue() {\n      this.nudgeInteractionCue.start();\n    }\n  }, {\n    key: \"stopInteractionCue\",\n    value: function stopInteractionCue() {\n      this.nudgeInteractionCue.stop();\n    }\n  }, {\n    key: \"setIndex\",\n    value: function setIndex(index) {\n      this.currentIndex = index;\n      this.dragSelector.setIndex(index);\n      this.setHandForSlide(index);\n    }\n  }]);\n\n  return ProductConveyor;\n}();\n\nComponent.register(\"dynamic-conveyor-carousel\", function (_Component) {\n  _inherits(DynamicConveyorCarousel, _Component);\n\n  function DynamicConveyorCarousel(config) {\n    _classCallCheck(this, DynamicConveyorCarousel);\n\n    var _this3 = _possibleConstructorReturn(this, (DynamicConveyorCarousel.__proto__ || Object.getPrototypeOf(DynamicConveyorCarousel)).call(this, config));\n\n    _this3.hasDragSelected = false;\n    _this3.currentProductIndex = 0;\n    _this3.products = _this3.config.useStaticProducts ? _this3.config.products : range(0, _this3.config.productCount).map(function () {\n      return window.Madlib.getNextProduct();\n    }).filter(function (rawProduct) {\n      return rawProduct != null;\n    }).map(function (rawProduct) {\n      return {\n        id: rawProduct.id,\n        imageURL: rawProduct.image_url,\n        normalPrice: rawProduct.display_price,\n        specialPrice: rawProduct.special_display_price,\n        title: rawProduct.title,\n        description: rawProduct.description\n      };\n    });\n\n    _this3.autoTransitionScheduler = new __WEBPACK_IMPORTED_MODULE_5__src_js_lib_scheduler__[\"a\" /* default */]({\n      intervalMS: _this3.config.autoScrollDelayMS,\n      callback: _this3._handleAutoTransition.bind(_this3)\n    });\n    return _this3;\n  }\n\n  _createClass(DynamicConveyorCarousel, [{\n    key: \"load\",\n    value: function load() {\n      var allImageURLs = this.products.map(function (_ref8) {\n        var imageURL = _ref8.imageURL;\n        return imageURL;\n      }).concat([this.config.customHandImage]).filter(function (url) {\n        return url != null;\n      });\n\n      return Promise.all(allImageURLs.map(function (imageURL) {\n        return loadImage(imageURL);\n      }));\n    }\n  }, {\n    key: \"layout\",\n    value: function layout(parentNode) {\n      var _this4 = this;\n\n      _get(DynamicConveyorCarousel.prototype.__proto__ || Object.getPrototypeOf(DynamicConveyorCarousel.prototype), \"layout\", this).call(this, parentNode);\n\n      empty(this.parentNode);\n\n      if (this.products.length === 0) return;\n\n      this.el = createElement({ classList: [\"dynamic-conveyor-carousel\"] });\n\n      this.parentNode.appendChild(this.el);\n\n      var boundingClientRect = this.el.getBoundingClientRect();\n      var isCarouselInteractive = this.config.carouselInteractionCue != null && this.config.carouselInteractionCue !== INTERACTION_CUE_TYPE_NONE;\n      var isConveyorInteractive = this.config.conveyorInteractionCue != null && this.config.conveyorInteractionCue !== INTERACTION_CUE_TYPE_NONE;\n\n      this.interactionCueHand = this.config.showInteractionCueHand && (this.config.useAutoScroll || isCarouselInteractive || isConveyorInteractive) ? new __WEBPACK_IMPORTED_MODULE_3__src_js_lib_interaction_cue__[\"a\" /* default */](this.config.customHandImage, this.config.interactionCueHandStyle) : null;\n\n      var productImageSizing = this.config.productImageSizing === \"fill\" ? \"100% 100%\" : this.config.productImageSizing;\n\n      // TODO(cory) Eliminate `attachHandToSlides` if we standardize flick-with-nudge.\n      var attachHandToSlides = !this.config.useAutoScroll && !this.config.flickInteractionCueHand;\n\n      this.carousel = new ProductCarousel({\n        products: this.products,\n        width: boundingClientRect.width,\n        onDragStart: function onDragStart() {\n          return _this4._handleDragStart();\n        },\n        onDragMove: function onDragMove() {\n          return _this4._stopInteractionCues();\n        },\n        onProductClick: function onProductClick(e, index) {\n          return _this4._handleProductClick(e, index);\n        },\n        dragAnywhere: this.config.dragAnywhere,\n        onProductSelection: function onProductSelection(index) {\n          return _this4._handleProductSelection(index);\n        },\n        interactionCueType: this.config.carouselInteractionCue,\n        interactionCueInterval: this.config.interactionCueInterval,\n        interactionCueHand: isCarouselInteractive ? this.interactionCueHand : null,\n        flickInteractionCueHand: this.config.flickInteractionCueHand,\n        attachHandToSlides: attachHandToSlides,\n        productSlideConfig: {\n          productImageStyle: this.config.productImageStyle,\n          productContainerStyle: this.config.productContainerStyle,\n          productImageSizing: productImageSizing,\n          shouldAnimatePrice: this.config.shouldAnimatePrice,\n\n          // Price\n          showPrices: this.config.showPrices,\n          mainPriceStyle: this.config.mainPriceStyle,\n          overriddenPriceStyle: this.config.overriddenPriceStyle,\n          priceInfoConfig: {\n            containerStyle: this.config.priceContainerStyle,\n            prefixHTML: this.config.pricePrefix,\n            prefixStyle: this.config.pricePrefixStyle,\n            suffixHTML: this.config.priceSuffix,\n            suffixStyle: this.config.priceSuffixStyle\n          },\n\n          // Title\n          showTitle: this.config.showTitle,\n          titleTextStyle: this.config.titleTextStyle,\n          titleInfoConfig: {\n            containerStyle: this.config.titleStyle,\n            prefixHTML: this.config.titlePrefix,\n            prefixStyle: this.config.titlePrefixStyle,\n            suffixHTML: this.config.titleSuffix,\n            suffixStyle: this.config.titleSuffixStyle\n          },\n\n          // Description\n          showDescription: this.config.showDescription,\n          descriptionTextStyle: this.config.descriptionTextStyle,\n          descriptionInfoConfig: {\n            containerStyle: this.config.descriptionStyle,\n            prefixHTML: this.config.descriptionPrefix,\n            prefixStyle: this.config.descriptionPrefixStyle,\n            suffixHTML: this.config.descriptionSuffix,\n            suffixStyle: this.config.descriptionSuffixStyle\n          },\n\n          // Discount\n          showDiscount: this.config.showDiscount,\n          discountTextStyle: this.config.discountTextStyle,\n          discountInfoConfig: {\n            containerStyle: this.config.discountStyle,\n            prefixHTML: this.config.discountPrefix,\n            prefixStyle: this.config.discountPrefixStyle,\n            suffixHTML: this.config.discountSuffix,\n            suffixStyle: this.config.discountSuffixStyle\n          }\n        }\n      });\n\n      this.conveyor = new ProductConveyor({\n        productImageSizing: productImageSizing,\n        products: this.products,\n        width: boundingClientRect.width,\n        onDragStart: function onDragStart() {\n          return _this4._handleDragStart();\n        },\n        onDragMove: function onDragMove() {\n          return _this4._stopInteractionCues();\n        },\n        onProductSelection: function onProductSelection(index) {\n          return _this4._handleProductSelection(index);\n        },\n        interactionCueType: this.config.conveyorInteractionCue,\n        interactionCueInterval: this.config.interactionCueInterval,\n        interactionCueHand: isConveyorInteractive && !isCarouselInteractive && !this.config.useAutoScroll ? this.interactionCueHand : null,\n        flickInteractionCueHand: this.config.flickInteractionCueHand,\n        activeSlideStyle: this.config.activeConveyorSlideStyle\n      });\n\n      this.dotIndicator = new __WEBPACK_IMPORTED_MODULE_1__src_js_lib_dot_indicator__[\"a\" /* default */](this.products.length, {\n        containerStyle: this.config.dotsContainerStyle,\n        dotStyle: this.config.dotStyle,\n        activeDotStyle: this.config.activeDotStyle\n      });\n\n      var spacingPx = this.config.verticalSpacing == null ? DEFAULT_VERTICAL_SPACING : this.config.verticalSpacing + \"px\";\n      var makeSpacer = function makeSpacer() {\n        return createElement({\n          // This class name is included only to improve the interpretability of the DOM. No CSS is applied\n          // to this class.\n          classList: [\"liftoff-spacer\"],\n          style: { height: spacingPx }\n        });\n      };\n\n      appendChildren(this.el, [{\n        classList: [\"product-carousel-container\"],\n        children: [this.carousel.getElement(), !attachHandToSlides && this.interactionCueHand && this.interactionCueHand.getElement()]\n      }, makeSpacer(), this.config.showConveyor && this.conveyor.getElement(), makeSpacer(), this.config.showDots && {\n        classList: [\"product-dots\"],\n        children: [this.dotIndicator.getElement()]\n      }, this.config.showDots && makeSpacer()]);\n\n      // NOTE(Casey): firstProductIndex is a required parameter, but it was added in later iterations on this\n      // component. The null-check is for backwards compatibility.\n      var firstProductIndex = this.config.firstProductIndex === \"Auto\" || this.config.firstProductIndex == null ? Math.floor(this.products.length / 2 - 0.5) : // The parameter value is a 1-based index.\n      this.config.firstProductIndex - 1;\n\n      this._setProductIndex(firstProductIndex);\n    }\n  }, {\n    key: \"resize\",\n    value: function resize() {}\n  }, {\n    key: \"_startInteractionCues\",\n    value: function _startInteractionCues() {\n      this.carousel.startInteractionCue();\n      this.conveyor.startInteractionCue();\n    }\n  }, {\n    key: \"start\",\n    value: function start() {\n      if (this.products.length === 0) return;\n\n      if (this.config.useAutoScroll) {\n        this.autoTransitionScheduler.start();\n      } else {\n        this._startInteractionCues();\n      }\n    }\n  }, {\n    key: \"_stopInteractionCues\",\n    value: function _stopInteractionCues() {\n      this.carousel.stopInteractionCue();\n      this.conveyor.stopInteractionCue();\n    }\n  }, {\n    key: \"_stopAutoTransitions\",\n    value: function _stopAutoTransitions() {\n      this.autoTransitionScheduler.stop();\n      if (this.interactionCueHand != null && this.config.useAutoScroll) {\n        this.interactionCueHand.hide();\n      }\n    }\n  }, {\n    key: \"stop\",\n    value: function stop() {\n      if (this.products.length === 0) return;\n\n      this._stopAutoTransitions();\n      this._stopInteractionCues();\n    }\n  }, {\n    key: \"restart\",\n    value: function restart() {}\n  }, {\n    key: \"_transitionProductView\",\n    value: function _transitionProductView(indexDelta) {\n      var newIndex = (this.currentProductIndex + indexDelta + this.products.length) % this.products.length;\n\n      this._setProductIndex(newIndex);\n    }\n  }, {\n    key: \"_handleAutoTransition\",\n    value: function _handleAutoTransition() {\n      var _this5 = this;\n\n      if (!this.config.useAutoScroll) return;\n\n      if (this.interactionCueHand != null && this.currentProductIndex !== this.products.length - 1) {\n        this.interactionCueHand.flick({\n          onFlickReady: function onFlickReady() {\n            return _this5._transitionProductView(1);\n          },\n          flickDuration: Math.min(this.config.autoScrollDelayMS / 2, 900)\n        });\n      } else {\n        this._transitionProductView(1);\n      }\n    }\n  }, {\n    key: \"_updateGlobalProductIdParam\",\n    value: function _updateGlobalProductIdParam(productIndex) {\n      var product = this.products[productIndex];\n      if (product == null) return;\n\n      Liftoff.mergeClickParams({ pid: product.id });\n    }\n  }, {\n    key: \"_handleDragStart\",\n    value: function _handleDragStart() {\n      this.recordInteraction();\n      this._stopAutoTransitions();\n\n      if (!this.hasDragSelected) {\n        this._startInteractionCues();\n      }\n    }\n  }, {\n    key: \"_handleProductClick\",\n    value: function _handleProductClick(e, index) {\n      if (!(0 <= index && index < this.products.length)) return;\n\n      var product = this.products[index];\n      window.Madlib.handleNavigationClick(e, { pid: product.id });\n    }\n  }, {\n    key: \"_handleProductSelection\",\n    value: function _handleProductSelection(index) {\n      if (!(0 <= index && index < this.products.length)) return;\n\n      if (index !== this.currentProductIndex) {\n        this.hasDragSelected = true;\n        this._stopInteractionCues();\n      } else if (!this.hasDragSelected) {\n        this._startInteractionCues();\n      }\n\n      this._setProductIndex(index);\n    }\n  }, {\n    key: \"_setProductIndex\",\n    value: function _setProductIndex(index) {\n      this.currentProductIndex = index;\n\n      this.carousel.setIndex(index);\n      this.conveyor.setIndex(index);\n      this.dotIndicator.setIndex(index);\n\n      this._updateGlobalProductIdParam(index);\n    }\n  }]);\n\n  return DynamicConveyorCarousel;\n}(Component));\n\n/***/ }),\n\n/***/ 147:\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n\n/***/ 15:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Tween = function () {\n  _createClass(Tween, null, [{\n    key: \"Tween\",\n    value: function Tween(start, end, ease, f) {\n      f = Math.min(1, Math.max(0, f));\n      switch (typeof start === \"undefined\" ? \"undefined\" : _typeof(start)) {\n        case \"number\":\n          return start + (end - start) * ease(f);\n        case \"object\":\n          var value = {};\n          for (var k in start) {\n            value[k] = start[k] + (end[k] - start[k]) * ease(f);\n          }\n          return value;\n      }\n    }\n  }]);\n\n  function Tween(config) {\n    var _this = this;\n\n    _classCallCheck(this, Tween);\n\n    [\"startValue\", \"endValue\", \"durationMS\", \"easingFn\"].forEach(function (param) {\n      return _this[param] = config[param];\n    });\n  }\n\n  _createClass(Tween, [{\n    key: \"from\",\n    value: function from(startValue) {\n      this.startValue = startValue;\n      return this;\n    }\n  }, {\n    key: \"to\",\n    value: function to(endValue) {\n      this.endValue = endValue;\n      return this;\n    }\n  }, {\n    key: \"in\",\n    value: function _in(durationMS) {\n      this.durationMS = durationMS;\n      return this;\n    }\n  }, {\n    key: \"with\",\n    value: function _with(easingFn) {\n      this.easingFn = easingFn;\n      return this;\n    }\n\n    // Cannot use `performance.now()` here due to lack of browser support.\n\n  }, {\n    key: \"start\",\n    value: function start() {\n      var _this2 = this;\n\n      var callbackMap = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n      this.startTS = Date.now();\n      this.stopped = false;\n      var update = function update() {\n        if (_this2.stopped) return;\n        var currentValue = _this2.valueNow();\n        if (callbackMap.onUpdate) {\n          callbackMap.onUpdate(currentValue);\n        }\n        if (Date.now() - _this2.startTS <= _this2.durationMS) {\n          requestAnimationFrame(update);\n        } else if (callbackMap.onComplete) {\n          callbackMap.onComplete(currentValue);\n        }\n      };\n      requestAnimationFrame(update);\n      return this;\n    }\n  }, {\n    key: \"stop\",\n    value: function stop() {\n      this.stopped = true;\n      return this;\n    }\n  }, {\n    key: \"valueNow\",\n    value: function valueNow() {\n      return Tween.Tween(this.startValue, this.endValue, this.easingFn, (Date.now() - this.startTS) / this.durationMS);\n    }\n  }, {\n    key: \"valueAfterMS\",\n    value: function valueAfterMS(elapsed) {\n      return Tween.Tween(this.startValue, this.endValue, this.easingFn, elapsed / this.durationMS);\n    }\n  }, {\n    key: \"valueAfterFraction\",\n    value: function valueAfterFraction(f) {\n      return Tween.Tween(this.startValue, this.endValue, this.easingFn, f);\n    }\n  }]);\n\n  return Tween;\n}();\n\nTween.Easing = {\n  Linear: function Linear(f) {\n    return f;\n  },\n  EaseInSine: function EaseInSine(f) {\n    return 1 - Math.cos(f * Math.PI / 2);\n  },\n  EaseOutSine: function EaseOutSine(f) {\n    return Math.sin(f * Math.PI / 2);\n  },\n  EaseInOutSine: function EaseInOutSine(f) {\n    return (1 - Math.cos(f * Math.PI)) / 2;\n  },\n  EaseInQuad: function EaseInQuad(f) {\n    return Math.pow(f, 2);\n  },\n  EaseOutQuad: function EaseOutQuad(f) {\n    return f * (2 - f);\n  },\n  EaseInOutQuad: function EaseInOutQuad(f) {\n    f *= 2;\n    if (f < 1) {\n      return Math.pow(f, 2) / 2;\n    } else {\n      f -= 1;\n      return (1 - f * (f - 2)) / 2;\n    }\n  },\n  EaseInCubic: function EaseInCubic(f) {\n    return Math.pow(f, 3);\n  },\n  EaseOutCubic: function EaseOutCubic(f) {\n    return Math.pow(f - 1, 3) + 1;\n  },\n  EaseInOutCubic: function EaseInOutCubic(f) {\n    f *= 2;\n    if (f < 1) {\n      return Math.pow(f, 3) / 2;\n    } else {\n      return (Math.pow(f - 2, 3) + 2) / 2;\n    }\n  }\n};\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Tween);\n\n/***/ }),\n\n/***/ 19:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__scheduler__ = __webpack_require__(5);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\nvar nudgeTypeToPx = {\n  \"nudge-up\": 20,\n  \"nudge-down\": -20,\n  \"nudge-left\": -20,\n  \"nudge-right\": 20\n};\nvar getNudgeOffsetPx = function getNudgeOffsetPx(nudgeType) {\n  return nudgeTypeToPx[nudgeType] || 0;\n};\n\nvar NudgeInteractionCue = function () {\n  function NudgeInteractionCue(_ref) {\n    var nudgeType = _ref.nudgeType,\n        intervalMS = _ref.intervalMS,\n        _ref$interactionCueHa = _ref.interactionCueHand,\n        interactionCueHand = _ref$interactionCueHa === undefined ? null : _ref$interactionCueHa,\n        flickInteractionCueHand = _ref.flickInteractionCueHand,\n        nudger = _ref.nudger,\n        _ref$horizontalCarous = _ref.horizontalCarousel,\n        horizontalCarousel = _ref$horizontalCarous === undefined ? true : _ref$horizontalCarous,\n        _ref$conveyorBorderTr = _ref.conveyorBorderTransition,\n        conveyorBorderTransition = _ref$conveyorBorderTr === undefined ? false : _ref$conveyorBorderTr;\n\n    _classCallCheck(this, NudgeInteractionCue);\n\n    this.interactionCueHand = interactionCueHand;\n\n    var offset = getNudgeOffsetPx(nudgeType);\n\n    this.scheduler = offset !== 0 ? new __WEBPACK_IMPORTED_MODULE_0__scheduler__[\"a\" /* default */]({\n      intervalMS: intervalMS,\n      callback: function callback() {\n        var flickDuration = Math.min(intervalMS / 2, 900);\n        if (interactionCueHand != null && flickInteractionCueHand) {\n          interactionCueHand.flick({\n            onFlickReady: function onFlickReady() {\n              // NOTE(cory) We choose not to wait on the nudge promise so the animations play in parallel.\n              nudger.nudge({\n                offset: offset,\n                durationMS: intervalMS / 2,\n                conveyorBorderTransition: conveyorBorderTransition\n              });\n            },\n            flickDistance: offset,\n            flickRotation: 10,\n            flickDuration: flickDuration,\n            xOrY: horizontalCarousel ? \"X\" : \"Y\"\n          });\n        } else {\n          // NOTE(cory) Wait for this timeout to sync nudges between carousel and conveyor.\n          // Unfortunately, this is coupled to the implementation of flick, and the amount of\n          // time it takes to call its `onFlickReady` argument.\n          new Promise(function (resolve) {\n            setTimeout(resolve, flickDuration / 2);\n          }).then(function () {\n            nudger.nudge({\n              offset: offset,\n              durationMS: intervalMS / 2,\n              conveyorBorderTransition: conveyorBorderTransition\n            });\n          });\n        }\n      }\n    }) : null;\n  }\n\n  _createClass(NudgeInteractionCue, [{\n    key: \"start\",\n    value: function start() {\n      if (this.scheduler != null) {\n        this.scheduler.start();\n      }\n      if (this.interactionCueHand != null) {\n        this.interactionCueHand.show();\n      }\n    }\n  }, {\n    key: \"stop\",\n    value: function stop() {\n      if (this.scheduler != null) {\n        this.scheduler.stop();\n      }\n      if (this.interactionCueHand != null) {\n        this.interactionCueHand.hide();\n      }\n    }\n  }]);\n\n  return NudgeInteractionCue;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (NudgeInteractionCue);\n\n/***/ }),\n\n/***/ 31:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return makeCurrencyFormatter; });\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar isDigit = function isDigit(char) {\n  return char >= \"0\" && char <= \"9\";\n};\n\n/**\n * Given an \"example\" currency string, returns a function that takes an integer\n * argument and returns the integer formatted in the same way as the example.\n * E.g.,\n *\n * const formatter = makeCurrencyFormatter(\"$1,234.56\");\n * formatter(9876543210) // => $98,765,432.10\n * formatter(0) // => $0.00\n * formatter(321) // => $3.21\n *\n * Assumes:\n *   1) There are either 0 or 2 decimal places.\n *   2) Every third digit may be separated by a consistent separator.\n *   3) The only characters between the first digit and the last digit are\n *      either a digit, the decimal separator, or the group separator.\n *   4) Any characters before the first digit or after the last digit should\n *      appear in any properly formatted string.\n *\n * Returns 'null' if the example string cannot be parsed according to the above\n * assumptions.\n */\n\n// eslint-disable-next-line\nvar makeCurrencyFormatter = function makeCurrencyFormatter(baseStr) {\n  var numericChars = [].concat(_toConsumableArray(baseStr));\n  var prefixStr = \"\";\n  while (numericChars.length !== 0 && !isDigit(numericChars[0])) {\n    prefixStr = \"\" + prefixStr + numericChars.shift();\n  }\n\n  var suffixStr = \"\";\n  while (numericChars.length !== 0 && !isDigit(numericChars[numericChars.length - 1])) {\n    suffixStr = \"\" + numericChars.pop() + suffixStr;\n  }\n\n  var decimalSeparator = numericChars[numericChars.length - 3];\n  if (isDigit(decimalSeparator)) {\n    decimalSeparator = null;\n  }\n\n  var groupSeparatorIndex = decimalSeparator == null ? numericChars.length - 4 : numericChars.length - 7;\n\n  var groupSeparator = numericChars[groupSeparatorIndex];\n  if (isDigit(groupSeparator)) {\n    groupSeparator = null;\n  }\n\n  if (numericChars.length === 0) {\n    return null;\n  }\n\n  // Check that the character at each position is of the expected class.\n  var decimalPosition = decimalSeparator == null ? numericChars.length : numericChars.length - 3;\n\n  var shouldBeGroupSeparator = function shouldBeGroupSeparator(charIndex) {\n    var charsFromDecimal = decimalPosition - charIndex;\n    return groupSeparator != null && charIndex !== 0 && charsFromDecimal > 0 && charsFromDecimal % 4 === 0;\n  };\n\n  var shouldBeDecimalSeparator = function shouldBeDecimalSeparator(charIndex) {\n    return decimalSeparator != null && charIndex === numericChars.length - 3;\n  };\n\n  for (var i = 0; i < numericChars.length; i++) {\n    var char = numericChars[i];\n    var charShouldBeGroupSeparator = shouldBeGroupSeparator(i);\n    var charShouldBeDecimalSeparator = shouldBeDecimalSeparator(i);\n    if (charShouldBeGroupSeparator && char !== groupSeparator || charShouldBeDecimalSeparator && char !== decimalSeparator || !charShouldBeGroupSeparator && !charShouldBeDecimalSeparator && !isDigit(char)) {\n      return null;\n    }\n  }\n\n  return function (intToFormat) {\n    var strToFormat = String(intToFormat);\n    if (decimalSeparator != null && strToFormat.length < 3) {\n      var zerosNeeded = 3 - strToFormat.length;\n      var zeroPadding = \"0\".repeat(zerosNeeded);\n      strToFormat = \"\" + zeroPadding + strToFormat;\n    }\n\n    var formattedDigits = [].concat(_toConsumableArray(strToFormat)).reverse().reduce(function (reversedFormatted, digitChar, digitIndex) {\n      var digitsBeforeDecimalCount = decimalSeparator == null ? digitIndex : digitIndex - 2;\n\n      if (digitIndex === 2 && decimalSeparator != null) {\n        reversedFormatted.push(decimalSeparator);\n      } else if (digitsBeforeDecimalCount > 0 && digitsBeforeDecimalCount % 3 === 0 & groupSeparator != null) {\n        reversedFormatted.push(groupSeparator);\n      }\n\n      reversedFormatted.push(digitChar);\n      return reversedFormatted;\n    }, []).reverse().join(\"\");\n\n    return \"\" + prefixStr + formattedDigits + suffixStr;\n  };\n};\n\n/***/ }),\n\n/***/ 32:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dragger1d__ = __webpack_require__(14);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\nvar _Liftoff = Liftoff,\n    clamp = _Liftoff.Utils.clamp;\n\nvar DragSelector1D = function () {\n  function DragSelector1D(_ref) {\n    var _this = this;\n\n    var itemCount = _ref.itemCount,\n        width = _ref.width,\n        height = _ref.height,\n        slidesPerView = _ref.slidesPerView,\n        onDragStart = _ref.onDragStart,\n        onDragMove = _ref.onDragMove,\n        _ref$onClick = _ref.onClick,\n        _onClick = _ref$onClick === undefined ? function () {} : _ref$onClick,\n        _ref$dragAnywhere = _ref.dragAnywhere,\n        dragAnywhere = _ref$dragAnywhere === undefined ? false : _ref$dragAnywhere,\n        _ref$onSelection = _ref.onSelection,\n        onSelection = _ref$onSelection === undefined ? function () {} : _ref$onSelection,\n        _ref$transitionMS = _ref.transitionMS,\n        transitionMS = _ref$transitionMS === undefined ? 500 : _ref$transitionMS,\n        children = _ref.children,\n        _ref$horizontalCarous = _ref.horizontalCarousel,\n        horizontalCarousel = _ref$horizontalCarous === undefined ? true : _ref$horizontalCarous,\n        _ref$carouselSnapsToS = _ref.carouselSnapsToScreen,\n        carouselSnapsToScreen = _ref$carouselSnapsToS === undefined ? true : _ref$carouselSnapsToS,\n        conveyorImagesTransition = _ref.conveyorImagesTransition,\n        forConveyor = _ref.forConveyor,\n        activeSlideStyle = _ref.activeSlideStyle;\n\n    _classCallCheck(this, DragSelector1D);\n\n    this.itemCount = itemCount;\n    this.width = width;\n    this.height = height;\n\n    this.slideWidth = width / slidesPerView;\n    this.slideHeight = height / slidesPerView;\n\n    this.widthOrHeight = horizontalCarousel || forConveyor ? this.width : this.height;\n    this.slideWidthOrHeight = horizontalCarousel || forConveyor ? this.slideWidth : this.slideHeight;\n    // explicitly using 'false' for backwards compatibility\n    this.minDivisor = carouselSnapsToScreen === false ? 10 : 2;\n    this.maxDivisor = carouselSnapsToScreen === false ? 1 : 2;\n    this.dragger = new __WEBPACK_IMPORTED_MODULE_0__dragger1d__[\"a\" /* default */]({\n      horizontalCarousel: horizontalCarousel,\n      carouselSnapsToScreen: carouselSnapsToScreen,\n      conveyorImagesTransition: conveyorImagesTransition,\n      activeSlideStyle: activeSlideStyle,\n      slideWidth: this.slideWidth,\n      slideHeight: this.slideHeight,\n      widthOrHeight: this.widthOrHeight,\n      itemCount: itemCount,\n      bounds: {\n        min: -this.widthOrHeight / this.minDivisor,\n        max: -this.widthOrHeight / this.maxDivisor + this.slideWidthOrHeight * itemCount\n      },\n      onDragStart: onDragStart,\n      onDragMove: onDragMove,\n      onDragEnd: function onDragEnd(state) {\n        if (state.hasDragMoved) {\n          onSelection(_this._getNearestIndex(state));\n        }\n      },\n      onClick: function onClick(e, state) {\n        _onClick(e, _this._getNearestIndex(state));\n      },\n      dragAnywhere: dragAnywhere,\n      transitionMS: transitionMS,\n      children: children,\n      forConveyor: forConveyor\n    });\n  }\n\n  _createClass(DragSelector1D, [{\n    key: \"getElement\",\n    value: function getElement() {\n      return this.dragger.getElement();\n    }\n  }, {\n    key: \"getFrameElement\",\n    value: function getFrameElement() {\n      return this.dragger.getFrameElement();\n    }\n  }, {\n    key: \"nudge\",\n    value: function nudge() {\n      var _dragger;\n\n      return (_dragger = this.dragger).nudge.apply(_dragger, arguments);\n    }\n  }, {\n    key: \"setIndex\",\n    value: function setIndex(index) {\n      var position = -this.widthOrHeight / 2 + (index + 0.5) * this.slideWidthOrHeight;\n      this.dragger.setBasePosition(position);\n      this.dragger.resetPosition(index);\n    }\n  }, {\n    key: \"_getNearestIndex\",\n    value: function _getNearestIndex(dragState) {\n      return clamp(Math.floor(((this.widthOrHeight - this.slideWidthOrHeight) / 2 + dragState.currentDragPosition) / this.slideWidthOrHeight + // Find the left edge of the nearest product view.\n      0.5 + // Align with the center on a scale of 0 to 1.\n      0.3 * Math.sign(dragState.dragDelta)\n      // The drag direction (`dragDelta`) shows some user intent.\n      // The product view in the forward direction is treated as being closer.\n      ), 0, this.itemCount - 1);\n    }\n  }]);\n\n  return DragSelector1D;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (DragSelector1D);\n\n/***/ }),\n\n/***/ 33:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__interaction_cue_hand_png__ = __webpack_require__(34);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\nvar _Liftoff = Liftoff,\n    _Liftoff$DOMUtils = _Liftoff.DOMUtils,\n    createElement = _Liftoff$DOMUtils.createElement,\n    runTransitionSequence = _Liftoff$DOMUtils.runTransitionSequence;\n\nvar InteractionCue = function () {\n  function InteractionCue(cueImageURL) {\n    var style = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n    _classCallCheck(this, InteractionCue);\n\n    this.el = createElement({\n      classList: [\"liftoff-interaction-cue-hand\", \"interaction-cue-hand-style\"],\n      style: style,\n      children: [createElement({\n        style: {\n          backgroundImage: \"url(\" + (cueImageURL || __WEBPACK_IMPORTED_MODULE_0__interaction_cue_hand_png__[\"a\" /* default */]) + \")\",\n          backgroundSize: \"contain\",\n          backgroundRepeat: \"no-repeat\",\n          pointerEvents: \"none\",\n          width: \"100%\",\n          height: \"100%\"\n        }\n      })]\n    });\n  }\n\n  _createClass(InteractionCue, [{\n    key: \"getElement\",\n    value: function getElement() {\n      return this.el;\n    }\n  }, {\n    key: \"hide\",\n    value: function hide() {\n      this.el.style.display = \"none\";\n    }\n  }, {\n    key: \"show\",\n    value: function show() {\n      this.el.style.display = \"block\";\n    }\n\n    /**\n     * Triggers a finger \"flick\" animation. The finger moves `flickDistance` px and rotates `flickRotation` deg\n     * to the right from its base position; `onFlickReady` is then called; the finger moves back to the left,\n     * overshooting its base position by `flickDistance / 2` px and `flickRotation / 2` deg; then the finger\n     * moves back to its base position. The entire animation is completed in `flickDuration` ms. If\n     * `flickDistance` is negative, the finger flicks in the other direction. `flickGrowth` controls\n     * the maximum fractional increase in the size of hand during the \"wind-up\" phase, increasing the\n     * impression of the finger being lifted from the screen.\n     */\n\n  }, {\n    key: \"flick\",\n    value: function flick(_ref) {\n      var _ref$onFlickReady = _ref.onFlickReady,\n          onFlickReady = _ref$onFlickReady === undefined ? function () {\n        return null;\n      } : _ref$onFlickReady,\n          _ref$flickDistance = _ref.flickDistance,\n          flickDistance = _ref$flickDistance === undefined ? -50 : _ref$flickDistance,\n          _ref$flickRotation = _ref.flickRotation,\n          flickRotation = _ref$flickRotation === undefined ? 20 : _ref$flickRotation,\n          _ref$flickDuration = _ref.flickDuration,\n          flickDuration = _ref$flickDuration === undefined ? 900 : _ref$flickDuration,\n          _ref$flickGrowth = _ref.flickGrowth,\n          flickGrowth = _ref$flickGrowth === undefined ? 0.1 : _ref$flickGrowth,\n          _ref$xOrY = _ref.xOrY,\n          xOrY = _ref$xOrY === undefined ? \"X\" : _ref$xOrY;\n\n      return runTransitionSequence(this.el, [{\n        transition: \"transform \" + flickDuration / 4 + \"ms\",\n        transitionTimingFunction: \"ease-in\",\n        transform: \"translate\" + xOrY + \"(\" + -flickDistance + \"px) \" + (\"rotate(\" + Math.sign(flickDistance) * -flickRotation + \"deg) \") + (\"scale(\" + (1 + flickGrowth) + \")\")\n      }, {\n        transform: null\n      }, onFlickReady, {\n        transform: \"translate\" + xOrY + \"(\" + flickDistance / 2 + \"px) \" + (\"rotate(\" + Math.sign(flickDistance) * flickRotation / 2 + \"deg) \") + (\"scale(\" + (1 + 0.5 * flickGrowth) + \")\"),\n        transitionTimingFunction: \"ease-out\"\n      }, {\n        transform: null,\n        transitionTimingFunction: \"linear\"\n      }, {\n        transition: null,\n        transform: null\n      }]);\n    }\n  }]);\n\n  return InteractionCue;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (InteractionCue);\n\n/***/ }),\n\n/***/ 34:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* eslint-disable-next-line */\nvar handImageData = \"data:image/png;base64,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\";\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (handImageData);\n\n/***/ }),\n\n/***/ 5:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n// NOTE(cory) `Scheduler` runs a function on an interval, which can be started, stopped, and restarted\n// at any time. Starting a scheduler when it's already running has no effect.\n\nvar Scheduler = function () {\n  /**\n   * When `leading === true`, the callback is executed on the leading edge of the interval, as well as on\n   * the trailing edge.\n   */\n  function Scheduler(_ref) {\n    var intervalMS = _ref.intervalMS,\n        callback = _ref.callback,\n        _ref$leading = _ref.leading,\n        leading = _ref$leading === undefined ? false : _ref$leading;\n\n    _classCallCheck(this, Scheduler);\n\n    this.intervalMS = intervalMS;\n    this.callback = callback;\n    this.leading = leading;\n\n    this.isActive = false;\n    this.intervalID = null;\n  }\n\n  _createClass(Scheduler, [{\n    key: \"start\",\n    value: function start() {\n      var _this = this;\n\n      if (this.isActive) return;\n\n      if (this.leading) {\n        this.callback();\n      }\n\n      this.isActive = true;\n      this.intervalID = setInterval(function () {\n        if (_this.isActive) _this.callback();\n      }, this.intervalMS);\n    }\n  }, {\n    key: \"stop\",\n    value: function stop() {\n      this.isActive = false;\n      if (this.intervalID != null) {\n        clearInterval(this.intervalID);\n        this.intervalID = null;\n      }\n    }\n  }]);\n\n  return Scheduler;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Scheduler);\n\n/***/ })\n\n/******/ });\n\n\n// WEBPACK FOOTER //\n// dynamic-conveyor-carousel-ac259dd6080f85168d62.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 145);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 49e3f4ed5eed6f7b6fe0","const {\n  DOMUtils: { createElement, replaceStyle },\n  Utils: { range },\n} = Liftoff;\n\nexport default class DotIndicator {\n  constructor(\n    count,\n    {\n      containerStyle,\n      dotStyle,\n      activeDotStyle,\n      horizontalCarousel,\n      dotsTopOrBottom = false,\n    }\n  ) {\n    this.count = count;\n    this.currentIndex = 0;\n    this.dotStyle = dotStyle;\n    this.activeDotStyle = activeDotStyle;\n    if (!this.activeDotStyle) {\n      this.activeDotStyle = {\n        background: \"#999\",\n      };\n    }\n    this.horizontalCarousel = horizontalCarousel;\n    this.verticalCarousel = horizontalCarousel === false; // explicitly using 'false' for backwards compatibility\n\n    this.dotsClasses = [\"dots\"];\n    this.dotClasses = [\"dot\"];\n    if (horizontalCarousel) {\n      this.dotsClasses.push(\"dots-horizontal-style\");\n      this.dotClasses.push(\"dot-style\");\n    } else if (this.verticalCarousel) {\n      this.dotsClasses.push(dotsTopOrBottom || \"dots-vertical-style-top\");\n      this.dotClasses.push(\"dot-style\");\n    }\n\n    this.dotElements = range(0, count).map(() =>\n      createElement({\n        classList: this.dotClasses,\n        style: dotStyle,\n      })\n    );\n\n    this.element = createElement({\n      classList: this.dotsClasses,\n      children: this.dotElements,\n      style: containerStyle,\n    });\n\n    this.setIndex(0);\n  }\n\n  getElement() {\n    return this.element;\n  }\n\n  setIndex(newIndex) {\n    if (!(0 <= newIndex && newIndex < this.count)) return;\n\n    const oldDotElement = this.dotElements[this.currentIndex];\n    replaceStyle(oldDotElement, this.dotStyle);\n    oldDotElement.classList.remove(\"active\");\n\n    this.currentIndex = newIndex;\n\n    const newDotElement = this.dotElements[this.currentIndex];\n    replaceStyle(newDotElement, this.dotStyle, this.activeDotStyle);\n    newDotElement.classList.add(\"active\");\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/lib/dot_indicator.js","const {\n  DOMUtils: { createElement, off, on, transitionEndPromise },\n  Utils: { clamp },\n} = Liftoff;\n\nexport default class Dragger1D {\n  constructor({\n    isEnabled = true,\n    bounds: { min, max },\n    onDragStart = () => {},\n    onDragMove = () => {},\n    onDragEnd = () => {},\n    onClick = () => {},\n    dragAnywhere = false,\n    transitionMS = 500,\n    children,\n    horizontalCarousel = true,\n    carouselSnapsToScreen = true,\n    conveyorImagesTransition,\n    forConveyor = false,\n    slideWidth,\n    itemCount,\n  }) {\n    this.itemCount = itemCount;\n    this.baseSlidePosition = false;\n    this.baseFramePosition = false;\n    this.isEnabled = isEnabled;\n    this.forConveyor = forConveyor;\n    this.horizontalCarousel = horizontalCarousel;\n    this.carouselSnapsToScreen = carouselSnapsToScreen;\n    this.conveyorImagesTransition = conveyorImagesTransition;\n    this.onDragStart = onDragStart;\n    this.onDragMove = onDragMove;\n    this.onDragEnd = onDragEnd;\n    this.onClick = onClick;\n    this.transitionMS = transitionMS;\n    this.slideWidth = slideWidth;\n\n    this.basePosition = 0;\n    this.oldTransitionStyle = null;\n    this.defaultStyle = {\n      position: \"absolute\",\n      top: \"0\",\n      left: \"0\",\n      right: \"0\",\n      bottom: \"0\",\n      transition: `transform ${transitionMS}ms ease-out`,\n    };\n\n    this.element = createElement({\n      style: this.defaultStyle,\n      children,\n    });\n\n    this.frameElement = createElement({\n      classList: [\"center-frame\"],\n      style: {\n        width: `${slideWidth}px`,\n        height: `${slideWidth}px`,\n        ...this.defaultStyle,\n        ...this.activeSlideStyle,\n      },\n    });\n\n    this.axis = this.horizontalCarousel || this.forConveyor ? \"X\" : \"Y\";\n\n    this.setBounds({ min, max });\n\n    this.resetPosition();\n\n    const dragStartEvents = {\n      \"mousedown touchstart\": (e) => this._onStart(e),\n    };\n    this._elementEvents = {\n      ...(dragAnywhere ? {} : dragStartEvents),\n      click: (e) => this._onClick(e),\n    };\n    this._windowEvents = {\n      ...(dragAnywhere ? dragStartEvents : {}),\n      \"mousemove touchmove\": (e) => this._onMove(e),\n      \"mouseup touchend mouseleave touchleave\": (e) => this._onEnd(e),\n    };\n\n    on(this.element, this._elementEvents);\n    on(window, this._windowEvents);\n  }\n\n  getElement() {\n    return this.element;\n  }\n\n  getFrameElement() {\n    return this.frameElement;\n  }\n\n  resetPosition(index) {\n    this._resetState();\n    this._setElementPosition(this.basePosition, index);\n  }\n\n  setBasePosition(newBasePosition) {\n    this.basePosition = newBasePosition;\n  }\n\n  setBaseFramePosition(position) {\n    const baseFramePositionUnuset = !this.baseFramePosition && position !== 0;\n    if (baseFramePositionUnuset) {\n      this.baseFramePosition = this.framePosition;\n    }\n  }\n\n  setBounds({ min = -Infinity, max = Infinity }) {\n    this.min = min;\n    this.max = max;\n  }\n\n  nudge({ offset = 0, durationMS = 1000, conveyorBorderTransition = false }) {\n    this.elementToNudge = conveyorBorderTransition\n      ? this.frameElement\n      : this.element;\n\n    const newPosition = conveyorBorderTransition\n      ? -this.framePosition - offset\n      : this.basePosition - offset;\n\n    const oldTransition = this.elementToNudge.style.transition;\n\n    // NOTE(cory) Divide `durationMS` by 2 because the transition should play out twice.\n    this.elementToNudge.style.transition = `transform ${\n      durationMS / 2\n    }ms ease-out`;\n\n    this._setElementPosition(newPosition, false);\n    return transitionEndPromise(this.elementToNudge, { matchTarget: true })\n      .then(() => {\n        const oldPosition = conveyorBorderTransition\n          ? -this.baseFramePosition\n          : this.basePosition;\n        this._setElementPosition(oldPosition, false);\n        return transitionEndPromise(this.elementToNudge, { matchTarget: true });\n      })\n      .finally(() => {\n        this.elementToNudge.style.transition = oldTransition;\n      });\n  }\n\n  clean() {\n    off(this.element, this._elementEvents);\n    off(window, this._windowEvents);\n  }\n\n  _resetState() {\n    this.isDragging = false;\n    if (!this.carouselSnapsToScreen && this.dragDelta) {\n      this.basePosition = clamp(this.dragDelta, this.min, this.max);\n    } else {\n      this.dragStartPosition = null;\n      this.dragDelta = null;\n    }\n    this.baseFramePosition = this.setBaseFramePosition(this.basePosition);\n    this.hasDragMoved = false;\n  }\n\n  _setFramePosition(position, index) {\n    const moveFramePosition =\n      this.forConveyor && !this.conveyorImagesTransition;\n    if (moveFramePosition) {\n      // Fix frame position being offset when < 5 products and <= 2 products\n      const notNudgingFrame = index !== false;\n      if (notNudgingFrame) {\n        if (this.itemCount < 5) {\n          index++;\n        }\n        if (this.itemCount <= 2) {\n          index++;\n        }\n      }\n\n      this.framePosition = notNudgingFrame\n        ? this.slideWidth / 2 + this.slideWidth * index\n        : -position;\n\n      this.frameElement.style.transform = `translate${this.axis}(${this.framePosition}px)`;\n      this.setBaseFramePosition(position);\n    }\n  }\n\n  _setElementPosition(position, index) {\n    this._setFramePosition(position, index);\n\n    const movingImagePosition =\n      this.conveyorImagesTransition ||\n      !this.forConveyor ||\n      !this.baseSlidePosition;\n    if (movingImagePosition) {\n      this.baseSlidePosition =\n        position !== 0 ? -position : this.baseSlidePosition;\n\n      this.element.style.transform = `translate${this.axis}(${-position}px)`;\n    }\n  }\n\n  _onStart(e) {\n    if (this.isDragging || !this.isEnabled) return;\n\n    // NOTE(cory) Stopping this propagation allows nested dragger targets.  This is necessary when\n    // any dragger uses `dragAnywhere` while another dragger exists.\n    e.stopPropagation();\n\n    const pointerEvent = e.touches != null ? e.touches[0] : e;\n\n    this.isDragging = true;\n    this.dragStartPosition = this.horizontalCarousel\n      ? pointerEvent.clientX\n      : pointerEvent.clientY;\n    this.dragDelta = 0;\n    this.hasDragMoved = false;\n\n    if (this.oldTransitionStyle == null) {\n      this.oldTransitionStyle = this.element.style.transition;\n      this.element.style.transition = \"none\";\n    }\n\n    this.onDragStart(this._getState());\n  }\n\n  _onMove(e) {\n    if (!this.isDragging) return;\n\n    this.element.style.pointerEvents = \"none\";\n\n    const pointerEvent = e.touches != null ? e.touches[0] : e;\n    this.dragMoved = this.horizontalCarousel\n      ? pointerEvent.clientX\n      : pointerEvent.clientY;\n    this.dragDelta = this.dragStartPosition - this.dragMoved;\n    if (!this.carouselSnapsToScreen && this.basePosition && !this.forConveyor) {\n      this.dragDelta = this.basePosition + this.dragDelta;\n    }\n    this.hasDragMoved = true;\n\n    const state = this._getState();\n\n    this._setElementPosition(state.currentDragPosition);\n\n    this.onDragMove(state);\n  }\n\n  _onEnd() {\n    if (!this.isDragging) return;\n\n    this.element.style.pointerEvents = null;\n\n    const state = this._getState();\n\n    this._resetState();\n\n    if (this.oldTransitionStyle != null) {\n      this.element.style.transition = this.oldTransitionStyle;\n      this.oldTransitionStyle = null;\n    }\n\n    this.onDragEnd(state);\n  }\n\n  _onClick(e) {\n    const state = this._getState();\n    if (state.hasDragMoved) return;\n\n    this.onClick(e, state);\n  }\n\n  _getState() {\n    const dragPosition = this.carouselSnapsToScreen\n      ? this.basePosition + this.dragDelta\n      : this.dragDelta;\n    return {\n      currentDragPosition: clamp(dragPosition, this.min, this.max),\n      dragStartPosition: this.dragStartPosition,\n      dragDelta: this.dragDelta,\n      hasDragMoved: this.hasDragMoved,\n    };\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/lib/dragger1d.js","import { makeCurrencyFormatter } from \"../../src/js/lib/currency\";\nimport DotIndicator from \"../../src/js/lib/dot_indicator\";\nimport DragSelector1D from \"../../src/js/lib/drag_selector1d\";\nimport InteractionCue from \"../../src/js/lib/interaction_cue\";\nimport NudgeInteractionCue from \"../../src/js/lib/nudge_interaction_cue\";\nimport Scheduler from \"../../src/js/lib/scheduler\";\nimport Tween from \"../../src/js/lib/tween\";\n\nconst {\n  Component,\n  Utils: { loadImage, range },\n  DOMUtils: { appendChildren, createElement, empty, fragmentFromString },\n} = window.Liftoff;\n\nconst DEFAULT_VERTICAL_SPACING = \"15px\";\nconst INTERACTION_CUE_TYPE_NONE = \"none\";\n\nconst currencyAnimationDurationMS = 1000;\nconst isDigit = (char) => char >= \"0\" && char <= \"9\";\nconst getNumericalPrice = (price) => {\n  // NOTE(Casey): We assume that normal and special prices are formatted similarly (i.e. same number of\n  // fractional parts). With this assumption, we can parse prices for discount calculations just by removing\n  // non-digits.\n  return Number.parseFloat([...price].filter((d) => isDigit(d)).join(\"\"));\n};\nconst getDiscount = (product) => {\n  const { normalPrice, specialPrice } = product;\n  if (specialPrice == null) {\n    return null;\n  }\n\n  const normal = getNumericalPrice(normalPrice);\n  const special = getNumericalPrice(specialPrice);\n\n  const discount = special / normal - 1;\n  if (discount === 0) {\n    return null;\n  }\n\n  return discount;\n};\n\nclass ProductDiscount {\n  constructor({ product, discountTextStyle }) {\n    this.totalDiscount = getDiscount(product);\n    this.startTime = Date.now();\n\n    this.element =\n      this.totalDiscount == null\n        ? null\n        : createElement({\n            tagName: \"span\",\n            style: discountTextStyle,\n            children: [\"0%\"],\n          });\n\n    this.tween = new Tween({\n      startValue: 0,\n      endValue: this.totalDiscount,\n      durationMS: currencyAnimationDurationMS,\n      easingFn: Tween.Easing.EaseOutQuad,\n    });\n  }\n\n  getElement() {\n    return this.element;\n  }\n\n  reset() {\n    if (this.totalDiscount == null) return;\n\n    this.tween.start({\n      onUpdate: (currentDiscount) => {\n        this.element.textContent = `${Math.floor(currentDiscount * 100)}%`;\n      },\n    });\n  }\n}\n\nclass ProductPrice {\n  constructor({\n    product,\n    mainPriceStyle,\n    overriddenPriceStyle,\n    shouldAnimatePrice,\n  }) {\n    const { specialPrice, normalPrice } = product;\n    const mainPrice = specialPrice || normalPrice;\n    const overriddenPrice = mainPrice !== normalPrice ? normalPrice : null;\n\n    if (mainPrice == null) {\n      this.element = null;\n      return null;\n    }\n\n    const priceFormatter = shouldAnimatePrice\n      ? makeCurrencyFormatter(mainPrice)\n      : null;\n    this.shouldAnimatePrice =\n      shouldAnimatePrice && mainPrice != null && priceFormatter != null;\n\n    const mainPriceEl = createElement({\n      tagName: \"span\",\n      style: mainPriceStyle,\n      children: [this.shouldAnimatePrice ? 0 : mainPrice],\n    });\n\n    this.element = createElement({\n      tagName: \"span\",\n      children: [\n        overriddenPrice && {\n          tagName: \"span\",\n          style: overriddenPriceStyle,\n          children: [overriddenPrice],\n        },\n        \" \",\n        mainPriceEl,\n      ],\n    });\n\n    this.initAnimation(mainPrice, mainPriceEl, priceFormatter);\n  }\n\n  initAnimation(mainPrice, mainPriceEl, priceFormatter) {\n    if (!this.shouldAnimatePrice) return;\n\n    const numericalMainPrice = getNumericalPrice(mainPrice);\n    this.tween = new Tween({\n      startValue: 0,\n      endValue: numericalMainPrice,\n      durationMS: currencyAnimationDurationMS,\n      easingFn: Tween.Easing.EaseOutQuad,\n    });\n\n    this.updatePrice = (currentTweenValue) => {\n      const currentTweenDigits = Math.round(currentTweenValue);\n      mainPriceEl.textContent = priceFormatter(currentTweenDigits);\n    };\n  }\n\n  getElement() {\n    return this.element;\n  }\n\n  reset() {\n    if (!this.shouldAnimatePrice) return;\n\n    this.tween.start({\n      onUpdate: this.updatePrice,\n    });\n  }\n}\n\nconst renderProductInfo = (\n  infoElement,\n  {\n    containerClassList,\n    containerStyle,\n    prefixHTML,\n    prefixStyle,\n    suffixHTML,\n    suffixStyle,\n  }\n) => {\n  return createElement({\n    classList: containerClassList,\n    style: containerStyle,\n    children: [\n      !!prefixHTML && {\n        tagName: \"span\",\n        style: prefixStyle,\n        children: [fragmentFromString(prefixHTML)],\n      },\n      infoElement,\n      \" \",\n      !!suffixHTML && {\n        tagName: \"span\",\n        style: suffixStyle,\n        children: [fragmentFromString(suffixHTML)],\n      },\n    ],\n  });\n};\n\nconst renderProductImage = (product, productImageSizing) => {\n  return (\n    product.imageURL && {\n      classList: [\"product-image\"],\n      style: {\n        backgroundImage: `url(${product.imageURL})`,\n        backgroundSize: productImageSizing,\n      },\n    }\n  );\n};\n\nclass ProductCarouselSlide {\n  constructor({\n    product,\n    index,\n    width,\n    productSlideConfig: {\n      productImageStyle,\n      productContainerStyle,\n      productImageSizing,\n      showPrices,\n      mainPriceStyle,\n      overriddenPriceStyle,\n      priceInfoConfig,\n      showTitle,\n      titleTextStyle,\n      titleInfoConfig,\n      showDescription,\n      descriptionTextStyle,\n      descriptionInfoConfig,\n      showDiscount,\n      discountTextStyle,\n      discountInfoConfig,\n      shouldAnimatePrice,\n    },\n    // TODO(cory) Remove the `interactionCueHand` parameter if we standardize on flick-with-nudge.\n    interactionCueHand,\n  }) {\n    this.discount = new ProductDiscount({ product, discountTextStyle });\n    this.price = new ProductPrice({\n      product,\n      overriddenPriceStyle,\n      mainPriceStyle,\n      shouldAnimatePrice,\n    });\n\n    const { title, description } = product;\n    this.interactionCueHand = interactionCueHand;\n\n    // NOTE(Casey): 'showDiscount' was added after some creatives were\n    // already using this component, so add a default here to ensure\n    // consistent behavior for creatives that were missing this parameter.\n    const showDiscountWithDefault =\n      showDiscount == null ? this.discount.getElement() != null : showDiscount;\n\n    this.productElement = createElement({\n      style: productContainerStyle,\n      children: [\n        {\n          style: productImageStyle,\n          children: [renderProductImage(product, productImageSizing)],\n        },\n        showDiscountWithDefault &&\n          renderProductInfo(this.discount.getElement(), discountInfoConfig),\n        showPrices &&\n          renderProductInfo(\n            this.price.getElement(),\n            Object.assign(priceInfoConfig, {\n              containerClassList: [\"product-prices\"],\n            })\n          ),\n        showTitle &&\n          renderProductInfo(\n            createElement({\n              tagName: \"span\",\n              children: [title],\n              style: titleTextStyle,\n            }),\n            titleInfoConfig\n          ),\n        showDescription &&\n          renderProductInfo(\n            createElement({\n              tagName: \"span\",\n              children: [description],\n              style: descriptionTextStyle,\n            }),\n            descriptionInfoConfig\n          ),\n      ],\n    });\n\n    this.element = createElement({\n      classList: [\"product-slide\"],\n      style: { transform: `translateX(${index * width}px)` },\n      children: [this.productElement],\n    });\n  }\n\n  getElement() {\n    return this.element;\n  }\n\n  activate() {\n    this.discount.reset();\n    this.price.reset();\n    if (this.interactionCueHand != null) {\n      appendChildren(this.productElement, [\n        this.interactionCueHand.getElement(),\n      ]);\n    }\n  }\n}\n\nclass ProductCarousel {\n  constructor({\n    products,\n    width,\n    onDragStart,\n    onDragMove,\n    onProductClick,\n    dragAnywhere,\n    onProductSelection,\n    interactionCueType,\n    interactionCueInterval,\n    interactionCueHand = null,\n    flickInteractionCueHand,\n    attachHandToSlides,\n    productSlideConfig,\n  }) {\n    this.products = products;\n    this.width = width;\n    this.currentIndex = null;\n    this.interactionCueHand = interactionCueHand;\n\n    this.productSlides = this.products.map((product, index) => {\n      return new ProductCarouselSlide({\n        product,\n        index,\n        width,\n        productSlideConfig,\n        interactionCueHand: attachHandToSlides ? interactionCueHand : null,\n      });\n    });\n\n    this.dragSelector = new DragSelector1D({\n      itemCount: products.length,\n      width,\n      slidesPerView: 1,\n      onDragStart,\n      onDragMove,\n      onClick: onProductClick,\n      dragAnywhere,\n      onSelection: onProductSelection,\n      children: this.productSlides.map((productSlide) =>\n        productSlide.getElement()\n      ),\n    });\n\n    this.element = createElement({\n      classList: [\"product-carousel\"],\n      children: [this.dragSelector.getElement()],\n    });\n\n    this.nudgeInteractionCue = new NudgeInteractionCue({\n      nudgeType: interactionCueType,\n      intervalMS: interactionCueInterval,\n      interactionCueHand,\n      flickInteractionCueHand,\n      nudger: this.dragSelector,\n    });\n  }\n\n  getElement() {\n    return this.element;\n  }\n\n  startInteractionCue() {\n    this.nudgeInteractionCue.start();\n  }\n\n  stopInteractionCue() {\n    this.nudgeInteractionCue.stop();\n  }\n\n  setIndex(index) {\n    this.currentIndex = index;\n    this.dragSelector.setIndex(index);\n    this.productSlides[index].activate();\n  }\n}\n\nconst slidesPerConveyorView = 6;\n\nclass ProductConveyorSlide {\n  constructor({\n    index,\n    width,\n    product,\n    productImageSizing,\n    onProductSelection,\n  }) {\n    this.element = createElement({\n      classList: [\"product-slide\"],\n      style: {\n        width: `${width}px`,\n        transform: `translateX(${index * width}px)`,\n        // Images to the left are in the front so the hand (positioned to the right of the image) is not\n        // under the image to the right.\n        zIndex: -index,\n      },\n      children: [renderProductImage(product, productImageSizing)],\n      eventHandlers: {\n        click: () => {\n          onProductSelection(index);\n        },\n      },\n    });\n  }\n\n  getElement() {\n    return this.element;\n  }\n\n  setInteractionCueHand(interactionCueHand) {\n    if (interactionCueHand == null) return;\n    appendChildren(this.element, [interactionCueHand.getElement()]);\n  }\n}\n\nclass ProductConveyor {\n  constructor({\n    products,\n    width,\n    onDragStart,\n    onDragMove,\n    onProductSelection,\n    interactionCueType,\n    interactionCueInterval,\n    interactionCueHand = null,\n    flickInteractionCueHand,\n    activeSlideStyle,\n    productImageSizing,\n  }) {\n    this.products = products;\n    this.width = width;\n    this.activeSlideStyle = activeSlideStyle;\n    this.currentIndex = null;\n    this.interactionCueHand = interactionCueHand;\n\n    this.slideWidth = width / slidesPerConveyorView;\n    this.productSlides = products.map((product, index) => {\n      return new ProductConveyorSlide({\n        width: this.slideWidth,\n        index,\n        product,\n        productImageSizing,\n        onProductSelection,\n      });\n    });\n\n    this.dragSelector = new DragSelector1D({\n      itemCount: products.length,\n      width,\n      slidesPerView: slidesPerConveyorView,\n      onDragStart,\n      onDragMove,\n      onSelection: onProductSelection,\n      children: this.productSlides.map((slide) => slide.getElement()),\n    });\n\n    this.element = createElement({\n      classList: [\"product-conveyor\"],\n      style: { height: `${this.slideWidth}px` },\n      children: [\n        this.dragSelector.getElement(),\n        {\n          classList: [\"center-frame\"],\n          style: {\n            width: `${this.slideWidth}px`,\n            height: `${this.slideWidth}px`,\n            ...this.activeSlideStyle,\n          },\n        },\n      ],\n    });\n\n    this.nudgeInteractionCue = new NudgeInteractionCue({\n      nudgeType: interactionCueType,\n      intervalMS: interactionCueInterval,\n      interactionCueHand,\n      flickInteractionCueHand,\n      nudger: this.dragSelector,\n    });\n  }\n\n  getElement() {\n    return this.element;\n  }\n\n  setHandForSlide(slideIndex) {\n    // NOTE(Casey): We position the hand to the right to avoid interfering with the center frame. The hand\n    // won't appear for the last image.\n    const slide = this.productSlides[slideIndex + 1];\n    if (slide == null) return;\n\n    slide.setInteractionCueHand(this.interactionCueHand);\n  }\n\n  startInteractionCue() {\n    this.nudgeInteractionCue.start();\n  }\n\n  stopInteractionCue() {\n    this.nudgeInteractionCue.stop();\n  }\n\n  setIndex(index) {\n    this.currentIndex = index;\n    this.dragSelector.setIndex(index);\n    this.setHandForSlide(index);\n  }\n}\n\nComponent.register(\n  \"dynamic-conveyor-carousel\",\n  class DynamicConveyorCarousel extends Component {\n    constructor(config) {\n      super(config);\n\n      this.hasDragSelected = false;\n      this.currentProductIndex = 0;\n      this.products = this.config.useStaticProducts\n        ? this.config.products\n        : range(0, this.config.productCount)\n            .map(() => window.Madlib.getNextProduct())\n            .filter((rawProduct) => rawProduct != null)\n            .map((rawProduct) => {\n              return {\n                id: rawProduct.id,\n                imageURL: rawProduct.image_url,\n                normalPrice: rawProduct.display_price,\n                specialPrice: rawProduct.special_display_price,\n                title: rawProduct.title,\n                description: rawProduct.description,\n              };\n            });\n\n      this.autoTransitionScheduler = new Scheduler({\n        intervalMS: this.config.autoScrollDelayMS,\n        callback: this._handleAutoTransition.bind(this),\n      });\n    }\n\n    load() {\n      const allImageURLs = this.products\n        .map(({ imageURL }) => imageURL)\n        .concat([this.config.customHandImage])\n        .filter((url) => url != null);\n\n      return Promise.all(allImageURLs.map((imageURL) => loadImage(imageURL)));\n    }\n\n    layout(parentNode) {\n      super.layout(parentNode);\n\n      empty(this.parentNode);\n\n      if (this.products.length === 0) return;\n\n      this.el = createElement({ classList: [\"dynamic-conveyor-carousel\"] });\n\n      this.parentNode.appendChild(this.el);\n\n      const boundingClientRect = this.el.getBoundingClientRect();\n      const isCarouselInteractive =\n        this.config.carouselInteractionCue != null &&\n        this.config.carouselInteractionCue !== INTERACTION_CUE_TYPE_NONE;\n      const isConveyorInteractive =\n        this.config.conveyorInteractionCue != null &&\n        this.config.conveyorInteractionCue !== INTERACTION_CUE_TYPE_NONE;\n\n      this.interactionCueHand =\n        this.config.showInteractionCueHand &&\n        (this.config.useAutoScroll ||\n          isCarouselInteractive ||\n          isConveyorInteractive)\n          ? new InteractionCue(\n              this.config.customHandImage,\n              this.config.interactionCueHandStyle\n            )\n          : null;\n\n      const productImageSizing =\n        this.config.productImageSizing === \"fill\"\n          ? \"100% 100%\"\n          : this.config.productImageSizing;\n\n      // TODO(cory) Eliminate `attachHandToSlides` if we standardize flick-with-nudge.\n      const attachHandToSlides =\n        !this.config.useAutoScroll && !this.config.flickInteractionCueHand;\n\n      this.carousel = new ProductCarousel({\n        products: this.products,\n        width: boundingClientRect.width,\n        onDragStart: () => this._handleDragStart(),\n        onDragMove: () => this._stopInteractionCues(),\n        onProductClick: (e, index) => this._handleProductClick(e, index),\n        dragAnywhere: this.config.dragAnywhere,\n        onProductSelection: (index) => this._handleProductSelection(index),\n        interactionCueType: this.config.carouselInteractionCue,\n        interactionCueInterval: this.config.interactionCueInterval,\n        interactionCueHand: isCarouselInteractive\n          ? this.interactionCueHand\n          : null,\n        flickInteractionCueHand: this.config.flickInteractionCueHand,\n        attachHandToSlides,\n        productSlideConfig: {\n          productImageStyle: this.config.productImageStyle,\n          productContainerStyle: this.config.productContainerStyle,\n          productImageSizing,\n          shouldAnimatePrice: this.config.shouldAnimatePrice,\n\n          // Price\n          showPrices: this.config.showPrices,\n          mainPriceStyle: this.config.mainPriceStyle,\n          overriddenPriceStyle: this.config.overriddenPriceStyle,\n          priceInfoConfig: {\n            containerStyle: this.config.priceContainerStyle,\n            prefixHTML: this.config.pricePrefix,\n            prefixStyle: this.config.pricePrefixStyle,\n            suffixHTML: this.config.priceSuffix,\n            suffixStyle: this.config.priceSuffixStyle,\n          },\n\n          // Title\n          showTitle: this.config.showTitle,\n          titleTextStyle: this.config.titleTextStyle,\n          titleInfoConfig: {\n            containerStyle: this.config.titleStyle,\n            prefixHTML: this.config.titlePrefix,\n            prefixStyle: this.config.titlePrefixStyle,\n            suffixHTML: this.config.titleSuffix,\n            suffixStyle: this.config.titleSuffixStyle,\n          },\n\n          // Description\n          showDescription: this.config.showDescription,\n          descriptionTextStyle: this.config.descriptionTextStyle,\n          descriptionInfoConfig: {\n            containerStyle: this.config.descriptionStyle,\n            prefixHTML: this.config.descriptionPrefix,\n            prefixStyle: this.config.descriptionPrefixStyle,\n            suffixHTML: this.config.descriptionSuffix,\n            suffixStyle: this.config.descriptionSuffixStyle,\n          },\n\n          // Discount\n          showDiscount: this.config.showDiscount,\n          discountTextStyle: this.config.discountTextStyle,\n          discountInfoConfig: {\n            containerStyle: this.config.discountStyle,\n            prefixHTML: this.config.discountPrefix,\n            prefixStyle: this.config.discountPrefixStyle,\n            suffixHTML: this.config.discountSuffix,\n            suffixStyle: this.config.discountSuffixStyle,\n          },\n        },\n      });\n\n      this.conveyor = new ProductConveyor({\n        productImageSizing,\n        products: this.products,\n        width: boundingClientRect.width,\n        onDragStart: () => this._handleDragStart(),\n        onDragMove: () => this._stopInteractionCues(),\n        onProductSelection: (index) => this._handleProductSelection(index),\n        interactionCueType: this.config.conveyorInteractionCue,\n        interactionCueInterval: this.config.interactionCueInterval,\n        interactionCueHand:\n          isConveyorInteractive &&\n          !isCarouselInteractive &&\n          !this.config.useAutoScroll\n            ? this.interactionCueHand\n            : null,\n        flickInteractionCueHand: this.config.flickInteractionCueHand,\n        activeSlideStyle: this.config.activeConveyorSlideStyle,\n      });\n\n      this.dotIndicator = new DotIndicator(this.products.length, {\n        containerStyle: this.config.dotsContainerStyle,\n        dotStyle: this.config.dotStyle,\n        activeDotStyle: this.config.activeDotStyle,\n      });\n\n      const spacingPx =\n        this.config.verticalSpacing == null\n          ? DEFAULT_VERTICAL_SPACING\n          : `${this.config.verticalSpacing}px`;\n      const makeSpacer = () => {\n        return createElement({\n          // This class name is included only to improve the interpretability of the DOM. No CSS is applied\n          // to this class.\n          classList: [\"liftoff-spacer\"],\n          style: { height: spacingPx },\n        });\n      };\n\n      appendChildren(this.el, [\n        {\n          classList: [\"product-carousel-container\"],\n          children: [\n            this.carousel.getElement(),\n            !attachHandToSlides &&\n              this.interactionCueHand &&\n              this.interactionCueHand.getElement(),\n          ],\n        },\n        makeSpacer(),\n        this.config.showConveyor && this.conveyor.getElement(),\n        makeSpacer(),\n        this.config.showDots && {\n          classList: [\"product-dots\"],\n          children: [this.dotIndicator.getElement()],\n        },\n        this.config.showDots && makeSpacer(),\n      ]);\n\n      // NOTE(Casey): firstProductIndex is a required parameter, but it was added in later iterations on this\n      // component. The null-check is for backwards compatibility.\n      const firstProductIndex =\n        this.config.firstProductIndex === \"Auto\" ||\n        this.config.firstProductIndex == null\n          ? Math.floor(this.products.length / 2 - 0.5)\n          : // The parameter value is a 1-based index.\n            this.config.firstProductIndex - 1;\n\n      this._setProductIndex(firstProductIndex);\n    }\n\n    resize() {}\n\n    _startInteractionCues() {\n      this.carousel.startInteractionCue();\n      this.conveyor.startInteractionCue();\n    }\n\n    start() {\n      if (this.products.length === 0) return;\n\n      if (this.config.useAutoScroll) {\n        this.autoTransitionScheduler.start();\n      } else {\n        this._startInteractionCues();\n      }\n    }\n\n    _stopInteractionCues() {\n      this.carousel.stopInteractionCue();\n      this.conveyor.stopInteractionCue();\n    }\n\n    _stopAutoTransitions() {\n      this.autoTransitionScheduler.stop();\n      if (this.interactionCueHand != null && this.config.useAutoScroll) {\n        this.interactionCueHand.hide();\n      }\n    }\n\n    stop() {\n      if (this.products.length === 0) return;\n\n      this._stopAutoTransitions();\n      this._stopInteractionCues();\n    }\n\n    restart() {}\n\n    _transitionProductView(indexDelta) {\n      const newIndex =\n        (this.currentProductIndex + indexDelta + this.products.length) %\n        this.products.length;\n\n      this._setProductIndex(newIndex);\n    }\n\n    _handleAutoTransition() {\n      if (!this.config.useAutoScroll) return;\n\n      if (\n        this.interactionCueHand != null &&\n        this.currentProductIndex !== this.products.length - 1\n      ) {\n        this.interactionCueHand.flick({\n          onFlickReady: () => this._transitionProductView(1),\n          flickDuration: Math.min(this.config.autoScrollDelayMS / 2, 900),\n        });\n      } else {\n        this._transitionProductView(1);\n      }\n    }\n\n    _updateGlobalProductIdParam(productIndex) {\n      const product = this.products[productIndex];\n      if (product == null) return;\n\n      Liftoff.mergeClickParams({ pid: product.id });\n    }\n\n    _handleDragStart() {\n      this.recordInteraction();\n      this._stopAutoTransitions();\n\n      if (!this.hasDragSelected) {\n        this._startInteractionCues();\n      }\n    }\n\n    _handleProductClick(e, index) {\n      if (!(0 <= index && index < this.products.length)) return;\n\n      const product = this.products[index];\n      window.Madlib.handleNavigationClick(e, { pid: product.id });\n    }\n\n    _handleProductSelection(index) {\n      if (!(0 <= index && index < this.products.length)) return;\n\n      if (index !== this.currentProductIndex) {\n        this.hasDragSelected = true;\n        this._stopInteractionCues();\n      } else if (!this.hasDragSelected) {\n        this._startInteractionCues();\n      }\n\n      this._setProductIndex(index);\n    }\n\n    _setProductIndex(index) {\n      this.currentProductIndex = index;\n\n      this.carousel.setIndex(index);\n      this.conveyor.setIndex(index);\n      this.dotIndicator.setIndex(index);\n\n      this._updateGlobalProductIdParam(index);\n    }\n  }\n);\n\n\n\n// WEBPACK FOOTER //\n// ./components/dynamic-conveyor-carousel/dynamic-conveyor-carousel.js","class Tween {\n  static Tween(start, end, ease, f) {\n    f = Math.min(1, Math.max(0, f));\n    switch (typeof start) {\n      case \"number\":\n        return start + (end - start) * ease(f);\n      case \"object\":\n        const value = {};\n        for (const k in start) {\n          value[k] = start[k] + (end[k] - start[k]) * ease(f);\n        }\n        return value;\n    }\n  }\n\n  constructor(config) {\n    [\"startValue\", \"endValue\", \"durationMS\", \"easingFn\"].forEach(\n      (param) => (this[param] = config[param])\n    );\n  }\n\n  from(startValue) {\n    this.startValue = startValue;\n    return this;\n  }\n\n  to(endValue) {\n    this.endValue = endValue;\n    return this;\n  }\n\n  in(durationMS) {\n    this.durationMS = durationMS;\n    return this;\n  }\n\n  with(easingFn) {\n    this.easingFn = easingFn;\n    return this;\n  }\n\n  // Cannot use `performance.now()` here due to lack of browser support.\n  start(callbackMap = {}) {\n    this.startTS = Date.now();\n    this.stopped = false;\n    const update = () => {\n      if (this.stopped) return;\n      const currentValue = this.valueNow();\n      if (callbackMap.onUpdate) {\n        callbackMap.onUpdate(currentValue);\n      }\n      if (Date.now() - this.startTS <= this.durationMS) {\n        requestAnimationFrame(update);\n      } else if (callbackMap.onComplete) {\n        callbackMap.onComplete(currentValue);\n      }\n    };\n    requestAnimationFrame(update);\n    return this;\n  }\n\n  stop() {\n    this.stopped = true;\n    return this;\n  }\n\n  valueNow() {\n    return Tween.Tween(\n      this.startValue,\n      this.endValue,\n      this.easingFn,\n      (Date.now() - this.startTS) / this.durationMS\n    );\n  }\n\n  valueAfterMS(elapsed) {\n    return Tween.Tween(\n      this.startValue,\n      this.endValue,\n      this.easingFn,\n      elapsed / this.durationMS\n    );\n  }\n\n  valueAfterFraction(f) {\n    return Tween.Tween(this.startValue, this.endValue, this.easingFn, f);\n  }\n}\n\nTween.Easing = {\n  Linear: (f) => f,\n  EaseInSine: (f) => 1 - Math.cos((f * Math.PI) / 2),\n  EaseOutSine: (f) => Math.sin((f * Math.PI) / 2),\n  EaseInOutSine: (f) => (1 - Math.cos(f * Math.PI)) / 2,\n  EaseInQuad: (f) => Math.pow(f, 2),\n  EaseOutQuad: (f) => f * (2 - f),\n  EaseInOutQuad: (f) => {\n    f *= 2;\n    if (f < 1) {\n      return Math.pow(f, 2) / 2;\n    } else {\n      f -= 1;\n      return (1 - f * (f - 2)) / 2;\n    }\n  },\n  EaseInCubic: (f) => Math.pow(f, 3),\n  EaseOutCubic: (f) => Math.pow(f - 1, 3) + 1,\n  EaseInOutCubic: (f) => {\n    f *= 2;\n    if (f < 1) {\n      return Math.pow(f, 3) / 2;\n    } else {\n      return (Math.pow(f - 2, 3) + 2) / 2;\n    }\n  },\n};\n\nexport default Tween;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/lib/tween.js","import Scheduler from \"./scheduler\";\n\nconst nudgeTypeToPx = {\n  \"nudge-up\": 20,\n  \"nudge-down\": -20,\n  \"nudge-left\": -20,\n  \"nudge-right\": 20,\n};\nconst getNudgeOffsetPx = (nudgeType) => nudgeTypeToPx[nudgeType] || 0;\n\nexport default class NudgeInteractionCue {\n  constructor({\n    nudgeType,\n    intervalMS,\n    interactionCueHand = null,\n    flickInteractionCueHand,\n    nudger,\n    horizontalCarousel = true,\n    conveyorBorderTransition = false,\n  }) {\n    this.interactionCueHand = interactionCueHand;\n\n    const offset = getNudgeOffsetPx(nudgeType);\n\n    this.scheduler =\n      offset !== 0\n        ? new Scheduler({\n            intervalMS,\n            callback: () => {\n              const flickDuration = Math.min(intervalMS / 2, 900);\n              if (interactionCueHand != null && flickInteractionCueHand) {\n                interactionCueHand.flick({\n                  onFlickReady: () => {\n                    // NOTE(cory) We choose not to wait on the nudge promise so the animations play in parallel.\n                    nudger.nudge({\n                      offset,\n                      durationMS: intervalMS / 2,\n                      conveyorBorderTransition,\n                    });\n                  },\n                  flickDistance: offset,\n                  flickRotation: 10,\n                  flickDuration,\n                  xOrY: horizontalCarousel ? \"X\" : \"Y\",\n                });\n              } else {\n                // NOTE(cory) Wait for this timeout to sync nudges between carousel and conveyor.\n                // Unfortunately, this is coupled to the implementation of flick, and the amount of\n                // time it takes to call its `onFlickReady` argument.\n                new Promise((resolve) => {\n                  setTimeout(resolve, flickDuration / 2);\n                }).then(() => {\n                  nudger.nudge({\n                    offset,\n                    durationMS: intervalMS / 2,\n                    conveyorBorderTransition,\n                  });\n                });\n              }\n            },\n          })\n        : null;\n  }\n\n  start() {\n    if (this.scheduler != null) {\n      this.scheduler.start();\n    }\n    if (this.interactionCueHand != null) {\n      this.interactionCueHand.show();\n    }\n  }\n\n  stop() {\n    if (this.scheduler != null) {\n      this.scheduler.stop();\n    }\n    if (this.interactionCueHand != null) {\n      this.interactionCueHand.hide();\n    }\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/lib/nudge_interaction_cue.js","const isDigit = (char) => char >= \"0\" && char <= \"9\";\n\n/**\n * Given an \"example\" currency string, returns a function that takes an integer\n * argument and returns the integer formatted in the same way as the example.\n * E.g.,\n *\n * const formatter = makeCurrencyFormatter(\"$1,234.56\");\n * formatter(9876543210) // => $98,765,432.10\n * formatter(0) // => $0.00\n * formatter(321) // => $3.21\n *\n * Assumes:\n *   1) There are either 0 or 2 decimal places.\n *   2) Every third digit may be separated by a consistent separator.\n *   3) The only characters between the first digit and the last digit are\n *      either a digit, the decimal separator, or the group separator.\n *   4) Any characters before the first digit or after the last digit should\n *      appear in any properly formatted string.\n *\n * Returns 'null' if the example string cannot be parsed according to the above\n * assumptions.\n */\n\n// eslint-disable-next-line\nexport const makeCurrencyFormatter = (baseStr) => {\n  const numericChars = [...baseStr];\n  let prefixStr = \"\";\n  while (numericChars.length !== 0 && !isDigit(numericChars[0])) {\n    prefixStr = `${prefixStr}${numericChars.shift()}`;\n  }\n\n  let suffixStr = \"\";\n  while (\n    numericChars.length !== 0 &&\n    !isDigit(numericChars[numericChars.length - 1])\n  ) {\n    suffixStr = `${numericChars.pop()}${suffixStr}`;\n  }\n\n  let decimalSeparator = numericChars[numericChars.length - 3];\n  if (isDigit(decimalSeparator)) {\n    decimalSeparator = null;\n  }\n\n  const groupSeparatorIndex =\n    decimalSeparator == null\n      ? numericChars.length - 4\n      : numericChars.length - 7;\n\n  let groupSeparator = numericChars[groupSeparatorIndex];\n  if (isDigit(groupSeparator)) {\n    groupSeparator = null;\n  }\n\n  if (numericChars.length === 0) {\n    return null;\n  }\n\n  // Check that the character at each position is of the expected class.\n  const decimalPosition =\n    decimalSeparator == null ? numericChars.length : numericChars.length - 3;\n\n  const shouldBeGroupSeparator = (charIndex) => {\n    const charsFromDecimal = decimalPosition - charIndex;\n    return (\n      groupSeparator != null &&\n      charIndex !== 0 &&\n      charsFromDecimal > 0 &&\n      charsFromDecimal % 4 === 0\n    );\n  };\n\n  const shouldBeDecimalSeparator = (charIndex) => {\n    return decimalSeparator != null && charIndex === numericChars.length - 3;\n  };\n\n  for (let i = 0; i < numericChars.length; i++) {\n    const char = numericChars[i];\n    const charShouldBeGroupSeparator = shouldBeGroupSeparator(i);\n    const charShouldBeDecimalSeparator = shouldBeDecimalSeparator(i);\n    if (\n      (charShouldBeGroupSeparator && char !== groupSeparator) ||\n      (charShouldBeDecimalSeparator && char !== decimalSeparator) ||\n      (!charShouldBeGroupSeparator &&\n        !charShouldBeDecimalSeparator &&\n        !isDigit(char))\n    ) {\n      return null;\n    }\n  }\n\n  return (intToFormat) => {\n    let strToFormat = String(intToFormat);\n    if (decimalSeparator != null && strToFormat.length < 3) {\n      const zerosNeeded = 3 - strToFormat.length;\n      const zeroPadding = \"0\".repeat(zerosNeeded);\n      strToFormat = `${zeroPadding}${strToFormat}`;\n    }\n\n    const formattedDigits = [...strToFormat]\n      .reverse()\n      .reduce((reversedFormatted, digitChar, digitIndex) => {\n        const digitsBeforeDecimalCount =\n          decimalSeparator == null ? digitIndex : digitIndex - 2;\n\n        if (digitIndex === 2 && decimalSeparator != null) {\n          reversedFormatted.push(decimalSeparator);\n        } else if (\n          digitsBeforeDecimalCount > 0 &&\n          (digitsBeforeDecimalCount % 3 === 0) & (groupSeparator != null)\n        ) {\n          reversedFormatted.push(groupSeparator);\n        }\n\n        reversedFormatted.push(digitChar);\n        return reversedFormatted;\n      }, [])\n      .reverse()\n      .join(\"\");\n\n    return `${prefixStr}${formattedDigits}${suffixStr}`;\n  };\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/lib/currency.js","import Dragger1D from \"./dragger1d\";\n\nconst {\n  Utils: { clamp },\n} = Liftoff;\n\nexport default class DragSelector1D {\n  constructor({\n    itemCount,\n    width,\n    height,\n    slidesPerView,\n    onDragStart,\n    onDragMove,\n    onClick = () => {},\n    dragAnywhere = false,\n    onSelection = () => {},\n    transitionMS = 500,\n    children,\n    horizontalCarousel = true,\n    carouselSnapsToScreen = true,\n    conveyorImagesTransition,\n    forConveyor,\n    activeSlideStyle,\n  }) {\n    this.itemCount = itemCount;\n    this.width = width;\n    this.height = height;\n\n    this.slideWidth = width / slidesPerView;\n    this.slideHeight = height / slidesPerView;\n\n    this.widthOrHeight =\n      horizontalCarousel || forConveyor ? this.width : this.height;\n    this.slideWidthOrHeight =\n      horizontalCarousel || forConveyor ? this.slideWidth : this.slideHeight;\n    // explicitly using 'false' for backwards compatibility\n    this.minDivisor = carouselSnapsToScreen === false ? 10 : 2;\n    this.maxDivisor = carouselSnapsToScreen === false ? 1 : 2;\n    this.dragger = new Dragger1D({\n      horizontalCarousel,\n      carouselSnapsToScreen,\n      conveyorImagesTransition,\n      activeSlideStyle,\n      slideWidth: this.slideWidth,\n      slideHeight: this.slideHeight,\n      widthOrHeight: this.widthOrHeight,\n      itemCount,\n      bounds: {\n        min: -this.widthOrHeight / this.minDivisor,\n        max:\n          -this.widthOrHeight / this.maxDivisor +\n          this.slideWidthOrHeight * itemCount,\n      },\n      onDragStart,\n      onDragMove,\n      onDragEnd: (state) => {\n        if (state.hasDragMoved) {\n          onSelection(this._getNearestIndex(state));\n        }\n      },\n      onClick: (e, state) => {\n        onClick(e, this._getNearestIndex(state));\n      },\n      dragAnywhere,\n      transitionMS,\n      children,\n      forConveyor,\n    });\n  }\n\n  getElement() {\n    return this.dragger.getElement();\n  }\n\n  getFrameElement() {\n    return this.dragger.getFrameElement();\n  }\n\n  nudge(...args) {\n    return this.dragger.nudge(...args);\n  }\n\n  setIndex(index) {\n    const position =\n      -this.widthOrHeight / 2 + (index + 0.5) * this.slideWidthOrHeight;\n    this.dragger.setBasePosition(position);\n    this.dragger.resetPosition(index);\n  }\n\n  _getNearestIndex(dragState) {\n    return clamp(\n      Math.floor(\n        ((this.widthOrHeight - this.slideWidthOrHeight) / 2 +\n          dragState.currentDragPosition) /\n          this.slideWidthOrHeight + // Find the left edge of the nearest product view.\n          0.5 + // Align with the center on a scale of 0 to 1.\n          0.3 * Math.sign(dragState.dragDelta)\n        // The drag direction (`dragDelta`) shows some user intent.\n        // The product view in the forward direction is treated as being closer.\n      ),\n      0,\n      this.itemCount - 1\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/lib/drag_selector1d.js","import handImage from \"./interaction_cue_hand.png\";\n\nconst {\n  DOMUtils: { createElement, runTransitionSequence },\n} = Liftoff;\n\nclass InteractionCue {\n  constructor(cueImageURL, style = {}) {\n    this.el = createElement({\n      classList: [\"liftoff-interaction-cue-hand\", \"interaction-cue-hand-style\"],\n      style: style,\n      children: [\n        createElement({\n          style: {\n            backgroundImage: `url(${cueImageURL || handImage})`,\n            backgroundSize: \"contain\",\n            backgroundRepeat: \"no-repeat\",\n            pointerEvents: \"none\",\n            width: \"100%\",\n            height: \"100%\",\n          },\n        }),\n      ],\n    });\n  }\n\n  getElement() {\n    return this.el;\n  }\n\n  hide() {\n    this.el.style.display = \"none\";\n  }\n\n  show() {\n    this.el.style.display = \"block\";\n  }\n\n  /**\n   * Triggers a finger \"flick\" animation. The finger moves `flickDistance` px and rotates `flickRotation` deg\n   * to the right from its base position; `onFlickReady` is then called; the finger moves back to the left,\n   * overshooting its base position by `flickDistance / 2` px and `flickRotation / 2` deg; then the finger\n   * moves back to its base position. The entire animation is completed in `flickDuration` ms. If\n   * `flickDistance` is negative, the finger flicks in the other direction. `flickGrowth` controls\n   * the maximum fractional increase in the size of hand during the \"wind-up\" phase, increasing the\n   * impression of the finger being lifted from the screen.\n   */\n  flick({\n    onFlickReady = () => null,\n    flickDistance = -50,\n    flickRotation = 20,\n    flickDuration = 900,\n    flickGrowth = 0.1,\n    xOrY = \"X\",\n  }) {\n    return runTransitionSequence(this.el, [\n      {\n        transition: `transform ${flickDuration / 4}ms`,\n        transitionTimingFunction: \"ease-in\",\n        transform:\n          `translate${xOrY}(${-flickDistance}px) ` +\n          `rotate(${Math.sign(flickDistance) * -flickRotation}deg) ` +\n          `scale(${1 + flickGrowth})`,\n      },\n      {\n        transform: null,\n      },\n      onFlickReady,\n      {\n        transform:\n          `translate${xOrY}(${flickDistance / 2}px) ` +\n          `rotate(${(Math.sign(flickDistance) * flickRotation) / 2}deg) ` +\n          `scale(${1 + 0.5 * flickGrowth})`,\n        transitionTimingFunction: \"ease-out\",\n      },\n      {\n        transform: null,\n        transitionTimingFunction: \"linear\",\n      },\n      {\n        transition: null,\n        transform: null,\n      },\n    ]);\n  }\n}\n\nexport default InteractionCue;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/lib/interaction_cue.js","/* eslint-disable-next-line */\nconst handImageData =\n  \"data:image/png;base64,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\";\n\nexport default handImageData;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/lib/interaction_cue_hand.png.js","// NOTE(cory) `Scheduler` runs a function on an interval, which can be started, stopped, and restarted\n// at any time. Starting a scheduler when it's already running has no effect.\n\nexport default class Scheduler {\n  /**\n   * When `leading === true`, the callback is executed on the leading edge of the interval, as well as on\n   * the trailing edge.\n   */\n  constructor({ intervalMS, callback, leading = false }) {\n    this.intervalMS = intervalMS;\n    this.callback = callback;\n    this.leading = leading;\n\n    this.isActive = false;\n    this.intervalID = null;\n  }\n\n  start() {\n    if (this.isActive) return;\n\n    if (this.leading) {\n      this.callback();\n    }\n\n    this.isActive = true;\n    this.intervalID = setInterval(() => {\n      if (this.isActive) this.callback();\n    }, this.intervalMS);\n  }\n\n  stop() {\n    this.isActive = false;\n    if (this.intervalID != null) {\n      clearInterval(this.intervalID);\n      this.intervalID = null;\n    }\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/lib/scheduler.js"],"sourceRoot":""}