{"version":3,"file":"handle-update-ui-16bd7c72.js","sources":["../../../client/src/javascripts/customer_pages/_prism-builder/common/tools/text/font-list.js","../../../client/src/javascripts/customer_pages/_prism-builder/utils/private-mode.js","../../../client/src/javascripts/customer_pages/_prism-builder/common/page-base.jsx","../../../client/src/javascripts/customer_pages/_prism-builder/quantity/quantity-pricing-tools.js","../../../client/src/javascripts/customer_pages/_prism-builder/quantity/price-and-quantity-base.jsx","../../../client/src/javascripts/customer_pages/_prism-builder/utils/category-info.js","../../../node_modules/smart-mixin/index.js","../../../node_modules/react-mixin/index.js","../../../client/src/javascripts/customer_pages/_prism-builder/misc/stash-fns.js","../../../client/src/javascripts/customer_pages/_prism-builder/misc/prism-builder-custom-sections.js","../../../client/src/javascripts/customer_pages/_prism-builder/misc/card-top-nav-active.js","../../../client/src/javascripts/customer_pages/_prism-builder/misc/chevron.jsx","../../../client/src/javascripts/customer_pages/_prism-builder/misc/address-form.jsx","../../../node_modules/tinycolor2/esm/tinycolor.js","../../../node_modules/@livelink/snapster/dist/edge.js","../../../node_modules/@livelink/snapster/dist/box.js","../../../node_modules/@livelink/snapster/dist/grid.js","../../../node_modules/@livelink/snapster/dist/renderer.js","../../../node_modules/@livelink/snapster/dist/snap.js","../../../node_modules/@livelink/snapster/dist/snapster.js","../../javascripts/libs/stacktrace.js","../../../client/src/javascripts/customer_pages/_prism-builder/prism/logger.js","../../../client/src/javascripts/customer_pages/_prism-builder/prism/prism-quality.js","../../../client/src/javascripts/customer_pages/_prism-builder/prism/geom/point.js","../../../client/src/javascripts/customer_pages/_prism-builder/prism/slots/utils.js","../../../client/src/javascripts/customer_pages/_prism-builder/prism/slots/imageLoaders.js","../../../client/src/javascripts/customer_pages/_prism-builder/common/slot-tools/simple/constants.js","../../../client/src/javascripts/customer_pages/_prism-builder/prism/geom/line.js","../../../client/src/javascripts/customer_pages/_prism-builder/prism/geom/polygon.js","../../../client/src/javascripts/customer_pages/_prism-builder/prism/slots/slotBase.js","../../../client/src/javascripts/customer_pages/_prism-builder/prism/slots/matrix.js","../../../client/src/javascripts/customer_pages/_prism-builder/prism/slots/imageSlot.js","../../../client/src/javascripts/customer_pages/_prism-builder/utils/text-preview-url.js","../../../client/src/javascripts/customer_pages/_prism-builder/utils/has-foil-text.js","../../../client/src/javascripts/customer_pages/_prism-builder/prism/slots/textSlot.js","../../../node_modules/lodash/isNumber.js","../../../client/src/javascripts/customer_pages/_prism-builder/stores/useSlotStore.js","../../../client/src/javascripts/customer_pages/_prism-builder/prism/slots/customSlots.js","../../../client/src/javascripts/customer_pages/_prism-builder/misc/custom-colour-history.js","../../../client/src/javascripts/customer_pages/_prism-builder/utils/filled-image-slot-confirmation.js","../../../client/src/javascripts/customer_pages/_utils/tools/prism_builder_history.js","../../../client/src/javascripts/customer_pages/_prism-builder/trays/prism-builder-reloader.js","../../../client/src/javascripts/customer_pages/_prism-builder/prism/prism-builder-history.js","../../../node_modules/parchment/dist/parchment.js","../../../node_modules/quill/core/polyfill.js","../../../node_modules/fast-diff/diff.js","../../../node_modules/object-keys/isArguments.js","../../../node_modules/object-keys/implementation.js","../../../node_modules/object-keys/index.js","../../../node_modules/has-symbols/shams.js","../../../node_modules/has-tostringtag/shams.js","../../../node_modules/has-symbols/index.js","../../../node_modules/get-intrinsic/node_modules/function-bind/implementation.js","../../../node_modules/get-intrinsic/node_modules/function-bind/index.js","../../../node_modules/has/node_modules/function-bind/implementation.js","../../../node_modules/has/node_modules/function-bind/index.js","../../../node_modules/has/src/index.js","../../../node_modules/get-intrinsic/index.js","../../../node_modules/call-bind/node_modules/function-bind/implementation.js","../../../node_modules/call-bind/node_modules/function-bind/index.js","../../../node_modules/call-bind/index.js","../../../node_modules/call-bind/callBound.js","../../../node_modules/is-arguments/index.js","../../../node_modules/define-properties/node_modules/has-property-descriptors/index.js","../../../node_modules/define-properties/index.js","../../../node_modules/object-is/implementation.js","../../../node_modules/object-is/polyfill.js","../../../node_modules/object-is/shim.js","../../../node_modules/object-is/index.js","../../../node_modules/is-regex/index.js","../../../node_modules/functions-have-names/index.js","../../../node_modules/regexp.prototype.flags/implementation.js","../../../node_modules/regexp.prototype.flags/polyfill.js","../../../node_modules/regexp.prototype.flags/shim.js","../../../node_modules/regexp.prototype.flags/index.js","../../../node_modules/is-date-object/index.js","../../../node_modules/deep-equal/index.js","../../../node_modules/extend/index.js","../../../node_modules/quill-delta/lib/op.js","../../../node_modules/quill-delta/lib/delta.js","../../../node_modules/quill/blots/break.js","../../../node_modules/quill/blots/text.js","../../../node_modules/quill/blots/inline.js","../../../node_modules/quill/blots/block.js","../../../node_modules/quill/formats/code.js","../../../node_modules/quill/blots/cursor.js","../../../node_modules/clone/clone.js","../../../node_modules/quill/core/editor.js","../../../node_modules/quill/node_modules/eventemitter3/index.js","../../../node_modules/quill/core/logger.js","../../../node_modules/quill/core/emitter.js","../../../node_modules/quill/core/module.js","../../../node_modules/quill/core/selection.js","../../../node_modules/quill/core/theme.js","../../../node_modules/quill/core/quill.js","../../../node_modules/quill/blots/container.js","../../../node_modules/quill/blots/embed.js","../../../node_modules/quill/blots/scroll.js","../../../node_modules/quill/formats/align.js","../../../node_modules/quill/formats/color.js","../../../node_modules/quill/formats/background.js","../../../node_modules/quill/formats/direction.js","../../../node_modules/quill/formats/font.js","../../../node_modules/quill/formats/size.js","../../../node_modules/quill/modules/clipboard.js","../../../node_modules/quill/modules/history.js","../../../node_modules/quill/modules/keyboard.js","../../../node_modules/quill/core.js","../../../node_modules/lodash/_baseLodash.js","../../../node_modules/lodash/_LodashWrapper.js","../../../node_modules/lodash/_flatRest.js","../../../node_modules/lodash/_metaMap.js","../../../node_modules/lodash/_getData.js","../../../node_modules/lodash/_realNames.js","../../../node_modules/lodash/_getFuncName.js","../../../node_modules/lodash/_LazyWrapper.js","../../../node_modules/lodash/_wrapperClone.js","../../../node_modules/lodash/wrapperLodash.js","../../../node_modules/lodash/_isLaziable.js","../../../node_modules/lodash/_createFlow.js","../../../node_modules/lodash/flow.js","../../../node_modules/lodash/_basePropertyOf.js","../../../node_modules/lodash/_escapeHtmlChar.js","../../../node_modules/lodash/escape.js","../../../node_modules/lodash/_unescapeHtmlChar.js","../../../node_modules/lodash/unescape.js","../../../node_modules/quill/modules/toolbar.js","../../../node_modules/quill/formats/bold.js","../../../node_modules/quill/formats/italic.js","../../../node_modules/quill/formats/underline.js","../../../node_modules/quill/formats/strike.js","../../../client/src/javascripts/customer_pages/_utils/quill/formats/font-style.js","../../../client/src/javascripts/customer_pages/_utils/font-size-converter.js","../../../client/src/javascripts/customer_pages/_utils/quill/formats/size-style.js","../../../client/src/javascripts/customer_pages/_utils/lazy-google-font.js","../../../client/src/javascripts/customer_pages/_utils/quill.js","../../../client/src/javascripts/customer_pages/_prism-builder/stores/useTabTray.js","../../../client/src/javascripts/customer_pages/_prism-builder/prism/prism-view-canvas.js","../../../client/src/javascripts/customer_pages/_prism-builder/context/app-type.js","../../../client/src/javascripts/customer_pages/_prism-builder/desktop/notices/change-orientation-notice.jsx","../../../client/src/javascripts/customer_pages/_prism-builder/edit-area/prism-view.jsx","../../../client/src/javascripts/customer_pages/_prism-builder/common/slot-tools/simple/image-slot-tool-simple.jsx","../../../client/src/javascripts/customer_pages/_prism-builder/misc/image-watcher.js","../../../client/src/javascripts/customer_pages/_prism-builder/misc/canvas-image.jsx","../../../client/src/javascripts/customer_pages/_prism-builder/common/chiclets-base.jsx","../../../client/src/javascripts/customer_pages/_prism-builder/utils/hide-used-photos.js","../../../client/src/javascripts/customer_pages/_prism-builder/common/trays/photos-tray-base.jsx","../../../client/src/javascripts/customer_pages/_utils/refresh-on-events.jsx","../../../client/src/javascripts/customer_pages/_prism-builder/common/trays/favourites-tray-item-preview.jsx","../../../client/src/javascripts/customer_pages/_prism-builder/common/trays/favourites-tray-item-preview-desktop.jsx","../../../client/src/javascripts/customer_pages/_prism-builder/utils/drag-item.jsx","../../../client/src/javascripts/customer_pages/_prism-builder/utils/spinner.jsx","../../../client/src/javascripts/customer_pages/_prism-builder/common/trays/layouts-tray-base.jsx","../../../client/src/javascripts/customer_pages/_prism-builder/trays/option-tray-mixin.jsx","../../../client/src/javascripts/customer_pages/_prism-builder/common/trays/options/title.jsx","../../../client/src/javascripts/customer_pages/_prism-builder/common/trays/options/price-difference.jsx","../../../client/src/javascripts/customer_pages/_prism-builder/common/trays/variable-tray-base.jsx","../../../client/src/javascripts/customer_pages/_prism-builder/common/trays/wraps-tray-base.jsx","../../../client/src/javascripts/customer_pages/_prism-builder/mobile/mobile-add-to-cart-button.jsx","../../../node_modules/zustand/esm/middleware.mjs","../../../client/src/javascripts/customer_pages/_prism-builder/stores/usePageStore.js","../../../client/src/javascripts/customer_pages/_prism-builder/common/notices/add-to-cart-notice-base.jsx","../../../client/src/javascripts/customer_pages/_prism-builder/utils/card-nav.js","../../../node_modules/lodash/_baseFilter.js","../../../node_modules/lodash/filter.js","../../../client/src/javascripts/customer_pages/_prism-builder/prism/record-uploads.js","../../../client/src/javascripts/customer_pages/_prism-builder/misc/set-bleed-warning.js","../../../client/src/javascripts/customer_pages/_prism-builder/dispatcher-methods/register-page-navigation.js","../../../client/src/javascripts/customer_pages/_prism-builder/dispatcher-methods/register-page-loader.js","../../../client/src/javascripts/customer_pages/_prism-builder/dispatcher-methods/register-preview-mode.js","../../../client/src/javascripts/customer_pages/_prism-builder/dispatcher-methods/register-upload-process.js","../../../client/src/javascripts/customer_pages/_prism-builder/misc/handle-update-ui.js"],"sourcesContent":["\nimport { FontStore } from '../../../utils/stores';\nimport { usePrismItemStore } from 'stores/usePrismItemStore';\n\n// --------------------------------------------\n\nfunction fontList() {\n  const options = {};\n\n  for (let i = 0; i < FontStore.list.length; i++) {\n    ((font) => {\n      if (!options[font.group]) {\n        options[font.group] = [];\n      }\n\n      const fontName = (font.name === 'Sans' ? 'Open Sans' : font.name);\n\n      options[font.group].push({\n        name: fontName,\n        title: font.title === 'Sans' ? 'Open Sans' : font.title,\n        thumb: `${location.origin}/edt/fnt/smp/${usePrismItemStore.getState().prismItem.sec}/${encodeURIComponent(fontName)}`,\n      });\n    })(FontStore.list[i]);\n  }\n\n  return ['Classic', 'Modern', 'Script', 'Themed']\n    .reduce((memo, group) => memo.concat(options[group]), [])\n    .filter(Boolean)\n    .sort(sorter);\n\n  function sorter(a, b) {\n    if (a.title < b.title) {\n      return -1;\n    }\n    if (a.title > b.title) {\n      return 1;\n    }\n    return 0;\n  }\n}\n\n// --------------------------------------------\n\nexport default fontList;\n","const isSafari =\n  !!navigator.vendor &&\n  navigator.vendor.indexOf('Apple') > -1 &&\n  navigator.userAgent &&\n  !navigator.userAgent.match('CriOS');\n\nasync function testPrivateMode() {\n  try {\n    const testFile = new File(['test'], 'test.txt', { type: 'text/plain' });\n    const db = await new Promise((resolve, reject) => {\n      const request = indexedDB.open('fileTest', 1);\n      request.onerror = () => reject(request.error);\n      request.onsuccess = () => resolve(request.result);\n      request.onupgradeneeded = (e) => {\n        const db = e.target.result;\n        db.createObjectStore('files', { keyPath: 'id' });\n      };\n    });\n\n    const transaction = db.transaction(['files'], 'readwrite');\n    const store = transaction.objectStore('files');\n    await store.put({ id: 1, file: testFile });\n    return false;\n  } catch (e) {\n    return true; // Return true if Private mode (likely saving failed)\n  }\n}\n\nconst safariPrivateMode = async () => isSafari && (await testPrivateMode());\n\nexport { safariPrivateMode };\n","'use strict';\n\n// Import Libraries\nimport React from 'react';\n// Import JS Modules\nimport { builderDispatch, PrismUI } from '../../_utils/ui';\nimport { ThumbnailStore } from '../utils/stores';\nimport { TYPES } from './tray-base';\nimport { safariPrivateMode } from '../utils/private-mode';\nimport { useGenStore } from 'stores/useGenStore';\n\nclass PageBase extends React.PureComponent {\n  constructor(props) {\n    super(props);\n\n    this.handlePrismItemLoaded = this.handlePrismItemLoaded.bind(this);\n    this.handleChicletClicked = this.handleChicletClicked.bind(this);\n    this.handleEntiretyClick = this.handleEntiretyClick.bind(this);\n\n    this.state = {\n      tray: {},\n      canvas: { maxHeight: 0, maxWidth: 0 }\n    };\n\n    this.prevSlot = {};\n    this.prismItemLoaded = false;\n  }\n\n  async componentDidMount() {\n    this.dispatchToken = builderDispatch.register(payload => {\n      switch (payload.type) {\n        case PrismUI.ITEM_LOADED:\n          this.handlePrismItemLoaded();\n          break;\n        case PrismUI.SLOT_CHANGED:\n          this.handleSlotChanged(payload);\n          break;\n      }\n    });\n\n    const isSafariPrivate = await safariPrivateMode();\n\n    if (window.newrelic) {\n      window.newrelic.setCustomAttribute('safariPrivateMode', isSafariPrivate);\n    }\n\n    useGenStore.setState({ isSafariPrivate });\n\n    this.setupResizeObserver(window.ResizeObserver);\n  }\n\n  componentWillUnmount() {\n    builderDispatch.unregister(this.dispatchToken);\n\n    if (this.resizeObserver) {\n      this.resizeObserver.disconnect();\n    }\n  }\n\n  handlePrismItemLoaded() {\n    if (!this.prismItemLoaded) {\n      this.updateCanvasSize();\n    }\n  }\n\n  handleSlotChanged({ slot = {}, view = {} }, onPhotosTrayShown = null) {\n    if ((view.selected && this.isSpineText(view.selected))\n      || this.isSpineText(this.prevSlot)) {\n      this.prevSlot = view.selected;\n      return;\n    }\n    if (slot && slot.isImage && !slot.img) {\n      // Always set the tray to photos tray for new UI\n      const slotIsColour = slot.isColour();\n      const trayName = (this.props.viewport.isMobile) ? TYPES.photos : TYPES.design;\n\n      this.setState(() => ({\n        tray: {\n          name: trayName,\n          visible: true\n        }\n      }), () => {\n        if (ThumbnailStore.empty() && !slotIsColour) {\n          this.fireAddPhotos();\n        }\n        if (typeof onPhotosTrayShown === 'function') {\n          onPhotosTrayShown();\n        }\n      });\n    }\n    if (view.selected) this.prevSlot = view.selected;\n  }\n\n  handleChicletClicked(name) {\n    this.setState(({ tray: { name: prevName } }) => {\n      name || (name = prevName); // if name is undefined then use the previous one in order to toggle the tray\n\n      return {\n        tray: {\n          name,\n          visible: true\n        }\n      };\n    });\n  }\n\n  handleEntiretyClick(e) {\n    // clear any selected slots in the editor\n    if ($(e.target).closest('.ub-view-bg').length === 0) {\n      activeView.selectSlotById(null);\n    }\n  }\n\n  isSpineText(slot) {\n    return slot.id === 'spine-text';\n  }\n\n  setupResizeObserver(ResizeObserverClass) {\n    this.resizeObserver = new ResizeObserverClass(entries => {\n      try {\n        // Use requestAnimationFrame to defer DOM updates\n        requestAnimationFrame(() => {\n          if (entries.some(entry => entry.target === this.main)) {\n            if (this.prismItemLoaded) {\n              this.updateCanvasSizeSafely();\n            }\n          }\n        });\n      } catch (error) {\n        console.error('Error in ResizeObserver callback:', error);\n      }\n    });\n  \n    if (this.main) {\n      this.resizeObserver.observe(this.main);\n    }\n  }\n\n  updateCanvasSizeSafely() {\n    const canvasWidth = this.main.offsetWidth;\n    const canvasHeight = this.main.offsetHeight;\n    const canvas = this.state.canvas;\n  \n    // Update the canvas dimensions only if they are different\n    if (canvas.width !== canvasWidth || canvas.height !== canvasHeight) {\n      canvas.width = canvasWidth;\n      canvas.height = canvasHeight;\n    }\n  }\n  \n  updateCanvasSize() {\n    window.requestAnimationFrame(() => {\n      // Calculate the available space within the prismContainerElement\n      const { height: maxHeight, width: maxWidth } = this.prismContainerExtents;\n\n      this.setState({\n        canvas: {\n          maxHeight,\n          maxWidth\n        }\n      });\n    });\n  }\n}\n\nexport default PageBase;\n","import QuantityPricingToolsBase from '../../_utils/tools/quantity-pricing-tools';\nimport isCard from '../utils/is-card';\nimport { isAlbum } from '../trays/tray-determiner';\nimport { usePrismItemStore } from 'stores/usePrismItemStore';\n\n\nfunction showQuantityDropdown() {\n  return wkData.show_quantity_dropdown;\n}\n\nlet transientUnitPrices;\n\nclass QuantityPricingTools extends QuantityPricingToolsBase {\n  constructor(product = wkData) {\n    super({\n      useSetsWherePossible: ['bundle', 'set'].includes(wkData.collection_name) || showQuantityDropdown(),\n      productSetCopies: product.set_copies,\n      unitPrices: transientUnitPrices || product.prices.prices.unit_prices,\n    });\n\n    this.perPagePrices = product.prices.prices.per_page_prices;\n  }\n\n  generateOptions() {\n    const productName = (() => {\n      if (isCard()) {\n        return 'card';\n      }\n      if (isAlbum()) {\n        return 'book';\n      }\n    })();\n\n    return super.generateOptions(productName);\n  }\n\n  getUnitPriceForQuantity(quantity = wkData.copies) {\n    let price = this.getBasePrice(quantity);\n\n    if (this.perPagePrices && this.additionalPages > 0) {\n      price += (this.additionalPages * this.perPagePrices.extra_page_price);\n    }\n\n    return price;\n  }\n\n  getBasePrice(quantity) {\n    return super.getUnitPriceForQuantity(quantity);\n  }\n\n  get additionalPages() {\n    if (this.perPagePrices) {\n      const prismItem = usePrismItemStore.getState().prismItem;\n      return Math.ceil((prismItem.pageCount - this.perPagePrices.free_pages) / this.perPagePrices.page_multiples);\n    }\n\n    return 0;\n  }\n\n  currentOrFirstAvailableCopies(previousValue = wkData.copies) {\n    return super.currentOrFirstAvailableCopies(previousValue);\n  }\n\n  replaceUnitPrices(prices) {\n    // temporarily overwrite unit prices with some arbritary value\n    // used for price affecting chiclet options\n    this.unitPrices = transientUnitPrices = [].concat(prices).map(({ price, from = 1 }) => ({\n      price,\n      from,\n    }));\n  }\n\n  resetUnitPrices() {\n    // revert the temporarily overwritten unit prices\n    this.unitPrices = wkData.prices.prices.unit_prices;\n    transientUnitPrices = undefined;\n    return this;\n  }\n\n  get completeUnitPrices() {\n    // inject the temporarily overwritten unit prices\n    // into an object which resembles wkData.prices\n    const prices = { ...wkData.prices };\n    prices.prices.unit_prices = this.unitPrices;\n\n    return prices;\n  }\n\n  productName(quantity = 1) {\n    if (isCard()) {\n      return quantity == 1 ? 'card' : 'cards';\n    }\n    if (isAlbum()) {\n      return quantity == 1 ? 'book' : 'books';\n    }\n\n    return quantity == 1 ? 'copy' : 'copies';\n  }\n}\n\nexport default QuantityPricingTools;\n","'use strict';\n\n// Import Libraries\nimport React from 'react';\n// Import JS Modules\nimport QuantityPricingTools from './quantity-pricing-tools';\nimport { PrismUI,\n         builderDispatch }  from '../../_utils/ui';\nimport Currency             from '../../_utils/tools/currency';\nimport pluralize            from '../../_utils/tools/pluralize';\n// Import JSX Modules\n\n// -----------------------------------------------------------\nclass PriceAndQuantityBase extends React.PureComponent {\n  constructor(props) {\n    super(props);\n  }\n\n  componentDidMount() {\n    this.dispatchToken = builderDispatch.register(payload => {\n      switch (payload.type) {\n        case PrismUI.EVENT_QUANTITY_CHANGED:\n          if (payload.value) {\n            this.handleQuantityChange(payload.value);\n          }\n          this.forceUpdate();\n          break;\n        case PrismUI.ITEM_LOADED:\n          this.handleItemLoaded();\n          break;\n        case PrismUI.OPTION_SELECTED:\n          this.handleOptionSelected(payload);\n          break;\n      }\n    });\n  }\n\n  componentWillUnmount() {\n    builderDispatch.unregister(this.dispatchToken);\n  }\n\n  get quantityPricingTools() {\n    return new QuantityPricingTools();\n  }\n\n  get isGenuineSet() {\n    const {collection_name: collectionName} = wkData;\n\n    return collectionName == 'set';\n  }\n\n  get selectOptions() {\n    const {unit_quantity: unitQuantity} = wkData;\n\n    return this.quantityPricingTools.generateOptions().map(({product, quantity, unitPrice, cost}) => {\n      if (this.isGenuineSet) {\n        product = `${pluralize('set', quantity)} of ${unitQuantity} ${pluralize(product, unitQuantity)}`;\n      }\n\n      const labelData = { product, quantity, unitPrice, unitQuantity, cost };\n\n      return {\n        value: quantity,\n        label: this.renderOptionLabel(labelData),\n        text: this.renderOptionText(labelData)\n      };\n    });\n  }\n\n  renderOptionText() {\n    // Stub\n  }\n\n  renderOptionLabel({ product, quantity, unitPrice, unitQuantity, cost }) {\n    return `${quantity} ${product} ${Currency.format(cost)} (${this.renderEachPrice(unitPrice, unitQuantity)} each)`;\n  }\n\n  renderEachPrice(unitPrice, unitQuantity) {\n    const parts = [];\n\n    // if there's a rounding error show the approximately symbol\n    if (unitPrice % unitQuantity) {\n      parts.push('~');\n    }\n\n    parts.push(Currency.format(Math.round(unitPrice / unitQuantity)));\n\n    return parts.join('');\n  }\n\n  handleItemLoaded() {\n    const copies = this.quantityPricingTools.resetUnitPrices().currentOrFirstAvailableCopies();\n    this.handleQuantityChange(copies);\n    this.forceUpdate();\n  }\n\n  handleOptionSelected({variable, option}) {\n    if (variable.affects_price) {\n      this.quantityPricingTools.replaceUnitPrices({price: option.minimum_price});\n      this.forceUpdate();\n    }\n  }\n}\n\nexport default PriceAndQuantityBase;\n","import { usePrismItemStore } from 'stores/usePrismItemStore';\n\n// pulls information about the product's category from the server\n// used for descriptions and learning about filters and options\n\n// --------------------------------------------------------------------\n\nfunction categoryInfoUrl() {\n  const prismItem = usePrismItemStore.getState().prismItem;\n\n  if (prismItem.design_code) {\n    return wkData.category_info_url.replace(/design_code=[^&]*/, `design_code=${prismItem.design_code}`);\n  }\n\n  return wkData.category_info_url;\n}\n\n// --------------------------------------------------------------------\n\nconst getCategoryInfo = (function () {\n  const cachedData = {};\n\n  return function () {\n    const url = categoryInfoUrl();\n\n    if (cachedData.hasOwnProperty(url)) {\n      return Promise.resolve(cachedData[url]);\n    }\n\n    return fetch(url, {\n      credentials: 'same-origin',\n    })\n      .then((response) => response.json())\n      .then((data) => {\n        cachedData[url] = data;\n\n        return data;\n      });\n  };\n}());\n\n// --------------------------------------------------------------------\n\nfunction currentProductFilterInfo(options = {}) {\n  return new Promise((resolve) => {\n    getCategoryInfo()\n      .then((data) => {\n        const { platform = 'desktop' } = options;\n        const platformAvailabilityKey = (data.platform_availabilities || {})[platform];\n\n        data.products = data.products.filter((product) => product.platform_availability & platformAvailabilityKey);\n\n        return data;\n      })\n      .then((data) => {\n        const currentProduct = data.products.find((product) => product.id == wkData.product_id) || data.products[0] || {}; // this could be null if the product isn't legitimately available on the currently platform\n\n        data.products = data.products.filter((product) => product.double_page == currentProduct.double_page);\n\n        data.filters.forEach((filter) => {\n          filter.options = (filter.options || []).filter((option) => data.products.some((product) => product.filters[filter.title] == option.title));\n        });\n\n        data.filters = data.filters.filter((filter) => filter.options.length > 0);\n\n        resolve({\n          product: currentProduct,\n          data,\n        });\n      });\n  });\n}\n\n// --------------------------------------------------------------------\n\nfunction findProductByFilters(products, filters) {\n  products = [].concat(products);\n\n  return products.find((product) => {\n    for (const filter in filters) {\n      if (product.filters[filter] != filters[filter]) return false;\n    }\n\n    return true;\n  });\n}\n\n// --------------------------------------------------------------------\n\nfunction doFiltersMatchAProduct(products, filters) {\n  return !!findProductByFilters(products, filters);\n}\n\n// --------------------------------------------------------------------\n\nfunction fireTransform(targetProductId, customFilters) {\n  const prismItem = usePrismItemStore.getState().prismItem;\n  const url = wkData.remember_url.replace(/remember/, 'transform');\n  const params = {\n    product_id: targetProductId,\n    custom_filters: customFilters,\n    prism_product_theme: prismItem.design_code\n  };\n\n  return fetch(url, {\n    body: JSON.stringify(params),\n    headers: {\n      'content-type': 'application/json'\n    },\n    method: 'POST',\n    credentials: 'same-origin',\n  }).then((response) => {\n    if (!response.ok) {\n      throw Error(response.statusText);\n    }\n    return response;\n  })\n    .then((response) => response.json()); // parses response to JSON\n}\n\n// --------------------------------------------------------------------\n\nexport {\n  getCategoryInfo,\n  currentProductFilterInfo,\n  findProductByFilters,\n  doFiltersMatchAProduct,\n  fireTransform,\n};\n","function objToStr(x){ return Object.prototype.toString.call(x); };\n\nfunction returner(x) { return x; }\n\nfunction wrapIfFunction(thing){\n    return typeof thing !== \"function\" ? thing\n    : function(){\n        return thing.apply(this, arguments);\n    };\n}\n\nfunction setNonEnumerable(target, key, value){\n    if (key in target){\n        target[key] = value;\n    }\n    else {\n        Object.defineProperty(target, key, {\n            value: value,\n            writable: true,\n            configurable: true\n        });\n    }\n}\n\nfunction defaultNonFunctionProperty(left, right, key){\n    if (left !== undefined && right !== undefined) {\n        var getTypeName = function(obj){\n            if (obj && obj.constructor && obj.constructor.name) {\n                return obj.constructor.name;\n            }\n            else {\n                return objToStr(obj).slice(8, -1);\n            }\n        };\n        throw new TypeError('Cannot mixin key ' + key + ' because it is provided by multiple sources, '\n                + 'and the types are ' + getTypeName(left) + ' and ' + getTypeName(right));\n    }\n    return left === undefined ? right : left;\n};\n\nfunction assertObject(obj, obj2){\n    var type = objToStr(obj);\n    if (type !== '[object Object]') {\n        var displayType = obj.constructor ? obj.constructor.name : 'Unknown';\n        var displayType2 = obj2.constructor ? obj2.constructor.name : 'Unknown';\n        throw new Error('cannot merge returned value of type ' + displayType + ' with an ' + displayType2);\n    }\n};\n\n\nvar mixins = module.exports = function makeMixinFunction(rules, _opts){\n    var opts = _opts || {};\n\n    if (!opts.unknownFunction) {\n        opts.unknownFunction = mixins.ONCE;\n    }\n\n    if (!opts.nonFunctionProperty) {\n        opts.nonFunctionProperty = defaultNonFunctionProperty;\n    }\n\n    return function applyMixin(source, mixin){\n        Object.keys(mixin).forEach(function(key){\n            var left = source[key], right = mixin[key], rule = rules[key];\n\n            // this is just a weird case where the key was defined, but there's no value\n            // behave like the key wasn't defined\n            if (left === undefined && right === undefined) return;\n\n            // do we have a rule for this key?\n            if (rule) {\n                // may throw here\n                var fn = rule(left, right, key);\n                setNonEnumerable(source, key, wrapIfFunction(fn));\n                return;\n            }\n\n            var leftIsFn = typeof left === \"function\";\n            var rightIsFn = typeof right === \"function\";\n\n            // check to see if they're some combination of functions or undefined\n            // we already know there's no rule, so use the unknown function behavior\n            if (leftIsFn && right === undefined\n             || rightIsFn && left === undefined\n             || leftIsFn && rightIsFn) {\n                // may throw, the default is ONCE so if both are functions\n                // the default is to throw\n                setNonEnumerable(source, key, wrapIfFunction(opts.unknownFunction(left, right, key)));\n                return;\n            }\n\n            // we have no rule for them, one may be a function but one or both aren't\n            // our default is MANY_MERGED_LOOSE which will merge objects, concat arrays\n            // and throw if there's a type mismatch or both are primitives (how do you merge 3, and \"foo\"?)\n            source[key] = opts.nonFunctionProperty(left, right, key);\n        });\n    };\n};\n\nmixins._mergeObjects = function(obj1, obj2) {\n    if (Array.isArray(obj1) && Array.isArray(obj2)) {\n        return obj1.concat(obj2);\n    }\n\n    assertObject(obj1, obj2);\n    assertObject(obj2, obj1);\n\n    var result = {};\n    Object.keys(obj1).forEach(function(k){\n        if (Object.prototype.hasOwnProperty.call(obj2, k)) {\n            throw new Error('cannot merge returns because both have the ' + JSON.stringify(k) + ' key');\n        }\n        result[k] = obj1[k];\n    });\n\n    Object.keys(obj2).forEach(function(k){\n        // we can skip the conflict check because all conflicts would already be found\n        result[k] = obj2[k];\n    });\n    return result;\n};\n\n// define our built-in mixin types\nmixins.ONCE = function(left, right, key){\n    if (left && right) {\n        throw new TypeError('Cannot mixin ' + key + ' because it has a unique constraint.');\n    }\n    return left || right;\n};\n\nmixins.MANY = function(left, right, key){\n    return function(){\n        if (right) right.apply(this, arguments);\n        return left ? left.apply(this, arguments) : undefined;\n    };\n};\n\nmixins.MANY_MERGED_LOOSE = function(left, right, key) {\n    if (left && right) {\n        return mixins._mergeObjects(left, right);\n    }\n    return left || right;\n};\n\nmixins.MANY_MERGED = function(left, right, key){\n    return function(){\n        var res1 = right && right.apply(this, arguments);\n        var res2 = left && left.apply(this, arguments);\n        if (res1 && res2) {\n            return mixins._mergeObjects(res1, res2)\n        }\n        return res2 || res1;\n    };\n};\n\nmixins.REDUCE_LEFT = function(_left, _right, key){\n    var left = _left || returner;\n    var right = _right || returner;\n    return function(){\n        return right.call(this, left.apply(this, arguments));\n    };\n};\n\nmixins.REDUCE_RIGHT = function(_left, _right, key){\n    var left = _left || returner;\n    var right = _right || returner;\n    return function(){\n        return left.call(this, right.apply(this, arguments));\n    };\n};\n\n","var mixin = require('smart-mixin');\nvar assign = require('object-assign');\n\nvar mixinProto = mixin({\n  // lifecycle stuff is as you'd expect\n  componentDidMount: mixin.MANY,\n  UNSAFE_componentWillMount: mixin.MANY,\n  UNSAFE_componentWillReceiveProps: mixin.MANY,\n  shouldComponentUpdate: mixin.ONCE,\n  UNSAFE_componentWillUpdate: mixin.MANY,\n  componentDidUpdate: mixin.MANY,\n  componentWillUnmount: mixin.MANY,\n  getChildContext: mixin.MANY_MERGED\n});\n\nfunction setDefaultProps(reactMixin) {\n  var getDefaultProps = reactMixin.getDefaultProps;\n\n  if (getDefaultProps) {\n    reactMixin.defaultProps = getDefaultProps();\n\n    delete reactMixin.getDefaultProps;\n  }\n}\n\nfunction setInitialState(reactMixin) {\n  var getInitialState = reactMixin.getInitialState;\n  var UNSAFE_componentWillMount = reactMixin.UNSAFE_componentWillMount;\n\n  function applyInitialState(instance) {\n    var state = instance.state || {};\n    assign(state, getInitialState.call(instance));\n    instance.state = state;\n  }\n\n  if (getInitialState) {\n    if (!UNSAFE_componentWillMount) {\n      reactMixin.UNSAFE_componentWillMount = function() {\n        applyInitialState(this);\n      };\n    } else {\n      reactMixin.UNSAFE_componentWillMount = function() {\n        applyInitialState(this);\n        UNSAFE_componentWillMount.call(this);\n      };\n    }\n\n    delete reactMixin.getInitialState;\n  }\n}\n\nfunction mixinClass(reactClass, reactMixin) {\n  setDefaultProps(reactMixin);\n  setInitialState(reactMixin);\n\n  var prototypeMethods = {};\n  var staticProps = {};\n\n  Object.keys(reactMixin).forEach(function(key) {\n    if (key === 'mixins') {\n      return; // Handled below to ensure proper order regardless of property iteration order\n    }\n    if (key === 'statics') {\n      return; // gets special handling\n    } else if (typeof reactMixin[key] === 'function') {\n      prototypeMethods[key] = reactMixin[key];\n    } else {\n      staticProps[key] = reactMixin[key];\n    }\n  });\n\n  mixinProto(reactClass.prototype, prototypeMethods);\n\n  var mergePropTypes = function(left, right, key) {\n    if (!left) return right;\n    if (!right) return left;\n\n    var result = {};\n    Object.keys(left).forEach(function(leftKey) {\n      if (!right[leftKey]) {\n        result[leftKey] = left[leftKey];\n      }\n    });\n\n    Object.keys(right).forEach(function(rightKey) {\n      if (left[rightKey]) {\n        result[rightKey] = function checkBothContextTypes() {\n          return right[rightKey].apply(this, arguments) && left[rightKey].apply(this, arguments);\n        };\n      } else {\n        result[rightKey] = right[rightKey];\n      }\n    });\n\n    return result;\n  };\n\n  mixin({\n    childContextTypes: mergePropTypes,\n    contextTypes: mergePropTypes,\n    propTypes: mixin.MANY_MERGED_LOOSE,\n    defaultProps: mixin.MANY_MERGED_LOOSE\n  })(reactClass, staticProps);\n\n  // statics is a special case because it merges directly onto the class\n  if (reactMixin.statics) {\n    Object.getOwnPropertyNames(reactMixin.statics).forEach(function(key) {\n      var left = reactClass[key];\n      var right = reactMixin.statics[key];\n\n      if (left !== undefined && right !== undefined) {\n        throw new TypeError('Cannot mixin statics because statics.' + key + ' and Component.' + key + ' are defined.');\n      }\n\n      reactClass[key] = left !== undefined ? left : right;\n    });\n  }\n\n  // If more mixins are defined, they need to run. This emulate's react's behavior.\n  // See behavior in code at:\n  // https://github.com/facebook/react/blob/41aa3496aa632634f650edbe10d617799922d265/src/isomorphic/classic/class/ReactClass.js#L468\n  // Note the .reverse(). In React, a fresh constructor is created, then all mixins are mixed in recursively,\n  // then the actual spec is mixed in last.\n  //\n  // With ES6 classes, the properties are already there, so smart-mixin mixes functions (a, b) -> b()a(), which is\n  // the opposite of how React does it. If we reverse this array, we basically do the whole logic in reverse,\n  // which makes the result the same. See the test for more.\n  // See also:\n  // https://github.com/facebook/react/blob/41aa3496aa632634f650edbe10d617799922d265/src/isomorphic/classic/class/ReactClass.js#L853\n  if (reactMixin.mixins) {\n    reactMixin.mixins.reverse().forEach(mixinClass.bind(null, reactClass));\n  }\n\n  return reactClass;\n}\n\nmodule.exports = (function() {\n  var reactMixin = mixinProto;\n\n  reactMixin.onClass = function(reactClass, mixin) {\n    // we mutate the mixin so let's clone it\n    mixin = assign({}, mixin);\n    return mixinClass(reactClass, mixin);\n  };\n\n  reactMixin.decorate = function(mixin) {\n    return function(reactClass) {\n      return reactMixin.onClass(reactClass, mixin);\n    };\n  };\n\n  return reactMixin;\n})();\n","\nconst imgStateHash = {};\n\n// -----------------------------------------------------------\n//  stashFns\n// -----------------------------------------------------------\nlet localZoomFn;\nconst imgDefaults = {\n  gamma: 1,\n  zoom: 1,\n};\nconst stashFns = {\n  setZoomFn(zoomFn) {\n    localZoomFn = zoomFn;\n  },\n\n  getImgSlotRef(slot) {\n    slot = slot || {};\n    return `${slot.id}---${slot.imgId}`;\n  },\n\n  setImgStateValue(imgSlotRef, key, value) {\n    if (!imgStateHash[imgSlotRef]) imgStateHash[imgSlotRef] = {}; // create a new hash for this particular image\n    if (!isNaN(value)) {\n      imgStateHash[imgSlotRef][key] = value;\n    }\n  },\n\n  straightenChangeDelegator(imgSlotRef, angle) {\n    this.setImgStateValue(imgSlotRef, 'straighten', Number(angle));\n  },\n\n  gammaChangeDelegator(imgSlotRef, gamma) {\n    this.setImgStateValue(imgSlotRef, 'gamma', Number(gamma));\n  },\n\n  zoomChangeDelegator(imgSlotRef, zoom) {\n    this.setImgStateValue(imgSlotRef, 'zoom', Number(zoom));\n  },\n\n  setEl1ZoomSlider(toZoom, zoom) {\n    const imgSlotRef = this.getImgSlotRef(toZoom);\n    this.zoomChangeDelegator(imgSlotRef, zoom);\n    localZoomFn = localZoomFn || function () {};\n    localZoomFn(zoom);\n  },\n\n  getImageStateValue(imgSlotRef, key) {\n    const slotRefVals = imgStateHash[imgSlotRef] || {};\n    let value = imgDefaults[key];\n    if (slotRefVals.hasOwnProperty(key)) value = slotRefVals[key];\n    if (isNaN(value)) value = imgDefaults[key];\n    return value;\n  },\n\n  getAllImageStateValues(imgSlotRef, data) {\n    data = data || {};\n    return $.extend(true, {}, imgDefaults, imgStateHash[imgSlotRef] || {}, data);\n  },\n};\n\nexport default stashFns;\n","import { usePrismItemStore } from 'stores/usePrismItemStore'\n\nconst PrismBuilderCustomSections = {\n  all: [\n    {\n      title: 'Envelope',\n      name: 'envelope',\n      id: 'envelope',\n      isEnabled() {\n        return window.wkData.values.hasEnvelopeOption;\n      },\n      spread: {\n        title: 'Envelope',\n        customPageId: 'envelope',\n        pages() {\n          return [usePrismItemStore.getState().prismItem.product.sections.length];\n        },\n        spread: 0,\n      },\n    },\n  ],\n  enabledSectionCount() {\n    let i = 0;\n\n    this.all.forEach((section) => {\n      if (section.isEnabled()) {\n        i += 1;\n      }\n    });\n\n    return i;\n  },\n  getById(id) {\n    let section;\n    this.all.forEach((s) => {\n      if (s.id === id) {\n        section = s;\n      }\n    });\n    return section;\n  },\n  isAnySectionEnabled() {\n    return this.enabledSectionCount() >= 1;\n  },\n};\n\nexport default PrismBuilderCustomSections;\n","import { usePrismItemStore } from 'stores/usePrismItemStore';\nimport PrismBuilderCustomSections from './prism-builder-custom-sections';\n\nfunction cardTopNavActive() {\n  const prismItem = usePrismItemStore.getState().prismItem;\n\n  return prismItem && prismItem.product && prismItem.product.sections\n      && (prismItem.product.sections.length + PrismBuilderCustomSections.enabledSectionCount() > 1)\n      && window.wkData.product.type === 'wmcard';\n}\n\nexport default cardTopNavActive;\n","import React from 'react';\nimport classNames from 'classnames';\n\nconst chevronDirections = {\n  previous: 'left',\n  next: 'right'\n};\n\nconst Chevron = ({ rel, disabled, label, onClick }) => (\n  <>\n    { !disabled ?\n\n      <button\n        aria-label={`${chevronDirections[rel]} to ${label}`}\n        className={classNames('btn btn-link chevron', rel)}\n        disabled={disabled}\n        rel={rel}\n        onClick={onClick}\n      >\n        <i aria-hidden=\"true\" className={`fas fa-chevron-${chevronDirections[rel]}`} />\n      </button>\n      : null\n    }\n  </>\n);\nexport default Chevron;\n","import React, { Component, PureComponent } from 'react';\nimport ReactDOM from 'react-dom';\nimport { prismAction } from '../utils/stores';\n\nclass TextField extends Component {\n  constructor (props) {\n    super(props);\n\n    this.state = {};\n    this.handleChange = this.handleChange.bind(this);\n  }\n\n  UNSAFE_componentWillMount () {\n    this.copyProps(this.props);\n  }\n\n  UNSAFE_componentWillReceiveProps (nextProps) {\n    this.copyProps(nextProps);\n  }\n\n  render () {\n    return (\n      <input \n        type=\"text\"\n        className=\"form-control\"\n        ref=\"input\"\n        required\n        value={ this.state.value }\n        placeholder={ this.props.placeholder }\n        autoComplete=\"no\"\n        onChange={ this.handleChange } \n      />\n    );\n  }\n\n  getValue() {\n    return ReactDOM.findDOMNode(this.refs.input).value;\n  }\n\n  handleChange (e) {\n    this.setState({\n      value: e.target.value\n    });\n  }\n\n  copyProps (props) {\n    this.setState(props);\n  }\n}\n\nclass AddressForm extends PureComponent {\n  constructor(props) {\n    super(props);\n\n    this.state = {};\n    this.handleSetAddress = this.setAddress.bind(this);\n  }\n\n  UNSAFE_componentWillMount () {\n    if (this.props.address) {\n      this.setAddress(this.props.address);\n    }\n  }\n\n  UNSAFE_componentWillReceiveProps (nextProps) {\n    if (nextProps.address) {\n      this.setAddress(nextProps.address);\n    }\n  }\n\n  render () {\n    return (\n      <form className=\"address-form\">\n        <div className=\"form-row\">\n          <TextField value={ this.state.name } placeholder=\"Name\" ref=\"name\" />\n        </div>\n        <div className=\"form-row\">\n          <div className=\"col-6\">\n            <TextField value={ this.state.streetAdd1 } placeholder=\"Address\" ref=\"streetAdd1\" />\n          </div>\n          <div className=\"col-6\">\n            <TextField value={ this.state.streetAdd2 } placeholder=\"Apt, Suite, Building, etc. (optional)\" ref=\"streetAdd2\" />\n          </div>\n        </div>\n        <div className=\"form-row\">\n          <div className=\"col-6\">\n            <TextField value={ this.state.city } placeholder=\"City\" ref=\"city\" />\n          </div>\n          <div className=\"col-3\">\n            <TextField value={ this.state.state } placeholder=\"State\" ref=\"state\" />\n          </div>\n          <div className=\"col-3\">\n            <TextField value={ this.state.zip } placeholder=\"Zip Code\" ref=\"zip\" />\n          </div>\n        </div>\n      </form>\n    );\n  }\n\n  getAddress () {\n    return {\n      name: this.refs.name.getValue(),\n      streetAdd1: this.refs.streetAdd1.getValue(),\n      streetAdd2: this.refs.streetAdd2.getValue(),\n      city: this.refs.city.getValue(),\n      state: this.refs.state.getValue(),\n      zip: this.refs.zip.getValue(),\n      country: this.refs.country ? this.refs.country.getValue() : 'US'\n    };\n  }\n\n  setAddress (address) {\n    const { name, streetAdd1, streetAdd2, city, state, zip, country } = address;\n\n    this.setState({ name, streetAdd1, streetAdd2, city, state, zip, country });\n  }\n}\n\nclass AddressModal extends Component {\n  addressFields = ['name', 'streetAdd1', 'streetAdd2', 'city', 'state', 'zip'];\n\n  constructor(props) {\n    super(props);\n\n    this.state = {};\n    this.handleSetAddress = this.handleSetAddress.bind(this);\n  }\n\n  componentDidMount() {\n    $(ReactDOM.findDOMNode(this)).modal({\n      keyboard: true,\n      show: false\n    }).on('show.bs.modal', () => {\n      this.setState({ address: Object.assign({}, wkData.values.returnAddress) });\n    }).on('hidden.bs.modal', () => {\n      this.setState({ address: null });\n    });\n  }\n\n  componentWillUnmount() {\n    $(ReactDOM.findDOMNode(this)).modal('hide');\n  }\n\n  render() {\n    return (\n      <div className=\"modal fade\">\n        <div className=\"modal-dialog modal-lg\">\n          <div className=\"modal-content\">\n            <div className=\"modal-header\">\n              <h5>Enter return address for your envelopes<sup>*</sup></h5>\n              <button type=\"button\" className=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\">&times;</span></button>\n            </div>\n            <div className=\"modal-body\">\n              <AddressForm ref=\"addressForm\" address={ this.state.address } />\n            </div>\n            <div className=\"modal-footer\">\n              <h6 className=\"flex-grow-1 text-left\"><sup>*</sup>Envelope printing not available for 1 hour cards</h6>\n              <button className=\"btn btn-primary float-right\"\n                      data-dismiss=\"modal\"\n                      onClick={ this.handleSetAddress }>\n                Done\n              </button>\n            </div>\n          </div>\n        </div>\n      </div>\n    );\n  }\n\n  handleSetAddress() {\n    const address = this.address(),\n          empty   = this.isAddressEmpty(address);\n\n    wkData.values.returnAddress = address;\n    wkData.values.useReturnAddress = empty ? '' : 'yes';\n\n    prismAction.save_wkdata();\n\n    this.props.onDone();\n  }\n\n  address() {\n    const address = this.refs.addressForm.getAddress();\n\n    this.addressFields.forEach(function(field) {\n      address[field] = address[field].trim();\n    });\n\n    return address;\n  }\n\n  isAddressEmpty(address) {\n    let isEmpty = true;\n\n    this.addressFields.forEach(function(field) {\n      if (!!address[field]) {\n        isEmpty = false;\n      }\n    });\n\n    return isEmpty;\n  }\n\n  open() {\n    $(ReactDOM.findDOMNode(this)).modal('show');\n  }\n\n  close() {\n    $(ReactDOM.findDOMNode(this)).modal('hide');\n  }\n}\n\nexport default AddressModal;\n","// This file is autogenerated. It's used to publish ESM to npm.\nfunction _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n    return typeof obj;\n  } : function (obj) {\n    return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n  }, _typeof(obj);\n}\n\n// https://github.com/bgrins/TinyColor\n// Brian Grinstead, MIT License\n\nvar trimLeft = /^\\s+/;\nvar trimRight = /\\s+$/;\nfunction tinycolor(color, opts) {\n  color = color ? color : \"\";\n  opts = opts || {};\n\n  // If input is already a tinycolor, return itself\n  if (color instanceof tinycolor) {\n    return color;\n  }\n  // If we are called as a function, call using new instead\n  if (!(this instanceof tinycolor)) {\n    return new tinycolor(color, opts);\n  }\n  var rgb = inputToRGB(color);\n  this._originalInput = color, this._r = rgb.r, this._g = rgb.g, this._b = rgb.b, this._a = rgb.a, this._roundA = Math.round(100 * this._a) / 100, this._format = opts.format || rgb.format;\n  this._gradientType = opts.gradientType;\n\n  // Don't let the range of [0,255] come back in [0,1].\n  // Potentially lose a little bit of precision here, but will fix issues where\n  // .5 gets interpreted as half of the total, instead of half of 1\n  // If it was supposed to be 128, this was already taken care of by `inputToRgb`\n  if (this._r < 1) this._r = Math.round(this._r);\n  if (this._g < 1) this._g = Math.round(this._g);\n  if (this._b < 1) this._b = Math.round(this._b);\n  this._ok = rgb.ok;\n}\ntinycolor.prototype = {\n  isDark: function isDark() {\n    return this.getBrightness() < 128;\n  },\n  isLight: function isLight() {\n    return !this.isDark();\n  },\n  isValid: function isValid() {\n    return this._ok;\n  },\n  getOriginalInput: function getOriginalInput() {\n    return this._originalInput;\n  },\n  getFormat: function getFormat() {\n    return this._format;\n  },\n  getAlpha: function getAlpha() {\n    return this._a;\n  },\n  getBrightness: function getBrightness() {\n    //http://www.w3.org/TR/AERT#color-contrast\n    var rgb = this.toRgb();\n    return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;\n  },\n  getLuminance: function getLuminance() {\n    //http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n    var rgb = this.toRgb();\n    var RsRGB, GsRGB, BsRGB, R, G, B;\n    RsRGB = rgb.r / 255;\n    GsRGB = rgb.g / 255;\n    BsRGB = rgb.b / 255;\n    if (RsRGB <= 0.03928) R = RsRGB / 12.92;else R = Math.pow((RsRGB + 0.055) / 1.055, 2.4);\n    if (GsRGB <= 0.03928) G = GsRGB / 12.92;else G = Math.pow((GsRGB + 0.055) / 1.055, 2.4);\n    if (BsRGB <= 0.03928) B = BsRGB / 12.92;else B = Math.pow((BsRGB + 0.055) / 1.055, 2.4);\n    return 0.2126 * R + 0.7152 * G + 0.0722 * B;\n  },\n  setAlpha: function setAlpha(value) {\n    this._a = boundAlpha(value);\n    this._roundA = Math.round(100 * this._a) / 100;\n    return this;\n  },\n  toHsv: function toHsv() {\n    var hsv = rgbToHsv(this._r, this._g, this._b);\n    return {\n      h: hsv.h * 360,\n      s: hsv.s,\n      v: hsv.v,\n      a: this._a\n    };\n  },\n  toHsvString: function toHsvString() {\n    var hsv = rgbToHsv(this._r, this._g, this._b);\n    var h = Math.round(hsv.h * 360),\n      s = Math.round(hsv.s * 100),\n      v = Math.round(hsv.v * 100);\n    return this._a == 1 ? \"hsv(\" + h + \", \" + s + \"%, \" + v + \"%)\" : \"hsva(\" + h + \", \" + s + \"%, \" + v + \"%, \" + this._roundA + \")\";\n  },\n  toHsl: function toHsl() {\n    var hsl = rgbToHsl(this._r, this._g, this._b);\n    return {\n      h: hsl.h * 360,\n      s: hsl.s,\n      l: hsl.l,\n      a: this._a\n    };\n  },\n  toHslString: function toHslString() {\n    var hsl = rgbToHsl(this._r, this._g, this._b);\n    var h = Math.round(hsl.h * 360),\n      s = Math.round(hsl.s * 100),\n      l = Math.round(hsl.l * 100);\n    return this._a == 1 ? \"hsl(\" + h + \", \" + s + \"%, \" + l + \"%)\" : \"hsla(\" + h + \", \" + s + \"%, \" + l + \"%, \" + this._roundA + \")\";\n  },\n  toHex: function toHex(allow3Char) {\n    return rgbToHex(this._r, this._g, this._b, allow3Char);\n  },\n  toHexString: function toHexString(allow3Char) {\n    return \"#\" + this.toHex(allow3Char);\n  },\n  toHex8: function toHex8(allow4Char) {\n    return rgbaToHex(this._r, this._g, this._b, this._a, allow4Char);\n  },\n  toHex8String: function toHex8String(allow4Char) {\n    return \"#\" + this.toHex8(allow4Char);\n  },\n  toRgb: function toRgb() {\n    return {\n      r: Math.round(this._r),\n      g: Math.round(this._g),\n      b: Math.round(this._b),\n      a: this._a\n    };\n  },\n  toRgbString: function toRgbString() {\n    return this._a == 1 ? \"rgb(\" + Math.round(this._r) + \", \" + Math.round(this._g) + \", \" + Math.round(this._b) + \")\" : \"rgba(\" + Math.round(this._r) + \", \" + Math.round(this._g) + \", \" + Math.round(this._b) + \", \" + this._roundA + \")\";\n  },\n  toPercentageRgb: function toPercentageRgb() {\n    return {\n      r: Math.round(bound01(this._r, 255) * 100) + \"%\",\n      g: Math.round(bound01(this._g, 255) * 100) + \"%\",\n      b: Math.round(bound01(this._b, 255) * 100) + \"%\",\n      a: this._a\n    };\n  },\n  toPercentageRgbString: function toPercentageRgbString() {\n    return this._a == 1 ? \"rgb(\" + Math.round(bound01(this._r, 255) * 100) + \"%, \" + Math.round(bound01(this._g, 255) * 100) + \"%, \" + Math.round(bound01(this._b, 255) * 100) + \"%)\" : \"rgba(\" + Math.round(bound01(this._r, 255) * 100) + \"%, \" + Math.round(bound01(this._g, 255) * 100) + \"%, \" + Math.round(bound01(this._b, 255) * 100) + \"%, \" + this._roundA + \")\";\n  },\n  toName: function toName() {\n    if (this._a === 0) {\n      return \"transparent\";\n    }\n    if (this._a < 1) {\n      return false;\n    }\n    return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false;\n  },\n  toFilter: function toFilter(secondColor) {\n    var hex8String = \"#\" + rgbaToArgbHex(this._r, this._g, this._b, this._a);\n    var secondHex8String = hex8String;\n    var gradientType = this._gradientType ? \"GradientType = 1, \" : \"\";\n    if (secondColor) {\n      var s = tinycolor(secondColor);\n      secondHex8String = \"#\" + rgbaToArgbHex(s._r, s._g, s._b, s._a);\n    }\n    return \"progid:DXImageTransform.Microsoft.gradient(\" + gradientType + \"startColorstr=\" + hex8String + \",endColorstr=\" + secondHex8String + \")\";\n  },\n  toString: function toString(format) {\n    var formatSet = !!format;\n    format = format || this._format;\n    var formattedString = false;\n    var hasAlpha = this._a < 1 && this._a >= 0;\n    var needsAlphaFormat = !formatSet && hasAlpha && (format === \"hex\" || format === \"hex6\" || format === \"hex3\" || format === \"hex4\" || format === \"hex8\" || format === \"name\");\n    if (needsAlphaFormat) {\n      // Special case for \"transparent\", all other non-alpha formats\n      // will return rgba when there is transparency.\n      if (format === \"name\" && this._a === 0) {\n        return this.toName();\n      }\n      return this.toRgbString();\n    }\n    if (format === \"rgb\") {\n      formattedString = this.toRgbString();\n    }\n    if (format === \"prgb\") {\n      formattedString = this.toPercentageRgbString();\n    }\n    if (format === \"hex\" || format === \"hex6\") {\n      formattedString = this.toHexString();\n    }\n    if (format === \"hex3\") {\n      formattedString = this.toHexString(true);\n    }\n    if (format === \"hex4\") {\n      formattedString = this.toHex8String(true);\n    }\n    if (format === \"hex8\") {\n      formattedString = this.toHex8String();\n    }\n    if (format === \"name\") {\n      formattedString = this.toName();\n    }\n    if (format === \"hsl\") {\n      formattedString = this.toHslString();\n    }\n    if (format === \"hsv\") {\n      formattedString = this.toHsvString();\n    }\n    return formattedString || this.toHexString();\n  },\n  clone: function clone() {\n    return tinycolor(this.toString());\n  },\n  _applyModification: function _applyModification(fn, args) {\n    var color = fn.apply(null, [this].concat([].slice.call(args)));\n    this._r = color._r;\n    this._g = color._g;\n    this._b = color._b;\n    this.setAlpha(color._a);\n    return this;\n  },\n  lighten: function lighten() {\n    return this._applyModification(_lighten, arguments);\n  },\n  brighten: function brighten() {\n    return this._applyModification(_brighten, arguments);\n  },\n  darken: function darken() {\n    return this._applyModification(_darken, arguments);\n  },\n  desaturate: function desaturate() {\n    return this._applyModification(_desaturate, arguments);\n  },\n  saturate: function saturate() {\n    return this._applyModification(_saturate, arguments);\n  },\n  greyscale: function greyscale() {\n    return this._applyModification(_greyscale, arguments);\n  },\n  spin: function spin() {\n    return this._applyModification(_spin, arguments);\n  },\n  _applyCombination: function _applyCombination(fn, args) {\n    return fn.apply(null, [this].concat([].slice.call(args)));\n  },\n  analogous: function analogous() {\n    return this._applyCombination(_analogous, arguments);\n  },\n  complement: function complement() {\n    return this._applyCombination(_complement, arguments);\n  },\n  monochromatic: function monochromatic() {\n    return this._applyCombination(_monochromatic, arguments);\n  },\n  splitcomplement: function splitcomplement() {\n    return this._applyCombination(_splitcomplement, arguments);\n  },\n  // Disabled until https://github.com/bgrins/TinyColor/issues/254\n  // polyad: function (number) {\n  //   return this._applyCombination(polyad, [number]);\n  // },\n  triad: function triad() {\n    return this._applyCombination(polyad, [3]);\n  },\n  tetrad: function tetrad() {\n    return this._applyCombination(polyad, [4]);\n  }\n};\n\n// If input is an object, force 1 into \"1.0\" to handle ratios properly\n// String input requires \"1.0\" as input, so 1 will be treated as 1\ntinycolor.fromRatio = function (color, opts) {\n  if (_typeof(color) == \"object\") {\n    var newColor = {};\n    for (var i in color) {\n      if (color.hasOwnProperty(i)) {\n        if (i === \"a\") {\n          newColor[i] = color[i];\n        } else {\n          newColor[i] = convertToPercentage(color[i]);\n        }\n      }\n    }\n    color = newColor;\n  }\n  return tinycolor(color, opts);\n};\n\n// Given a string or object, convert that input to RGB\n// Possible string inputs:\n//\n//     \"red\"\n//     \"#f00\" or \"f00\"\n//     \"#ff0000\" or \"ff0000\"\n//     \"#ff000000\" or \"ff000000\"\n//     \"rgb 255 0 0\" or \"rgb (255, 0, 0)\"\n//     \"rgb 1.0 0 0\" or \"rgb (1, 0, 0)\"\n//     \"rgba (255, 0, 0, 1)\" or \"rgba 255, 0, 0, 1\"\n//     \"rgba (1.0, 0, 0, 1)\" or \"rgba 1.0, 0, 0, 1\"\n//     \"hsl(0, 100%, 50%)\" or \"hsl 0 100% 50%\"\n//     \"hsla(0, 100%, 50%, 1)\" or \"hsla 0 100% 50%, 1\"\n//     \"hsv(0, 100%, 100%)\" or \"hsv 0 100% 100%\"\n//\nfunction inputToRGB(color) {\n  var rgb = {\n    r: 0,\n    g: 0,\n    b: 0\n  };\n  var a = 1;\n  var s = null;\n  var v = null;\n  var l = null;\n  var ok = false;\n  var format = false;\n  if (typeof color == \"string\") {\n    color = stringInputToObject(color);\n  }\n  if (_typeof(color) == \"object\") {\n    if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) {\n      rgb = rgbToRgb(color.r, color.g, color.b);\n      ok = true;\n      format = String(color.r).substr(-1) === \"%\" ? \"prgb\" : \"rgb\";\n    } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) {\n      s = convertToPercentage(color.s);\n      v = convertToPercentage(color.v);\n      rgb = hsvToRgb(color.h, s, v);\n      ok = true;\n      format = \"hsv\";\n    } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) {\n      s = convertToPercentage(color.s);\n      l = convertToPercentage(color.l);\n      rgb = hslToRgb(color.h, s, l);\n      ok = true;\n      format = \"hsl\";\n    }\n    if (color.hasOwnProperty(\"a\")) {\n      a = color.a;\n    }\n  }\n  a = boundAlpha(a);\n  return {\n    ok: ok,\n    format: color.format || format,\n    r: Math.min(255, Math.max(rgb.r, 0)),\n    g: Math.min(255, Math.max(rgb.g, 0)),\n    b: Math.min(255, Math.max(rgb.b, 0)),\n    a: a\n  };\n}\n\n// Conversion Functions\n// --------------------\n\n// `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:\n// <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>\n\n// `rgbToRgb`\n// Handle bounds / percentage checking to conform to CSS color spec\n// <http://www.w3.org/TR/css3-color/>\n// *Assumes:* r, g, b in [0, 255] or [0, 1]\n// *Returns:* { r, g, b } in [0, 255]\nfunction rgbToRgb(r, g, b) {\n  return {\n    r: bound01(r, 255) * 255,\n    g: bound01(g, 255) * 255,\n    b: bound01(b, 255) * 255\n  };\n}\n\n// `rgbToHsl`\n// Converts an RGB color value to HSL.\n// *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]\n// *Returns:* { h, s, l } in [0,1]\nfunction rgbToHsl(r, g, b) {\n  r = bound01(r, 255);\n  g = bound01(g, 255);\n  b = bound01(b, 255);\n  var max = Math.max(r, g, b),\n    min = Math.min(r, g, b);\n  var h,\n    s,\n    l = (max + min) / 2;\n  if (max == min) {\n    h = s = 0; // achromatic\n  } else {\n    var d = max - min;\n    s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n    switch (max) {\n      case r:\n        h = (g - b) / d + (g < b ? 6 : 0);\n        break;\n      case g:\n        h = (b - r) / d + 2;\n        break;\n      case b:\n        h = (r - g) / d + 4;\n        break;\n    }\n    h /= 6;\n  }\n  return {\n    h: h,\n    s: s,\n    l: l\n  };\n}\n\n// `hslToRgb`\n// Converts an HSL color value to RGB.\n// *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]\n// *Returns:* { r, g, b } in the set [0, 255]\nfunction hslToRgb(h, s, l) {\n  var r, g, b;\n  h = bound01(h, 360);\n  s = bound01(s, 100);\n  l = bound01(l, 100);\n  function hue2rgb(p, q, t) {\n    if (t < 0) t += 1;\n    if (t > 1) t -= 1;\n    if (t < 1 / 6) return p + (q - p) * 6 * t;\n    if (t < 1 / 2) return q;\n    if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n    return p;\n  }\n  if (s === 0) {\n    r = g = b = l; // achromatic\n  } else {\n    var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n    var p = 2 * l - q;\n    r = hue2rgb(p, q, h + 1 / 3);\n    g = hue2rgb(p, q, h);\n    b = hue2rgb(p, q, h - 1 / 3);\n  }\n  return {\n    r: r * 255,\n    g: g * 255,\n    b: b * 255\n  };\n}\n\n// `rgbToHsv`\n// Converts an RGB color value to HSV\n// *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]\n// *Returns:* { h, s, v } in [0,1]\nfunction rgbToHsv(r, g, b) {\n  r = bound01(r, 255);\n  g = bound01(g, 255);\n  b = bound01(b, 255);\n  var max = Math.max(r, g, b),\n    min = Math.min(r, g, b);\n  var h,\n    s,\n    v = max;\n  var d = max - min;\n  s = max === 0 ? 0 : d / max;\n  if (max == min) {\n    h = 0; // achromatic\n  } else {\n    switch (max) {\n      case r:\n        h = (g - b) / d + (g < b ? 6 : 0);\n        break;\n      case g:\n        h = (b - r) / d + 2;\n        break;\n      case b:\n        h = (r - g) / d + 4;\n        break;\n    }\n    h /= 6;\n  }\n  return {\n    h: h,\n    s: s,\n    v: v\n  };\n}\n\n// `hsvToRgb`\n// Converts an HSV color value to RGB.\n// *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]\n// *Returns:* { r, g, b } in the set [0, 255]\nfunction hsvToRgb(h, s, v) {\n  h = bound01(h, 360) * 6;\n  s = bound01(s, 100);\n  v = bound01(v, 100);\n  var i = Math.floor(h),\n    f = h - i,\n    p = v * (1 - s),\n    q = v * (1 - f * s),\n    t = v * (1 - (1 - f) * s),\n    mod = i % 6,\n    r = [v, q, p, p, t, v][mod],\n    g = [t, v, v, q, p, p][mod],\n    b = [p, p, t, v, v, q][mod];\n  return {\n    r: r * 255,\n    g: g * 255,\n    b: b * 255\n  };\n}\n\n// `rgbToHex`\n// Converts an RGB color to hex\n// Assumes r, g, and b are contained in the set [0, 255]\n// Returns a 3 or 6 character hex\nfunction rgbToHex(r, g, b, allow3Char) {\n  var hex = [pad2(Math.round(r).toString(16)), pad2(Math.round(g).toString(16)), pad2(Math.round(b).toString(16))];\n\n  // Return a 3 character hex if possible\n  if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) {\n    return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);\n  }\n  return hex.join(\"\");\n}\n\n// `rgbaToHex`\n// Converts an RGBA color plus alpha transparency to hex\n// Assumes r, g, b are contained in the set [0, 255] and\n// a in [0, 1]. Returns a 4 or 8 character rgba hex\nfunction rgbaToHex(r, g, b, a, allow4Char) {\n  var hex = [pad2(Math.round(r).toString(16)), pad2(Math.round(g).toString(16)), pad2(Math.round(b).toString(16)), pad2(convertDecimalToHex(a))];\n\n  // Return a 4 character hex if possible\n  if (allow4Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1) && hex[3].charAt(0) == hex[3].charAt(1)) {\n    return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);\n  }\n  return hex.join(\"\");\n}\n\n// `rgbaToArgbHex`\n// Converts an RGBA color to an ARGB Hex8 string\n// Rarely used, but required for \"toFilter()\"\nfunction rgbaToArgbHex(r, g, b, a) {\n  var hex = [pad2(convertDecimalToHex(a)), pad2(Math.round(r).toString(16)), pad2(Math.round(g).toString(16)), pad2(Math.round(b).toString(16))];\n  return hex.join(\"\");\n}\n\n// `equals`\n// Can be called with any tinycolor input\ntinycolor.equals = function (color1, color2) {\n  if (!color1 || !color2) return false;\n  return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString();\n};\ntinycolor.random = function () {\n  return tinycolor.fromRatio({\n    r: Math.random(),\n    g: Math.random(),\n    b: Math.random()\n  });\n};\n\n// Modification Functions\n// ----------------------\n// Thanks to less.js for some of the basics here\n// <https://github.com/cloudhead/less.js/blob/master/lib/less/functions.js>\n\nfunction _desaturate(color, amount) {\n  amount = amount === 0 ? 0 : amount || 10;\n  var hsl = tinycolor(color).toHsl();\n  hsl.s -= amount / 100;\n  hsl.s = clamp01(hsl.s);\n  return tinycolor(hsl);\n}\nfunction _saturate(color, amount) {\n  amount = amount === 0 ? 0 : amount || 10;\n  var hsl = tinycolor(color).toHsl();\n  hsl.s += amount / 100;\n  hsl.s = clamp01(hsl.s);\n  return tinycolor(hsl);\n}\nfunction _greyscale(color) {\n  return tinycolor(color).desaturate(100);\n}\nfunction _lighten(color, amount) {\n  amount = amount === 0 ? 0 : amount || 10;\n  var hsl = tinycolor(color).toHsl();\n  hsl.l += amount / 100;\n  hsl.l = clamp01(hsl.l);\n  return tinycolor(hsl);\n}\nfunction _brighten(color, amount) {\n  amount = amount === 0 ? 0 : amount || 10;\n  var rgb = tinycolor(color).toRgb();\n  rgb.r = Math.max(0, Math.min(255, rgb.r - Math.round(255 * -(amount / 100))));\n  rgb.g = Math.max(0, Math.min(255, rgb.g - Math.round(255 * -(amount / 100))));\n  rgb.b = Math.max(0, Math.min(255, rgb.b - Math.round(255 * -(amount / 100))));\n  return tinycolor(rgb);\n}\nfunction _darken(color, amount) {\n  amount = amount === 0 ? 0 : amount || 10;\n  var hsl = tinycolor(color).toHsl();\n  hsl.l -= amount / 100;\n  hsl.l = clamp01(hsl.l);\n  return tinycolor(hsl);\n}\n\n// Spin takes a positive or negative amount within [-360, 360] indicating the change of hue.\n// Values outside of this range will be wrapped into this range.\nfunction _spin(color, amount) {\n  var hsl = tinycolor(color).toHsl();\n  var hue = (hsl.h + amount) % 360;\n  hsl.h = hue < 0 ? 360 + hue : hue;\n  return tinycolor(hsl);\n}\n\n// Combination Functions\n// ---------------------\n// Thanks to jQuery xColor for some of the ideas behind these\n// <https://github.com/infusion/jQuery-xcolor/blob/master/jquery.xcolor.js>\n\nfunction _complement(color) {\n  var hsl = tinycolor(color).toHsl();\n  hsl.h = (hsl.h + 180) % 360;\n  return tinycolor(hsl);\n}\nfunction polyad(color, number) {\n  if (isNaN(number) || number <= 0) {\n    throw new Error(\"Argument to polyad must be a positive number\");\n  }\n  var hsl = tinycolor(color).toHsl();\n  var result = [tinycolor(color)];\n  var step = 360 / number;\n  for (var i = 1; i < number; i++) {\n    result.push(tinycolor({\n      h: (hsl.h + i * step) % 360,\n      s: hsl.s,\n      l: hsl.l\n    }));\n  }\n  return result;\n}\nfunction _splitcomplement(color) {\n  var hsl = tinycolor(color).toHsl();\n  var h = hsl.h;\n  return [tinycolor(color), tinycolor({\n    h: (h + 72) % 360,\n    s: hsl.s,\n    l: hsl.l\n  }), tinycolor({\n    h: (h + 216) % 360,\n    s: hsl.s,\n    l: hsl.l\n  })];\n}\nfunction _analogous(color, results, slices) {\n  results = results || 6;\n  slices = slices || 30;\n  var hsl = tinycolor(color).toHsl();\n  var part = 360 / slices;\n  var ret = [tinycolor(color)];\n  for (hsl.h = (hsl.h - (part * results >> 1) + 720) % 360; --results;) {\n    hsl.h = (hsl.h + part) % 360;\n    ret.push(tinycolor(hsl));\n  }\n  return ret;\n}\nfunction _monochromatic(color, results) {\n  results = results || 6;\n  var hsv = tinycolor(color).toHsv();\n  var h = hsv.h,\n    s = hsv.s,\n    v = hsv.v;\n  var ret = [];\n  var modification = 1 / results;\n  while (results--) {\n    ret.push(tinycolor({\n      h: h,\n      s: s,\n      v: v\n    }));\n    v = (v + modification) % 1;\n  }\n  return ret;\n}\n\n// Utility Functions\n// ---------------------\n\ntinycolor.mix = function (color1, color2, amount) {\n  amount = amount === 0 ? 0 : amount || 50;\n  var rgb1 = tinycolor(color1).toRgb();\n  var rgb2 = tinycolor(color2).toRgb();\n  var p = amount / 100;\n  var rgba = {\n    r: (rgb2.r - rgb1.r) * p + rgb1.r,\n    g: (rgb2.g - rgb1.g) * p + rgb1.g,\n    b: (rgb2.b - rgb1.b) * p + rgb1.b,\n    a: (rgb2.a - rgb1.a) * p + rgb1.a\n  };\n  return tinycolor(rgba);\n};\n\n// Readability Functions\n// ---------------------\n// <http://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef (WCAG Version 2)\n\n// `contrast`\n// Analyze the 2 colors and returns the color contrast defined by (WCAG Version 2)\ntinycolor.readability = function (color1, color2) {\n  var c1 = tinycolor(color1);\n  var c2 = tinycolor(color2);\n  return (Math.max(c1.getLuminance(), c2.getLuminance()) + 0.05) / (Math.min(c1.getLuminance(), c2.getLuminance()) + 0.05);\n};\n\n// `isReadable`\n// Ensure that foreground and background color combinations meet WCAG2 guidelines.\n// The third argument is an optional Object.\n//      the 'level' property states 'AA' or 'AAA' - if missing or invalid, it defaults to 'AA';\n//      the 'size' property states 'large' or 'small' - if missing or invalid, it defaults to 'small'.\n// If the entire object is absent, isReadable defaults to {level:\"AA\",size:\"small\"}.\n\n// *Example*\n//    tinycolor.isReadable(\"#000\", \"#111\") => false\n//    tinycolor.isReadable(\"#000\", \"#111\",{level:\"AA\",size:\"large\"}) => false\ntinycolor.isReadable = function (color1, color2, wcag2) {\n  var readability = tinycolor.readability(color1, color2);\n  var wcag2Parms, out;\n  out = false;\n  wcag2Parms = validateWCAG2Parms(wcag2);\n  switch (wcag2Parms.level + wcag2Parms.size) {\n    case \"AAsmall\":\n    case \"AAAlarge\":\n      out = readability >= 4.5;\n      break;\n    case \"AAlarge\":\n      out = readability >= 3;\n      break;\n    case \"AAAsmall\":\n      out = readability >= 7;\n      break;\n  }\n  return out;\n};\n\n// `mostReadable`\n// Given a base color and a list of possible foreground or background\n// colors for that base, returns the most readable color.\n// Optionally returns Black or White if the most readable color is unreadable.\n// *Example*\n//    tinycolor.mostReadable(tinycolor.mostReadable(\"#123\", [\"#124\", \"#125\"],{includeFallbackColors:false}).toHexString(); // \"#112255\"\n//    tinycolor.mostReadable(tinycolor.mostReadable(\"#123\", [\"#124\", \"#125\"],{includeFallbackColors:true}).toHexString();  // \"#ffffff\"\n//    tinycolor.mostReadable(\"#a8015a\", [\"#faf3f3\"],{includeFallbackColors:true,level:\"AAA\",size:\"large\"}).toHexString(); // \"#faf3f3\"\n//    tinycolor.mostReadable(\"#a8015a\", [\"#faf3f3\"],{includeFallbackColors:true,level:\"AAA\",size:\"small\"}).toHexString(); // \"#ffffff\"\ntinycolor.mostReadable = function (baseColor, colorList, args) {\n  var bestColor = null;\n  var bestScore = 0;\n  var readability;\n  var includeFallbackColors, level, size;\n  args = args || {};\n  includeFallbackColors = args.includeFallbackColors;\n  level = args.level;\n  size = args.size;\n  for (var i = 0; i < colorList.length; i++) {\n    readability = tinycolor.readability(baseColor, colorList[i]);\n    if (readability > bestScore) {\n      bestScore = readability;\n      bestColor = tinycolor(colorList[i]);\n    }\n  }\n  if (tinycolor.isReadable(baseColor, bestColor, {\n    level: level,\n    size: size\n  }) || !includeFallbackColors) {\n    return bestColor;\n  } else {\n    args.includeFallbackColors = false;\n    return tinycolor.mostReadable(baseColor, [\"#fff\", \"#000\"], args);\n  }\n};\n\n// Big List of Colors\n// ------------------\n// <https://www.w3.org/TR/css-color-4/#named-colors>\nvar names = tinycolor.names = {\n  aliceblue: \"f0f8ff\",\n  antiquewhite: \"faebd7\",\n  aqua: \"0ff\",\n  aquamarine: \"7fffd4\",\n  azure: \"f0ffff\",\n  beige: \"f5f5dc\",\n  bisque: \"ffe4c4\",\n  black: \"000\",\n  blanchedalmond: \"ffebcd\",\n  blue: \"00f\",\n  blueviolet: \"8a2be2\",\n  brown: \"a52a2a\",\n  burlywood: \"deb887\",\n  burntsienna: \"ea7e5d\",\n  cadetblue: \"5f9ea0\",\n  chartreuse: \"7fff00\",\n  chocolate: \"d2691e\",\n  coral: \"ff7f50\",\n  cornflowerblue: \"6495ed\",\n  cornsilk: \"fff8dc\",\n  crimson: \"dc143c\",\n  cyan: \"0ff\",\n  darkblue: \"00008b\",\n  darkcyan: \"008b8b\",\n  darkgoldenrod: \"b8860b\",\n  darkgray: \"a9a9a9\",\n  darkgreen: \"006400\",\n  darkgrey: \"a9a9a9\",\n  darkkhaki: \"bdb76b\",\n  darkmagenta: \"8b008b\",\n  darkolivegreen: \"556b2f\",\n  darkorange: \"ff8c00\",\n  darkorchid: \"9932cc\",\n  darkred: \"8b0000\",\n  darksalmon: \"e9967a\",\n  darkseagreen: \"8fbc8f\",\n  darkslateblue: \"483d8b\",\n  darkslategray: \"2f4f4f\",\n  darkslategrey: \"2f4f4f\",\n  darkturquoise: \"00ced1\",\n  darkviolet: \"9400d3\",\n  deeppink: \"ff1493\",\n  deepskyblue: \"00bfff\",\n  dimgray: \"696969\",\n  dimgrey: \"696969\",\n  dodgerblue: \"1e90ff\",\n  firebrick: \"b22222\",\n  floralwhite: \"fffaf0\",\n  forestgreen: \"228b22\",\n  fuchsia: \"f0f\",\n  gainsboro: \"dcdcdc\",\n  ghostwhite: \"f8f8ff\",\n  gold: \"ffd700\",\n  goldenrod: \"daa520\",\n  gray: \"808080\",\n  green: \"008000\",\n  greenyellow: \"adff2f\",\n  grey: \"808080\",\n  honeydew: \"f0fff0\",\n  hotpink: \"ff69b4\",\n  indianred: \"cd5c5c\",\n  indigo: \"4b0082\",\n  ivory: \"fffff0\",\n  khaki: \"f0e68c\",\n  lavender: \"e6e6fa\",\n  lavenderblush: \"fff0f5\",\n  lawngreen: \"7cfc00\",\n  lemonchiffon: \"fffacd\",\n  lightblue: \"add8e6\",\n  lightcoral: \"f08080\",\n  lightcyan: \"e0ffff\",\n  lightgoldenrodyellow: \"fafad2\",\n  lightgray: \"d3d3d3\",\n  lightgreen: \"90ee90\",\n  lightgrey: \"d3d3d3\",\n  lightpink: \"ffb6c1\",\n  lightsalmon: \"ffa07a\",\n  lightseagreen: \"20b2aa\",\n  lightskyblue: \"87cefa\",\n  lightslategray: \"789\",\n  lightslategrey: \"789\",\n  lightsteelblue: \"b0c4de\",\n  lightyellow: \"ffffe0\",\n  lime: \"0f0\",\n  limegreen: \"32cd32\",\n  linen: \"faf0e6\",\n  magenta: \"f0f\",\n  maroon: \"800000\",\n  mediumaquamarine: \"66cdaa\",\n  mediumblue: \"0000cd\",\n  mediumorchid: \"ba55d3\",\n  mediumpurple: \"9370db\",\n  mediumseagreen: \"3cb371\",\n  mediumslateblue: \"7b68ee\",\n  mediumspringgreen: \"00fa9a\",\n  mediumturquoise: \"48d1cc\",\n  mediumvioletred: \"c71585\",\n  midnightblue: \"191970\",\n  mintcream: \"f5fffa\",\n  mistyrose: \"ffe4e1\",\n  moccasin: \"ffe4b5\",\n  navajowhite: \"ffdead\",\n  navy: \"000080\",\n  oldlace: \"fdf5e6\",\n  olive: \"808000\",\n  olivedrab: \"6b8e23\",\n  orange: \"ffa500\",\n  orangered: \"ff4500\",\n  orchid: \"da70d6\",\n  palegoldenrod: \"eee8aa\",\n  palegreen: \"98fb98\",\n  paleturquoise: \"afeeee\",\n  palevioletred: \"db7093\",\n  papayawhip: \"ffefd5\",\n  peachpuff: \"ffdab9\",\n  peru: \"cd853f\",\n  pink: \"ffc0cb\",\n  plum: \"dda0dd\",\n  powderblue: \"b0e0e6\",\n  purple: \"800080\",\n  rebeccapurple: \"663399\",\n  red: \"f00\",\n  rosybrown: \"bc8f8f\",\n  royalblue: \"4169e1\",\n  saddlebrown: \"8b4513\",\n  salmon: \"fa8072\",\n  sandybrown: \"f4a460\",\n  seagreen: \"2e8b57\",\n  seashell: \"fff5ee\",\n  sienna: \"a0522d\",\n  silver: \"c0c0c0\",\n  skyblue: \"87ceeb\",\n  slateblue: \"6a5acd\",\n  slategray: \"708090\",\n  slategrey: \"708090\",\n  snow: \"fffafa\",\n  springgreen: \"00ff7f\",\n  steelblue: \"4682b4\",\n  tan: \"d2b48c\",\n  teal: \"008080\",\n  thistle: \"d8bfd8\",\n  tomato: \"ff6347\",\n  turquoise: \"40e0d0\",\n  violet: \"ee82ee\",\n  wheat: \"f5deb3\",\n  white: \"fff\",\n  whitesmoke: \"f5f5f5\",\n  yellow: \"ff0\",\n  yellowgreen: \"9acd32\"\n};\n\n// Make it easy to access colors via `hexNames[hex]`\nvar hexNames = tinycolor.hexNames = flip(names);\n\n// Utilities\n// ---------\n\n// `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }`\nfunction flip(o) {\n  var flipped = {};\n  for (var i in o) {\n    if (o.hasOwnProperty(i)) {\n      flipped[o[i]] = i;\n    }\n  }\n  return flipped;\n}\n\n// Return a valid alpha value [0,1] with all invalid values being set to 1\nfunction boundAlpha(a) {\n  a = parseFloat(a);\n  if (isNaN(a) || a < 0 || a > 1) {\n    a = 1;\n  }\n  return a;\n}\n\n// Take input from [0, n] and return it as [0, 1]\nfunction bound01(n, max) {\n  if (isOnePointZero(n)) n = \"100%\";\n  var processPercent = isPercentage(n);\n  n = Math.min(max, Math.max(0, parseFloat(n)));\n\n  // Automatically convert percentage into number\n  if (processPercent) {\n    n = parseInt(n * max, 10) / 100;\n  }\n\n  // Handle floating point rounding errors\n  if (Math.abs(n - max) < 0.000001) {\n    return 1;\n  }\n\n  // Convert into [0, 1] range if it isn't already\n  return n % max / parseFloat(max);\n}\n\n// Force a number between 0 and 1\nfunction clamp01(val) {\n  return Math.min(1, Math.max(0, val));\n}\n\n// Parse a base-16 hex value into a base-10 integer\nfunction parseIntFromHex(val) {\n  return parseInt(val, 16);\n}\n\n// Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1\n// <http://stackoverflow.com/questions/7422072/javascript-how-to-detect-number-as-a-decimal-including-1-0>\nfunction isOnePointZero(n) {\n  return typeof n == \"string\" && n.indexOf(\".\") != -1 && parseFloat(n) === 1;\n}\n\n// Check to see if string passed in is a percentage\nfunction isPercentage(n) {\n  return typeof n === \"string\" && n.indexOf(\"%\") != -1;\n}\n\n// Force a hex value to have 2 characters\nfunction pad2(c) {\n  return c.length == 1 ? \"0\" + c : \"\" + c;\n}\n\n// Replace a decimal with it's percentage value\nfunction convertToPercentage(n) {\n  if (n <= 1) {\n    n = n * 100 + \"%\";\n  }\n  return n;\n}\n\n// Converts a decimal to a hex value\nfunction convertDecimalToHex(d) {\n  return Math.round(parseFloat(d) * 255).toString(16);\n}\n// Converts a hex value to a decimal\nfunction convertHexToDecimal(h) {\n  return parseIntFromHex(h) / 255;\n}\nvar matchers = function () {\n  // <http://www.w3.org/TR/css3-values/#integers>\n  var CSS_INTEGER = \"[-\\\\+]?\\\\d+%?\";\n\n  // <http://www.w3.org/TR/css3-values/#number-value>\n  var CSS_NUMBER = \"[-\\\\+]?\\\\d*\\\\.\\\\d+%?\";\n\n  // Allow positive/negative integer/number.  Don't capture the either/or, just the entire outcome.\n  var CSS_UNIT = \"(?:\" + CSS_NUMBER + \")|(?:\" + CSS_INTEGER + \")\";\n\n  // Actual matching.\n  // Parentheses and commas are optional, but not required.\n  // Whitespace can take the place of commas or opening paren\n  var PERMISSIVE_MATCH3 = \"[\\\\s|\\\\(]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")\\\\s*\\\\)?\";\n  var PERMISSIVE_MATCH4 = \"[\\\\s|\\\\(]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")\\\\s*\\\\)?\";\n  return {\n    CSS_UNIT: new RegExp(CSS_UNIT),\n    rgb: new RegExp(\"rgb\" + PERMISSIVE_MATCH3),\n    rgba: new RegExp(\"rgba\" + PERMISSIVE_MATCH4),\n    hsl: new RegExp(\"hsl\" + PERMISSIVE_MATCH3),\n    hsla: new RegExp(\"hsla\" + PERMISSIVE_MATCH4),\n    hsv: new RegExp(\"hsv\" + PERMISSIVE_MATCH3),\n    hsva: new RegExp(\"hsva\" + PERMISSIVE_MATCH4),\n    hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n    hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,\n    hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n    hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/\n  };\n}();\n\n// `isValidCSSUnit`\n// Take in a single string / number and check to see if it looks like a CSS unit\n// (see `matchers` above for definition).\nfunction isValidCSSUnit(color) {\n  return !!matchers.CSS_UNIT.exec(color);\n}\n\n// `stringInputToObject`\n// Permissive string parsing.  Take in a number of formats, and output an object\n// based on detected format.  Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}`\nfunction stringInputToObject(color) {\n  color = color.replace(trimLeft, \"\").replace(trimRight, \"\").toLowerCase();\n  var named = false;\n  if (names[color]) {\n    color = names[color];\n    named = true;\n  } else if (color == \"transparent\") {\n    return {\n      r: 0,\n      g: 0,\n      b: 0,\n      a: 0,\n      format: \"name\"\n    };\n  }\n\n  // Try to match string input using regular expressions.\n  // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]\n  // Just return an object and let the conversion functions handle that.\n  // This way the result will be the same whether the tinycolor is initialized with string or object.\n  var match;\n  if (match = matchers.rgb.exec(color)) {\n    return {\n      r: match[1],\n      g: match[2],\n      b: match[3]\n    };\n  }\n  if (match = matchers.rgba.exec(color)) {\n    return {\n      r: match[1],\n      g: match[2],\n      b: match[3],\n      a: match[4]\n    };\n  }\n  if (match = matchers.hsl.exec(color)) {\n    return {\n      h: match[1],\n      s: match[2],\n      l: match[3]\n    };\n  }\n  if (match = matchers.hsla.exec(color)) {\n    return {\n      h: match[1],\n      s: match[2],\n      l: match[3],\n      a: match[4]\n    };\n  }\n  if (match = matchers.hsv.exec(color)) {\n    return {\n      h: match[1],\n      s: match[2],\n      v: match[3]\n    };\n  }\n  if (match = matchers.hsva.exec(color)) {\n    return {\n      h: match[1],\n      s: match[2],\n      v: match[3],\n      a: match[4]\n    };\n  }\n  if (match = matchers.hex8.exec(color)) {\n    return {\n      r: parseIntFromHex(match[1]),\n      g: parseIntFromHex(match[2]),\n      b: parseIntFromHex(match[3]),\n      a: convertHexToDecimal(match[4]),\n      format: named ? \"name\" : \"hex8\"\n    };\n  }\n  if (match = matchers.hex6.exec(color)) {\n    return {\n      r: parseIntFromHex(match[1]),\n      g: parseIntFromHex(match[2]),\n      b: parseIntFromHex(match[3]),\n      format: named ? \"name\" : \"hex\"\n    };\n  }\n  if (match = matchers.hex4.exec(color)) {\n    return {\n      r: parseIntFromHex(match[1] + \"\" + match[1]),\n      g: parseIntFromHex(match[2] + \"\" + match[2]),\n      b: parseIntFromHex(match[3] + \"\" + match[3]),\n      a: convertHexToDecimal(match[4] + \"\" + match[4]),\n      format: named ? \"name\" : \"hex8\"\n    };\n  }\n  if (match = matchers.hex3.exec(color)) {\n    return {\n      r: parseIntFromHex(match[1] + \"\" + match[1]),\n      g: parseIntFromHex(match[2] + \"\" + match[2]),\n      b: parseIntFromHex(match[3] + \"\" + match[3]),\n      format: named ? \"name\" : \"hex\"\n    };\n  }\n  return false;\n}\nfunction validateWCAG2Parms(parms) {\n  // return valid WCAG2 parms for isReadable.\n  // If input parms are invalid, return {\"level\":\"AA\", \"size\":\"small\"}\n  var level, size;\n  parms = parms || {\n    level: \"AA\",\n    size: \"small\"\n  };\n  level = (parms.level || \"AA\").toUpperCase();\n  size = (parms.size || \"small\").toLowerCase();\n  if (level !== \"AA\" && level !== \"AAA\") {\n    level = \"AA\";\n  }\n  if (size !== \"small\" && size !== \"large\") {\n    size = \"small\";\n  }\n  return {\n    level: level,\n    size: size\n  };\n}\n\nexport { tinycolor as default };\n","export default class Edge {\n    constructor(options) {\n        this.direction = options.direction;\n        this.position = options.position;\n        this.type = options.type;\n    }\n    is(edge) {\n        return this.direction === edge.direction && this.position === edge.position;\n    }\n}\n","import Edge from \"./edge\";\nexport default class Box {\n    constructor(options) {\n        this.x = options.x;\n        this.y = options.y;\n        this.width = options.width;\n        this.height = options.height;\n        this.type = options.type;\n    }\n    get top() {\n        return this.y;\n    }\n    get middle() {\n        return this.y + (this.height / 2);\n    }\n    get bottom() {\n        return this.y + this.height;\n    }\n    get left() {\n        return this.x;\n    }\n    get center() {\n        return this.x + (this.width / 2);\n    }\n    get right() {\n        return this.x + this.width;\n    }\n    get horizontals() {\n        return [\n            new Edge({ direction: 'horizontal', position: this.top, type: this.type }),\n            new Edge({ direction: 'horizontal', position: this.middle, type: this.type }),\n            new Edge({ direction: 'horizontal', position: this.bottom, type: this.type })\n        ];\n    }\n    get verticals() {\n        return [\n            new Edge({ direction: 'vertical', position: this.left, type: this.type }),\n            new Edge({ direction: 'vertical', position: this.center, type: this.type }),\n            new Edge({ direction: 'vertical', position: this.right, type: this.type })\n        ];\n    }\n    get edges() {\n        return [...this.horizontals, ...this.verticals];\n    }\n}\n","export default class Grid {\n    constructor() {\n        this.horizontals = [];\n        this.verticals = [];\n    }\n    add(box) {\n        this.horizontals.push(...this.distinct(box.horizontals, this.horizontals));\n        this.verticals.push(...this.distinct(box.verticals, this.verticals));\n    }\n    clear() {\n        this.horizontals = [];\n        this.verticals = [];\n    }\n    get edges() {\n        return [...this.horizontals, ...this.verticals];\n    }\n    matches(box) {\n        return this.edges.filter(edge => box.edges.some(compare => compare.is(edge)));\n    }\n    distinct(edges, existing) {\n        return edges.filter(edge => !existing.some(compare => compare.is(edge)));\n    }\n}\n","const defaultSetup = (options) => {\n    const { element, edge } = options;\n    const modifiers = [edge.direction];\n    if (edge.type)\n        modifiers.push(edge.type);\n    const classes = ['guide', ...modifiers.map(modifier => `guide--${modifier}`)];\n    element.className = classes.join(' ');\n};\nconst defaultPositioner = (options) => {\n    const { element, edge } = options;\n    element.style[edge.direction === 'horizontal' ? 'top' : 'left'] = `${edge.position}px`;\n};\nconst defaultReset = (options) => {\n    const style = options.element.style;\n    style.top = null;\n    style.left = null;\n};\nexport default class Renderer {\n    constructor(options) {\n        this.document = options.document;\n        this.container = options.container;\n        this.setup = options.setup || defaultSetup;\n        this.positioner = options.positioner || defaultPositioner;\n        this.reset = options.reset || defaultReset;\n        this.elements = [];\n    }\n    draw(edges) {\n        let count = 0;\n        for (const edge of edges) {\n            const element = this.elements[count] || this.createElement();\n            this.setup({ element, edge });\n            this.reset({ element });\n            this.positioner({ element, edge });\n            count++;\n        }\n        this.removeGuidesFrom(count);\n    }\n    createElement() {\n        const element = this.document.createElement('div');\n        this.container.appendChild(element);\n        this.elements.push(element);\n        return element;\n    }\n    removeGuidesFrom(start) {\n        for (const element of this.elements.splice(start)) {\n            this.container.removeChild(element);\n        }\n    }\n}\n","export default class Snap {\n    constructor(options) {\n        this.grid = options.grid;\n        this.threshold = options.threshold || 8;\n    }\n    to(box) {\n        const grid = this.grid;\n        const { left, center, right, width, x, top, middle, bottom, height, y } = box;\n        return {\n            x: this.snapAxis(grid.verticals, left, center, right, width, x),\n            y: this.snapAxis(grid.horizontals, top, middle, bottom, height, y)\n        };\n    }\n    snapAxis(edges, start, middle, end, extent, fallback) {\n        for (let edge of edges) {\n            for (const [position, offset] of [\n                [start, 0], [middle, extent / 2], [end, extent]\n            ]) {\n                const snapped = this.snapped(edge, position, offset, fallback);\n                if (snapped !== fallback)\n                    return snapped;\n            }\n        }\n        return fallback;\n    }\n    snapped(edge, position, offset, fallback) {\n        return this.snappable(edge.position, position) ? edge.position - offset : fallback;\n    }\n    snappable(compare, position) {\n        return compare - this.threshold < position && compare + this.threshold > position;\n    }\n}\n","import Grid from './grid';\nimport Box from './box';\nimport Snap from './snap';\nimport Renderer from './renderer';\nexport default class Snapster {\n    constructor(options) {\n        this.grid = new Grid();\n        this.snapping = new Snap({ grid: this.grid, threshold: options.threshold || 8 });\n        this.renderer = new Renderer({\n            document: options.document,\n            container: options.container,\n            setup: options.setup,\n            positioner: options.positioner,\n            reset: options.reset\n        });\n    }\n    populate(boxes) {\n        this.grid.clear();\n        for (const box of boxes)\n            this.grid.add(new Box(box));\n    }\n    snap(box) {\n        const position = this.snapping.to(new Box(box));\n        this.renderer.draw(this.grid.matches(new Box({\n            x: position.x === null ? box.x : position.x,\n            y: position.y === null ? box.y : position.y,\n            width: box.width,\n            height: box.height,\n            type: box.type\n        })));\n        return position;\n    }\n    clear() {\n        this.renderer.draw([]);\n    }\n}\n","// Domain Public by Eric Wendelin http://eriwen.com/ (2008)\n//                  Luke Smith http://lucassmith.name/ (2008)\n//                  Loic Dachary <loic@dachary.org> (2008)\n//                  Johan Euphrosine <proppy@aminche.com> (2008)\n//                  Oyvind Sean Kinsey http://kinsey.no/blog (2010)\n//                  Victor Homyakov <victor-homyakov@users.sourceforge.net> (2010)\n\n/**\n * Main function giving a function stack trace with a forced or passed in Error\n *\n * @cfg {Error} e The error to create a stacktrace from (optional)\n * @cfg {Boolean} guess If we should try to resolve the names of anonymous functions\n * @return {Array} of Strings with functions, lines, files, and arguments where possible\n */\nfunction printStackTrace(options) {\n    options = options || {guess: true};\n    var ex = options.e || null, guess = !!options.guess;\n    var p = new printStackTrace.implementation(), result = p.run(ex);\n    return (guess) ? p.guessAnonymousFunctions(result) : result;\n}\n\nprintStackTrace.implementation = function() {\n};\n\nprintStackTrace.implementation.prototype = {\n    /**\n     * @param {Error} ex The error to create a stacktrace from (optional)\n     * @param {String} mode Forced mode (optional, mostly for unit tests)\n     */\n    run: function(ex, mode) {\n        ex = ex || this.createException();\n        // examine exception properties w/o debugger\n        //for (var prop in ex) {alert(\"Ex['\" + prop + \"']=\" + ex[prop]);}\n        mode = mode || this.mode(ex);\n        if (mode === 'other') {\n            return this.other(arguments.callee);\n        } else {\n            return this[mode](ex);\n        }\n    },\n\n    createException: function() {\n        try {\n            this.undef();\n        } catch (e) {\n            return e;\n        }\n    },\n\n    /**\n     * Mode could differ for different exception, e.g.\n     * exceptions in Chrome may or may not have arguments or stack.\n     *\n     * @return {String} mode of operation for the exception\n     */\n    mode: function(e) {\n        if (e['arguments'] && e.stack) {\n            return 'chrome';\n        } else if (e.stack && e.sourceURL) {\n            return 'safari';\n        } else if (e.stack && e.number) {\n            return 'ie';\n        } else if (typeof e.message === 'string' && typeof window !== 'undefined' && window.opera) {\n            // e.message.indexOf(\"Backtrace:\") > -1 -> opera\n            // !e.stacktrace -> opera\n            if (!e.stacktrace) {\n                return 'opera9'; // use e.message\n            }\n            // 'opera#sourceloc' in e -> opera9, opera10a\n            if (e.message.indexOf('\\n') > -1 && e.message.split('\\n').length > e.stacktrace.split('\\n').length) {\n                return 'opera9'; // use e.message\n            }\n            // e.stacktrace && !e.stack -> opera10a\n            if (!e.stack) {\n                return 'opera10a'; // use e.stacktrace\n            }\n            // e.stacktrace && e.stack -> opera10b\n            if (e.stacktrace.indexOf(\"called from line\") < 0) {\n                return 'opera10b'; // use e.stacktrace, format differs from 'opera10a'\n            }\n            // e.stacktrace && e.stack -> opera11\n            return 'opera11'; // use e.stacktrace, format differs from 'opera10a', 'opera10b'\n        } else if (e.stack) {\n            return 'firefox';\n        }\n        return 'other';\n    },\n\n    /**\n     * Given a context, function name, and callback function, overwrite it so that it calls\n     * printStackTrace() first with a callback and then runs the rest of the body.\n     *\n     * @param {Object} context of execution (e.g. window)\n     * @param {String} functionName to instrument\n     * @param {Function} function to call with a stack trace on invocation\n     */\n    instrumentFunction: function(context, functionName, callback) {\n        context = context || window;\n        var original = context[functionName];\n        context[functionName] = function instrumented() {\n            callback.call(this, printStackTrace().slice(4));\n            return context[functionName]._instrumented.apply(this, arguments);\n        };\n        context[functionName]._instrumented = original;\n    },\n\n    /**\n     * Given a context and function name of a function that has been\n     * instrumented, revert the function to it's original (non-instrumented)\n     * state.\n     *\n     * @param {Object} context of execution (e.g. window)\n     * @param {String} functionName to de-instrument\n     */\n    deinstrumentFunction: function(context, functionName) {\n        if (context[functionName].constructor === Function &&\n                context[functionName]._instrumented &&\n                context[functionName]._instrumented.constructor === Function) {\n            context[functionName] = context[functionName]._instrumented;\n        }\n    },\n\n    /**\n     * Given an Error object, return a formatted Array based on Chrome's stack string.\n     *\n     * @param e - Error object to inspect\n     * @return Array<String> of function calls, files and line numbers\n     */\n    chrome: function(e) {\n        var stack = (e.stack + '\\n').replace(/^\\S[^\\(]+?[\\n$]/gm, '').\n          replace(/^\\s+(at eval )?at\\s+/gm, '').\n          replace(/^([^\\(]+?)([\\n$])/gm, '{anonymous}()@$1$2').\n          replace(/^Object.<anonymous>\\s*\\(([^\\)]+)\\)/gm, '{anonymous}()@$1').split('\\n');\n        stack.pop();\n        return stack;\n    },\n\n    /**\n     * Given an Error object, return a formatted Array based on Safari's stack string.\n     *\n     * @param e - Error object to inspect\n     * @return Array<String> of function calls, files and line numbers\n     */\n    safari: function(e) {\n        return e.stack.replace(/\\[native code\\]\\n/m, '')\n            .replace(/^(?=\\w+Error\\:).*$\\n/m, '')\n            .replace(/^@/gm, '{anonymous}()@')\n            .split('\\n');\n    },\n\n    /**\n     * Given an Error object, return a formatted Array based on IE's stack string.\n     *\n     * @param e - Error object to inspect\n     * @return Array<String> of function calls, files and line numbers\n     */\n    ie: function(e) {\n        var lineRE = /^.*at (\\w+) \\(([^\\)]+)\\)$/gm;\n        return e.stack.replace(/at Anonymous function /gm, '{anonymous}()@')\n            .replace(/^(?=\\w+Error\\:).*$\\n/m, '')\n            .replace(lineRE, '$1@$2')\n            .split('\\n');\n    },\n\n    /**\n     * Given an Error object, return a formatted Array based on Firefox's stack string.\n     *\n     * @param e - Error object to inspect\n     * @return Array<String> of function calls, files and line numbers\n     */\n    firefox: function(e) {\n        return e.stack.replace(/(?:\\n@:0)?\\s+$/m, '').replace(/^[\\(@]/gm, '{anonymous}()@').split('\\n');\n    },\n\n    opera11: function(e) {\n        var ANON = '{anonymous}', lineRE = /^.*line (\\d+), column (\\d+)(?: in (.+))? in (\\S+):$/;\n        var lines = e.stacktrace.split('\\n'), result = [];\n\n        for (var i = 0, len = lines.length; i < len; i += 2) {\n            var match = lineRE.exec(lines[i]);\n            if (match) {\n                var location = match[4] + ':' + match[1] + ':' + match[2];\n                var fnName = match[3] || \"global code\";\n                fnName = fnName.replace(/<anonymous function: (\\S+)>/, \"$1\").replace(/<anonymous function>/, ANON);\n                result.push(fnName + '@' + location + ' -- ' + lines[i + 1].replace(/^\\s+/, ''));\n            }\n        }\n\n        return result;\n    },\n\n    opera10b: function(e) {\n        // \"<anonymous function: run>([arguments not available])@file://localhost/G:/js/stacktrace.js:27\\n\" +\n        // \"printStackTrace([arguments not available])@file://localhost/G:/js/stacktrace.js:18\\n\" +\n        // \"@file://localhost/G:/js/test/functional/testcase1.html:15\"\n        var lineRE = /^(.*)@(.+):(\\d+)$/;\n        var lines = e.stacktrace.split('\\n'), result = [];\n\n        for (var i = 0, len = lines.length; i < len; i++) {\n            var match = lineRE.exec(lines[i]);\n            if (match) {\n                var fnName = match[1]? (match[1] + '()') : \"global code\";\n                result.push(fnName + '@' + match[2] + ':' + match[3]);\n            }\n        }\n\n        return result;\n    },\n\n    /**\n     * Given an Error object, return a formatted Array based on Opera 10's stacktrace string.\n     *\n     * @param e - Error object to inspect\n     * @return Array<String> of function calls, files and line numbers\n     */\n    opera10a: function(e) {\n        // \"  Line 27 of linked script file://localhost/G:/js/stacktrace.js\\n\"\n        // \"  Line 11 of inline#1 script in file://localhost/G:/js/test/functional/testcase1.html: In function foo\\n\"\n        var ANON = '{anonymous}', lineRE = /Line (\\d+).*script (?:in )?(\\S+)(?:: In function (\\S+))?$/i;\n        var lines = e.stacktrace.split('\\n'), result = [];\n\n        for (var i = 0, len = lines.length; i < len; i += 2) {\n            var match = lineRE.exec(lines[i]);\n            if (match) {\n                var fnName = match[3] || ANON;\n                result.push(fnName + '()@' + match[2] + ':' + match[1] + ' -- ' + lines[i + 1].replace(/^\\s+/, ''));\n            }\n        }\n\n        return result;\n    },\n\n    // Opera 7.x-9.2x only!\n    opera9: function(e) {\n        // \"  Line 43 of linked script file://localhost/G:/js/stacktrace.js\\n\"\n        // \"  Line 7 of inline#1 script in file://localhost/G:/js/test/functional/testcase1.html\\n\"\n        var ANON = '{anonymous}', lineRE = /Line (\\d+).*script (?:in )?(\\S+)/i;\n        var lines = e.message.split('\\n'), result = [];\n\n        for (var i = 2, len = lines.length; i < len; i += 2) {\n            var match = lineRE.exec(lines[i]);\n            if (match) {\n                result.push(ANON + '()@' + match[2] + ':' + match[1] + ' -- ' + lines[i + 1].replace(/^\\s+/, ''));\n            }\n        }\n\n        return result;\n    },\n\n    // Safari 5-, IE 9-, and others\n    other: function(curr) {\n        var ANON = '{anonymous}', fnRE = /function\\s*([\\w\\-$]+)?\\s*\\(/i, stack = [], fn, args, maxStackSize = 10;\n        while (curr && curr['arguments'] && stack.length < maxStackSize) {\n            fn = fnRE.test(curr.toString()) ? RegExp.$1 || ANON : ANON;\n            args = Array.prototype.slice.call(curr['arguments'] || []);\n            stack[stack.length] = fn + '(' + this.stringifyArguments(args) + ')';\n            curr = curr.caller;\n        }\n        return stack;\n    },\n\n    /**\n     * Given arguments array as a String, subsituting type names for non-string types.\n     *\n     * @param {Arguments} args\n     * @return {Array} of Strings with stringified arguments\n     */\n    stringifyArguments: function(args) {\n        var result = [];\n        var slice = Array.prototype.slice;\n        for (var i = 0; i < args.length; ++i) {\n            var arg = args[i];\n            if (arg === undefined) {\n                result[i] = 'undefined';\n            } else if (arg === null) {\n                result[i] = 'null';\n            } else if (arg.constructor) {\n                if (arg.constructor === Array) {\n                    if (arg.length < 3) {\n                        result[i] = '[' + this.stringifyArguments(arg) + ']';\n                    } else {\n                        result[i] = '[' + this.stringifyArguments(slice.call(arg, 0, 1)) + '...' + this.stringifyArguments(slice.call(arg, -1)) + ']';\n                    }\n                } else if (arg.constructor === Object) {\n                    result[i] = '#object';\n                } else if (arg.constructor === Function) {\n                    result[i] = '#function';\n                } else if (arg.constructor === String) {\n                    result[i] = '\"' + arg + '\"';\n                } else if (arg.constructor === Number) {\n                    result[i] = arg;\n                }\n            }\n        }\n        return result.join(',');\n    },\n\n    sourceCache: {},\n\n    /**\n     * @return the text from a given URL\n     */\n    ajax: function(url) {\n        var req = this.createXMLHTTPObject();\n        if (req) {\n            try {\n                req.open('GET', url, false);\n                //req.overrideMimeType('text/plain');\n                //req.overrideMimeType('text/javascript');\n                req.send(null);\n                //return req.status == 200 ? req.responseText : '';\n                return req.responseText;\n            } catch (e) {\n            }\n        }\n        return '';\n    },\n\n    /**\n     * Try XHR methods in order and store XHR factory.\n     *\n     * @return <Function> XHR function or equivalent\n     */\n    createXMLHTTPObject: function() {\n        var xmlhttp, XMLHttpFactories = [\n            function() {\n                return new XMLHttpRequest();\n            }, function() {\n                return new ActiveXObject('Msxml2.XMLHTTP');\n            }, function() {\n                return new ActiveXObject('Msxml3.XMLHTTP');\n            }, function() {\n                return new ActiveXObject('Microsoft.XMLHTTP');\n            }\n        ];\n        for (var i = 0; i < XMLHttpFactories.length; i++) {\n            try {\n                xmlhttp = XMLHttpFactories[i]();\n                // Use memoization to cache the factory\n                this.createXMLHTTPObject = XMLHttpFactories[i];\n                return xmlhttp;\n            } catch (e) {\n            }\n        }\n    },\n\n    /**\n     * Given a URL, check if it is in the same domain (so we can get the source\n     * via Ajax).\n     *\n     * @param url <String> source url\n     * @return False if we need a cross-domain request\n     */\n    isSameDomain: function(url) {\n        return typeof location !== \"undefined\" && url.indexOf(location.hostname) !== -1; // location may not be defined, e.g. when running from nodejs.\n    },\n\n    /**\n     * Get source code from given URL if in the same domain.\n     *\n     * @param url <String> JS source URL\n     * @return <Array> Array of source code lines\n     */\n    getSource: function(url) {\n        // TODO reuse source from script tags?\n        if (!(url in this.sourceCache)) {\n            this.sourceCache[url] = this.ajax(url).split('\\n');\n        }\n        return this.sourceCache[url];\n    },\n\n    guessAnonymousFunctions: function(stack) {\n        for (var i = 0; i < stack.length; ++i) {\n            var reStack = /\\{anonymous\\}\\(.*\\)@(.*)/,\n                reRef = /^(.*?)(?::(\\d+))(?::(\\d+))?(?: -- .+)?$/,\n                frame = stack[i], ref = reStack.exec(frame);\n\n            if (ref) {\n                var m = reRef.exec(ref[1]);\n                if (m) { // If falsey, we did not get any file/line information\n                    var file = m[1], lineno = m[2], charno = m[3] || 0;\n                    if (file && this.isSameDomain(file) && lineno) {\n                        var functionName = this.guessAnonymousFunction(file, lineno, charno);\n                        stack[i] = frame.replace('{anonymous}', functionName);\n                    }\n                }\n            }\n        }\n        return stack;\n    },\n\n    guessAnonymousFunction: function(url, lineNo, charNo) {\n        var ret;\n        try {\n            ret = this.findFunctionName(this.getSource(url), lineNo);\n        } catch (e) {\n            ret = 'getSource failed with url: ' + url + ', exception: ' + e.toString();\n        }\n        return ret;\n    },\n\n    findFunctionName: function(source, lineNo) {\n        // FIXME findFunctionName fails for compressed source\n        // (more than one function on the same line)\n        // function {name}({args}) m[1]=name m[2]=args\n        var reFunctionDeclaration = /function\\s+([^(]*?)\\s*\\(([^)]*)\\)/;\n        // {name} = function ({args}) TODO args capture\n        // /['\"]?([0-9A-Za-z_]+)['\"]?\\s*[:=]\\s*function(?:[^(]*)/\n        var reFunctionExpression = /['\"]?([$_A-Za-z][$_A-Za-z0-9]*)['\"]?\\s*[:=]\\s*function\\b/;\n        // {name} = eval()\n        var reFunctionEvaluation = /['\"]?([$_A-Za-z][$_A-Za-z0-9]*)['\"]?\\s*[:=]\\s*(?:eval|new Function)\\b/;\n        // Walk backwards in the source lines until we find\n        // the line which matches one of the patterns above\n        var code = \"\", line, maxLines = Math.min(lineNo, 20), m, commentPos;\n        for (var i = 0; i < maxLines; ++i) {\n            // lineNo is 1-based, source[] is 0-based\n            line = source[lineNo - i - 1];\n            commentPos = line.indexOf('//');\n            if (commentPos >= 0) {\n                line = line.substr(0, commentPos);\n            }\n            // TODO check other types of comments? Commented code may lead to false positive\n            if (line) {\n                code = line + code;\n                m = reFunctionExpression.exec(code);\n                if (m && m[1]) {\n                    return m[1];\n                }\n                m = reFunctionDeclaration.exec(code);\n                if (m && m[1]) {\n                    //return m[1] + \"(\" + (m[2] || \"\") + \")\";\n                    return m[1];\n                }\n                m = reFunctionEvaluation.exec(code);\n                if (m && m[1]) {\n                    return m[1];\n                }\n            }\n        }\n        return '(?)';\n    }\n};\n\nexport default printStackTrace;\n","import printStackTrace from '../../../../../../public/javascripts/libs/stacktrace';\n\n\nconst __slice = Array.prototype.slice;\n\nconst error = function (e, location) {\n  let key; let str; let\n    value;\n  str = void 0;\n  if (typeof e === 'string') {\n    str = e;\n    if (printStackTrace) {\n      str += printStackTrace({\n        guess: true,\n      }).join('\\n');\n    }\n  } else if (e) {\n    str = 'Error: ';\n    for (key in e) {\n      value = e[key];\n      if (key.toUpperCase() === key) continue;\n      str += `${key}: ${value}\\n`;\n    }\n    if (printStackTrace) {\n      str += printStackTrace({\n        guess: true,\n        e,\n      }).join('\\n');\n    }\n  }\n  if (location) str = `::${location}:: ${str}`;\n  if (console.error) {\n    console.error(e, str);\n  } else if (console.log) console.log(e, str);\n  return false;\n};\n\nconst log = function () {\n  let args;\n  args = arguments.length >= 1 ? __slice.call(arguments, 0) : [];\n};\n\nconst debug = function () {\n  let args;\n  args = arguments.length >= 1 ? __slice.call(arguments, 0) : [];\n};\n\nconst wkLogger = {\n  error,\n  log,\n  debug\n}\n\nexport default wkLogger\n","\nconst PrismQuality = {};\nPrismQuality.Good = new Image();\nPrismQuality.Good.crossOrigin = 'use-credentials';\nPrismQuality.Good.src = '/wm/images/build/good_quality.png';\n\nPrismQuality.Okay = new Image();\nPrismQuality.Okay.crossOrigin = 'use-credentials';\nPrismQuality.Okay.src = '/wm/images/build/okay_quality.png';\n\nPrismQuality.Poor = new Image();\nPrismQuality.Poor.crossOrigin = 'use-credentials';\nPrismQuality.Poor.src = '/wm/images/build/poor_quality.png';\n\nPrismQuality.exclamation = new Image();\nPrismQuality.exclamation.crossOrigin = 'use-credentials';\nPrismQuality.exclamation.src = '/wm/images/build/exclamation-18.png';\n\nPrismQuality.exclamationBlack = new Image();\nPrismQuality.exclamationBlack.crossOrigin = 'use-credentials';\nPrismQuality.exclamationBlack.src = '/wm/images/build/exclamation-black.png';\n\nexport default PrismQuality;\n","class Point {\n  /**\n   * Simple point representation.\n   * @constructor\n   */\n  constructor(x, y) {\n    this.x = x;\n    this.y = y;\n  }\n\n  /**\n   * Adds another point to this one\n   * @param {Point} that\n   * @return {Point} thisArg\n   */\n  add(that) {\n    this.x += that.x;\n    this.y += that.y;\n    return this;\n  }\n\n  /**\n   * Subtracts another point from this point\n   * @param {Point} that\n   * @return {Point} thisArg\n   */\n  subtract(that) {\n    this.x -= that.x;\n    this.y -= that.y;\n    return this;\n  }\n\n  /**\n   * Returns the angle in degrees between this point and another.\n   * @param {Point} point\n   * @return {Number}\n   */\n  getAngle(point) {\n    return (Math.atan2(point.y - this.y, point.x - this.x) * 180) / Math.PI;\n  }\n\n  /**\n   * Calculates the distance between two points\n   *\n   * @param {Point} point\n   * @return {Number}\n   */\n  distanceFrom(point) {\n    return Math.sqrt(Math.pow(point.x - this.x, 2) + Math.pow(point.y - this.y, 2));\n  }\n\n  /**\n   * Rotates this Point around a given origin for the given degrees.\n   * @param {Point} origin\n   * @param {Number} degrees\n   */\n  rotate(origin, degrees) {\n    const radians = Point.degreesToRadians(degrees);\n    const sin = Math.sin(radians);\n    const cos = Math.cos(radians);\n\n    this.subtract(origin);\n\n    const { x, y } = this;\n    (this.x = x * cos - y * sin), (this.y = x * sin + y * cos);\n\n    return this.add(origin);\n  }\n\n  /**\n   * Returns the center position between this point and another.\n   * (Note, the x/y positions might be floating points)\n   * @param {Point} other\n   * @return {Point}\n   */\n  getMiddle(other) {\n    return new Point((this.x + other.x) / 2, (this.y + other.y) / 2);\n  }\n\n  toString() {\n    return `Point(${this.x},${this.y})`;\n  }\n\n  /**\n   * Converts the given value from degrees to radians (used for Math calculations)\n   * @param {integer} degrees\n   * @return {float}\n   */\n  static degreesToRadians(degrees) {\n    return degrees * (Math.PI / 180);\n  }\n\n  static shouldStopAction(w, h, slot, angle) {\n    if (w < slot.minWidth || h < slot.minHeight) return true;\n    if (angle === null) return false;\n    if (angle > 90 || angle < -90) return true;\n    return false;\n  }\n\n  static createResizeValues(relativeXY, coords, location, slot) {\n    const { handler, opposite } = coords;\n    const centerPoints = slot.getCenter(true);\n    const angle = slot._angle;\n    const center = new Point(centerPoints.pivotX, centerPoints.pivotY);\n    let diffAng = null;\n\n    const mousePoint = new Point(relativeXY.x, relativeXY.y);\n    // Opposite point. Rotate it to get the visual position\n    const oppositePointRotated = new Point(opposite.x, opposite.y).rotate(\n      center,\n      angle\n    );\n\n    // If a handler point is needed, indicates that this is one of the \"middle\" handlers\n    // The mouse coordinates need to be rotated to join the straight line that connects\n    // the handler point and the opposite point.\n    if (handler) {\n      const handlerRotated = new Point(handler.x, handler.y).rotate(\n        center,\n        angle\n      );\n\n      const angleOppRotAndHandRot = oppositePointRotated.getAngle(\n        handlerRotated\n      );\n      const angleOppositeAndMouse = oppositePointRotated.getAngle(mousePoint);\n\n      diffAng = angleOppositeAndMouse - angleOppRotAndHandRot;\n\n      mousePoint.rotate(oppositePointRotated, -diffAng);\n    }\n\n    // calculate the new center\n    const centerPoint = mousePoint.getMiddle(oppositePointRotated);\n    // rotate the opposite point back around the new center point\n    const oppositePointUnrotated = oppositePointRotated.rotate(\n      centerPoint,\n      -angle\n    );\n    // rotate the mouse point around the new center.\n    const mousePointNormalised = mousePoint.rotate(centerPoint, -angle);\n\n    const aspectRatio = slot.w / slot.h;\n\n    let w;\n    let h;\n    let x;\n    let y;\n    switch (location) {\n      case 'top-middle':\n        h = oppositePointUnrotated.y - mousePointNormalised.y;\n        y = oppositePointUnrotated.y - h;\n\n        if (slot.isText) {\n          w = h * aspectRatio;\n        } else {\n          w = slot._w;\n        }\n        x = oppositePointUnrotated.x - w / 2;\n        break;\n      case 'bottom-middle':\n        h = mousePointNormalised.y - oppositePointUnrotated.y;\n        y = oppositePointUnrotated.y;\n\n        if (slot.isText) {\n          w = h * aspectRatio;\n        } else {\n          w = slot._w;\n        }\n        x = mousePointNormalised.x - w / 2;\n\n        break;\n      case 'middle-right':\n        w = mousePointNormalised.x - oppositePointUnrotated.x;\n        x = oppositePointUnrotated.x;\n\n        if (slot.isText) {\n          h = w / aspectRatio;\n        } else {\n          h = slot._h;\n        }\n        y = mousePointNormalised.y - h / 2;\n        break;\n      case 'middle-left':\n        w = oppositePointUnrotated.x - mousePointNormalised.x;\n        x = oppositePointUnrotated.x - w;\n\n        if (slot.isText) {\n          h = w / aspectRatio;\n        } else {\n          h = slot._h;\n        }\n        y = mousePointNormalised.y - h / 2;\n        break;\n      case 'top-left':\n        w = oppositePointUnrotated.x - mousePointNormalised.x;\n        x = oppositePointUnrotated.x - w;\n\n        if (slot.isText) {\n          h = w / aspectRatio;\n        } else {\n          h = oppositePointUnrotated.y - mousePointNormalised.y;\n        }\n        y = oppositePointUnrotated.y - h;\n        break;\n      case 'bottom-right':\n        w = mousePointNormalised.x - oppositePointUnrotated.x;\n        x = oppositePointUnrotated.x;\n\n        if (slot.isText) {\n          h = w / aspectRatio;\n        } else {\n          h = mousePointNormalised.y - oppositePointUnrotated.y;\n        }\n\n        y = oppositePointUnrotated.y;\n        break;\n      case 'top-right':\n        w = mousePointNormalised.x - oppositePointUnrotated.x;\n        x = oppositePointUnrotated.x;\n\n        if (slot.isText) {\n          h = w / aspectRatio;\n        } else {\n          h = oppositePointUnrotated.y - mousePointNormalised.y;\n        }\n        y = oppositePointUnrotated.y - h;\n        break;\n      case 'bottom-left':\n        w = oppositePointUnrotated.x - mousePointNormalised.x;\n        x = oppositePointUnrotated.x - w;\n        if (slot.isText) {\n          h = w / aspectRatio;\n        } else {\n          h = mousePointNormalised.y - oppositePointUnrotated.y;\n        }\n        y = oppositePointUnrotated.y;\n        break;\n    }\n\n    const stopAction = Point.shouldStopAction(w, h, slot, diffAng);\n\n    if (stopAction) return null;\n\n    return {\n      x,\n      y,\n      w,\n      h,\n    };\n  }\n}\n\nexport default Point;","export const stripString = (string) => `${string}`.replace(/^\\s*/, '').replace(/\\s*$/, '');\n\nexport const safeNumber = (value, defaultValue) => {\n  if (typeof value !== 'number') return defaultValue;\n  if (!isFinite(value)) return defaultValue;\n  return value;\n}\n\nexport const limit = (number, min, max) => {\n  if (number <= min) return min;\n  if (number >= max) return max;\n  return number;\n}\n\nexport const isNumber = (e) => typeof e === 'number' && !isNaN(e);\n\nconst contextApplyMatrixInternalD = (ctx, d) => {\n  ctx.translate(d.dx, d.dy);\n  ctx.rotate(d.angle2);\n  ctx.scale(d.sx, d.sy);\n  // ctx.scale(1, 1);\n  return ctx.rotate(d.angle1);\n};\n\nconst arrayToMatrixInternalD = (arr) => {\n  return new window.dojox.gfx.Matrix2D({\n    xx: arr[0],\n    yx: arr[1],\n    xy: arr[2],\n    yy: arr[3],\n    dx: arr[4],\n    dy: arr[5],\n  });\n};\n\nexport const ctxApplyMatrix = (ctx, meta) => {\n  let d;\n  if (!meta.matrix_decomposed) {\n    meta.matrix_decomposed = window.dojox.gfx.decompose(\n      arrayToMatrixInternalD(meta.matrix)\n    );\n  }\n  d = meta.matrix_decomposed;\n  return contextApplyMatrixInternalD(ctx, d);\n};\n\nexport const RealMatrix = true;\n","const PlaceFiller = new Image();\nPlaceFiller.crossOrigin = 'use-credentials';\nPlaceFiller.src = '/images/prism/missing.png';\n\nwindow.PlaceFiller = PlaceFiller;\n\nconst LoadingImage = new Image();\nLoadingImage.crossOrigin = 'use-credentials';\nLoadingImage.src = '/images/prism/loading.png';\n\nconst BlankImage = new Image();\nBlankImage.crossOrigin = 'use-credentials';\nBlankImage.src = '/images/prism/blank.png';\n\nconst BlankEmptyImage = new Image();\nBlankEmptyImage.crossOrigin = 'use-credentials';\nBlankEmptyImage.src = '/images/prism/empty.png';\n\nconst imgComplete = img => img && img.complete;\n\nexport { PlaceFiller, LoadingImage, BlankImage, BlankEmptyImage, imgComplete };\n","export const TOP_TOOL_HEIGHT = 44;\nexport const BASE_TOOL_WIDTH = 104;\nexport const BASE_TOOL_HEIGHT = 44;\nexport const PAD = 20;\nexport const TOOL_HEIGHT = 33;\nexport const TOOL_WIDTH = 33;\n","import Point from './point';\n\nclass Line {\n  /**\n   * Constructor for Line object\n   * @param {Point} p1\n   * @param {Point} p2\n   */\n  constructor(p1, p2) {\n    this.p1 = p1;\n    this.p2 = p2;\n  }\n\n  dy() {\n    return this.p2.y - this.p1.y;\n  }\n\n  dx() {\n    return this.p2.x - this.p1.x;\n  }\n\n\n  closestPoint(point) {\n    const A = point.x - this.p1.x;\n    const B = point.y - this.p1.y;\n    const C = this.p2.x - this.p1.x;\n    const D = this.p2.y - this.p1.y;\n\n    const dot = A * C + B * D;\n    const len_sq = C * C + D * D;\n    let param = -1;\n    if (len_sq != 0) {\n      // in case of 0 length line\n      param = dot / len_sq;\n    }\n\n    let xx;\n    let yy;\n\n    if (param < 0) {\n      xx = this.p1.x;\n      yy = this.p1.y;\n    } else if (param > 1) {\n      xx = this.p2.x;\n      yy = this.p2.y;\n    } else {\n      xx = this.p1.x + param * C;\n      yy = this.p1.y + param * D;\n    }\n\n    return new Point(xx, yy);\n  }\n\n  toString() {\n    return `Line(${this.p1.toString()} -> ${this.p2.toString()})`;\n  }\n}\n\n\nexport { Line };\n","import { Line } from './line.js';\nimport Point from './point';\n\nclass Polygon {\n  /**\n   * Simple polygon representation.\n   *\n   * @param {Array[Point]} points - clockwise list of points\n   * @constructor\n   */\n  constructor(points) {\n    this.points = points;\n  }\n\n  /**\n   * Find the closest point on a polygon to a position (point).\n   * @param {Point} point\n   */\n  findClosestPointTo(point) {\n    let closest;\n    let closestIndex = -1;\n    let distance;\n\n    this.points.forEach((p, index) => {\n      const d = p.distanceFrom(point);\n      if ((closestIndex === -1) || (d < distance)) {\n        closest = p;\n        distance = d;\n        closestIndex = index;\n      }\n    });\n\n    const p1 = this.points[closestIndex];\n    let p0;\n    let p2;\n\n    p0 = this.points[closestIndex - 1] || this.points[this.points.length - 1];\n    p2 = this.points[closestIndex + 1] || this.points[0];\n\n    [new Line(p0, p1), new Line(p1, p2)].forEach((line, index) => {\n      const intersection = line.closestPoint(point);\n      if (!intersection) {\n        return;\n      }\n\n      const d = intersection.distanceFrom(point);\n      if (d < distance) {\n        closest = intersection;\n        distance = d;\n      }\n    });\n\n    return closest;\n  }\n\n  /**\n   * @return Array of edges\n   */\n  edges() {\n    return this.points.map((point, index) => new Line(point, this.points[index + 1] || this.points[0]));\n  }\n\n  toString() {\n    return `Poly(${this.points.map((p) => p.toString()).join(',')})`;\n  }\n\n  /**\n   * Returns a Polygon that represents a rectangle\n   * @param {Number} x\n   * @param {Number} y\n   * @param {Number} w\n   * @param {Number} h\n   */\n  static fromRectangle(x, y, w, h) {\n    return new Polygon([\n      new Point(x, y),\n      new Point(x + w, y),\n      new Point(x + w, y + h),\n      new Point(x, y + h),\n    ]);\n  }\n}\n\nexport default Polygon;\n","// Import Modules\nimport { PanHandle } from '../../../_utils/image-editor';\nimport { EventEmitter } from 'wk-event-emitter';\nimport { PAD } from '../../common/slot-tools/simple/constants';\n\nimport Point from '../geom/point';\nimport Polygon from '../geom/polygon';\nimport Rectangle from '../../../_utils/img/geometry';\nimport { isClonedSlot } from '../../utils/special-slots';\nimport genericHelpers from '../../../_utils/generic-helpers';\nimport { isNumber, ctxApplyMatrix, limit } from './utils';\n\nclass SlotBase {\n  RealMatrix = true;\n\n  constructor() {\n    this.constrain = [0, 0, 400, 400];\n\n    this.x = 0;\n\n    this.y = 0;\n\n    this.ox = 0;\n\n    this.oy = 0;\n\n    this.w = 0;\n\n    this.h = 0;\n\n    this.angle = 0;\n\n    this.xalign = 0.5;\n\n    this.yalign = 0.5;\n\n    this.zoom = 1;\n\n    this.id = 'SET-ME';\n\n    this.type = 'invalid';\n\n    this.minHeight = 10;\n\n    this.minWidth = 10;\n\n    this.slotState = 'moving';\n\n    this.needsPopover = false;\n  }\n\n  isClone() {\n    return isClonedSlot(this.id);\n  }\n\n  isEmbellishment() {\n    return false;\n  }\n\n  isSticker() {\n    return false;\n  }\n\n  isPattern() {\n    return false;\n  }\n\n  select() {\n    let _ref;\n    return (_ref = this.view) != null ? _ref.selectASlot(this) : void 0;\n  }\n\n  triggerRedraw() {\n    if (!this.view) return;\n\n    this.view.queueRedraw();\n  }\n\n  deselect() {\n    let _ref;\n    return (_ref = this.view) != null ? _ref.deselectASlot(this) : void 0;\n  }\n\n  hasPoint = function(x, y) {\n    let h;\n    let lx;\n    let ty;\n    let w;\n\n    if (this.imatrix) {\n      [x, y] = this.imatrix.transform_point(x, y);\n    }\n\n    w = this.w;\n    h = this.h;\n    lx = this.x - this.ox;\n    ty = this.y - this.oy;\n\n    const points = this._getRotatedPoint(x, y);\n\n    if (\n      points.x >= lx && points.x <= lx + w\n        ? points.y >= ty && points.y <= ty + h\n        : void 0\n    ) {\n      return true;\n    }\n    return false;\n  };\n\n  getPoints() {\n    return [\n      { x: this.x, y: this.y },\n      { x: this.x + this.w, y: this.y },\n      { x: this.x + this.w, y: this.y + this.h },\n      { x: this.x, y: this.y + this.h },\n    ].map(point => {\n      if (this.matrix) {\n        [point.x, point.y] = this.matrix.transform_point(point.x, point.y);\n      }\n      return point;\n    });\n  }\n\n  resetXYWH() {\n    this._angle = this.angle;\n    this._x = this.x;\n    this._y = this.y;\n    this._w = this.w;\n    this._h = this.h;\n    this._ix = this.ix;\n    this._iy = this.iy;\n  }\n\n  hasControlPoint(x, y) {\n    const controlSize = 20;\n\n    if (this.imatrix) {\n      [x, y] = this.imatrix.transform_point(x, y);\n    }\n\n    const {\n      topMiddle,\n      bottomMiddle,\n      middleRight,\n      middleLeft,\n      bottomLeft,\n      topRight,\n      topLeft,\n      bottomRight,\n    } = this.getSlotPoints();\n\n    function minusControlPoint(point, size) {\n      return point - size / 3;\n    }\n\n    function plusControlPoint(point, size) {\n      return point + size / 3;\n    }\n\n    function minusControlPointSize(point, size) {\n      return plusControlPoint(point, size) - size;\n    }\n\n    function plusControlPointSize(point, size) {\n      return minusControlPoint(point, size) + size;\n    }\n\n    function middlePoints(x, y, pointX, pointY, size) {\n      return x >= minusControlPoint(pointX, size) &&\n        x <= plusControlPoint(pointX, size)\n        ? y >= minusControlPoint(pointY, size) &&\n            y <= plusControlPoint(pointY, size)\n        : void 0;\n    }\n\n    function cornerPoints(x, y, pointX, pointY, size) {\n      return x >= minusControlPointSize(pointX, size) &&\n        x <= plusControlPoint(pointX, size)\n        ? y >= minusControlPoint(pointY, size) &&\n            y <= plusControlPointSize(pointY, size)\n        : void 0;\n    }\n\n    if (middlePoints(x, y, topMiddle.x, topMiddle.y, controlSize)) {\n      return 'top-middle';\n    }\n\n    if (middlePoints(x, y, bottomMiddle.x, bottomMiddle.y, controlSize)) {\n      return 'bottom-middle';\n    }\n\n    if (middlePoints(x, y, middleRight.x, middleRight.y, controlSize)) {\n      return 'middle-right';\n    }\n\n    if (middlePoints(x, y, middleLeft.x, middleLeft.y, controlSize)) {\n      return 'middle-left';\n    }\n\n    if (cornerPoints(x, y, bottomLeft.x, bottomLeft.y, controlSize)) {\n      return 'bottom-left';\n    }\n    if (cornerPoints(x, y, topRight.x, topRight.y, controlSize)) {\n      return 'top-right';\n    }\n    if (cornerPoints(x, y, topLeft.x, topLeft.y, controlSize)) {\n      return 'top-left';\n    }\n    if (cornerPoints(x, y, bottomRight.x, bottomRight.y, controlSize)) {\n      return 'bottom-right';\n    }\n    return false;\n  }\n\n  hasImage() {\n    return imgComplete(this.img);\n  }\n\n  stackable() {\n    return this.type === 'stackable';\n  }\n\n  constrainCoord(val, cur, dim, ix1, ix2) {\n    if (val + dim > this.constrain[ix1] + this.constrain[ix2]) {\n      val = this.constrain[ix1] + this.constrain[ix2] - dim;\n    }\n    if (val < this.constrain[ix1]) val = this.constrain[ix1];\n    if (val > cur + dim - 4) val = cur + dim - 4;\n    if (val > this.constrain[ix1] + this.constrain[ix2]) {\n      val = this.constrain[ix1] + this.constrain[ix2] - 2;\n    }\n    return val;\n  }\n\n  constrainDim(val, dim, ix1, ix2) {\n    if (dim < 4) dim = 4;\n    if (dim + val > this.constrain[ix2] + this.constrain[ix1]) {\n      dim = this.constrain[ix1] + this.constrain[ix2] - val;\n    }\n    return dim;\n  }\n\n  drawHighlight(ctx) {\n    ctx.save();\n    try {\n      this._drawHighlight(ctx);\n    } finally {\n      ctx.restore();\n    }\n  }\n\n  _drawHighlight(ctx) {\n    let fontSize;\n    let h;\n    let info;\n    let p;\n    let scale;\n    let w;\n    let x;\n    let x_;\n    let y;\n    let y_;\n    let data;\n    const meta = this.meta;\n    x = this.x - this.ox;\n    y = this.y - this.oy;\n    w = this.w - 1;\n    h = this.h - 1;\n    if (\n      meta &&\n      meta.rotate === 0 &&\n      meta.shift[1] === 0 &&\n      meta.shift[0] === 0\n    ) {\n      if (y < 0) {\n        h -= y;\n        y = 0;\n        if (h > this.view.template['real-size'].height) {\n          h = this.view.template['real-size'].height - 1;\n        }\n      }\n    }\n\n    if (meta) {\n      if (this.RealMatrix) {\n        ctxApplyMatrix(ctx, meta);\n      } else {\n        if (meta.shift) {\n          ctx.translate(meta.shift[0], meta.shift[1]);\n        }\n        if (meta.scale) ctx.scale(meta.scale[0], meta.scale[1]);\n        if (typeof meta.rotate === 'number' && meta.rotate !== 0) {\n          ctx.rotate(meta.rotate);\n        }\n      }\n    }\n    ctx.lineCap = 'round';\n    if (this.p) {\n      if (window.PanHandle && imgComplete(this.img)) {\n        ctx.save();\n        try {\n          info = this.data();\n          ctx.translate(this.x, this.y);\n          let handleScale = 0.27 * (800 / this.view.element.clientWidth);\n          if (meta.scale) {\n            handleScale /= meta.scale[0];\n          }\n          ctx.translate(\n            (info.layout.w - PanHandle.width * handleScale) / 2,\n            (info.layout.h - PanHandle.height * handleScale) / 2\n          );\n          // ctx.rotate(this.getAngleRadian());\n          // ctx.scale(handleScale, handleScale);\n          // ctx.drawImage(window.PanHandle, 0, 0);\n        } finally {\n          ctx.restore();\n        }\n      }\n    }\n\n    ctx.lineWidth = 2;\n    fontSize = 10;\n    let dash = 3;\n\n    if (this.meta && this.meta.scale) {\n      const scale = Math.abs(this.meta.scale[0]);\n      ctx.lineWidth /= scale;\n      fontSize /= scale;\n      dash /= scale;\n    }\n\n    ctx.closePath();\n    ctx.lineCap = 'butt';\n\n    if (this.view.hasFocus()) {\n      ctx.save();\n      try {\n        ctx.rotate(this.getAngleRadian());\n        ctx.beginPath();\n        if (window.Path2D && ctx.clip) {\n          const region = new Path2D();\n          region.rect(x - dash, y - dash, w + dash * 2, h + dash * 2);\n          region.rect(x, y, w, h);\n          ctx.clip(region, 'evenodd');\n        }\n\n        ctx.shadowColor = '#cb2c90';\n        ctx.shadowBlur = dash / 3;\n        ctx.strokeStyle = '#fff';\n        ctx.strokeRect(x - 1, y - 1, w + 2, h + 2);\n        ctx.shadowBlur = 0;\n      } finally {\n        ctx.restore();\n      }\n    }\n    ctx.beginPath();\n    ctx.lineDashOffset = dash;\n    ctx.strokeStyle = '#cb2c90';\n    try {\n      ctx.save();\n      if (this.stackable()) {\n        ctx.translate(this.x + this.w / 2, this.y + this.h / 2);\n        ctx.rotate(this.getAngleRadian());\n        ctx.strokeRect(-w / 2, -h / 2, w, h);\n      } else {\n        ctx.strokeRect(x, y, w, h);\n      }\n    } finally {\n      ctx.restore();\n    }\n  }\n\n  bounds(x = null, y = null, w = null, h = null, a = null) {\n    const points = Object.values(this.getSlotPoints(x, y, w, h, a));\n\n    const xcoords = points.map(({ x }) => x);\n    const ycoords = points.map(({ y }) => y);\n\n    const min_x = Math.min(...xcoords);\n    const min_y = Math.min(...ycoords);\n    const max_x = Math.max(...xcoords);\n    const max_y = Math.max(...ycoords);\n\n    return {\n      x: min_x,\n      y: min_y,\n      w: max_x - min_x,\n      h: max_y - min_y,\n    };\n  }\n\n  moveTo(x, y) {\n    if (this.isText && this.fromTemplate) return;\n    if (genericHelpers.isMobileViewport()) return;\n\n    if (this.stackable() && !this.canMoveTo(x, y)) {\n      const [cx, cy, cw, ch] = this.constrainTo();\n      const constraint = Polygon.fromRectangle(cx, cy, cw, ch);\n      const p = constraint.findClosestPointTo(new Point(x, y));\n      if (p) {\n        this.x = p.x;\n        this.y = p.y;\n        return;\n      }\n    }\n\n    this.x = x;\n    this.y = y;\n    setTimeout(() => {\n      EventEmitter.emit('prism-edit-slot-moved', {\n        view: this.view,\n        slot: this,\n      });\n    }, 10);\n  }\n\n  _set(name, value) {\n    if (this.properties.indexOf(name) < 0) return false;\n\n    const setter = `_set_${name}`;\n    const fn = this[setter];\n\n    if (fn && $.isFunction(fn)) {\n      return fn.apply(this, [value]);\n    }\n\n    if (this[`${name}_min`] || this[`${name}_max`]) {\n      value = limit(value, this[`${name}_min`], this[`${name}_max`]);\n    }\n\n    if (this[name] === value) {\n      return false;\n    }\n\n    this[name] = value;\n\n    if (\n      {\n        angle: 1,\n        straighten: 1,\n        gamma: 1,\n        filter: 1,\n      }[name]\n    ) {\n      this._img = null;\n    }\n    return true;\n  }\n\n  drawControlBackground(ctx, isSelected) {\n    let h;\n    let w;\n    let x;\n    let y;\n    x = this.x - this.ox;\n    y = this.y - this.oy;\n    w = this.w;\n    if (!isNumber(w) || w <= 0) w = 10;\n    h = this.h;\n    if (!isNumber(h) || h <= 0) h = 10;\n    if (!(isSelected || this.string.length === 0)) return;\n\n    if (this.meta) {\n      if (this.RealMatrix) {\n        ctxApplyMatrix(ctx, this.meta);\n      } else {\n        if (this.meta.shift) {\n          ctx.translate(this.meta.shift[0], this.meta.shift[1]);\n        }\n        if (this.meta.scale) ctx.scale(this.meta.scale[0], this.meta.scale[1]);\n        if (typeof this.meta.rotate === 'number' && this.meta.rotate !== 0) {\n          ctx.rotate(this.meta.rotate);\n        }\n      }\n    }\n    ctx.beginPath();\n    const px = this.x + this.w / 2;\n    const py = this.y + this.h / 2;\n    ctx.translate(px, py);\n    ctx.rotate(this.getAngleRadian());\n    ctx.rect(-w / 2, -h / 2, w, h);\n    ctx.restore();\n  }\n\n  isMovingState() {\n    return this.slotState === 'moving';\n  }\n\n  isInactiveState() {\n    return this.slotState === 'inactive';\n  }\n\n  isPanningState() {\n    return this.slotState === 'panning';\n  }\n\n  isEditingState() {\n    return this.slotState === 'editing';\n  }\n\n  setSlotState(state) {\n    const possibleSlotStates = ['inactive', 'moving', 'editing', 'panning'];\n\n    if (possibleSlotStates.indexOf(state) >= 0) {\n      this.slotState = state;\n      return true;\n    }\n    return false;\n  }\n\n  setNeedsPopover(boolean) {\n    this.needsPopover = boolean;\n  }\n\n  shouldRender() {\n    return (\n      (this.isText || this.stackable()) &&\n      (this.slotState !== 'editing' || this.needsPopover) &&\n      !this.isClone()\n    );\n  }\n\n  drawControls(ctx, isSelected) {\n    let h;\n    let w;\n    let x;\n    let y;\n    x = this.x - this.ox;\n    y = this.y - this.oy;\n    w = this.w;\n    if (!isNumber(w) || w <= 0) w = 10;\n    h = this.h;\n    if (!isNumber(h) || h <= 0) h = 10;\n    if (!(isSelected || this.string.length === 0)) return;\n\n    if (this.meta) {\n      if (this.RealMatrix) {\n        ctxApplyMatrix(ctx, this.meta);\n      } else {\n        if (this.meta.shift) {\n          ctx.translate(this.meta.shift[0], this.meta.shift[1]);\n        }\n        if (this.meta.scale) {\n          ctx.scale(this.meta.scale[0], this.meta.scale[1]);\n        }\n        if (typeof this.meta.rotate === 'number' && this.meta.rotate !== 0) {\n          ctx.rotate(this.meta.rotate);\n        }\n      }\n    }\n\n    ctx.lineWidth = 2 / this.view.scale;\n    ctx.lineCap = 'butt';\n\n    try {\n      ctx.save();\n      ctx.beginPath();\n      if (this.isMovingState()) {\n        ctx.setLineDash([]);\n      }\n      ctx.translate(this.x + this.w / 2, this.y + this.h / 2);\n      ctx.rotate(this.getAngleRadian());\n\n      if (this.isImage || !this.isEditingState() || this.needsPopover) {\n        ctx.lineDashOffset = 0;\n        ctx.strokeStyle = '#b6b7b9';\n        ctx.strokeRect(-w / 2, -h / 2, w, h);\n\n        ctx.lineDashOffset = 3;\n        ctx.strokeStyle = '#5eb200';\n        ctx.strokeRect(-w / 2, -h / 2, w, h);\n      }\n\n      const smallestScale = 4 / this.view.scale;\n      const smallerScale = 6 / this.view.scale;\n\n      const handleStyle = { stroke: '#5eb200', fill: '#fff' };\n      ctx.setLineDash([]);\n\n      function highlight(centerX, centerY, rounded = false) {\n        ctx.beginPath();\n        if (rounded === true) {\n          const rectangleCenterX = centerX + smallerScale / 2;\n          const rectangleCenterY = centerY + smallerScale / 2;\n          ctx.arc(rectangleCenterX, rectangleCenterY, smallerScale, 0, 2 * Math.PI);\n        } else {\n          ctx.rect(centerX, centerY, smallerScale, smallerScale);\n        }\n        ctx.fillStyle = handleStyle.fill;\n        ctx.fill();\n        ctx.strokeStyle = handleStyle.stroke;\n        ctx.stroke();\n      }\n\n      function startOffset(extent) {\n        return -(extent / 2 + smallestScale);\n      }\n\n      function endOffset(extent) {\n        return -extent / 2 + extent - smallerScale + smallestScale;\n      }\n\n      function middleOffset(extent) {\n        return -extent / 2 + extent / 2 - smallerScale + smallestScale;\n      }\n\n      if (this.editable && this.isMovingState()) {\n        // top left\n        highlight(startOffset(w), startOffset(h), this.isText);\n        // top right\n        highlight(endOffset(w), startOffset(h), this.isText);\n        // bottom left\n        highlight(startOffset(w), endOffset(h), this.isText);\n        //bottom right\n        highlight(endOffset(w), endOffset(h), this.isText);\n\n        if (!this.isText) {\n          // bottom middle\n          highlight(middleOffset(w), endOffset(h));\n          // top middle\n          highlight(middleOffset(w), startOffset(h));\n          // middle right\n          highlight(endOffset(w), middleOffset(h));\n          // middle left\n          highlight(startOffset(w), middleOffset(h));\n        }\n      }\n    } finally {\n      ctx.restore();\n    }\n  }\n\n  _drawDiamondControl(ctx, centerX, centerY, scale) {\n    const handleStyle = { stroke: '#7beb00', fill: '#a9ff4a' };\n    const newScale = scale / 1.5;\n\n    ctx.beginPath();\n    ctx.moveTo(centerX, centerY);\n    ctx.lineTo(centerX + newScale, centerY + newScale);\n    ctx.lineTo(centerX, centerY + newScale * 2);\n    ctx.lineTo(centerX - newScale, centerY + newScale);\n    ctx.closePath();\n    ctx.fillStyle = handleStyle.fill;\n    ctx.fill();\n    ctx.strokeStyle = handleStyle.stroke;\n    ctx.stroke();\n  }\n\n  /**\n   * Gets the points of the slot\n   * @returns {object} points of the slot formatted as\n   * {{x, y}}\n   */\n  getSlotPoints(x = null, y = null, width = null, height = null, angle = null) {\n    x = isNumber(x) ? x : this.x;\n    y = isNumber(y) ? y : this.y;\n    width = isNumber(width) ? width : this.w;\n    height = isNumber(height) ? height : this.h;\n    angle = isNumber(angle) ? angle : this.angle;\n\n    const topMiddle = this._getPoint(x + width / 2, y, angle);\n    const bottomMiddle = this._getPoint(x + width / 2, y + height, angle);\n    const middleRight = this._getPoint(x + width, y + height / 2, angle);\n    const middleLeft = this._getPoint(x, y + height / 2, angle);\n    const topLeft = this._getPoint(x, y, angle);\n    const topRight = this._getPoint(x + width, y, angle);\n    const bottomRight = this._getPoint(x + width, y + height, angle);\n    const bottomLeft = this._getPoint(x, y + height, angle);\n\n    return {\n      topMiddle,\n      bottomMiddle,\n      middleRight,\n      middleLeft,\n      topLeft,\n      topRight,\n      bottomRight,\n      bottomLeft,\n    };\n  }\n\n  /**\n   * Gets the points of the control items\n   * @returns {object} points of the slot formatted as\n   * {{x, y}}\n   */\n  getControlPoints() {\n    const { x, y, w: width, h: height, angle } = this;\n\n    const padding = 15;\n    const bottomMenu = this._getPoint(\n      x + width / 2,\n      y + height + PAD * 1.25,\n      angle\n    );\n    const topMenu = this._getPoint(x + width / 2, y - padding, angle);\n\n    return {\n      bottomMenu,\n      topMenu,\n    };\n  }\n\n  /**\n   * @returns {number} angle converted to radians\n   */\n  getAngleRadian(angle = this.angle) {\n    return Math.PI / (180.0 / angle || 0);\n  }\n\n  /**\n   * @returns {number} angle converted to degrees\n   */\n  getAngleDegrees(angle = this.angle) {\n    return (angle * 180) / Math.PI;\n  }\n\n  /**\n   * Calculates new X and Y points from the current angle\n   * @param {number} pointX the x coord to be rotated\n   * @param {number} pointY\n   * @returns {object} Newly moved point formatted as {x, y}\n   */\n  _getPoint(pointX, pointY, angleToUse) {\n    const { pivotX, pivotY } = this.getCenter();\n    let angle = this.getAngleRadian(angleToUse);\n\n    // / get distance from center to point\n    const diffX = pointX - pivotX;\n    const diffY = pointY - pivotY;\n    const distance = Math.sqrt(diffX * diffX + diffY * diffY);\n\n    // / find angle from pivot to corner\n    angle += Math.atan2(diffY, diffX);\n\n    // / get new x and y and round it off to integer\n    const x = pivotX + distance * Math.cos(angle);\n    const y = pivotY + distance * Math.sin(angle);\n\n    return { x, y };\n  }\n\n  /**\n   * gets the centre point of the rectangle\n   * @returns {object} center points of the rectangle {x, y}\n   */\n  getCenter(preDrag = false) {\n    if (preDrag) {\n      return {\n        pivotX: this._x + this._w / 2,\n        pivotY: this._y + this._h / 2,\n      };\n    }\n    return {\n      pivotX: this.x + this.w / 2,\n      pivotY: this.y + this.h / 2,\n    };\n  }\n\n  /**\n   * Rotates the slot around its center and queues a re-draw\n   * @param {number} mouseX The Y coord of the mouse\n   * @param {number} mouseY The X coord of the mouse\n   */\n  rotateSlot(mouseX, mouseY, lock = 0) {\n    const { x1, x2, y1, y2 } = this.view.slotRegion(this);\n    const pivotX = x1 + (x2 - x1) / 2;\n    const pivotY = y1 + (y2 - y1) / 2;\n\n    let calculateAngle =\n      (Math.atan2(mouseY - pivotY, mouseX - pivotX) * 180) / Math.PI - 90;\n\n    if (calculateAngle < 0) {\n      calculateAngle = 360 + calculateAngle;\n    }\n    if (lock > 0) {\n      calculateAngle = parseInt(calculateAngle / lock, 10) * lock;\n    }\n    if (this.canRotate(calculateAngle)) {\n      this.angle = calculateAngle;\n      setTimeout(() => {\n        EventEmitter.emit('prism-edit-slot-moved', {\n          view: this.view,\n          slot: this,\n        });\n      }, 10);\n      this.view.drawGuides();\n      this.triggerRedraw();\n    }\n  }\n\n  /**\n   * Rotates the slot around its center by 5 and queues a re-draw\n   */\n  keyRotate(amount) {\n    let calculateAngle = this.angle + amount;\n    if (!this.canRotate(calculateAngle)) return;\n\n    if (calculateAngle < 0) {\n      calculateAngle = 360 + calculateAngle;\n    }\n    this.angle = calculateAngle;\n\n    setTimeout(() => {\n      EventEmitter.emit('prism-edit-slot-moved', {\n        view: this.view,\n        slot: this,\n      });\n    }, 10);\n    this.triggerRedraw();\n    this.view.do_save();\n  }\n\n  /**\n   * Rotates the slot around its center by 5 and queues a re-draw\n   */\n  setAngle(angle) {\n    if (angle < 0) {\n      angle = 360 + angle;\n    }\n    this.angle = angle;\n  }\n\n  /**\n   * Notifies the view to save when rotating has finished\n   */\n  rotateComplete() {\n    if (this.angle >= 357 || this.angle <= 3) {\n      this.angle = 0;\n      setTimeout(() => {\n        EventEmitter.emit('prism-edit-slot-moved', {\n          view: this.view,\n          slot: this,\n        });\n      }, 10);\n      this.triggerRedraw();\n    }\n    if (this.angle >= 87 && this.angle <= 93) {\n      this.angle = 90;\n      setTimeout(() => {\n        EventEmitter.emit('prism-edit-slot-moved', {\n          view: this.view,\n          slot: this,\n        });\n      }, 10);\n      this.triggerRedraw();\n    }\n    if (this.angle >= 177 && this.angle <= 183) {\n      this.angle = 180;\n      setTimeout(() => {\n        EventEmitter.emit('prism-edit-slot-moved', {\n          view: this.view,\n          slot: this,\n        });\n      }, 10);\n      this.triggerRedraw();\n    }\n    if (this.angle >= 267 && this.angle <= 273) {\n      this.angle = 270;\n      setTimeout(() => {\n        EventEmitter.emit('prism-edit-slot-moved', {\n          view: this.view,\n          slot: this,\n        });\n      }, 10);\n      this.triggerRedraw();\n    }\n    this.view.keepSelected = true;\n    this.view.clearGuides();\n    this.resetXYWH();\n    this.view.do_save();\n  }\n\n  _getRotatedPoint(pointX, pointY) {\n    const newAngle = 360 - this.angle;\n    const pivotX = this.x + this.w / 2;\n    const pivotY = this.y + this.h / 2;\n    let angle = Math.PI / (180.0 / newAngle);\n\n    // / get distance from center to point\n    const diffX = pointX - pivotX;\n    const diffY = pointY - pivotY;\n    const distance = Math.sqrt(diffX * diffX + diffY * diffY);\n\n    // / find angle from pivot to corner\n    angle += Math.atan2(diffY, diffX);\n\n    // / get new x and y and round it off to integer\n    const x = pivotX + distance * Math.cos(angle);\n    const y = pivotY + distance * Math.sin(angle);\n\n    return { x, y };\n  }\n\n  constrainTo(x = null, y = null, w = null, h = null, a = null) {\n    x = isNumber(x) ? x : this.x;\n    y = isNumber(y) ? y : this.y;\n    w = isNumber(w) ? w : this.w;\n    h = isNumber(h) ? h : this.h;\n\n    const points = Object.values(this.getSlotPoints(x, y, w, h, a));\n\n    const xcoords = points.map(({ x }) => x);\n    const ycoords = points.map(({ y }) => y);\n\n    const min_x = Math.min(...xcoords);\n    const min_y = Math.min(...ycoords);\n    const max_x = Math.max(...xcoords);\n    const max_y = Math.max(...ycoords);\n\n    const ext = {\n      x: min_x - x,\n      y: min_y - y,\n      w: max_x - min_x,\n      h: max_y - min_y,\n    };\n    const [cx, cy, cw, ch] = this.constrain;\n\n    return [cx - ext.x, cy - ext.y, cw - ext.w, ch - ext.h];\n  }\n\n  canMoveTo(x, y) {\n    const [cx, cy, cw, ch] = this.constrainTo();\n    return x >= cx && y >= cy && x <= cx + cw && y <= cy + ch;\n  }\n\n  canRotate(angle) {\n    const points = this.getSlotPoints(null, null, null, null, angle);\n\n    return this.withinConstraints(Object.values(points));\n  }\n\n  enforceBounds(editableArea) {\n    if (!this.stackable()) return;\n    if (!editableArea) return;\n\n    if (this.insideRectangle(editableArea)) {\n      return;\n    }\n\n    const bounds = this.bounds();\n    const [, , min_w, min_h] = editableArea;\n    const coeff_w = (min_w - 1) / bounds.w;\n    const coeff_h = (min_h - 1) / bounds.h;\n    const coeff = Math.min(coeff_w, coeff_h);\n\n    let { x, y, w, h } = this;\n\n    // console.warn(\"Slot %s is out of bounds: %f,%f (%f,%f)\", this.id, x, y, w, h);\n\n    if (coeff < 1) {\n      w = this.w * coeff;\n      h = this.h * coeff;\n    }\n\n    // Safe because we've already checked it'll fit\n    this.w = w;\n    this.h = h;\n    this.moveTo(x, y);\n    // console.warn(\"Moved %s to %f,%f (%f,%f)\", this.id, this.x, this.y, w, h);\n  }\n\n  insideRectangle([x, y, w, h], loose = false) {\n    const rect = new Rectangle(x, y, w, h);\n    if (loose) {\n      rect.modifyLimits(-3);\n    }\n    return Object.values(this.getPoints()).every(point =>\n      rect.containsPoint(point)\n    );\n  }\n\n  canResize({ x, y, w, h }, direction) {\n    const points = this.getSlotPoints(x, y, w, h);\n    const [cx, cy, cw, ch] = this.constrain;\n\n    function startPoint(type, coord, start, extent = 0) {\n      return Math[type](coord, start + extent);\n    }\n\n    function endPoint(coord, start, extent = 0) {\n      return Math.min(Math.max(coord, start), start + extent);\n    }\n\n    switch (direction) {\n      case 'top-middle':\n        delete points.bottomLeft, points.bottomMiddle, points.bottomRight;\n        points.topRight.x = startPoint('max', points.topRight.x, cx);\n        points.topRight.y = endPoint(points.topRight.y, cy, ch);\n        points.topLeft.x = startPoint('min', points.topLeft.x, cx, cw);\n        points.topLeft.y = endPoint(points.topLeft.y, cy, ch);\n        break;\n      case 'bottom-middle':\n        delete points.topLeft, points.topMiddle, points.topRight;\n        points.bottomRight.x = startPoint('max', points.bottomRight.x, cx);\n        points.bottomRight.y = endPoint(points.bottomRight.y, cy, ch);\n        points.bottomLeft.x = startPoint('min', points.bottomLeft.x, cx);\n        points.bottomLeft.y = endPoint(points.bottomLeft.y, cy, ch);\n        break;\n      case 'middle-right':\n        delete points.topLeft, points.middleLeft, points.bottomLeft;\n        points.topRight.x = startPoint('max', points.topRight.x, cx);\n        points.topRight.y = endPoint(points.topRight.y, cy, ch);\n        points.bottomRight.x = startPoint('max', points.bottomRight.x, cx);\n        points.bottomRight.y = endPoint(points.bottomRight.y, cy, ch);\n        break;\n      case 'middle-left':\n        delete points.bottomRight, points.middleRight, points.bottomRight;\n        points.topLeft.x = startPoint('max', points.topLeft.x, cx);\n        points.topLeft.y = endPoint(points.topLeft.y, cy, ch);\n        points.bottomLeft.x = startPoint('max', points.bottomLeft.x, cx);\n        points.bottomLeft.y = endPoint(points.bottomLeft.y, cy, ch);\n        break;\n      case 'top-left':\n        delete points.bottomRight;\n        points.topRight.x = startPoint('max', points.topRight.x, cx);\n        points.topRight.y = endPoint(points.topRight.y, cy, ch);\n        points.bottomLeft.x = endPoint(points.bottomLeft.x, cx, cw);\n        points.bottomLeft.y = startPoint('max', points.bottomLeft.y, cy);\n        break;\n      case 'top-right':\n        delete points.bottomLeft;\n        points.topLeft.x = startPoint('min', points.topLeft.x, cx + cw);\n        points.topLeft.y = endPoint(points.bottomRight.y, cy, ch);\n        points.bottomRight.x = endPoint(points.bottomRight.x, cx, cw);\n        points.bottomRight.y = startPoint('max', points.bottomRight.y, cy);\n        break;\n      case 'bottom-right':\n        delete points.topLeft;\n        points.topRight.x = endPoint(points.bottomLeft.x, cx, cw);\n        points.topRight.y = startPoint('min', points.topRight.y, cy, ch);\n        points.bottomLeft.x = startPoint('min', points.bottomLeft.x, cx, cw);\n        points.bottomLeft.y = endPoint(points.bottomLeft.y, cy, ch);\n        break;\n      case 'bottom-left':\n        delete points.topRight;\n        points.topLeft.x = endPoint(points.topLeft.x, cx, cw);\n        points.topLeft.y = startPoint('min', points.topLeft.y, cy, ch);\n        points.bottomRight.x = startPoint('max', points.bottomRight.x, cx);\n        points.bottomRight.y = endPoint(points.bottomRight.y, cy, ch);\n        break;\n    }\n\n    return this.withinConstraints(Object.values(points));\n  }\n\n  resize({ x, y, w, h }, direction) {\n    if (!this.canResize({ x, y, w, h }, direction)) {\n      return;\n    }\n\n    this.moveTo(x, y);\n\n    this.setClipSize(Math.max(w, this.minWidth), Math.max(h, this.minHeight));\n  }\n\n  withinConstraints(points) {\n    const [x, y, w, h] = this.constrain;\n\n    const xBetweenFn = betweenFactory(x, x + w);\n    const yBetweenFn = betweenFactory(y, y + h);\n\n    return points.every(p => xBetweenFn(p.x) && yBetweenFn(p.y));\n\n    function betweenFactory(min, max) {\n      // Limit precision to avoid unexpected results.\n      min = Math.round(parseFloat(min) * 10000);\n      max = Math.round(parseFloat(max) * 10000);\n\n      return function between(value) {\n        value = Math.round(parseFloat(value) * 10000);\n\n        return value >= min && value <= max;\n      };\n    }\n  }\n\n  /**\n   * Is this slot allowed to be overridden\n   */\n  canOverride() {\n    return false;\n  }\n\n  /**\n   * Checks if this slot is overridden\n   */\n  isOverride() {\n    return false;\n  }\n\n  overriddenId() {}\n\n  acceptsImage() {\n    return false;\n  }\n\n  isOptionalBackground() {\n    return false;\n  }\n\n  canShowEditLevel2() {\n    return false;\n  }\n}\n\nexport default SlotBase;","class MyMatrix {\n  constructor(a, b, c, d, e, f) {\n    // a = xx, b = xy\n    // c = yx, d = yy\n    // e = dx, f = dy\n    \n    this.a = a;\n    this.b = b;\n    this.c = c;\n    this.d = d;\n    this.e = e;\n    this.f = f;\n  }\n\n  transform_point(x, y) {\n    return [this.a * x + this.c * y + this.e, this.b * x + this.d * y + this.f];\n  }\n\n  invert() {\n    const d = this.a * this.d - this.b * this.c;\n    return new MyMatrix(\n      this.d / d,\n      -this.c / d,\n      -this.c / d,\n      this.a / d,\n      (this.b * this.f - this.d * this.e) / d,\n      (this.c * this.e - this.a * this.f) / d\n    );\n  }\n\n  // assume degrees\n  static rotate(angle) {\n    angle = (angle * Math.PI) / 180;\n    const c = Math.cos(angle);\n    const s = Math.sin(angle);\n\n    return new MyMatrix(c, -s, s, c, 0, 0);\n  }\n}\n\nwindow.MyMatrix = MyMatrix;\n\nexport default MyMatrix;\n","// Import Modules\nimport fetchImage from '../../../_utils/fetch-image';\nimport IU from '../../../_utils/img/img-utils';\nimport wkLogger from '../logger';\nimport PrismQuality from '../prism-quality';\nimport DpiThreshold from '../../utils/dpi-threshold';\n\nimport Point from '../geom/point';\nimport { isCalendarEventPhotoSlot } from '../../utils/special-slots';\nimport genericHelpers from '../../../_utils/generic-helpers';\nimport { isCanvas } from '../../trays/tray-determiner';\nimport { usePrismItemStore } from 'stores/usePrismItemStore';\nimport { safeNumber, ctxApplyMatrix } from './utils';\nimport { imgComplete, PlaceFiller, LoadingImage, BlankEmptyImage } from './imageLoaders';\nimport SlotBase from './slotBase';\nimport MyMatrix from './matrix';\n\nconst EditMode = {\n  Content: 1,\n  Layout: 2,\n};\n\nconst { imgHelpers } = IU;\n\nconst {\n  imgHelpers: { urlMunge },\n} = IU;\n\nconst { MAX_ZOOM, MIN_ZOOM } = IU;\n\nclass ImageSlot extends SlotBase {\n  RealMatrix = true;\n\n  constructor(area, properties = {}) {\n    super();\n\n    this.editable = true;\n\n    this.isImage = true;\n\n    this.isText = false;\n\n    this.type = 'image';\n    this.scale = 2;\n\n    this.straighten_min = -15;\n    this.straighten_max = 15;\n\n    this.gamma_min = 0.1;\n    this.gamma_max = 1.9;\n    this.lowDpi = false;\n\n    // Allows view & constrain properties to be set on creation\n    ['view', 'constrain'].forEach(key => {\n      if (properties.hasOwnProperty(key)) {\n        this[key] = properties[key];\n      }\n    });\n\n    this.setCoords(area.x, area.y, area.w, area.h);\n    this.editMode = EditMode.Content;\n  }\n\n  /**\n   * Checks if this slot is overridden\n   */\n  isOverridePhoto() {\n    return /^override-photo-/.test(this.id);\n  }\n\n  overriddenId() {\n    if (this.isOverridePhoto()) {\n      return this.id.replace(/^override-photo-/, '');\n    }\n  }\n\n  static from(slotData, properties = {}) {\n    // split the layout from the rest of the data\n    const { layout, ...data } = slotData.data || {};\n\n    // create the imageslot with the layout but fallback to 'pixel-coords' if needed\n    const area =\n      layout || (([x, y, w, h]) => ({ x, y, w, h }))(slotData['pixel-coords']);\n\n    const slot = new ImageSlot(area, properties);\n\n    // top level attributes\n    ['id', 'type', 'content_type'].forEach(\n      key => slotData.hasOwnProperty(key) && (slot[key] = slotData[key])\n    );\n\n    slotData.matrix && (slot.matrix = new MyMatrix(...slotData.matrix));\n    slotData.imatrix && (slot.imatrix = new MyMatrix(...slotData.imatrix));\n\n    // data object level attributes\n    ['zindex', 'embellishment_type'].forEach(\n      key =>\n        !slot.hasOwnProperty(key) &&\n        data.hasOwnProperty(key) &&\n        (slot[key] = data[key])\n    );\n\n    if (!slot.stackable()) {\n      slot.meta = slotData;\n    }\n    return slot;\n  }\n\n  restoreData(data) {\n    let { img } = this;\n    if (!img && data.url) {\n      img = fetchImage(urlMunge(data.url), 'use-credentials');\n    }\n    return this.setImage(img || null, data.imgId, data);\n  }\n\n  clearData() {\n    this.img = null;\n    this.lowDpi = false;\n    this.restoreData({});\n  }\n\n  data() {\n    const data = {\n      url: this.img ? this.img.src : void 0,\n      imgId: this.imgId || this.image,\n      x: safeNumber(this.ix, 0.5),\n      y: safeNumber(this.iy, 0.5),\n      zoom: safeNumber(this.zoomFactor, 1),\n      angle: safeNumber(this.angle, 0),\n      filter: this.filter || 'colour',\n      stroke: this.stroke,\n      straighten: safeNumber(this.straighten, 0),\n      gamma: safeNumber(this.gamma, 1.0),\n      lowDpi: this.lowDpi,\n      zindex: this.zindex,\n      layout: {\n        x: safeNumber(this.x, 0),\n        y: safeNumber(this.y, 0),\n        w: safeNumber(this.w, 10),\n        h: safeNumber(this.h, 10),\n      },\n    };\n\n    if (this.isEmbellishment()) {\n      data.embellishment_type = this.embellishment_type;\n    }\n\n    return data;\n  }\n\n  draw(ctx) {\n    let _ref;\n    if (this.original && this.original.img) this.img = this.original.img;\n    if (imgComplete(this.img)) {\n      var img = this._img || this.img;\n      const vars = {};\n      let ratio = this.img.width / this.img.height;\n\n      if (this.meta && this.meta['pixel-coords']) {\n        const r = this.meta['pixel-coords'];\n        ratio = r[2] / r[3];\n      }\n\n      vars.fx = this.filter || 'colour';\n      // vars.angle = this.angle;\n      vars.angle = 0; // we do this in web prism\n      vars.straighten = this.straighten;\n      vars.gamma = this.gamma;\n\n      const key = [\n        vars.fx,\n        vars.angle,\n        vars.straighten,\n        vars.gamma,\n      ].join('-');\n\n      if (this.key !== key || !this._img) {\n        this.key = key;\n        this._img = imgHelpers.doProcessPhoto(this.img, vars, ratio);\n        img = this._img;\n      }\n\n      if (this.original) {\n        this.drawCentred(ctx, img, this.original.data());\n      } else {\n        this.drawCentred(ctx, img, this.data());\n      }\n    } else if (this.isEmbellishment()) {\n      // Don't render loading or placefiller images for embellishments\n      return;\n    } else if (this.img && !imgComplete(this.img) && LoadingImage.complete) {\n      this.drawCentred(ctx, LoadingImage, {\n        x: 0.5,\n        y: 0.5,\n        zoom: 1.0,\n        angle: 0,\n        filter: 'colour',\n      });\n    } else if (\n      !this.img &&\n      PlaceFiller.complete &&\n      ((_ref = this.view) != null ? _ref.editable || this.isColour() : void 0)\n    ) {\n      if (this.isOptionalBackground()) {\n        if (!this.imgId) {\n          // Default white background?\n          this.imgId = '#ffffff';\n        }\n      }\n      var img;\n      img = this.isClone() ? BlankEmptyImage : PlaceFiller;\n      this.drawCentred(ctx, img, {\n        x: 0.5,\n        y: 0.5,\n        zoom: 1.0,\n        angle: 0,\n        filter: 'colour',\n      });\n    }\n  }\n\n  draw_clip(ctx, clip_path) {\n    if (!window.Path2D) {\n      return;\n    }\n    const path = new Path2D(clip_path);\n    ctx.clip(path, 'evenodd');\n  }\n\n  drawCentred(ctx, img, info) {\n    let p;\n    let _ref;\n    if (!img) return;\n\n    if (this.meta) {\n      if (this.RealMatrix) {\n        ctxApplyMatrix(ctx, this.meta);\n      } else {\n        ctx.translate(this.meta.shift[0], this.meta.shift[1]);\n        ctx.scale(this.meta.scale[0], this.meta.scale[1]);\n        ctx.rotate(this.meta.rotate);\n      }\n      if (this.meta.clip_path) {\n        try {\n          this.draw_clip(ctx, this.meta.clip_path);\n        } catch (_error) {}\n      }\n    }\n\n    ctx.save();\n    try {\n      if (this.isColour()) {\n        this._drawColour(ctx);\n      } else {\n        this._drawImage(ctx, img, info);\n      }\n    } finally {\n      ctx.restore();\n    }\n  }\n\n  _drawImage(ctx, img, info) {\n    const p = this.calculateRenderArea(img, info);\n    if (this.stackable()) {\n      ctx.translate(this.x + this.w / 2, this.y + this.h / 2);\n      ctx.rotate(this.getAngleRadian());\n      ctx.drawImage(\n        img,\n        p.img.x,\n        p.img.y,\n        p.img.w,\n        p.img.h,\n        -p.tgt.w / 2,\n        -p.tgt.h / 2,\n        p.tgt.w,\n        p.tgt.h\n      );\n    } else {\n      ctx.translate(this.x, this.y);\n      ctx.rotate((Math.PI * (360 - info.angle)) / 180);\n      ctx.drawImage(\n        img,\n        p.img.x,\n        p.img.y,\n        p.img.w,\n        p.img.h,\n        p.tgt.x,\n        p.tgt.y,\n        p.tgt.w,\n        p.tgt.h\n      );\n    }\n    this.p = p;\n  }\n\n  _drawColour(ctx) {\n    const imgId = this.imgId || this.image;\n    if (!(typeof imgId === 'string' && imgId.match(/^\\#[A-Fa-f0-9]{6}/))) {\n      return;\n    }\n\n    ctx.beginPath();\n    ctx.fillStyle = imgId;\n    if (this.stackable()) {\n      ctx.translate(this.x + this.w / 2, this.y + this.h / 2);\n      ctx.rotate(this.getAngleRadian());\n      ctx.rect(-this.w / 2, -this.h / 2, this.w, this.h);\n    } else {\n      const c = this.meta['real-coords'];\n      ctx.rect(c[0], c[1], c[2], c[3]);\n    }\n    ctx.fill();\n  }\n\n  drawLowDpiWarning(ctx) {\n    if (!this.hasLowDpi(this.slotData, this.photoData)) return;\n\n    this.drawWarning(ctx, 'Low Quality');\n  }\n\n  drawOrientationWarning(ctx) {\n    if (this.matchSlotOrientation() || this.hasLowDpi(this.slotData, this.photoData) || !isCanvas()) return;\n\n    this.drawWarning(ctx, 'Orientation Mismatch', 'yellow', false);\n  }\n\n  drawWarning(ctx, msg, colour_scheme = 'default', show_icon = true) {\n    // Getting same font as whole site\n    const font = $('body')\n      .css('fontFamily')\n      .toString();\n    const iconImg =\n      colour_scheme === 'default'\n        ? PrismQuality.exclamation\n        : PrismQuality.exclamationBlack;\n    const backgroundColour =\n      colour_scheme === 'default'\n        ? 'rgba(0, 0, 0, 0.68)'\n        : 'rgba(255, 193, 32, 0.68)';\n    const textColour =\n      colour_scheme === 'default'\n        ? 'rgba(255, 255, 255, 1)'\n        : 'rgba(0, 0, 0, 1)';\n\n    let x = this.x - this.ox;\n    const y = this.y - this.oy;\n\n    ctx.save();\n    let w = this.w - 1;\n    const h = this.h - 1;\n\n    if (this.meta) {\n      if (this.RealMatrix) {\n        ctxApplyMatrix(ctx, this.meta);\n      } else {\n        if (this.meta.shift) {\n          ctx.translate(this.meta.shift[0], this.meta.shift[1]);\n        }\n        if (this.meta.scale) ctx.scale(this.meta.scale[0], this.meta.scale[1]);\n        if (typeof this.meta.rotate === 'number' && this.meta.rotate !== 0) {\n          ctx.rotate(this.meta.rotate);\n        }\n      }\n    }\n    ctx.lineWidth = 2;\n    let fontSize = 10;\n\n    if (this.meta && this.meta.scale) {\n      const scale = Math.abs(this.meta.scale[0]);\n      ctx.lineWidth /= scale;\n      fontSize /= scale;\n    }\n\n    const overlap = (w / 100) * 5;\n    ctx.font = `${fontSize}px ${font}`;\n    const info = ctx.measureText(msg);\n    const info_width = info.width * 1.2;\n    const dpi_x = x + (w - info_width) / 2;\n    const dpi_y = y + h - fontSize - overlap;\n    const msgHeight = fontSize * 1.2 + 1;\n\n    ctx.globalAlpha = 1;\n    if (this.view.selected && this.view.selected.img) {\n      if (this.isCalendarDayEntry()) {\n        // XXX This is due to calendar small slots, this will overlap the slot\n        //     and remain same readable fonsize\n        const iconTextWidth = iconImg.width + info_width;\n        w = iconTextWidth + iconTextWidth / 4;\n        x -= iconTextWidth / 4;\n      }\n      ctx.fillStyle = backgroundColour;\n      ctx.fillRect(x, dpi_y, w, msgHeight);\n      ctx.drawImage(iconImg, dpi_x, dpi_y, msgHeight, msgHeight);\n      ctx.fillStyle = textColour;\n      ctx.fillText(msg, dpi_x + fontSize + info.width * 0.1, dpi_y + fontSize);\n    }\n    return ctx.restore();\n  }\n\n  calculateRenderArea(img, info) {\n    const p = {\n      img: {\n        x: 0,\n        y: 0,\n        w: 0,\n        h: 0,\n      },\n      tgt: {\n        x: 0,\n        y: 0,\n        w: 0,\n        h: 0,\n      },\n    };\n\n    let x = 0;\n    let y = 0;\n    let w = 0;\n    let h = 0;\n    info.x = this.constrainRange(info.x, 0, 1.0);\n    info.y = this.constrainRange(info.y, 0, 1.0);\n    const align = {\n      x: info.x,\n      y: info.y,\n    };\n    let ih;\n    let iw;\n\n    if (this.stackable()) {\n      iw = img.width;\n      ih = img.height;\n      w = this.w;\n      h = this.h;\n      info.x = align.x;\n      info.y = align.y;\n    } else {\n      switch (info.angle) {\n        case 0:\n          iw = img.width;\n          ih = img.height;\n          w = this.w;\n          h = this.h;\n          info.x = align.x;\n          info.y = align.y;\n          break;\n        case 270:\n          ih = img.height;\n          iw = img.width;\n          w = this.h;\n          h = this.w;\n          y -= h;\n          info.x = align.y;\n          info.y = 1 - align.x;\n          break;\n        case 180:\n          iw = img.width;\n          ih = img.height;\n          w = this.w;\n          h = this.h;\n          x -= w;\n          y -= h;\n          info.x = 1 - align.x;\n          info.y = 1 - align.y;\n          break;\n        case 90:\n          ih = img.height;\n          iw = img.width;\n          w = this.h;\n          h = this.w;\n          x -= w;\n          info.y = align.x;\n          info.x = 1 - align.y;\n      }\n    }\n    const src_aspect = iw / ih;\n    const tgt_aspect = w / h;\n    if (tgt_aspect < src_aspect) {\n      p.img.w = parseInt(ih * tgt_aspect, 10);\n      p.img.h = ih;\n      p.aspect = 'tgtmin';\n    } else {\n      p.img.w = iw;\n      p.img.h = parseInt(iw / tgt_aspect, 10);\n      p.aspect = 'srcmin';\n    }\n    p.img.w /= info.zoom;\n    p.img.h /= info.zoom;\n    p.img.x = info.x * (iw - p.img.w);\n    p.img.y = info.y * (ih - p.img.h);\n    if (p.img.x < 0) p.img.x = 0;\n    if (p.img.y < 0) p.img.y = 0;\n    if (p.img.w + p.img.x > iw) p.img.x = iw - p.img.w;\n    if (p.img.h + p.img.y > ih) p.img.y = ih - p.img.h;\n    if (p.img.x < 0) p.img.x = 0;\n    if (p.img.y < 0) p.img.y = 0;\n    if (p.img.w + p.img.x > iw) p.img.w = iw - p.img.x;\n    if (p.img.h + p.img.y > ih) p.img.h = ih - p.img.y;\n    p.tgt.x = x;\n    p.tgt.y = y;\n    p.tgt.w = w;\n    p.tgt.h = h;\n    return p;\n  }\n\n  imageInfo() {\n    if (!this.imgId) return false;\n\n    const prismItem = usePrismItemStore.getState().prismItem;\n\n    if (!prismItem) return false;\n    if (!prismItem.imageList) return false;\n\n    for (let i = 0; i < prismItem.imageList.length; i++) {\n      if (prismItem.imageList[i].id == this.imgId) {\n        return prismItem.imageList[i];\n      }\n    }\n\n    return false;\n  }\n\n  getSize() {\n    const info = this.imageInfo() || {};\n\n    return {\n      width: info.width,\n      height: info.height,\n    };\n  }\n\n  get slotData() {     \n    return { ...this.data() };\n  }\n\n  get photoData() { \n      return prismItem.imageList.find(image => image.id === Number(this.imgId));  \n  }\n\n  effectiveDims() {\n    const imgInfo = this.imageInfo();\n    if (!imgInfo) return false;\n\n    const imgData = this.data();\n    const adjHeight = imgInfo.height / imgData.zoom;\n    const adjWidth = imgInfo.width / imgData.zoom;\n    const sideWays = imgData.angle % 180 !== 0;\n\n    if (sideWays) {\n      return { x: adjHeight, y: adjWidth }; // x and y swapped if the image is \"on its side\"\n    }\n\n    return { x: adjWidth, y: adjHeight };\n  }\n \n  acceptsImage({ allowOptionalBackground = false } = {}) {\n    const predicates = [this.isClone, this.isEmbellishment];\n\n    if (!allowOptionalBackground) {\n      predicates.push(this.isOptionalBackground);\n    }\n\n    return predicates.every(predicate => !predicate.call(this));\n  }\n\n  canAppend() {\n    return (\n      !this.img &&\n      !this.isColour() &&\n      !this.isClone() &&\n      !this.isOptionalBackground() &&\n      !this.isCalendarDayEntry()\n    );\n  }\n\n  setAsClone(original) {\n    return (this.original = original);\n  }\n\n  setAsColour(colour) {\n    this.imgId = colour;\n    this.img = null;\n  }\n\n  isColour() {\n    if (typeof this.imgId === 'string') {\n      if (this.imgId.match(/^#[A-Fa-f0-9]{6}$/)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  setImage(img, imgId, data) {\n    let _ref;\n    let _ref2;\n    let _ref3;\n    let _ref4;\n    let _ref5;\n    const _this = this;\n    if (!data) data = false;\n    this.zoomFactor =\n      (_ref = data != null ? data.zoom : void 0) != null ? _ref : 1;\n    this.angle =\n      (_ref2 = data != null ? data.angle : void 0) != null ? _ref2 : 0;\n    this.ix = (_ref3 = data != null ? data.x : void 0) != null ? _ref3 : 0.5;\n    this.iy = (_ref4 = data != null ? data.y : void 0) != null ? _ref4 : 0.5;\n    this.filter =\n      (_ref5 = data != null ? data.filter : void 0) != null ? _ref5 : 'colour';\n    this.straighten =\n      (_ref5 = data != null ? data.straighten : void 0) != null ? _ref5 : 0;\n    this.gamma =\n      (_ref5 = data != null ? data.gamma : void 0) != null ? _ref5 : 1.0;\n    this.imgId = imgId;\n    this.lowDpi = this.hasLowDpi(this.slotData, this.photoData);\n    this.key = null;\n    this._img = null;\n    if (img) {\n      this._img = null;\n      this.img = img;\n      this.setFilter(data.filter);\n\n      if (imgComplete(img)) {\n        _this.triggerRedraw();\n      } else {\n        img.onload = function(e) {\n          _this.triggerRedraw();\n        };\n      }\n    } else {\n      this.img = null;\n      this.image = null;\n      _this.triggerRedraw();\n    }\n  }\n\n  setData(imgInfo, data) {\n    if (imgInfo) {\n      const img = fetchImage(\n        urlMunge(imgInfo.urls[data.filter] || imgInfo.url),\n        'use-credentials'\n      );\n      this.setImage(img, imgInfo.id, data);\n    } else {\n      this.setImage(null, null, {});\n    }\n  }\n\n  properties = [\n    'angle',\n    'filter',\n    'gamma',\n    'imgId',\n    'ix',\n    'iy',\n    'straighten',\n    'zindex',\n    'zoomFactor',\n  ];\n\n  dragStopped() {\n    this._set_ix(this.ix);\n    return this._set_iy(this.iy);\n  }\n\n  setProperty(name, value) {\n    if (!this.img) return false;\n    if (this._set(name, value)) {\n      return true;\n    }\n    return false;\n  }\n\n  straightenBy(value) {\n    return this._set('straighten', this.straighten + value);\n  }\n\n  brightenBy(value) {\n    return this._set('gamma', this.gamma + value);\n  }\n\n  setProperties(data) {\n    const { x, y, zoom, filter, angle, ...properties } = data;\n    data = Object.assign(properties, {\n      ix: x,\n      iy: y,\n      zoomFactor: zoom,\n      angle,\n    });\n\n    for (const [key, value] of Object.entries(data)) {\n      if (typeof value !== 'undefined') this.setProperty(key, value);\n    }\n\n    if (typeof filter !== 'undefined') this.setFilter(filter);\n\n    this.view.do_save();\n    this.triggerRedraw();\n  }\n\n  _set_ix(value) {\n    return (this.ix = this.constrainRange(value, 0, 1.0, 0.5));\n  }\n\n  _set_iy(value) {\n    return (this.iy = this.constrainRange(value, 0, 1.0, 0.5));\n  }\n\n  zoomBy(mod) {\n    if (!this.img) return false;\n    return this.setZoom(this.zoomFactor + mod);\n  }\n\n  setZoom(zoom) {\n    if (!this.img) return false;\n\n    zoom = parseFloat(zoom);\n    if (zoom < MIN_ZOOM) {\n      zoom = MIN_ZOOM;\n    }\n    if (zoom > MAX_ZOOM) {\n      zoom = MAX_ZOOM;\n    }\n    if (zoom !== this.zoomFactor) {\n      this.zoomFactor = zoom;\n      return true;\n    }\n  }\n\n  rotate(angle) {\n    if (!this.img) return false;\n\n    let newAngle = this.angle + angle;\n    while (newAngle < 360) newAngle += 360;\n    if (this.stackable() && !this.canRotate(newAngle)) return;\n\n    const [x, y] = (() => {\n      return Math.abs(angle) === IU.RIGHT_ANGLE\n        ? [this.iy, this.ix]\n        : [this.ix, this.iy];\n    })();\n\n    this.setProperties({\n      x,\n      y,\n      angle: newAngle % 360,\n    });\n  }\n\n  setClipSize(w, h) {\n    // Stickers are being cropped by the boundaries of the slot instead of scaling within it correctly.\n    if (this.isSticker()) {\n      w = h = Math.min(w, h);\n    }\n    this.w = w;\n    this.h = h;\n  }\n\n  setCoords(x, y, w, h) {\n    this.x = x;\n    this.y = y;\n    this.w = w;\n    this.h = h;\n\n    this.moveTo(x, y);\n    return this.setClipSize(w, h);\n  }\n\n  isLoading() {\n    return this.img && !this.img.complete;\n  }\n\n  setFilter(filter = 'colour') {\n    if (this.filter === filter) {\n      return; // nothing to do here\n    }\n\n    if (this.img) {\n      this._img = null;\n      if (imgHelpers.doProcessPhoto) {\n        // no-op - we process clientside\n      } else {\n        this.img.crossOrigin = 'use-credentials';\n        this.img.src = urlMunge(\n          this.img.src.replace(\n            /\\/(greyscale|bw|sepia|colour|blue|bluetone)[a-z]*$/,\n            `/${filter}`\n          )\n        );\n      }\n      this.filter = filter;\n    }\n  }\n\n  constrainRange(val, min, max, def_value) {\n    if (def_value != null && isNaN(val)) return def_value;\n    if (val < min) return min;\n    if (val > max) return max;\n    return val;\n  }\n\n  moveImgBy(x, y) {\n    const radiansAngle = Point.degreesToRadians(this.angle);\n\n    const xMod = x * Math.cos(radiansAngle) + y * Math.sin(radiansAngle);\n    const yMod = x * Math.sin(-radiansAngle) + y * Math.cos(radiansAngle);\n    const dx = this.stackable() ? xMod : x;\n    const dy = this.stackable() ? yMod : y;\n\n    let img;\n    if (x === 0 && y === 0) return;\n    if (imgComplete(this.img)) {\n      img = {\n        w: this.img.width * this.zoomFactor - this.p.img.w,\n        h: this.img.height * this.zoomFactor - this.p.img.h,\n      };\n      if (this.angle === 90 || this.angle === 270) {\n        [img.w, img.h] = [img.h, img.w];\n      }\n      wkLogger.debug('Move by %o', {\n        xMod,\n        yMod,\n      });\n      if (img.w > 0) this._set_ix(this._ix - dx / img.w);\n      if (img.h > 0) this._set_iy(this._iy - dy / img.h);\n    }\n  }\n\n  slotRatio() {\n    if (this.meta) {\n      return this.meta['pixel-coords'][3] / this.meta['pixel-coords'][2];\n    }\n    return this.h / this.w;\n  }\n\n  editorData() {\n    const { angle, ...slotData } = this.data();\n    const stackable = this.stackable();\n\n    return {\n      ...slotData,\n      id: this.id,\n      image: this.img,\n      angle: stackable ? 0 : angle,\n      stackable,\n      crop_ratio: this.slotRatio(),\n      dimensions: {\n        width: this.w || this.meta['real-coords'][WIDTH],\n        height: this.h || this.meta['real-coords'][HEIGHT],\n      },\n    };\n  }\n\n  matchSlotOrientation() {\n    const prismItem = usePrismItemStore.getState().prismItem;\n\n    const photoData = prismItem.imageList.find(\n      image => image.id === Number(this.imgId)\n    );\n    if (!photoData) return;\n\n    return genericHelpers.imageMatchesSlotOrientation(photoData, this);\n  }\n\n  hasLowDpi(slotData, photoData) {       \n    if (this.meta || this.stackable()) {\n      const dpiThreshold = new DpiThreshold(genericHelpers.getImageOutputDpiWithSlotData(slotData, photoData)).isTooLow;\n      \n      this.lowDpi = dpiThreshold;\n      this.slotData.lowDpi = dpiThreshold;\n      \n      \n      return dpiThreshold;\n    }\n  }\n\n  isEmbellishment() {\n    return this.content_type === 'embellishment';\n  }\n\n  isSticker() {\n    return this.isEmbellishment() && this.embellishment_type === 'sticker';\n  }\n\n  isPattern() {\n    return this.isEmbellishment() && this.embellishment_type === 'pattern';\n  }\n\n  isOptionalBackground() {\n    return this.id === 'optional-bg';\n  }\n\n  canShowEditLevel2() {\n    return !this.isEmbellishment();\n  }\n\n  isCalendarDayEntry() {\n    return isCalendarEventPhotoSlot(this.id);\n  }\n\n  convertFromTemplateToStackable(editableArea) {\n    const { meta } = this;\n    if (!meta || this.stackable()) return;\n    this.id = `override-photo-${meta.id}`;\n    this.type = 'stackable';\n    this.content_type = 'image';\n    const [x, y] = this.matrix.transform_point(this.x, this.y);\n\n    const realScaleX = meta.scale[0];\n    const realScaleY = meta.scale[1];\n    const scaleX = Math.abs(realScaleX);\n    const scaleY = Math.abs(realScaleY);\n\n    this.x = x;\n    this.y = y;\n    this.w *= scaleX;\n    this.h *= scaleY;\n\n    let angle = meta.rotate;\n\n    if (realScaleX < 0 || realScaleY < 0) {\n      const initialReference = new Point(this.x, this.y);\n      if (realScaleX < 0 && realScaleY >= 0) {\n        angle = -angle;\n        const opposite = new Point(this.x - this.w, this.y);\n        opposite.rotate(initialReference, this.getAngleDegrees(angle));\n        this.x = opposite.x;\n        this.y = opposite.y;\n      }\n      if (realScaleY < 0 && realScaleX >= 0) {\n        angle = -angle;\n        const opposite = new Point(this.x, this.y - this.h);\n        opposite.rotate(initialReference, this.getAngleDegrees(angle));\n        this.x = opposite.x;\n        this.y = opposite.y;\n      }\n      if (realScaleY < 0 && realScaleX < 0) {\n        const initialReference = new Point(this.x, this.y);\n        const opposite = new Point(this.x - this.w, this.y - this.h);\n        opposite.rotate(initialReference, angle);\n        this.x = opposite.x;\n        this.y = opposite.y;\n      }\n    }\n\n    this.angle = this.getAngleDegrees(angle);\n\n    const centerCoord = [this.x + this.w / 2, this.y + this.h / 2];\n    const centerPoint = new Point(centerCoord[0], centerCoord[1]);\n    const slotCoordRotated = new Point(this.x, this.y).rotate(\n      centerPoint,\n      this.angle\n    );\n    const diffX = this.x - slotCoordRotated.x;\n    const diffY = this.y - slotCoordRotated.y;\n\n    this.x += diffX;\n    this.y += diffY;\n\n    delete this.meta;\n    delete this.matrix;\n    delete this.imatrix;\n\n    if (!this.insideRectangle(editableArea)) {\n      this.enforceBounds(editableArea);\n    }\n\n    return this;\n  }\n\n  permittedToBeStacked() {\n    return (\n      this.fromTemplate && this.inEditableArea && !this.isOptionalBackground()\n    );\n  }\n}\n\nexport default ImageSlot;\n","\n// Import Libraries\nimport md5 from 'js-md5';\n\n// Import JS Modules\nimport UrlBuilder from '../../_utils/url-building';\nimport { usePrismItemStore } from 'stores/usePrismItemStore';\n\n// --------------------------------------------------------------------\n\nclass TextPreviewUrl {\n  constructor(slot) {\n    this.slot = slot;\n  }\n\n  generate() {\n    const prismItem = usePrismItemStore.getState().prismItem;\n    \n    this.queryString || (this.queryString = this.generateQueryString());\n\n    return `/edt/fnt/str/${prismItem.sec}/${prismItem.num}?${this.queryString}`;\n  }\n\n  generateQueryString() {\n    const params = Object.assign(this.params, {\n      random: this.md5,\n    });\n\n    return UrlBuilder.buildURLQuery(params);\n  }\n\n  get params() {\n    if (this.memoizedParams) {\n      return this.memoizedParams;\n    }\n\n    const {\n      id, string, fontName, fontSize, fontWeight, fontSlant, zoom, align, valign, scale, w, h, renderer, stroke, templateId, pageIndex,\n    } = this.slot;\n    let { fontColour } = this.slot;\n\n    if (fontColour.slice(0, 1) === '#') {\n      fontColour = `X${fontColour.slice(1)}`;\n    }\n\n    const params = {\n      text: string,\n      colour: fontColour,\n      font: fontName,\n      size: fontSize,\n      bold: fontWeight,\n      italic: fontSlant,\n      zoom,\n      width: w,\n      height: h,\n      renderer,\n      align,\n      valign,\n      scale,\n      slt: id,\n      template: templateId,\n      index: pageIndex,\n    };\n\n    if (stroke) {\n      ['width', 'opacity', 'colour', 'linejoin'].forEach((type) => {\n        params[`stroke_${type}`] = stroke[type];\n      });\n    }\n\n    return this.memoizedParams = params;\n  }\n\n  get md5() {\n    return md5(UrlBuilder.buildURLQuery(this.params));\n  }\n}\n\n// --------------------------------------------------------------------\n\nexport default TextPreviewUrl;\n","function validJSON(jsonString) {\n  try {\n    const parsedString = JSON.parse(jsonString);\n    if (parsedString && typeof parsedString === 'object') return true;\n  } catch (error) {\n    console.warn(\n      'String in MyLab for this product is not valid: ',\n      jsonString,\n      ' error message: ',\n      error,\n    );\n    return false;\n  }\n  return false;\n}\n\nfunction hasFoilText(adjustments) {\n  return (\n    adjustments.replace_prism_view_text_fill === true &&\n    validJSON(adjustments.replacement_prism_view_text_fill_colour) === true\n  );\n}\n\nexport { hasFoilText };\n","// Import Modules\nimport fetchImage from '../../../_utils/fetch-image';\nimport { EventEmitter } from 'wk-event-emitter';\nimport TextPreviewUrl from '../../utils/text-preview-url';\nimport { isCalendarEventTextSlot } from '../../utils/special-slots';\nimport IU from '../../../_utils/img/img-utils';\nimport genericHelpers from '../../../_utils/generic-helpers';\nimport { safeNumber, stripString, ctxApplyMatrix } from './utils';\nimport { imgComplete, BlankImage } from './imageLoaders';\nimport SlotBase from './slotBase';\nimport { replaceImageFillWithGradient } from '../../../_utils/img/canvas.js';\nimport { replaceImageFillWithWhiteAndThresholdAlpha } from '../../../_utils/img/canvas.js';\nimport { hasFoilText } from '../../utils/has-foil-text';\n\nconst {\n  imgHelpers: { urlMunge },\n} = IU;\n\nclass TextSlot extends SlotBase {\n  FONT_WEIGHT_NORMAL = 0;\n\n  FONT_WEIGHT_BOLD = 1;\n\n  FONT_SLANT_NORMAL = 0;\n\n  FONT_SLANT_OBLIQUE = 1;\n\n  RealMatrix = true;\n\n  constructor(id) {\n    super();\n\n    this.isImage = false;\n\n    this.isText = true;\n\n    this.zoom = 1.0;\n\n    this.type = 'text';\n\n    const _this = this;\n\n    this.id = id;\n\n    this.string = 'Enter text';\n\n    this.fontName = 'Lora';\n\n    this.fontSize = 36;\n\n    this.fontWeight = this.FONT_WEIGHT_NORMAL;\n\n    this.fontSlant = this.FONT_SLANT_NORMAL;\n\n    this.fontColour = '#000000';\n\n    this.align = 'left';\n\n    this.scale = 1.0;\n\n    this.valign = 'top';\n\n    this.renderer = 'simple'; // \"default\";\n\n    this.img = new Image();\n\n    this.img.onload = function(e) {\n      return _this.onLoad(e);\n    };\n  }\n\n  isLoading() {\n    return this.img && !this.img.complete;\n  }\n\n  setAsClone(original) {\n    return (this.original = original);\n  }\n\n  setRenderer(renderer) {\n    if (this._set_renderer(renderer)) {\n      return this.queueReload();\n    }\n  }\n\n  _set_renderer(renderer) {\n    renderer = 'simple';\n    if (this.renderer !== renderer) {\n      this.renderer = renderer;\n      return true;\n    }\n    return false;\n  }\n\n  _set_scale(value) {\n    let coords;\n    let _ref;\n\n    if (value === this.scale) return false;\n    this.scale = value;\n    coords = (_ref = this.meta) != null ? _ref['pixel-coords'] : void 0;\n    if (this.meta && coords && this.fromTemplate) {\n      this.x = coords[0];\n      this.y = coords[1];\n      this.w = coords[2];\n      this.h = coords[3];\n    }\n    return true;\n  }\n\n  setScale(scale) {\n    if (this._set_scale(scale)) return this.queueReload();\n  }\n\n  preview_url() {\n    const data = this.data();\n\n    if (data.string.length === 0) {\n      if (!this.isCalendarDayEntry() && this.view && this.view.editable) {\n        data.string = this.isClone() ? '' : 'Enter your text';\n      } else {\n        return BlankImage.src;\n      }\n    }\n\n    return new TextPreviewUrl(data).generate();\n  }\n\n  isCalendarDayEntry() {\n    return isCalendarEventTextSlot(this.id);\n  }\n\n  copyFrom(slot) {\n    this.align = slot.align;\n    this.fontColour = slot.fontColour;\n    this.fontName = slot.fontName;\n    this.fontWeight = slot.fontWeight;\n    this.fontSize = slot.fontSize;\n    this.fontSlant = slot.fontSlant;\n    this.string = slot.string;\n    this.valign = slot.valign;\n\n    this._reload();\n  }\n\n  resizeToFit() {\n    let changed = false;\n    if (this.fromTemplate) return;\n\n    if (this.constrain && this.constrain.length) {\n      if (this.h > this.constrain[3]) {\n        this.h = this.constrain[3];\n        changed = true;\n      }\n      if (this.w > this.constrain[2]) {\n        this.w = this.constrain[2];\n        changed = true;\n      }\n    }\n\n    if (changed) {\n      this.queueReload('slot resizeToFit', 300);\n    }\n  }\n\n  // called when re-sizing the text slot\n  setClipSize(w, h) {\n    if (this.fromTemplate) return;\n    w = w > 10 ? (w > 400 ? 400 : w) : 10;\n    h = h > 10 ? (h > 400 ? 400 : h) : 10;\n\n    this.w = w;\n    this.h = h;\n    return this.queueReload('text resize', 2000); // 2s = Rough Prism Round-Trip Time for text render\n  }\n\n  moveBy(dx, dy) {\n    if (this.fromTemplate) return false;\n\n    this.x += dx;\n    this.y += dy;\n    return true;\n  }\n\n  queueReload(reason, time) {\n    const _this = this;\n    if (!this.timeoutID) {\n      this.timeoutID = window.setTimeout(\n        () => _this._reload(),\n        time || 50,\n        'queued'\n      );\n    }\n  }\n\n  reload(reason) {\n    if (!this._allow_reload) {\n      this._pending_reload = true;\n      return false;\n    }\n    if (this.timeoutID) {\n      window.clearTimeout(this.timeoutID);\n      this.timeoutID = false;\n    }\n    this._reload(reason);\n    this._pending_reload = false;\n    return true;\n  }\n\n  _reload() {\n    this._pending_reload = false;\n    this.timeoutID = false;\n    if (this.meta) this.zoom = 1.0;\n\n    // if (this.string === \"\") url = BlankImage.src;\n    // Application.log(\"From url: %s to %s\", this.img.src, url);\n    this.img = fetchImage(urlMunge(this.preview_url()), 'use-credentials', e =>\n      this.onLoad(e)\n    );\n  }\n\n  onLoad(e) {\n    let _ref;\n    if (!this.w || !this.h) {\n      this.w = this.img.width;\n      this.h = this.img.height;\n    }\n    this.scaledTo = 1.0;\n\n    if (this.view && $.cookie) {\n      const cname = `ts${this.view.pageIndex}_${this.id}`;\n      const cookie = $.cookie(cname);\n      $.removeCookie(cname, { path: '/' });\n      if (cookie) {\n        const data = JSON.parse(cookie);\n        // check the size is the same as for this request\n        if (data.sz == this.fontSize && (data.want && data.got)) {\n          // this.scaledTo = 100 * data.got / data.want;\n          if (this.scaledTo > 1) {\n            const size = parseInt(0.5 + (this.scaledTo * this.fontSize) / 100);\n            if (size > 2 && this.fontSize != size) {\n              this.fontSize = size;\n              this.reload();\n            }\n          }\n        }\n      }\n    }\n\n    this.triggerRedraw();\n  }\n\n  imgReady = false;\n\n  properties = [\n    'align',\n    'angle',\n    'fontColour',\n    'fontName',\n    'fontSize',\n    'fontSlant',\n    'fontWeight',\n    'h',\n    'id',\n    'string',\n    'valign',\n    'renderer',\n    'scale',\n    'stroke',\n    'w',\n    'x',\n    'y',\n    'zindex',\n    'zoom',\n  ];\n\n  updateType() {\n    if (this.fromTemplate) {\n      this.type = 'text';\n      this.content_type = 'text';\n    } else {\n      this.type = 'stackable';\n      this.content_type = 'text';\n    }\n  }\n\n  stackable() {\n    return !this.fromTemplate;\n  }\n\n  data() {\n    this.updateType();\n\n    const data = this.properties.reduce((memo, property) => {\n      switch (property) {\n        case 'string':\n          memo[property] = stripString(this[property]);\n          break;\n        case 'fontSize':\n          memo[property] = Math.abs(this[property]);\n          break;\n        case 'renderer':\n          memo[property] = 'simple'; // force simple renderer\n          break;\n        case 'x':\n        case 'y':\n          isNaN(this.x) || isNaN(this.y)\n            ? (memo[property] = 10)\n            : (memo[property] = this[property]);\n          break;\n        default:\n          memo[property] = this[property];\n          break;\n      }\n\n      return memo;\n    }, {});\n\n    data.editable = this.editable;\n    data.templateId = this.view.template.id;\n    data.pageIndex = this.view.pageIndex;\n\n    data.layout = {\n      x: safeNumber(this.x, 0),\n      y: safeNumber(this.y, 0),\n      w: safeNumber(this.w, 10),\n      h: safeNumber(this.h, 10),\n    };\n\n    return data;\n  }\n\n  _set_fontSize(value) {\n    value = parseInt(value);\n    value = Math.abs(value);\n    this.fontSize = Math.max(4, value);\n\n    // For some reason this.fontSize equals value when\n    // flow arrives in the function\n    // want to use `return this.fontSize !== value`\n    // but it's always going to be false.\n    // We need to return true for the slot\n    // to save to the server\n    return true;\n  }\n\n  _set_align(value) {\n    switch (value) {\n      case 'left':\n      case 'center':\n      case 'right':\n        this.align = value;\n        break;\n      case 'top':\n      case 'middle':\n      case 'bottom':\n        this.valign = value;\n        break;\n    }\n    return true;\n  }\n\n  setString(string) {\n    return this.setProperty('string', `${string}`);\n  }\n\n  setProperty(name, value) {\n    if (this._set(name, value)) {\n      this.queueReload();\n      this.string = this.string;\n      EventEmitter.emit('text-slot-updated', this);\n      return true;\n    }\n\n    return false;\n  }\n\n  restoreData(data) {\n    return this.loadData(data);\n  }\n\n  loadData(data) {\n    let changed = false;\n\n    this.properties.forEach(property => {\n      const value = data[property];\n      if (\n        value !== null &&\n        value !== undefined &&\n        !this.isClone() &&\n        this._set(property, value)\n      ) {\n        changed = true;\n      }\n    });\n\n    if (changed) {\n      EventEmitter.emit('text-slot-updated', this);\n      this._reload();\n      return true;\n    }\n\n    return false;\n  }\n\n  zoomBy(factor) {\n    this.fontSize += factor > 0 ? 2 : -2;\n    return this.reload();\n  }\n\n  createOffscreenCanvasAndContext(width, height) {\n    const canvas = new OffscreenCanvas(width, height);\n    const context = canvas.getContext('2d', {\n      willReadFrequently: true,\n    });\n    return [canvas, context];\n  }\n\n  validJSON(jsonString) {\n    try {\n      const parsedString = JSON.parse(jsonString);\n      if (parsedString && typeof parsedString === 'object') return true;\n    } catch (error) {\n      console.warn(\n        'String in MyLab for this product is not valid: ',\n        jsonString,\n        ' error message: ',\n        error,\n      );\n      return false;\n    }\n    return false;\n  }\n\n  prepareFoil() {\n    try {\n      // create OffscreenCanvas and Context for drawing on 2D view if slot does not already have one\n      if (!this.slotCanvas || !this.slotContext) {\n        [this.slotCanvas, this.slotContext] =\n          this.createOffscreenCanvasAndContext(this.img.width, this.img.height);\n      }\n\n      // create OffscreenCanvas and Context for drawing on 3D view if slot does not already have one\n      if (!this.slot3dCanvas || !this.slot3dContext) {\n        [this.slot3dCanvas, this.slot3dContext] =\n          this.createOffscreenCanvasAndContext(this.img.width, this.img.height);\n      }\n\n      if (\n        this.slotCanvas.width !== this.img.width ||\n        this.slotCanvas.height !== this.img.height\n      ) {\n        this.slotCanvas.width = this.img.width;\n        this.slotCanvas.height = this.img.height;\n      }\n\n      if (\n        this.slot3dCanvas.width !== this.img.width ||\n        this.slot3dCanvas.height !== this.img.height\n      ) {\n        this.slot3dCanvas.width = this.img.width;\n        this.slot3dCanvas.height = this.img.height;\n      }\n\n      // parse gradient value in MyLab\n      const baseHSL = JSON.parse(\n        wkData.prism_view_text_adjustments\n          .replacement_prism_view_text_fill_colour,\n      );\n\n      // create gradient fill image for drawing to 2D view\n      this.drawImage = replaceImageFillWithGradient(\n        this.img,\n        this.x,\n        this.y,\n        baseHSL,\n        this.slotCanvas,\n        this.slotContext,\n      );\n\n      // create white fill image for drawing to 3D view\n      this.drawWhite = replaceImageFillWithWhiteAndThresholdAlpha(\n        this.img,\n        this.slot3dCanvas,\n        this.slot3dContext,\n      );\n    } catch (error) {\n      console.warn(error);\n    }\n  }\n\n  draw(ctx) {\n    if (!imgComplete(this.img)) {\n      return;\n    }\n\n    if (!this.view || !this.view.editable) {\n      if (this.string == '') {\n        return;\n      }\n    }\n\n    const { x } = this;\n    const { y } = this;\n\n    if (this.meta) {\n      if (this.RealMatrix) {\n        ctxApplyMatrix(ctx, this.meta);\n      } else {\n        if (this.meta.shift) {\n          ctx.translate(this.meta.shift[0], this.meta.shift[1]);\n        }\n        if (this.meta.scale) {\n          ctx.scale(this.meta.scale[0], this.meta.scale[1]);\n        }\n        if (typeof this.meta.rotate === 'number' && this.meta.rotate !== 0) {\n          ctx.rotate(this.meta.rotate);\n        }\n      }\n    }\n\n    this.drawImage = this.img;\n\n    // check if product features foil text\n    if (wkData.prism_view_text_adjustments && !this.productHasFoilText)\n      this.productHasFoilText = hasFoilText(wkData.prism_view_text_adjustments);\n\n    // prepare canvases for creation of metallic text and white on black\n    if (this.productHasFoilText === true) this.prepareFoil();\n\n    if (this.meta && this.meta['real-coords']) {\n      const w = this.meta['real-coords'][2];\n      const h = this.meta['real-coords'][3];\n\n      ctx.translate(x + w / 2, y + h / 2);\n      ctx.rotate(this.getAngleRadian());\n\n      if (this.productHasFoilText === true && ctx.canvas.id === '3DFoil') {\n        ctx.drawImage(this.drawWhite, -w / 2, -h / 2, w, h);\n        ctx.restore();\n      } else {\n        ctx.drawImage(this.drawImage, -w / 2, -h / 2, w, h);\n        ctx.restore();\n      }\n    } else {\n      ctx.translate(x + this.w / 2, y + this.h / 2);\n      ctx.rotate(this.getAngleRadian());\n\n      if (this.productHasFoilText === true && ctx.canvas.id === '3DFoil') {\n        // if target canvas is intended for usage in the 3D view\n        ctx.drawImage(this.drawWhite, -this.w / 2, -this.h / 2, this.w, this.h);\n        ctx.restore();\n      } else {\n        // if target canvas is 2D view draw the image\n        ctx.drawImage(this.drawImage, -this.w / 2, -this.h / 2, this.w, this.h);\n        ctx.restore();\n      }\n    }\n  }\n\n  debug() {\n    let canvas;\n    let ctx;\n    canvas = document.createElement('CANVAS');\n    ctx = void 0;\n    canvas.setAttribute('width', this.w);\n    canvas.setAttribute('height', this.h);\n    ctx = canvas.getContext('2d');\n    ctx.drawImage(this.img, 0, 0, this.w, this.h, 0, 0, this.w, this.h);\n    canvas.style.zIndex = 5000;\n    canvas.style.position = 'absolute';\n    canvas.style.left = '10px';\n    canvas.style.top = '10px';\n    $(canvas).observe('click', e => document.body.removeChild(canvas));\n    return document.body.appendChild(canvas);\n  }\n\n  /**\n   * Copies the properties of the provided text slot\n   * @param {object} slot TextSlot to copy\n   */\n  copyOverrideFrom(slot) {\n    const scale = slot.matrix.a;\n\n    this.align = slot.align;\n    this.fontColour = slot.fontColour;\n    this.fontName = slot.fontName;\n    this.fontWeight = slot.fontWeight;\n    this.fontSize = Math.round(slot.fontSize * scale);\n    this.fontSlant = slot.fontSlant;\n    this.string = slot.string;\n    this.valign = slot.valign;\n    this.w = Math.round(slot.w * scale);\n    this.h = Math.round(slot.h * scale);\n\n    [this.x, this.y] = slot.matrix.transform_point(slot.x, slot.y);\n\n    if (slot.meta.rotate !== 0) {\n      this.angle = slot.meta.rotate;\n    }\n  }\n\n  /**\n   * Is this slot allowed to be overridden\n   */\n  canOverride() {\n    return (\n      !this.isOverride() &&\n      this.permittedToBeStacked() &&\n      !genericHelpers.disallowStackable()\n    );\n  }\n\n  permittedToBeStacked() {\n    return (\n      this.fromTemplate &&\n      this.inEditableArea &&\n      !this.locked &&\n      ![/spine-text/, /spineText/, /text-\\d{4}-\\d{2}-\\d{2}/].some(r =>\n        r.test(this.id)\n      )\n    );\n  }\n\n  moveable() {\n    return this.stackable() || this.permittedToBeStacked();\n  }\n\n  fixed() {\n    return [/spine-text/, /spineText/, /text-\\d{4}-\\d{2}-\\d{2}/].some(r =>\n      r.test(this.id)\n    );\n  }\n\n  /**\n   * Checks if this slot is overridden\n   */\n  isOverride() {\n    return /^override-text-/.test(this.id);\n  }\n\n  overriddenId() {\n    if (this.isOverride()) {\n      return this.id.replace(/^override-text-/, '');\n    }\n  }\n}\n\nexport default TextSlot;\n","var baseGetTag = require('./_baseGetTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar numberTag = '[object Number]';\n\n/**\n * Checks if `value` is classified as a `Number` primitive or object.\n *\n * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n * classified as numbers, use the `_.isFinite` method.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n * @example\n *\n * _.isNumber(3);\n * // => true\n *\n * _.isNumber(Number.MIN_VALUE);\n * // => true\n *\n * _.isNumber(Infinity);\n * // => true\n *\n * _.isNumber('3');\n * // => false\n */\nfunction isNumber(value) {\n  return typeof value == 'number' ||\n    (isObjectLike(value) && baseGetTag(value) == numberTag);\n}\n\nmodule.exports = isNumber;\n","import { create } from 'zustand';\n\n// This store would in the near future replace active clicked on slot for easy maintenance\n// Components should reference this rather than set local slot state with slot from FLUX\nexport const useSlotStore = create(set => ({\n  slot: null,\n  slotIndex: 0,\n  lastSaved: null,\n  updateSlot: slot => set({ slot }),\n  updateSlotIndex: slotIndex => set({ slotIndex }),\n  updateLastSaved: () => set({ lastSaved: new Date()})\n}));\n\nexport const useFocusedSlotStore = create(set => ({\n  focusedSlot: null,\n  updateFocusedSlot: slot => set({ focusedSlot: slot }),\n}));\n","// Import JS Modules\nimport { TextSlot } from '.';\nimport isNumber from 'lodash/isNumber';\nimport genericHelpers from '../../../_utils/generic-helpers';\nimport sendToGoogleAnalytics from '../../desktop/slot-tools/send-to-google-analytics';\nimport { getViewport } from '../../../_utils/hoc/with-viewport-size';\nimport { useSlotStore } from 'stores/useSlotStore';\nimport isCard from '../../../../customer_pages/_prism-builder/utils/is-card.js';\n\n\nconst customSlots = {\n  get canAdd() {\n    if (getViewport().isMobile) {\n      return false;\n    }\n\n    if (isCard() && genericHelpers.disallowStackable()) {\n      return prismViews.page.template.id.includes('front') ? false : true;\n    }\n\n    if (genericHelpers.disallowStackable() || !window.activeView) {\n        return false;\n    }\n\n    return activeView.acceptsUserContent;\n  },\n\n  get freshLayout() {\n    const [x, y, w, h] = window.activeView.editableArea;\n\n    return {\n      x: x + w / 2 - w / 4,\n      y: y + h / 2 - h / 4,\n      w: w / 2,\n      h: h / 2,\n    };\n  },\n  text: {\n    add(str = '') {\n      if (!customSlots.canAdd) return;\n      activeView.deselectAll();\n      const slot = new TextSlot(`text-${new Date().getTime()}`);\n      Object.entries(customSlots.freshLayout).forEach(\n        ([key, value]) => (slot[key] = value)\n      );\n\n      sendToGoogleAnalytics('stackable-text', 'add');\n\n      slot.isUnconfirmedTextSlot = true;\n      slot.slotState = 'editing';\n      slot.type = 'stackable';\n      slot.content_type = 'text';\n      slot.valign = 'middle';\n      slot.align = 'center';\n      slot.string = str;\n      slot.zindex = activeView.slots.length || 1;\n      slot.h = slot.fontSize;\n\n      activeView.addTextSlot(slot);\n      activeView.selectASlot(slot);\n\n      useSlotStore.getState().updateSlot(slot);\n    },\n\n    overrideSlot(sourceSlot) {\n      const id = `override-text-${sourceSlot.id}`;\n      sendToGoogleAnalytics('stackable-text', 'override');\n\n      const slot = new TextSlot(id);\n      slot.copyOverrideFrom(sourceSlot);\n      sourceSlot.string = '';\n\n      slot.type = 'stackable';\n      slot.content_type = 'text';\n      slot.zindex = activeView.slots.length || 1;\n\n      activeView.addTextSlot(slot);\n      activeView.selectASlot(slot);\n      activeView.do_save();\n    },\n  },\n\n  photos: {\n    slotData({ id, view, data }) {\n      if (!data) {\n        data = {};\n      }\n\n      if (data.hasOwnProperty('zindex')) {\n        data.zindex = view.slots.length || 1;\n      }\n      if (!data.hasOwnProperty('layout')) {\n        data.layout = customSlots.freshLayout;\n      }\n\n      return {\n        id,\n        type: 'stackable',\n        content_type: 'image',\n        data\n      };\n    },\n\n    add({ view }) {\n      if (!customSlots.canAdd) return;\n      const id = `photo-${new Date().getTime()}`;\n\n      const slotData = this.slotData({ id, view });\n\n      const slot = view.addPhotoSlot(slotData);\n      view.selectASlot(slot);\n      view.do_save();\n      return slot;\n    },\n\n    restore({ id, img, imgId, data, view }) {\n      const { x, y, w, h } = (data && data.layout) || {};\n      const slotData = this.slotData({ id, view, data });\n      const slot = view.addPhotoSlot(slotData);\n\n      slot.setImage(img, imgId, data);\n      // Not the neatest approach, but it should\n      // ensure that the slot ends up as close to its\n      // original size as possible.\n      slot.setAngle(data.angle);\n      slot.moveTo(0, 0);\n      slot.setClipSize(w, h);\n      slot.enforceBounds(view.editableArea);\n      slot.moveTo(x, y);\n      return slot;\n    },\n  },\n  embellishments: {\n    get freshLayoutSticker() {\n      const [x, y, w, h] = activeView.editableArea;\n      const size = Math.min(w / 4, h / 4);\n\n      return {\n        x: x + w / 2 - size / 2,\n        y: y + h / 2 - size / 2,\n        w: size,\n        h: size,\n      };\n    },\n\n    get freshLayout() {\n      const layout = customSlots.freshLayout;\n\n      // make the longest side as short as the shortest is\n      layout.w = layout.h = Math.min(layout.w, layout.h);\n\n      return layout;\n    },\n\n    freshLayoutFor(what) {\n      switch (what) {\n        case 'sticker':\n          return this.freshLayoutSticker;\n        default:\n          return this.freshLayout;\n      }\n    },\n\n    slotData(image, view, { id, data }) {\n      data = data || {};\n\n      return {\n        slotData: {\n          id,\n          type: 'stackable',\n          content_type: 'embellishment',\n          content_url: image.src,\n          data: {\n            layout:\n              data.layout ||\n              this.freshLayoutFor(data.embellishment_type || 'sticker'),\n            zindex: data.zindex || view.slots.length || 1,\n            ...data,\n          },\n        },\n        img: image,\n      };\n    },\n\n    buildSlotData(type, view, src) {\n      return new Promise(resolve => {\n        const image = new Image();\n        const data = {\n          id: `${type}-${new Date().getTime()}`,\n          data: { embellishment_type: type },\n        };\n\n        image.onload = function() {\n          resolve(customSlots.embellishments.slotData(this, view, data));\n        };\n        image.src = src;\n      });\n    },\n\n    async add({ src, type, view, x, y }) {\n      if (!customSlots.canAdd) return;\n      const { slotData, img } = await this.buildSlotData(type, view, src);\n\n      // COMMENTED OUT UNTIL WEBPRISM CAN HANDLE EMBELLISHMENTS IN CUSTOM BACKGROUND\n      // const slot = type === 'pattern' && activeView.selected && activeView.selected.isOptionalBackground()\n      //   ? activeView.selected\n      //   : activeView.addPhotoSlot(slotData);\n      const slot = view.addPhotoSlot(slotData);\n      // END OF COMMENTED OUT UNTIL WEBPRISM CAN HANDLE EMBELLISHMENTS IN CUSTOM BACKGROUND\n\n      view.setImageById(slot.id, img);\n\n      if (isNumber(x) && isNumber(y)) {\n        slot.moveTo(x - slot.w / 2, y - slot.h / 2);\n      }\n\n      view.do_save();\n\n      return slot;\n    },\n\n    restore({ id, img, data, view }) {\n      const { slotData } = this.slotData(img, view, { id, data });\n\n      const slot = view.addPhotoSlot(slotData);\n      view.setImageById(slot.id, img);\n\n      slot.setAngle(data.angle);\n      slot.moveTo(0, 0);\n      slot.setClipSize(data.layout.w, data.layout.h);\n      slot.enforceBounds(view.editableArea);\n      slot.moveTo(data.layout.x, data.layout.y);\n\n      return slot;\n    },\n  },\n};\n\nexport default customSlots;\n","import uniq from 'lodash/uniq';\n\n// --------------------------------------------------------------------\n\nclass CustomColourHistory {\n  constructor() {\n    this._values = [];\n  }\n\n  values(length = 99) {\n    return this._values.slice(0, length);\n  }\n\n  push(colour) {\n    // place new colour on the front of the customColourHistory array and limit to 99 items\n    this._values = uniq([].concat(colour, this._values));\n  }\n}\n\n// --------------------------------------------------------------------\n\nexport default new CustomColourHistory();\n","import { WebUI, builderDispatch } from '../../_utils/ui';\nimport { usePrismItemStore } from 'stores/usePrismItemStore';\n\nexport default async function filledImageSlotConfirmation(confirmCallback) {\n  const { filledImageSlot } = await usePrismItemStore.getState().checkSlots();\n\n  if (filledImageSlot) {\n    builderDispatch.dispatch({\n      type: WebUI.SHOW_CONFIRMATION_DIALOG,\n      message: 'By proceeding, you may need to re-add photos. Do you wish to continue?',\n      onConfirm: confirmCallback\n    });\n  } else {\n    confirmCallback();\n  }\n};\n","const PrismBuilderHistory = {\n  activeView() {\n    return window.activeView;\n  },\n\n  clear() {\n    this.activeView().historyStack.clear();\n  },\n};\n\nexport default PrismBuilderHistory;\n","import { builderDispatch, PrismUI, WebUI } from '../../_utils/ui';\nimport PrismBuilderHistory from '../../_utils/tools/prism_builder_history';\nimport TemplateCache from '../templates/template-cache';\nimport { loadPrismItem } from '../utils/stores';\nimport { themeStore } from 'stores/themes';\nimport { usePrismItemStore } from 'stores/usePrismItemStore';\n\nconst PrismBuilderReloader = {\n  start(data, clearBuilderHistory = true) {\n    return new Promise((resolve, reject) => {\n      this.goToFirstSection();\n      this.clearCache();\n      this.reloadWK(data);\n      if (clearBuilderHistory) this.clearBuilderHistory();\n      loadPrismItem(data.wk_data)\n        .then(async () => {\n          this.reloadBrowserUrl(data);\n\n          themeStore.fetch();\n\n          this.notifyPrismItemHasBeenLoaded();\n\n          resolve();\n        })\n        .catch(() => {\n          reject();\n        });\n    });\n  },\n\n  startReloadingNotification() {\n    builderDispatch.delayedDispatch({\n      type: WebUI.PAGES_TRAY_START_RELOAD,\n    });\n  },\n\n  goToFirstSection() {\n    const prismItem = usePrismItemStore.getState().prismItem;\n    \n    if (prismItem.currentPage >= prismItem.pageCount) {\n      prismItem.currentPage = prismItem.pageCount - 1;\n      builderDispatch.delayedDispatch({\n        type: WebUI.HIDE_CUSTOM_PAGE,\n      });\n    }\n  },\n\n  clearCache() {\n    TemplateCache.reset();\n    builderDispatch.dispatch({ type: PrismUI.THEME_CHANGED });\n  },\n\n  reloadWK(data) {\n    window.wkData = { ...data.wk_data, copies: wkData.copies };\n\n    wkData.product.bleedWarning = {\n      showForAlbum() {\n        return ['album'].indexOf(wkData.product.type) > -1;\n      },\n\n      show() {\n        return this.showForAlbum()\n          || wkData.missing_attributes\n          || wkData.disabled_options_chosen;\n      },\n    };\n  },\n\n  clearBuilderHistory() {\n    PrismBuilderHistory.clear();\n  },\n\n  reloadBrowserUrl(data) {\n    const editUrl = window.location.pathname.split(/\\//);\n\n    // This should be able to be removed once https://livelinktech.atlassian.net/browse/TECH-7478\n    // has gone to all web prism production environments, as the id will no longer change\n    editUrl.pop();\n    editUrl.push(data.wk_data.id);\n\n    const title = data.title || data.wk_data.product_title;\n    window.history.replaceState({}, title, this.buildReloadedUrl(editUrl));\n    document.title = title;\n  },\n\n  notifyPrismItemHasBeenLoaded() {\n    builderDispatch.dispatch({ type: PrismUI.ITEM_LOADED });\n  },\n\n  buildReloadedUrl(editUrl) {\n    // Base URL\n    let url = `${editUrl.join('/')}${window.location.search}`;\n    // When transforming you can optionally pass in hash to\n    // allow you to return to a specific spread. This should\n    // be carried over between transforms\n    if (window.location.hash) url += `#${window.location.hash.replace(/#/g, '')}`;\n\n    return url;\n  },\n};\n\nexport default PrismBuilderReloader;\n","import PrismJSON from './prism-json-encoder';\nimport { PrismUI, builderDispatch } from '../../_utils/ui';\nimport { loadPrismItem } from '../utils/stores';\nimport TemplateCache from '../templates/template-cache';\nimport PrismBuilderReloader from '../trays/prism-builder-reloader';\nimport { usePrismItemStore } from 'stores/usePrismItemStore';\n\n\nconst MAX_RETRY_SNAPSHOT = 3;\nclass PrismBuilderHistory {\n  constructor(view) {\n    this.view = view;\n    this.stack = [];\n    this.pointer = 1;\n    this.disabled = false;\n    this.urlTakeSnapshot = (wkData && wkData.remember_url) ? wkData.remember_url.replace(/remember/, 'snapshot') : '';\n    this.urlRestoreFromSnapshot = (wkData && wkData.remember_url) ? wkData.remember_url.replace(/remember/, 'restore-from-snapshot') : '';\n    this.fetchConfig = {\n      headers: {\n        'content-type': 'application/json',\n      },\n      method: 'POST',\n      credentials: 'same-origin'\n    };\n    this.skipsSave = [];\n    this.retrySnapshotCount = MAX_RETRY_SNAPSHOT;\n    this.pushCallback = [];\n    this.saving = false;\n  }\n\n  clear = (dispatchUndoAction = false) => {\n    this.stack = [];\n    this.pointer = 1;\n    this.clearAfterPush();\n    if (dispatchUndoAction) builderDispatch.dispatch({ type: PrismUI.UNDO_CHANGED });\n  }\n\n  clearAfterPush = () => {\n    this.saving = false;\n    this.pushCallback = [];\n  }\n\n  movePointer = (pointer) => {\n    this.pointer = pointer;\n  }\n\n  movePointerForward = () => {\n    this.pointer = this.pointer + 1;\n  }\n\n  movePointerBackward = () => {\n    if (this.pointer > 1) this.pointer = this.pointer - 1;\n  } \n\n  getOtherView = () => {\n\n    if (this.view === prismViews.page) {\n      return prismViews.pageRight;\n    } else {\n      return prismViews.page;\n    }\n  }\n\n  addToPushCallback = (method, params) => {\n    if (this.saving) this.pushCallback.push({ method, params });\n    else {\n      method(...params);\n      this.clearAfterPush();\n    }\n  }\n\n  callPushCallback = () => {\n    this.pushCallback.forEach(callback => {\n      callback.method(...callback.params);\n    });\n    this.clearAfterPush();\n  }\n\n  movePointerOtherViewToSnapshot = (direction = null) => {\n    const possibleDirections = ['forward', 'backward'];\n    const otherView = this.getOtherView();\n\n    if (!possibleDirections.includes(direction) || !otherView) return;\n    const { historyStack } = otherView;\n    let stack;\n\n    if (direction === 'forward') stack = historyStack.stack.slice(historyStack.pointer, historyStack.stack.length);\n    if (direction === 'backward') stack = historyStack.stack.slice(0, historyStack.pointer - 1).reverse();\n\n\n    let steps = stack.findIndex((stackStep) => {\n      const decodedStackStep = PrismJSON.decode(stackStep);\n      return !!decodedStackStep.snapshot && this.hasDifferentDesign(decodedStackStep);\n    })\n\n    if (direction === 'backward') historyStack.pointer -= steps + 1;\n    if (direction === 'forward') {\n      if (steps !== -1) historyStack.pointer += steps + 1;\n      else {\n        // If there in not a snapshot, things get complicated.\n        // we get rid of lost history (everything beyond the current pointer)\n        historyStack.stack.splice(historyStack.pointer, historyStack.stack.length);\n        // and then we add a step to the stack with the snapshot of the other view\n        historyStack.stack.push(this.currentEncodedState());\n        // finally we point to the added step (should be the last one)\n        historyStack.setPointerToLastState();\n      }\n    }     \n  }\n\n  push = (state) => {\n    this.sliceStack();\n    const json = PrismJSON.encode(state);\n    this.stack.push(json);\n    this.setPointerToLastState();\n\n    if (this.saving) this.callPushCallback();\n  }\n\n  preventSave = (data) => {\n    const { dateIdentifier } = data;\n\n    if (!dateIdentifier) return false;\n    const prevent = dateIdentifier && this.skipsSave.includes(dateIdentifier);\n    \n    if (prevent) {\n      this.deleteIdentifier(dateIdentifier);\n    }\n    return prevent;\n  }\n\n  deleteIdentifier = (dateIdentifier) => {\n    const index = this.skipsSave.findIndex(identifier => identifier === dateIdentifier);\n    this.skipsSave.splice(index, 1);\n  }\n\n  sliceStack = () => {\n    this.stack = this.stack.slice(0, this.pointer || 9e9);\n  }\n\n  retryTakeSnapshot = (withPush) => {\n    this.retrySnapshotCount--\n    return  this.takeSnapshot(withPush);\n  }\n\n  takeSnapshot = async (withPush = false) => {\n    if (withPush) this.saving = true;\n    \n    return fetch(this.urlTakeSnapshot, { ...this.fetchConfig })\n      .then(response => {\n        if (response.ok) {\n          return response.json();\n        }\n        throw Error (\"Unable to take snapshot\")\n      })\n      .then(dataResponse => {\n        const snapshot = dataResponse.snapshot;\n        const uniqueId = Date.now();\n        const productId = wkData.product_id;\n        this.addSnapshotToStep(prismViews.page, snapshot, uniqueId, productId);\n        this.addSnapshotToStep(prismViews.pageRight, snapshot, uniqueId, productId);\n        this.resetRetrySnapshotCount();\n      })\n      .catch(e => {\n        if (this.retrySnapshotCount > 0) {\n          return this.retryTakeSnapshot(withPush);\n        } else {\n          this.clear(true);\n          this.resetRetrySnapshotCount();\n          return null;\n        }\n      })\n  }\n\n  resetRetrySnapshotCount = () => {\n    this.retrySnapshotCount = MAX_RETRY_SNAPSHOT;\n  }\n\n  addSnapshotToStep = (view, snapshot, uniqueId, productId) => {\n    const { historyStack } = view;\n\n    if (!historyStack) return;\n    if (!historyStack.currentEncodedState()) return;\n    \n    const currentStep = PrismJSON.decode(historyStack.currentEncodedState());\n    currentStep.snapshot = snapshot;\n    currentStep.id = uniqueId;\n    currentStep.productId = productId;\n    const json = PrismJSON.encode(currentStep);\n    historyStack.stack.splice(historyStack.pointer - 1, 1, json);\n  }\n\n  hasSameLayout = () => {\n    const data = PrismJSON.decode(this.currentEncodedState());\n    return data.templateID === this.view.template.id;\n  }\n\n  restoreFromSnapshot = async (snapshotCode, productId) => {\n    return fetch(this.urlRestoreFromSnapshot, {\n      body: JSON.stringify({\n        snapshot_code: snapshotCode,\n        product_id: productId,\n        prism_product_theme: usePrismItemStore.getState().prismItem.design_code\n      }),\n      ...this.fetchConfig\n    }).then(response => {\n      if (response.ok) {\n        return response.json();\n      }\n      throw Error (\"Unable to perform undo action\")\n    }).then(data => {\n      return data.wk_data;\n    }).catch(e => {\n      builderDispatch.dispatch({ type: PrismUI.ITEM_COPYING_FINISHED });\n      this.clear(true);\n      builderDispatch.delayedDispatch({ type: PrismUI.UNDO_CHANGED });\n      return null;\n    })\n  }\n\n  setStepTheme = (theme) => {\n    const view = this.view;\n    const otherView = this.getOtherView();\n    this.modifyCurrentStep(view, 'theme', theme);\n    this.modifyCurrentStep(otherView, 'theme', theme);\n  }\n\n  modifyCurrentStep = (view, field, value) => {\n    if (!view.historyStack.pointedStateExists()) return;\n\n    let data = PrismJSON.decode(view.historyStack.currentEncodedState());\n    data[field] = value;\n    const json = PrismJSON.encode(data);\n    view.historyStack.stack.splice(view.historyStack.pointer - 1, 1, json);\n  }\n\n  setOtherViewJumpToNextSnapshot = () => {\n    const otherView = this.getOtherView();\n    const { historyStack } = otherView;\n    const id = PrismJSON.decode(this.currentEncodedState()).id;\n    const index = historyStack.stack.findIndex(step => {\n      const stepData = PrismJSON.decode(step);\n\n      if (!stepData.snapshot || !stepData.id) return false;\n      return stepData.id === id;\n    });\n\n    if (index >= 0) {\n      let nextStepData = PrismJSON.decode(historyStack.stack[index + 1]);\n\n      if (!nextStepData.snapshot) {\n        nextStepData.jumpToNextSnapshot = true;\n        const json = PrismJSON.encode(nextStepData);\n        historyStack.stack.splice(index + 1, 1, json);\n      }\n    }\n  }\n                  \n  undo = async () => {\n    if(!this.canUndo()) return; \n\n    this.movePointerBackward();\n\n    if (this.pointedStateExists()) {\n      builderDispatch.dispatch({ type: PrismUI.ITEM_COPYING });\n      const data = PrismJSON.decode(this.currentEncodedState());\n\n      if (this.shouldRestore(data)) { \n        TemplateCache.reset();\n        this.setOtherViewJumpToNextSnapshot();\n        this.movePointerForward();\n        await this.takeSnapshot(); \n        this.movePointerOtherViewToSnapshot('backward');\n        this.movePointerBackward();\n        const prismData = await this.restore(data);\n        builderDispatch.dispatch({ type: PrismUI.UNDO_CHANGED });\n\n        if (prismData) {\n          this.reloadPrismItem(prismData);\n        } \n      } else {\n        this.saveData(data);\n      }\n    } else {\n      this.clear(true);\n    }\n    builderDispatch.dispatch({ type: PrismUI.UNDO_CHANGED });\n  }\n\n  redo = async () => {\n\n    if(!this.canRedo()) return;\n\n    this.movePointerForward();\n\n    if (this.pointedStateExists()) {\n      builderDispatch.dispatch({ type: PrismUI.ITEM_COPYING });\n      const data = PrismJSON.decode(this.currentEncodedState());\n\n      if (this.shouldRestore(data, 'forward')) { \n        TemplateCache.reset();\n        const { dataRestore, pointer } = this.getRedoDataToRestore(data);\n        this.movePointerBackward();\n        await this.takeSnapshot(); \n        this.movePointer(pointer);\n        this.movePointerOtherViewToSnapshot('forward');\n        const prismData = await this.restore(dataRestore);\n        builderDispatch.dispatch({ type: PrismUI.UNDO_CHANGED });\n\n        if (prismData) {\n          this.reloadPrismItem(prismData);\n        } \n      } else {\n        this.saveData(data);\n      }\n      builderDispatch.dispatch({ type: PrismUI.UNDO_CHANGED });\n    } else {\n      this.clear(true);\n    }\n  }\n\n  saveData = (data) => {\n    this.view.setData(data, undefined, this.hasSameLayout());\n    builderDispatch.dispatch({ type: PrismUI.ITEM_COPYING_FINISHED });\n  }\n\n  shouldRestore = (followingData, direction = false) => {\n    const followingDataHasSnapshot = !!followingData.snapshot;\n    const shouldJumpToNextSnapshot = !!followingData.jumpToNextSnapshot;\n\n    if (followingDataHasSnapshot) {\n      return this.hasDifferentDesign(followingData) || this.hasDifferentProduct(followingData);\n    } else if (shouldJumpToNextSnapshot && direction === 'forward') {\n      return true;\n    }\n    return false;\n  }\n\n  hasDifferentDesign = (data) => {\n    return data.theme !== this.view.album_manager.prismItem.theme;\n  }\n\n  hasDifferentProduct = (data) => {\n    return data.productId !== wkData.product_id;\n  }\n\n  getRedoDataToRestore = (data) => {\n    if (data.snapshot) {\n      return {\n        dataRestore: data,\n        pointer: this.pointer\n      };\n    }\n\n    if (data.jumpToNextSnapshot) {\n      const index = this.stack.findIndex((stackStep, index) => {\n        if (index <= this.pointer - 1) return false;\n        const decodedStackStep = PrismJSON.decode(stackStep);\n        return !!decodedStackStep.snapshot;\n      });\n      return {\n        dataRestore: PrismJSON.decode(this.stack[index]),\n        pointer: index + 1\n      };\n    }\n  }\n\n  reloadPrismItem = (prismData) => {\n    setTimeout(() => {\n      loadPrismItem(prismData, { initialPage: usePrismItemStore.getState().prismItem.currentPage }, true).\n        then(() => {\n          PrismBuilderReloader.reloadWK({ wk_data: prismData.data });\n        })\n    }, 500);\n  }\n\n  restore = async (data) => {\n    const snapshotCode = data.snapshot.undo_snapshot;\n    const productId = data.productId;\n    return this.restoreFromSnapshot(snapshotCode, productId); \n  }\n\n  skipStep = (dateIdentifier) => {\n    const otherView = this.getOtherView();\n    this.skipsSave.push(dateIdentifier);\n    otherView.historyStack.skipsSave.push(dateIdentifier);\n  }\n\n  pointedStateExists = () => {\n    return !!this.currentEncodedState();\n  }\n\n  canUndo = () => {\n    return this.pointer > 1;\n  }\n\n  canRedo = () => {\n    return this.pointer < this.stack.length;\n  }\n\n  stepsAreDifferent = (state) => {\n    const json = PrismJSON.encode(state);\n    return this.currentEncodedState() !== json;\n  }\n\n  currentEncodedState = (position = null) => {\n    const pointer = position == null ? this.pointer : position;\n    return this.stack[pointer - 1];\n  }\n\n  setPointerToLastState = () => {\n    const lastStatePosition = this.stack.length;\n    this.movePointer(lastStatePosition);\n  }\n}\n\nexport default PrismBuilderHistory;","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Parchment\"] = factory();\n\telse\n\t\troot[\"Parchment\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn /******/ (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 = 9);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar ParchmentError = /** @class */ (function (_super) {\n    __extends(ParchmentError, _super);\n    function ParchmentError(message) {\n        var _this = this;\n        message = '[Parchment] ' + message;\n        _this = _super.call(this, message) || this;\n        _this.message = message;\n        _this.name = _this.constructor.name;\n        return _this;\n    }\n    return ParchmentError;\n}(Error));\nexports.ParchmentError = ParchmentError;\nvar attributes = {};\nvar classes = {};\nvar tags = {};\nvar types = {};\nexports.DATA_KEY = '__blot';\nvar Scope;\n(function (Scope) {\n    Scope[Scope[\"TYPE\"] = 3] = \"TYPE\";\n    Scope[Scope[\"LEVEL\"] = 12] = \"LEVEL\";\n    Scope[Scope[\"ATTRIBUTE\"] = 13] = \"ATTRIBUTE\";\n    Scope[Scope[\"BLOT\"] = 14] = \"BLOT\";\n    Scope[Scope[\"INLINE\"] = 7] = \"INLINE\";\n    Scope[Scope[\"BLOCK\"] = 11] = \"BLOCK\";\n    Scope[Scope[\"BLOCK_BLOT\"] = 10] = \"BLOCK_BLOT\";\n    Scope[Scope[\"INLINE_BLOT\"] = 6] = \"INLINE_BLOT\";\n    Scope[Scope[\"BLOCK_ATTRIBUTE\"] = 9] = \"BLOCK_ATTRIBUTE\";\n    Scope[Scope[\"INLINE_ATTRIBUTE\"] = 5] = \"INLINE_ATTRIBUTE\";\n    Scope[Scope[\"ANY\"] = 15] = \"ANY\";\n})(Scope = exports.Scope || (exports.Scope = {}));\nfunction create(input, value) {\n    var match = query(input);\n    if (match == null) {\n        throw new ParchmentError(\"Unable to create \" + input + \" blot\");\n    }\n    var BlotClass = match;\n    var node = \n    // @ts-ignore\n    input instanceof Node || input['nodeType'] === Node.TEXT_NODE ? input : BlotClass.create(value);\n    return new BlotClass(node, value);\n}\nexports.create = create;\nfunction find(node, bubble) {\n    if (bubble === void 0) { bubble = false; }\n    if (node == null)\n        return null;\n    // @ts-ignore\n    if (node[exports.DATA_KEY] != null)\n        return node[exports.DATA_KEY].blot;\n    if (bubble)\n        return find(node.parentNode, bubble);\n    return null;\n}\nexports.find = find;\nfunction query(query, scope) {\n    if (scope === void 0) { scope = Scope.ANY; }\n    var match;\n    if (typeof query === 'string') {\n        match = types[query] || attributes[query];\n        // @ts-ignore\n    }\n    else if (query instanceof Text || query['nodeType'] === Node.TEXT_NODE) {\n        match = types['text'];\n    }\n    else if (typeof query === 'number') {\n        if (query & Scope.LEVEL & Scope.BLOCK) {\n            match = types['block'];\n        }\n        else if (query & Scope.LEVEL & Scope.INLINE) {\n            match = types['inline'];\n        }\n    }\n    else if (query instanceof HTMLElement) {\n        var names = (query.getAttribute('class') || '').split(/\\s+/);\n        for (var i in names) {\n            match = classes[names[i]];\n            if (match)\n                break;\n        }\n        match = match || tags[query.tagName];\n    }\n    if (match == null)\n        return null;\n    // @ts-ignore\n    if (scope & Scope.LEVEL & match.scope && scope & Scope.TYPE & match.scope)\n        return match;\n    return null;\n}\nexports.query = query;\nfunction register() {\n    var Definitions = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        Definitions[_i] = arguments[_i];\n    }\n    if (Definitions.length > 1) {\n        return Definitions.map(function (d) {\n            return register(d);\n        });\n    }\n    var Definition = Definitions[0];\n    if (typeof Definition.blotName !== 'string' && typeof Definition.attrName !== 'string') {\n        throw new ParchmentError('Invalid definition');\n    }\n    else if (Definition.blotName === 'abstract') {\n        throw new ParchmentError('Cannot register abstract class');\n    }\n    types[Definition.blotName || Definition.attrName] = Definition;\n    if (typeof Definition.keyName === 'string') {\n        attributes[Definition.keyName] = Definition;\n    }\n    else {\n        if (Definition.className != null) {\n            classes[Definition.className] = Definition;\n        }\n        if (Definition.tagName != null) {\n            if (Array.isArray(Definition.tagName)) {\n                Definition.tagName = Definition.tagName.map(function (tagName) {\n                    return tagName.toUpperCase();\n                });\n            }\n            else {\n                Definition.tagName = Definition.tagName.toUpperCase();\n            }\n            var tagNames = Array.isArray(Definition.tagName) ? Definition.tagName : [Definition.tagName];\n            tagNames.forEach(function (tag) {\n                if (tags[tag] == null || Definition.className == null) {\n                    tags[tag] = Definition;\n                }\n            });\n        }\n    }\n    return Definition;\n}\nexports.register = register;\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Registry = __webpack_require__(0);\nvar Attributor = /** @class */ (function () {\n    function Attributor(attrName, keyName, options) {\n        if (options === void 0) { options = {}; }\n        this.attrName = attrName;\n        this.keyName = keyName;\n        var attributeBit = Registry.Scope.TYPE & Registry.Scope.ATTRIBUTE;\n        if (options.scope != null) {\n            // Ignore type bits, force attribute bit\n            this.scope = (options.scope & Registry.Scope.LEVEL) | attributeBit;\n        }\n        else {\n            this.scope = Registry.Scope.ATTRIBUTE;\n        }\n        if (options.whitelist != null)\n            this.whitelist = options.whitelist;\n    }\n    Attributor.keys = function (node) {\n        return [].map.call(node.attributes, function (item) {\n            return item.name;\n        });\n    };\n    Attributor.prototype.add = function (node, value) {\n        if (!this.canAdd(node, value))\n            return false;\n        node.setAttribute(this.keyName, value);\n        return true;\n    };\n    Attributor.prototype.canAdd = function (node, value) {\n        var match = Registry.query(node, Registry.Scope.BLOT & (this.scope | Registry.Scope.TYPE));\n        if (match == null)\n            return false;\n        if (this.whitelist == null)\n            return true;\n        if (typeof value === 'string') {\n            return this.whitelist.indexOf(value.replace(/[\"']/g, '')) > -1;\n        }\n        else {\n            return this.whitelist.indexOf(value) > -1;\n        }\n    };\n    Attributor.prototype.remove = function (node) {\n        node.removeAttribute(this.keyName);\n    };\n    Attributor.prototype.value = function (node) {\n        var value = node.getAttribute(this.keyName);\n        if (this.canAdd(node, value) && value) {\n            return value;\n        }\n        return '';\n    };\n    return Attributor;\n}());\nexports.default = Attributor;\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar linked_list_1 = __webpack_require__(11);\nvar shadow_1 = __webpack_require__(5);\nvar Registry = __webpack_require__(0);\nvar ContainerBlot = /** @class */ (function (_super) {\n    __extends(ContainerBlot, _super);\n    function ContainerBlot(domNode) {\n        var _this = _super.call(this, domNode) || this;\n        _this.build();\n        return _this;\n    }\n    ContainerBlot.prototype.appendChild = function (other) {\n        this.insertBefore(other);\n    };\n    ContainerBlot.prototype.attach = function () {\n        _super.prototype.attach.call(this);\n        this.children.forEach(function (child) {\n            child.attach();\n        });\n    };\n    ContainerBlot.prototype.build = function () {\n        var _this = this;\n        this.children = new linked_list_1.default();\n        // Need to be reversed for if DOM nodes already in order\n        [].slice\n            .call(this.domNode.childNodes)\n            .reverse()\n            .forEach(function (node) {\n            try {\n                var child = makeBlot(node);\n                _this.insertBefore(child, _this.children.head || undefined);\n            }\n            catch (err) {\n                if (err instanceof Registry.ParchmentError)\n                    return;\n                else\n                    throw err;\n            }\n        });\n    };\n    ContainerBlot.prototype.deleteAt = function (index, length) {\n        if (index === 0 && length === this.length()) {\n            return this.remove();\n        }\n        this.children.forEachAt(index, length, function (child, offset, length) {\n            child.deleteAt(offset, length);\n        });\n    };\n    ContainerBlot.prototype.descendant = function (criteria, index) {\n        var _a = this.children.find(index), child = _a[0], offset = _a[1];\n        if ((criteria.blotName == null && criteria(child)) ||\n            (criteria.blotName != null && child instanceof criteria)) {\n            return [child, offset];\n        }\n        else if (child instanceof ContainerBlot) {\n            return child.descendant(criteria, offset);\n        }\n        else {\n            return [null, -1];\n        }\n    };\n    ContainerBlot.prototype.descendants = function (criteria, index, length) {\n        if (index === void 0) { index = 0; }\n        if (length === void 0) { length = Number.MAX_VALUE; }\n        var descendants = [];\n        var lengthLeft = length;\n        this.children.forEachAt(index, length, function (child, index, length) {\n            if ((criteria.blotName == null && criteria(child)) ||\n                (criteria.blotName != null && child instanceof criteria)) {\n                descendants.push(child);\n            }\n            if (child instanceof ContainerBlot) {\n                descendants = descendants.concat(child.descendants(criteria, index, lengthLeft));\n            }\n            lengthLeft -= length;\n        });\n        return descendants;\n    };\n    ContainerBlot.prototype.detach = function () {\n        this.children.forEach(function (child) {\n            child.detach();\n        });\n        _super.prototype.detach.call(this);\n    };\n    ContainerBlot.prototype.formatAt = function (index, length, name, value) {\n        this.children.forEachAt(index, length, function (child, offset, length) {\n            child.formatAt(offset, length, name, value);\n        });\n    };\n    ContainerBlot.prototype.insertAt = function (index, value, def) {\n        var _a = this.children.find(index), child = _a[0], offset = _a[1];\n        if (child) {\n            child.insertAt(offset, value, def);\n        }\n        else {\n            var blot = def == null ? Registry.create('text', value) : Registry.create(value, def);\n            this.appendChild(blot);\n        }\n    };\n    ContainerBlot.prototype.insertBefore = function (childBlot, refBlot) {\n        if (this.statics.allowedChildren != null &&\n            !this.statics.allowedChildren.some(function (child) {\n                return childBlot instanceof child;\n            })) {\n            throw new Registry.ParchmentError(\"Cannot insert \" + childBlot.statics.blotName + \" into \" + this.statics.blotName);\n        }\n        childBlot.insertInto(this, refBlot);\n    };\n    ContainerBlot.prototype.length = function () {\n        return this.children.reduce(function (memo, child) {\n            return memo + child.length();\n        }, 0);\n    };\n    ContainerBlot.prototype.moveChildren = function (targetParent, refNode) {\n        this.children.forEach(function (child) {\n            targetParent.insertBefore(child, refNode);\n        });\n    };\n    ContainerBlot.prototype.optimize = function (context) {\n        _super.prototype.optimize.call(this, context);\n        if (this.children.length === 0) {\n            if (this.statics.defaultChild != null) {\n                var child = Registry.create(this.statics.defaultChild);\n                this.appendChild(child);\n                child.optimize(context);\n            }\n            else {\n                this.remove();\n            }\n        }\n    };\n    ContainerBlot.prototype.path = function (index, inclusive) {\n        if (inclusive === void 0) { inclusive = false; }\n        var _a = this.children.find(index, inclusive), child = _a[0], offset = _a[1];\n        var position = [[this, index]];\n        if (child instanceof ContainerBlot) {\n            return position.concat(child.path(offset, inclusive));\n        }\n        else if (child != null) {\n            position.push([child, offset]);\n        }\n        return position;\n    };\n    ContainerBlot.prototype.removeChild = function (child) {\n        this.children.remove(child);\n    };\n    ContainerBlot.prototype.replace = function (target) {\n        if (target instanceof ContainerBlot) {\n            target.moveChildren(this);\n        }\n        _super.prototype.replace.call(this, target);\n    };\n    ContainerBlot.prototype.split = function (index, force) {\n        if (force === void 0) { force = false; }\n        if (!force) {\n            if (index === 0)\n                return this;\n            if (index === this.length())\n                return this.next;\n        }\n        var after = this.clone();\n        this.parent.insertBefore(after, this.next);\n        this.children.forEachAt(index, this.length(), function (child, offset, length) {\n            child = child.split(offset, force);\n            after.appendChild(child);\n        });\n        return after;\n    };\n    ContainerBlot.prototype.unwrap = function () {\n        this.moveChildren(this.parent, this.next);\n        this.remove();\n    };\n    ContainerBlot.prototype.update = function (mutations, context) {\n        var _this = this;\n        var addedNodes = [];\n        var removedNodes = [];\n        mutations.forEach(function (mutation) {\n            if (mutation.target === _this.domNode && mutation.type === 'childList') {\n                addedNodes.push.apply(addedNodes, mutation.addedNodes);\n                removedNodes.push.apply(removedNodes, mutation.removedNodes);\n            }\n        });\n        removedNodes.forEach(function (node) {\n            // Check node has actually been removed\n            // One exception is Chrome does not immediately remove IFRAMEs\n            // from DOM but MutationRecord is correct in its reported removal\n            if (node.parentNode != null &&\n                // @ts-ignore\n                node.tagName !== 'IFRAME' &&\n                document.body.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_CONTAINED_BY) {\n                return;\n            }\n            var blot = Registry.find(node);\n            if (blot == null)\n                return;\n            if (blot.domNode.parentNode == null || blot.domNode.parentNode === _this.domNode) {\n                blot.detach();\n            }\n        });\n        addedNodes\n            .filter(function (node) {\n            return node.parentNode == _this.domNode;\n        })\n            .sort(function (a, b) {\n            if (a === b)\n                return 0;\n            if (a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING) {\n                return 1;\n            }\n            return -1;\n        })\n            .forEach(function (node) {\n            var refBlot = null;\n            if (node.nextSibling != null) {\n                refBlot = Registry.find(node.nextSibling);\n            }\n            var blot = makeBlot(node);\n            if (blot.next != refBlot || blot.next == null) {\n                if (blot.parent != null) {\n                    blot.parent.removeChild(_this);\n                }\n                _this.insertBefore(blot, refBlot || undefined);\n            }\n        });\n    };\n    return ContainerBlot;\n}(shadow_1.default));\nfunction makeBlot(node) {\n    var blot = Registry.find(node);\n    if (blot == null) {\n        try {\n            blot = Registry.create(node);\n        }\n        catch (e) {\n            blot = Registry.create(Registry.Scope.INLINE);\n            [].slice.call(node.childNodes).forEach(function (child) {\n                // @ts-ignore\n                blot.domNode.appendChild(child);\n            });\n            if (node.parentNode) {\n                node.parentNode.replaceChild(blot.domNode, node);\n            }\n            blot.attach();\n        }\n    }\n    return blot;\n}\nexports.default = ContainerBlot;\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar attributor_1 = __webpack_require__(1);\nvar store_1 = __webpack_require__(6);\nvar container_1 = __webpack_require__(2);\nvar Registry = __webpack_require__(0);\nvar FormatBlot = /** @class */ (function (_super) {\n    __extends(FormatBlot, _super);\n    function FormatBlot(domNode) {\n        var _this = _super.call(this, domNode) || this;\n        _this.attributes = new store_1.default(_this.domNode);\n        return _this;\n    }\n    FormatBlot.formats = function (domNode) {\n        if (typeof this.tagName === 'string') {\n            return true;\n        }\n        else if (Array.isArray(this.tagName)) {\n            return domNode.tagName.toLowerCase();\n        }\n        return undefined;\n    };\n    FormatBlot.prototype.format = function (name, value) {\n        var format = Registry.query(name);\n        if (format instanceof attributor_1.default) {\n            this.attributes.attribute(format, value);\n        }\n        else if (value) {\n            if (format != null && (name !== this.statics.blotName || this.formats()[name] !== value)) {\n                this.replaceWith(name, value);\n            }\n        }\n    };\n    FormatBlot.prototype.formats = function () {\n        var formats = this.attributes.values();\n        var format = this.statics.formats(this.domNode);\n        if (format != null) {\n            formats[this.statics.blotName] = format;\n        }\n        return formats;\n    };\n    FormatBlot.prototype.replaceWith = function (name, value) {\n        var replacement = _super.prototype.replaceWith.call(this, name, value);\n        this.attributes.copy(replacement);\n        return replacement;\n    };\n    FormatBlot.prototype.update = function (mutations, context) {\n        var _this = this;\n        _super.prototype.update.call(this, mutations, context);\n        if (mutations.some(function (mutation) {\n            return mutation.target === _this.domNode && mutation.type === 'attributes';\n        })) {\n            this.attributes.build();\n        }\n    };\n    FormatBlot.prototype.wrap = function (name, value) {\n        var wrapper = _super.prototype.wrap.call(this, name, value);\n        if (wrapper instanceof FormatBlot && wrapper.statics.scope === this.statics.scope) {\n            this.attributes.move(wrapper);\n        }\n        return wrapper;\n    };\n    return FormatBlot;\n}(container_1.default));\nexports.default = FormatBlot;\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar shadow_1 = __webpack_require__(5);\nvar Registry = __webpack_require__(0);\nvar LeafBlot = /** @class */ (function (_super) {\n    __extends(LeafBlot, _super);\n    function LeafBlot() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    LeafBlot.value = function (domNode) {\n        return true;\n    };\n    LeafBlot.prototype.index = function (node, offset) {\n        if (this.domNode === node ||\n            this.domNode.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_CONTAINED_BY) {\n            return Math.min(offset, 1);\n        }\n        return -1;\n    };\n    LeafBlot.prototype.position = function (index, inclusive) {\n        var offset = [].indexOf.call(this.parent.domNode.childNodes, this.domNode);\n        if (index > 0)\n            offset += 1;\n        return [this.parent.domNode, offset];\n    };\n    LeafBlot.prototype.value = function () {\n        return _a = {}, _a[this.statics.blotName] = this.statics.value(this.domNode) || true, _a;\n        var _a;\n    };\n    LeafBlot.scope = Registry.Scope.INLINE_BLOT;\n    return LeafBlot;\n}(shadow_1.default));\nexports.default = LeafBlot;\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Registry = __webpack_require__(0);\nvar ShadowBlot = /** @class */ (function () {\n    function ShadowBlot(domNode) {\n        this.domNode = domNode;\n        // @ts-ignore\n        this.domNode[Registry.DATA_KEY] = { blot: this };\n    }\n    Object.defineProperty(ShadowBlot.prototype, \"statics\", {\n        // Hack for accessing inherited static methods\n        get: function () {\n            return this.constructor;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ShadowBlot.create = function (value) {\n        if (this.tagName == null) {\n            throw new Registry.ParchmentError('Blot definition missing tagName');\n        }\n        var node;\n        if (Array.isArray(this.tagName)) {\n            if (typeof value === 'string') {\n                value = value.toUpperCase();\n                if (parseInt(value).toString() === value) {\n                    value = parseInt(value);\n                }\n            }\n            if (typeof value === 'number') {\n                node = document.createElement(this.tagName[value - 1]);\n            }\n            else if (this.tagName.indexOf(value) > -1) {\n                node = document.createElement(value);\n            }\n            else {\n                node = document.createElement(this.tagName[0]);\n            }\n        }\n        else {\n            node = document.createElement(this.tagName);\n        }\n        if (this.className) {\n            node.classList.add(this.className);\n        }\n        return node;\n    };\n    ShadowBlot.prototype.attach = function () {\n        if (this.parent != null) {\n            this.scroll = this.parent.scroll;\n        }\n    };\n    ShadowBlot.prototype.clone = function () {\n        var domNode = this.domNode.cloneNode(false);\n        return Registry.create(domNode);\n    };\n    ShadowBlot.prototype.detach = function () {\n        if (this.parent != null)\n            this.parent.removeChild(this);\n        // @ts-ignore\n        delete this.domNode[Registry.DATA_KEY];\n    };\n    ShadowBlot.prototype.deleteAt = function (index, length) {\n        var blot = this.isolate(index, length);\n        blot.remove();\n    };\n    ShadowBlot.prototype.formatAt = function (index, length, name, value) {\n        var blot = this.isolate(index, length);\n        if (Registry.query(name, Registry.Scope.BLOT) != null && value) {\n            blot.wrap(name, value);\n        }\n        else if (Registry.query(name, Registry.Scope.ATTRIBUTE) != null) {\n            var parent_1 = Registry.create(this.statics.scope);\n            blot.wrap(parent_1);\n            parent_1.format(name, value);\n        }\n    };\n    ShadowBlot.prototype.insertAt = function (index, value, def) {\n        var blot = def == null ? Registry.create('text', value) : Registry.create(value, def);\n        var ref = this.split(index);\n        this.parent.insertBefore(blot, ref);\n    };\n    ShadowBlot.prototype.insertInto = function (parentBlot, refBlot) {\n        if (refBlot === void 0) { refBlot = null; }\n        if (this.parent != null) {\n            this.parent.children.remove(this);\n        }\n        var refDomNode = null;\n        parentBlot.children.insertBefore(this, refBlot);\n        if (refBlot != null) {\n            refDomNode = refBlot.domNode;\n        }\n        if (this.domNode.parentNode != parentBlot.domNode ||\n            this.domNode.nextSibling != refDomNode) {\n            parentBlot.domNode.insertBefore(this.domNode, refDomNode);\n        }\n        this.parent = parentBlot;\n        this.attach();\n    };\n    ShadowBlot.prototype.isolate = function (index, length) {\n        var target = this.split(index);\n        target.split(length);\n        return target;\n    };\n    ShadowBlot.prototype.length = function () {\n        return 1;\n    };\n    ShadowBlot.prototype.offset = function (root) {\n        if (root === void 0) { root = this.parent; }\n        if (this.parent == null || this == root)\n            return 0;\n        return this.parent.children.offset(this) + this.parent.offset(root);\n    };\n    ShadowBlot.prototype.optimize = function (context) {\n        // TODO clean up once we use WeakMap\n        // @ts-ignore\n        if (this.domNode[Registry.DATA_KEY] != null) {\n            // @ts-ignore\n            delete this.domNode[Registry.DATA_KEY].mutations;\n        }\n    };\n    ShadowBlot.prototype.remove = function () {\n        if (this.domNode.parentNode != null) {\n            this.domNode.parentNode.removeChild(this.domNode);\n        }\n        this.detach();\n    };\n    ShadowBlot.prototype.replace = function (target) {\n        if (target.parent == null)\n            return;\n        target.parent.insertBefore(this, target.next);\n        target.remove();\n    };\n    ShadowBlot.prototype.replaceWith = function (name, value) {\n        var replacement = typeof name === 'string' ? Registry.create(name, value) : name;\n        replacement.replace(this);\n        return replacement;\n    };\n    ShadowBlot.prototype.split = function (index, force) {\n        return index === 0 ? this : this.next;\n    };\n    ShadowBlot.prototype.update = function (mutations, context) {\n        // Nothing to do by default\n    };\n    ShadowBlot.prototype.wrap = function (name, value) {\n        var wrapper = typeof name === 'string' ? Registry.create(name, value) : name;\n        if (this.parent != null) {\n            this.parent.insertBefore(wrapper, this.next);\n        }\n        wrapper.appendChild(this);\n        return wrapper;\n    };\n    ShadowBlot.blotName = 'abstract';\n    return ShadowBlot;\n}());\nexports.default = ShadowBlot;\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar attributor_1 = __webpack_require__(1);\nvar class_1 = __webpack_require__(7);\nvar style_1 = __webpack_require__(8);\nvar Registry = __webpack_require__(0);\nvar AttributorStore = /** @class */ (function () {\n    function AttributorStore(domNode) {\n        this.attributes = {};\n        this.domNode = domNode;\n        this.build();\n    }\n    AttributorStore.prototype.attribute = function (attribute, value) {\n        // verb\n        if (value) {\n            if (attribute.add(this.domNode, value)) {\n                if (attribute.value(this.domNode) != null) {\n                    this.attributes[attribute.attrName] = attribute;\n                }\n                else {\n                    delete this.attributes[attribute.attrName];\n                }\n            }\n        }\n        else {\n            attribute.remove(this.domNode);\n            delete this.attributes[attribute.attrName];\n        }\n    };\n    AttributorStore.prototype.build = function () {\n        var _this = this;\n        this.attributes = {};\n        var attributes = attributor_1.default.keys(this.domNode);\n        var classes = class_1.default.keys(this.domNode);\n        var styles = style_1.default.keys(this.domNode);\n        attributes\n            .concat(classes)\n            .concat(styles)\n            .forEach(function (name) {\n            var attr = Registry.query(name, Registry.Scope.ATTRIBUTE);\n            if (attr instanceof attributor_1.default) {\n                _this.attributes[attr.attrName] = attr;\n            }\n        });\n    };\n    AttributorStore.prototype.copy = function (target) {\n        var _this = this;\n        Object.keys(this.attributes).forEach(function (key) {\n            var value = _this.attributes[key].value(_this.domNode);\n            target.format(key, value);\n        });\n    };\n    AttributorStore.prototype.move = function (target) {\n        var _this = this;\n        this.copy(target);\n        Object.keys(this.attributes).forEach(function (key) {\n            _this.attributes[key].remove(_this.domNode);\n        });\n        this.attributes = {};\n    };\n    AttributorStore.prototype.values = function () {\n        var _this = this;\n        return Object.keys(this.attributes).reduce(function (attributes, name) {\n            attributes[name] = _this.attributes[name].value(_this.domNode);\n            return attributes;\n        }, {});\n    };\n    return AttributorStore;\n}());\nexports.default = AttributorStore;\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar attributor_1 = __webpack_require__(1);\nfunction match(node, prefix) {\n    var className = node.getAttribute('class') || '';\n    return className.split(/\\s+/).filter(function (name) {\n        return name.indexOf(prefix + \"-\") === 0;\n    });\n}\nvar ClassAttributor = /** @class */ (function (_super) {\n    __extends(ClassAttributor, _super);\n    function ClassAttributor() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    ClassAttributor.keys = function (node) {\n        return (node.getAttribute('class') || '').split(/\\s+/).map(function (name) {\n            return name\n                .split('-')\n                .slice(0, -1)\n                .join('-');\n        });\n    };\n    ClassAttributor.prototype.add = function (node, value) {\n        if (!this.canAdd(node, value))\n            return false;\n        this.remove(node);\n        node.classList.add(this.keyName + \"-\" + value);\n        return true;\n    };\n    ClassAttributor.prototype.remove = function (node) {\n        var matches = match(node, this.keyName);\n        matches.forEach(function (name) {\n            node.classList.remove(name);\n        });\n        if (node.classList.length === 0) {\n            node.removeAttribute('class');\n        }\n    };\n    ClassAttributor.prototype.value = function (node) {\n        var result = match(node, this.keyName)[0] || '';\n        var value = result.slice(this.keyName.length + 1); // +1 for hyphen\n        return this.canAdd(node, value) ? value : '';\n    };\n    return ClassAttributor;\n}(attributor_1.default));\nexports.default = ClassAttributor;\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar attributor_1 = __webpack_require__(1);\nfunction camelize(name) {\n    var parts = name.split('-');\n    var rest = parts\n        .slice(1)\n        .map(function (part) {\n        return part[0].toUpperCase() + part.slice(1);\n    })\n        .join('');\n    return parts[0] + rest;\n}\nvar StyleAttributor = /** @class */ (function (_super) {\n    __extends(StyleAttributor, _super);\n    function StyleAttributor() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    StyleAttributor.keys = function (node) {\n        return (node.getAttribute('style') || '').split(';').map(function (value) {\n            var arr = value.split(':');\n            return arr[0].trim();\n        });\n    };\n    StyleAttributor.prototype.add = function (node, value) {\n        if (!this.canAdd(node, value))\n            return false;\n        // @ts-ignore\n        node.style[camelize(this.keyName)] = value;\n        return true;\n    };\n    StyleAttributor.prototype.remove = function (node) {\n        // @ts-ignore\n        node.style[camelize(this.keyName)] = '';\n        if (!node.getAttribute('style')) {\n            node.removeAttribute('style');\n        }\n    };\n    StyleAttributor.prototype.value = function (node) {\n        // @ts-ignore\n        var value = node.style[camelize(this.keyName)];\n        return this.canAdd(node, value) ? value : '';\n    };\n    return StyleAttributor;\n}(attributor_1.default));\nexports.default = StyleAttributor;\n\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(10);\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar container_1 = __webpack_require__(2);\nvar format_1 = __webpack_require__(3);\nvar leaf_1 = __webpack_require__(4);\nvar scroll_1 = __webpack_require__(12);\nvar inline_1 = __webpack_require__(13);\nvar block_1 = __webpack_require__(14);\nvar embed_1 = __webpack_require__(15);\nvar text_1 = __webpack_require__(16);\nvar attributor_1 = __webpack_require__(1);\nvar class_1 = __webpack_require__(7);\nvar style_1 = __webpack_require__(8);\nvar store_1 = __webpack_require__(6);\nvar Registry = __webpack_require__(0);\nvar Parchment = {\n    Scope: Registry.Scope,\n    create: Registry.create,\n    find: Registry.find,\n    query: Registry.query,\n    register: Registry.register,\n    Container: container_1.default,\n    Format: format_1.default,\n    Leaf: leaf_1.default,\n    Embed: embed_1.default,\n    Scroll: scroll_1.default,\n    Block: block_1.default,\n    Inline: inline_1.default,\n    Text: text_1.default,\n    Attributor: {\n        Attribute: attributor_1.default,\n        Class: class_1.default,\n        Style: style_1.default,\n        Store: store_1.default,\n    },\n};\nexports.default = Parchment;\n\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar LinkedList = /** @class */ (function () {\n    function LinkedList() {\n        this.head = this.tail = null;\n        this.length = 0;\n    }\n    LinkedList.prototype.append = function () {\n        var nodes = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            nodes[_i] = arguments[_i];\n        }\n        this.insertBefore(nodes[0], null);\n        if (nodes.length > 1) {\n            this.append.apply(this, nodes.slice(1));\n        }\n    };\n    LinkedList.prototype.contains = function (node) {\n        var cur, next = this.iterator();\n        while ((cur = next())) {\n            if (cur === node)\n                return true;\n        }\n        return false;\n    };\n    LinkedList.prototype.insertBefore = function (node, refNode) {\n        if (!node)\n            return;\n        node.next = refNode;\n        if (refNode != null) {\n            node.prev = refNode.prev;\n            if (refNode.prev != null) {\n                refNode.prev.next = node;\n            }\n            refNode.prev = node;\n            if (refNode === this.head) {\n                this.head = node;\n            }\n        }\n        else if (this.tail != null) {\n            this.tail.next = node;\n            node.prev = this.tail;\n            this.tail = node;\n        }\n        else {\n            node.prev = null;\n            this.head = this.tail = node;\n        }\n        this.length += 1;\n    };\n    LinkedList.prototype.offset = function (target) {\n        var index = 0, cur = this.head;\n        while (cur != null) {\n            if (cur === target)\n                return index;\n            index += cur.length();\n            cur = cur.next;\n        }\n        return -1;\n    };\n    LinkedList.prototype.remove = function (node) {\n        if (!this.contains(node))\n            return;\n        if (node.prev != null)\n            node.prev.next = node.next;\n        if (node.next != null)\n            node.next.prev = node.prev;\n        if (node === this.head)\n            this.head = node.next;\n        if (node === this.tail)\n            this.tail = node.prev;\n        this.length -= 1;\n    };\n    LinkedList.prototype.iterator = function (curNode) {\n        if (curNode === void 0) { curNode = this.head; }\n        // TODO use yield when we can\n        return function () {\n            var ret = curNode;\n            if (curNode != null)\n                curNode = curNode.next;\n            return ret;\n        };\n    };\n    LinkedList.prototype.find = function (index, inclusive) {\n        if (inclusive === void 0) { inclusive = false; }\n        var cur, next = this.iterator();\n        while ((cur = next())) {\n            var length_1 = cur.length();\n            if (index < length_1 ||\n                (inclusive && index === length_1 && (cur.next == null || cur.next.length() !== 0))) {\n                return [cur, index];\n            }\n            index -= length_1;\n        }\n        return [null, 0];\n    };\n    LinkedList.prototype.forEach = function (callback) {\n        var cur, next = this.iterator();\n        while ((cur = next())) {\n            callback(cur);\n        }\n    };\n    LinkedList.prototype.forEachAt = function (index, length, callback) {\n        if (length <= 0)\n            return;\n        var _a = this.find(index), startNode = _a[0], offset = _a[1];\n        var cur, curIndex = index - offset, next = this.iterator(startNode);\n        while ((cur = next()) && curIndex < index + length) {\n            var curLength = cur.length();\n            if (index > curIndex) {\n                callback(cur, index - curIndex, Math.min(length, curIndex + curLength - index));\n            }\n            else {\n                callback(cur, 0, Math.min(curLength, index + length - curIndex));\n            }\n            curIndex += curLength;\n        }\n    };\n    LinkedList.prototype.map = function (callback) {\n        return this.reduce(function (memo, cur) {\n            memo.push(callback(cur));\n            return memo;\n        }, []);\n    };\n    LinkedList.prototype.reduce = function (callback, memo) {\n        var cur, next = this.iterator();\n        while ((cur = next())) {\n            memo = callback(memo, cur);\n        }\n        return memo;\n    };\n    return LinkedList;\n}());\nexports.default = LinkedList;\n\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar container_1 = __webpack_require__(2);\nvar Registry = __webpack_require__(0);\nvar OBSERVER_CONFIG = {\n    attributes: true,\n    characterData: true,\n    characterDataOldValue: true,\n    childList: true,\n    subtree: true,\n};\nvar MAX_OPTIMIZE_ITERATIONS = 100;\nvar ScrollBlot = /** @class */ (function (_super) {\n    __extends(ScrollBlot, _super);\n    function ScrollBlot(node) {\n        var _this = _super.call(this, node) || this;\n        _this.scroll = _this;\n        _this.observer = new MutationObserver(function (mutations) {\n            _this.update(mutations);\n        });\n        _this.observer.observe(_this.domNode, OBSERVER_CONFIG);\n        _this.attach();\n        return _this;\n    }\n    ScrollBlot.prototype.detach = function () {\n        _super.prototype.detach.call(this);\n        this.observer.disconnect();\n    };\n    ScrollBlot.prototype.deleteAt = function (index, length) {\n        this.update();\n        if (index === 0 && length === this.length()) {\n            this.children.forEach(function (child) {\n                child.remove();\n            });\n        }\n        else {\n            _super.prototype.deleteAt.call(this, index, length);\n        }\n    };\n    ScrollBlot.prototype.formatAt = function (index, length, name, value) {\n        this.update();\n        _super.prototype.formatAt.call(this, index, length, name, value);\n    };\n    ScrollBlot.prototype.insertAt = function (index, value, def) {\n        this.update();\n        _super.prototype.insertAt.call(this, index, value, def);\n    };\n    ScrollBlot.prototype.optimize = function (mutations, context) {\n        var _this = this;\n        if (mutations === void 0) { mutations = []; }\n        if (context === void 0) { context = {}; }\n        _super.prototype.optimize.call(this, context);\n        // We must modify mutations directly, cannot make copy and then modify\n        var records = [].slice.call(this.observer.takeRecords());\n        // Array.push currently seems to be implemented by a non-tail recursive function\n        // so we cannot just mutations.push.apply(mutations, this.observer.takeRecords());\n        while (records.length > 0)\n            mutations.push(records.pop());\n        // TODO use WeakMap\n        var mark = function (blot, markParent) {\n            if (markParent === void 0) { markParent = true; }\n            if (blot == null || blot === _this)\n                return;\n            if (blot.domNode.parentNode == null)\n                return;\n            // @ts-ignore\n            if (blot.domNode[Registry.DATA_KEY].mutations == null) {\n                // @ts-ignore\n                blot.domNode[Registry.DATA_KEY].mutations = [];\n            }\n            if (markParent)\n                mark(blot.parent);\n        };\n        var optimize = function (blot) {\n            // Post-order traversal\n            if (\n            // @ts-ignore\n            blot.domNode[Registry.DATA_KEY] == null ||\n                // @ts-ignore\n                blot.domNode[Registry.DATA_KEY].mutations == null) {\n                return;\n            }\n            if (blot instanceof container_1.default) {\n                blot.children.forEach(optimize);\n            }\n            blot.optimize(context);\n        };\n        var remaining = mutations;\n        for (var i = 0; remaining.length > 0; i += 1) {\n            if (i >= MAX_OPTIMIZE_ITERATIONS) {\n                throw new Error('[Parchment] Maximum optimize iterations reached');\n            }\n            remaining.forEach(function (mutation) {\n                var blot = Registry.find(mutation.target, true);\n                if (blot == null)\n                    return;\n                if (blot.domNode === mutation.target) {\n                    if (mutation.type === 'childList') {\n                        mark(Registry.find(mutation.previousSibling, false));\n                        [].forEach.call(mutation.addedNodes, function (node) {\n                            var child = Registry.find(node, false);\n                            mark(child, false);\n                            if (child instanceof container_1.default) {\n                                child.children.forEach(function (grandChild) {\n                                    mark(grandChild, false);\n                                });\n                            }\n                        });\n                    }\n                    else if (mutation.type === 'attributes') {\n                        mark(blot.prev);\n                    }\n                }\n                mark(blot);\n            });\n            this.children.forEach(optimize);\n            remaining = [].slice.call(this.observer.takeRecords());\n            records = remaining.slice();\n            while (records.length > 0)\n                mutations.push(records.pop());\n        }\n    };\n    ScrollBlot.prototype.update = function (mutations, context) {\n        var _this = this;\n        if (context === void 0) { context = {}; }\n        mutations = mutations || this.observer.takeRecords();\n        // TODO use WeakMap\n        mutations\n            .map(function (mutation) {\n            var blot = Registry.find(mutation.target, true);\n            if (blot == null)\n                return null;\n            // @ts-ignore\n            if (blot.domNode[Registry.DATA_KEY].mutations == null) {\n                // @ts-ignore\n                blot.domNode[Registry.DATA_KEY].mutations = [mutation];\n                return blot;\n            }\n            else {\n                // @ts-ignore\n                blot.domNode[Registry.DATA_KEY].mutations.push(mutation);\n                return null;\n            }\n        })\n            .forEach(function (blot) {\n            if (blot == null ||\n                blot === _this ||\n                //@ts-ignore\n                blot.domNode[Registry.DATA_KEY] == null)\n                return;\n            // @ts-ignore\n            blot.update(blot.domNode[Registry.DATA_KEY].mutations || [], context);\n        });\n        // @ts-ignore\n        if (this.domNode[Registry.DATA_KEY].mutations != null) {\n            // @ts-ignore\n            _super.prototype.update.call(this, this.domNode[Registry.DATA_KEY].mutations, context);\n        }\n        this.optimize(mutations, context);\n    };\n    ScrollBlot.blotName = 'scroll';\n    ScrollBlot.defaultChild = 'block';\n    ScrollBlot.scope = Registry.Scope.BLOCK_BLOT;\n    ScrollBlot.tagName = 'DIV';\n    return ScrollBlot;\n}(container_1.default));\nexports.default = ScrollBlot;\n\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar format_1 = __webpack_require__(3);\nvar Registry = __webpack_require__(0);\n// Shallow object comparison\nfunction isEqual(obj1, obj2) {\n    if (Object.keys(obj1).length !== Object.keys(obj2).length)\n        return false;\n    // @ts-ignore\n    for (var prop in obj1) {\n        // @ts-ignore\n        if (obj1[prop] !== obj2[prop])\n            return false;\n    }\n    return true;\n}\nvar InlineBlot = /** @class */ (function (_super) {\n    __extends(InlineBlot, _super);\n    function InlineBlot() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    InlineBlot.formats = function (domNode) {\n        if (domNode.tagName === InlineBlot.tagName)\n            return undefined;\n        return _super.formats.call(this, domNode);\n    };\n    InlineBlot.prototype.format = function (name, value) {\n        var _this = this;\n        if (name === this.statics.blotName && !value) {\n            this.children.forEach(function (child) {\n                if (!(child instanceof format_1.default)) {\n                    child = child.wrap(InlineBlot.blotName, true);\n                }\n                _this.attributes.copy(child);\n            });\n            this.unwrap();\n        }\n        else {\n            _super.prototype.format.call(this, name, value);\n        }\n    };\n    InlineBlot.prototype.formatAt = function (index, length, name, value) {\n        if (this.formats()[name] != null || Registry.query(name, Registry.Scope.ATTRIBUTE)) {\n            var blot = this.isolate(index, length);\n            blot.format(name, value);\n        }\n        else {\n            _super.prototype.formatAt.call(this, index, length, name, value);\n        }\n    };\n    InlineBlot.prototype.optimize = function (context) {\n        _super.prototype.optimize.call(this, context);\n        var formats = this.formats();\n        if (Object.keys(formats).length === 0) {\n            return this.unwrap(); // unformatted span\n        }\n        var next = this.next;\n        if (next instanceof InlineBlot && next.prev === this && isEqual(formats, next.formats())) {\n            next.moveChildren(this);\n            next.remove();\n        }\n    };\n    InlineBlot.blotName = 'inline';\n    InlineBlot.scope = Registry.Scope.INLINE_BLOT;\n    InlineBlot.tagName = 'SPAN';\n    return InlineBlot;\n}(format_1.default));\nexports.default = InlineBlot;\n\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar format_1 = __webpack_require__(3);\nvar Registry = __webpack_require__(0);\nvar BlockBlot = /** @class */ (function (_super) {\n    __extends(BlockBlot, _super);\n    function BlockBlot() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    BlockBlot.formats = function (domNode) {\n        var tagName = Registry.query(BlockBlot.blotName).tagName;\n        if (domNode.tagName === tagName)\n            return undefined;\n        return _super.formats.call(this, domNode);\n    };\n    BlockBlot.prototype.format = function (name, value) {\n        if (Registry.query(name, Registry.Scope.BLOCK) == null) {\n            return;\n        }\n        else if (name === this.statics.blotName && !value) {\n            this.replaceWith(BlockBlot.blotName);\n        }\n        else {\n            _super.prototype.format.call(this, name, value);\n        }\n    };\n    BlockBlot.prototype.formatAt = function (index, length, name, value) {\n        if (Registry.query(name, Registry.Scope.BLOCK) != null) {\n            this.format(name, value);\n        }\n        else {\n            _super.prototype.formatAt.call(this, index, length, name, value);\n        }\n    };\n    BlockBlot.prototype.insertAt = function (index, value, def) {\n        if (def == null || Registry.query(value, Registry.Scope.INLINE) != null) {\n            // Insert text or inline\n            _super.prototype.insertAt.call(this, index, value, def);\n        }\n        else {\n            var after = this.split(index);\n            var blot = Registry.create(value, def);\n            after.parent.insertBefore(blot, after);\n        }\n    };\n    BlockBlot.prototype.update = function (mutations, context) {\n        if (navigator.userAgent.match(/Trident/)) {\n            this.build();\n        }\n        else {\n            _super.prototype.update.call(this, mutations, context);\n        }\n    };\n    BlockBlot.blotName = 'block';\n    BlockBlot.scope = Registry.Scope.BLOCK_BLOT;\n    BlockBlot.tagName = 'P';\n    return BlockBlot;\n}(format_1.default));\nexports.default = BlockBlot;\n\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar leaf_1 = __webpack_require__(4);\nvar EmbedBlot = /** @class */ (function (_super) {\n    __extends(EmbedBlot, _super);\n    function EmbedBlot() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    EmbedBlot.formats = function (domNode) {\n        return undefined;\n    };\n    EmbedBlot.prototype.format = function (name, value) {\n        // super.formatAt wraps, which is what we want in general,\n        // but this allows subclasses to overwrite for formats\n        // that just apply to particular embeds\n        _super.prototype.formatAt.call(this, 0, this.length(), name, value);\n    };\n    EmbedBlot.prototype.formatAt = function (index, length, name, value) {\n        if (index === 0 && length === this.length()) {\n            this.format(name, value);\n        }\n        else {\n            _super.prototype.formatAt.call(this, index, length, name, value);\n        }\n    };\n    EmbedBlot.prototype.formats = function () {\n        return this.statics.formats(this.domNode);\n    };\n    return EmbedBlot;\n}(leaf_1.default));\nexports.default = EmbedBlot;\n\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar leaf_1 = __webpack_require__(4);\nvar Registry = __webpack_require__(0);\nvar TextBlot = /** @class */ (function (_super) {\n    __extends(TextBlot, _super);\n    function TextBlot(node) {\n        var _this = _super.call(this, node) || this;\n        _this.text = _this.statics.value(_this.domNode);\n        return _this;\n    }\n    TextBlot.create = function (value) {\n        return document.createTextNode(value);\n    };\n    TextBlot.value = function (domNode) {\n        var text = domNode.data;\n        // @ts-ignore\n        if (text['normalize'])\n            text = text['normalize']();\n        return text;\n    };\n    TextBlot.prototype.deleteAt = function (index, length) {\n        this.domNode.data = this.text = this.text.slice(0, index) + this.text.slice(index + length);\n    };\n    TextBlot.prototype.index = function (node, offset) {\n        if (this.domNode === node) {\n            return offset;\n        }\n        return -1;\n    };\n    TextBlot.prototype.insertAt = function (index, value, def) {\n        if (def == null) {\n            this.text = this.text.slice(0, index) + value + this.text.slice(index);\n            this.domNode.data = this.text;\n        }\n        else {\n            _super.prototype.insertAt.call(this, index, value, def);\n        }\n    };\n    TextBlot.prototype.length = function () {\n        return this.text.length;\n    };\n    TextBlot.prototype.optimize = function (context) {\n        _super.prototype.optimize.call(this, context);\n        this.text = this.statics.value(this.domNode);\n        if (this.text.length === 0) {\n            this.remove();\n        }\n        else if (this.next instanceof TextBlot && this.next.prev === this) {\n            this.insertAt(this.length(), this.next.value());\n            this.next.remove();\n        }\n    };\n    TextBlot.prototype.position = function (index, inclusive) {\n        if (inclusive === void 0) { inclusive = false; }\n        return [this.domNode, index];\n    };\n    TextBlot.prototype.split = function (index, force) {\n        if (force === void 0) { force = false; }\n        if (!force) {\n            if (index === 0)\n                return this;\n            if (index === this.length())\n                return this.next;\n        }\n        var after = Registry.create(this.domNode.splitText(index));\n        this.parent.insertBefore(after, this.next);\n        this.text = this.statics.value(this.domNode);\n        return after;\n    };\n    TextBlot.prototype.update = function (mutations, context) {\n        var _this = this;\n        if (mutations.some(function (mutation) {\n            return mutation.type === 'characterData' && mutation.target === _this.domNode;\n        })) {\n            this.text = this.statics.value(this.domNode);\n        }\n    };\n    TextBlot.prototype.value = function () {\n        return this.text;\n    };\n    TextBlot.blotName = 'text';\n    TextBlot.scope = Registry.Scope.INLINE_BLOT;\n    return TextBlot;\n}(leaf_1.default));\nexports.default = TextBlot;\n\n\n/***/ })\n/******/ ]);\n});\n//# sourceMappingURL=parchment.js.map","let elem = document.createElement('div');\nelem.classList.toggle('test-class', false);\nif (elem.classList.contains('test-class')) {\n  let _toggle = DOMTokenList.prototype.toggle;\n  DOMTokenList.prototype.toggle = function(token, force) {\n    if (arguments.length > 1 && !this.contains(token) === !force) {\n      return force;\n    } else {\n      return _toggle.call(this, token);\n    }\n  };\n}\n\nif (!String.prototype.startsWith) {\n  String.prototype.startsWith = function(searchString, position){\n    position = position || 0;\n    return this.substr(position, searchString.length) === searchString;\n  };\n}\n\nif (!String.prototype.endsWith) {\n  String.prototype.endsWith = function(searchString, position) {\n    var subjectString = this.toString();\n    if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) {\n      position = subjectString.length;\n    }\n    position -= searchString.length;\n    var lastIndex = subjectString.indexOf(searchString, position);\n    return lastIndex !== -1 && lastIndex === position;\n  };\n}\n\nif (!Array.prototype.find) {\n  Object.defineProperty(Array.prototype, \"find\", {\n    value: function(predicate) {\n      if (this === null) {\n        throw new TypeError('Array.prototype.find called on null or undefined');\n      }\n      if (typeof predicate !== 'function') {\n        throw new TypeError('predicate must be a function');\n      }\n      var list = Object(this);\n      var length = list.length >>> 0;\n      var thisArg = arguments[1];\n      var value;\n\n      for (var i = 0; i < length; i++) {\n        value = list[i];\n        if (predicate.call(thisArg, value, i, list)) {\n          return value;\n        }\n      }\n      return undefined;\n    }\n  });\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", function() {\n  // Disable resizing in Firefox\n  document.execCommand(\"enableObjectResizing\", false, false);\n  // Disable automatic linkifying in IE11\n  document.execCommand(\"autoUrlDetect\", false, false);\n});\n","/**\n * This library modifies the diff-patch-match library by Neil Fraser\n * by removing the patch and match functionality and certain advanced\n * options in the diff function. The original license is as follows:\n *\n * ===\n *\n * Diff Match and Patch\n *\n * Copyright 2006 Google Inc.\n * http://code.google.com/p/google-diff-match-patch/\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n/**\n * The data structure representing a diff is an array of tuples:\n * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]\n * which means: delete 'Hello', add 'Goodbye' and keep ' world.'\n */\nvar DIFF_DELETE = -1;\nvar DIFF_INSERT = 1;\nvar DIFF_EQUAL = 0;\n\n\n/**\n * Find the differences between two texts.  Simplifies the problem by stripping\n * any common prefix or suffix off the texts before diffing.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {Int} cursor_pos Expected edit position in text1 (optional)\n * @return {Array} Array of diff tuples.\n */\nfunction diff_main(text1, text2, cursor_pos) {\n  // Check for equality (speedup).\n  if (text1 == text2) {\n    if (text1) {\n      return [[DIFF_EQUAL, text1]];\n    }\n    return [];\n  }\n\n  // Check cursor_pos within bounds\n  if (cursor_pos < 0 || text1.length < cursor_pos) {\n    cursor_pos = null;\n  }\n\n  // Trim off common prefix (speedup).\n  var commonlength = diff_commonPrefix(text1, text2);\n  var commonprefix = text1.substring(0, commonlength);\n  text1 = text1.substring(commonlength);\n  text2 = text2.substring(commonlength);\n\n  // Trim off common suffix (speedup).\n  commonlength = diff_commonSuffix(text1, text2);\n  var commonsuffix = text1.substring(text1.length - commonlength);\n  text1 = text1.substring(0, text1.length - commonlength);\n  text2 = text2.substring(0, text2.length - commonlength);\n\n  // Compute the diff on the middle block.\n  var diffs = diff_compute_(text1, text2);\n\n  // Restore the prefix and suffix.\n  if (commonprefix) {\n    diffs.unshift([DIFF_EQUAL, commonprefix]);\n  }\n  if (commonsuffix) {\n    diffs.push([DIFF_EQUAL, commonsuffix]);\n  }\n  diff_cleanupMerge(diffs);\n  if (cursor_pos != null) {\n    diffs = fix_cursor(diffs, cursor_pos);\n  }\n  diffs = fix_emoji(diffs);\n  return diffs;\n};\n\n\n/**\n * Find the differences between two texts.  Assumes that the texts do not\n * have any common prefix or suffix.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @return {Array} Array of diff tuples.\n */\nfunction diff_compute_(text1, text2) {\n  var diffs;\n\n  if (!text1) {\n    // Just add some text (speedup).\n    return [[DIFF_INSERT, text2]];\n  }\n\n  if (!text2) {\n    // Just delete some text (speedup).\n    return [[DIFF_DELETE, text1]];\n  }\n\n  var longtext = text1.length > text2.length ? text1 : text2;\n  var shorttext = text1.length > text2.length ? text2 : text1;\n  var i = longtext.indexOf(shorttext);\n  if (i != -1) {\n    // Shorter text is inside the longer text (speedup).\n    diffs = [[DIFF_INSERT, longtext.substring(0, i)],\n             [DIFF_EQUAL, shorttext],\n             [DIFF_INSERT, longtext.substring(i + shorttext.length)]];\n    // Swap insertions for deletions if diff is reversed.\n    if (text1.length > text2.length) {\n      diffs[0][0] = diffs[2][0] = DIFF_DELETE;\n    }\n    return diffs;\n  }\n\n  if (shorttext.length == 1) {\n    // Single character string.\n    // After the previous speedup, the character can't be an equality.\n    return [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];\n  }\n\n  // Check to see if the problem can be split in two.\n  var hm = diff_halfMatch_(text1, text2);\n  if (hm) {\n    // A half-match was found, sort out the return data.\n    var text1_a = hm[0];\n    var text1_b = hm[1];\n    var text2_a = hm[2];\n    var text2_b = hm[3];\n    var mid_common = hm[4];\n    // Send both pairs off for separate processing.\n    var diffs_a = diff_main(text1_a, text2_a);\n    var diffs_b = diff_main(text1_b, text2_b);\n    // Merge the results.\n    return diffs_a.concat([[DIFF_EQUAL, mid_common]], diffs_b);\n  }\n\n  return diff_bisect_(text1, text2);\n};\n\n\n/**\n * Find the 'middle snake' of a diff, split the problem in two\n * and return the recursively constructed diff.\n * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @return {Array} Array of diff tuples.\n * @private\n */\nfunction diff_bisect_(text1, text2) {\n  // Cache the text lengths to prevent multiple calls.\n  var text1_length = text1.length;\n  var text2_length = text2.length;\n  var max_d = Math.ceil((text1_length + text2_length) / 2);\n  var v_offset = max_d;\n  var v_length = 2 * max_d;\n  var v1 = new Array(v_length);\n  var v2 = new Array(v_length);\n  // Setting all elements to -1 is faster in Chrome & Firefox than mixing\n  // integers and undefined.\n  for (var x = 0; x < v_length; x++) {\n    v1[x] = -1;\n    v2[x] = -1;\n  }\n  v1[v_offset + 1] = 0;\n  v2[v_offset + 1] = 0;\n  var delta = text1_length - text2_length;\n  // If the total number of characters is odd, then the front path will collide\n  // with the reverse path.\n  var front = (delta % 2 != 0);\n  // Offsets for start and end of k loop.\n  // Prevents mapping of space beyond the grid.\n  var k1start = 0;\n  var k1end = 0;\n  var k2start = 0;\n  var k2end = 0;\n  for (var d = 0; d < max_d; d++) {\n    // Walk the front path one step.\n    for (var k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {\n      var k1_offset = v_offset + k1;\n      var x1;\n      if (k1 == -d || (k1 != d && v1[k1_offset - 1] < v1[k1_offset + 1])) {\n        x1 = v1[k1_offset + 1];\n      } else {\n        x1 = v1[k1_offset - 1] + 1;\n      }\n      var y1 = x1 - k1;\n      while (x1 < text1_length && y1 < text2_length &&\n             text1.charAt(x1) == text2.charAt(y1)) {\n        x1++;\n        y1++;\n      }\n      v1[k1_offset] = x1;\n      if (x1 > text1_length) {\n        // Ran off the right of the graph.\n        k1end += 2;\n      } else if (y1 > text2_length) {\n        // Ran off the bottom of the graph.\n        k1start += 2;\n      } else if (front) {\n        var k2_offset = v_offset + delta - k1;\n        if (k2_offset >= 0 && k2_offset < v_length && v2[k2_offset] != -1) {\n          // Mirror x2 onto top-left coordinate system.\n          var x2 = text1_length - v2[k2_offset];\n          if (x1 >= x2) {\n            // Overlap detected.\n            return diff_bisectSplit_(text1, text2, x1, y1);\n          }\n        }\n      }\n    }\n\n    // Walk the reverse path one step.\n    for (var k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {\n      var k2_offset = v_offset + k2;\n      var x2;\n      if (k2 == -d || (k2 != d && v2[k2_offset - 1] < v2[k2_offset + 1])) {\n        x2 = v2[k2_offset + 1];\n      } else {\n        x2 = v2[k2_offset - 1] + 1;\n      }\n      var y2 = x2 - k2;\n      while (x2 < text1_length && y2 < text2_length &&\n             text1.charAt(text1_length - x2 - 1) ==\n             text2.charAt(text2_length - y2 - 1)) {\n        x2++;\n        y2++;\n      }\n      v2[k2_offset] = x2;\n      if (x2 > text1_length) {\n        // Ran off the left of the graph.\n        k2end += 2;\n      } else if (y2 > text2_length) {\n        // Ran off the top of the graph.\n        k2start += 2;\n      } else if (!front) {\n        var k1_offset = v_offset + delta - k2;\n        if (k1_offset >= 0 && k1_offset < v_length && v1[k1_offset] != -1) {\n          var x1 = v1[k1_offset];\n          var y1 = v_offset + x1 - k1_offset;\n          // Mirror x2 onto top-left coordinate system.\n          x2 = text1_length - x2;\n          if (x1 >= x2) {\n            // Overlap detected.\n            return diff_bisectSplit_(text1, text2, x1, y1);\n          }\n        }\n      }\n    }\n  }\n  // Diff took too long and hit the deadline or\n  // number of diffs equals number of characters, no commonality at all.\n  return [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];\n};\n\n\n/**\n * Given the location of the 'middle snake', split the diff in two parts\n * and recurse.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} x Index of split point in text1.\n * @param {number} y Index of split point in text2.\n * @return {Array} Array of diff tuples.\n */\nfunction diff_bisectSplit_(text1, text2, x, y) {\n  var text1a = text1.substring(0, x);\n  var text2a = text2.substring(0, y);\n  var text1b = text1.substring(x);\n  var text2b = text2.substring(y);\n\n  // Compute both diffs serially.\n  var diffs = diff_main(text1a, text2a);\n  var diffsb = diff_main(text1b, text2b);\n\n  return diffs.concat(diffsb);\n};\n\n\n/**\n * Determine the common prefix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the start of each\n *     string.\n */\nfunction diff_commonPrefix(text1, text2) {\n  // Quick check for common null cases.\n  if (!text1 || !text2 || text1.charAt(0) != text2.charAt(0)) {\n    return 0;\n  }\n  // Binary search.\n  // Performance analysis: http://neil.fraser.name/news/2007/10/09/\n  var pointermin = 0;\n  var pointermax = Math.min(text1.length, text2.length);\n  var pointermid = pointermax;\n  var pointerstart = 0;\n  while (pointermin < pointermid) {\n    if (text1.substring(pointerstart, pointermid) ==\n        text2.substring(pointerstart, pointermid)) {\n      pointermin = pointermid;\n      pointerstart = pointermin;\n    } else {\n      pointermax = pointermid;\n    }\n    pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n  }\n  return pointermid;\n};\n\n\n/**\n * Determine the common suffix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of each string.\n */\nfunction diff_commonSuffix(text1, text2) {\n  // Quick check for common null cases.\n  if (!text1 || !text2 ||\n      text1.charAt(text1.length - 1) != text2.charAt(text2.length - 1)) {\n    return 0;\n  }\n  // Binary search.\n  // Performance analysis: http://neil.fraser.name/news/2007/10/09/\n  var pointermin = 0;\n  var pointermax = Math.min(text1.length, text2.length);\n  var pointermid = pointermax;\n  var pointerend = 0;\n  while (pointermin < pointermid) {\n    if (text1.substring(text1.length - pointermid, text1.length - pointerend) ==\n        text2.substring(text2.length - pointermid, text2.length - pointerend)) {\n      pointermin = pointermid;\n      pointerend = pointermin;\n    } else {\n      pointermax = pointermid;\n    }\n    pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n  }\n  return pointermid;\n};\n\n\n/**\n * Do the two texts share a substring which is at least half the length of the\n * longer text?\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {Array.<string>} Five element Array, containing the prefix of\n *     text1, the suffix of text1, the prefix of text2, the suffix of\n *     text2 and the common middle.  Or null if there was no match.\n */\nfunction diff_halfMatch_(text1, text2) {\n  var longtext = text1.length > text2.length ? text1 : text2;\n  var shorttext = text1.length > text2.length ? text2 : text1;\n  if (longtext.length < 4 || shorttext.length * 2 < longtext.length) {\n    return null;  // Pointless.\n  }\n\n  /**\n   * Does a substring of shorttext exist within longtext such that the substring\n   * is at least half the length of longtext?\n   * Closure, but does not reference any external variables.\n   * @param {string} longtext Longer string.\n   * @param {string} shorttext Shorter string.\n   * @param {number} i Start index of quarter length substring within longtext.\n   * @return {Array.<string>} Five element Array, containing the prefix of\n   *     longtext, the suffix of longtext, the prefix of shorttext, the suffix\n   *     of shorttext and the common middle.  Or null if there was no match.\n   * @private\n   */\n  function diff_halfMatchI_(longtext, shorttext, i) {\n    // Start with a 1/4 length substring at position i as a seed.\n    var seed = longtext.substring(i, i + Math.floor(longtext.length / 4));\n    var j = -1;\n    var best_common = '';\n    var best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b;\n    while ((j = shorttext.indexOf(seed, j + 1)) != -1) {\n      var prefixLength = diff_commonPrefix(longtext.substring(i),\n                                           shorttext.substring(j));\n      var suffixLength = diff_commonSuffix(longtext.substring(0, i),\n                                           shorttext.substring(0, j));\n      if (best_common.length < suffixLength + prefixLength) {\n        best_common = shorttext.substring(j - suffixLength, j) +\n            shorttext.substring(j, j + prefixLength);\n        best_longtext_a = longtext.substring(0, i - suffixLength);\n        best_longtext_b = longtext.substring(i + prefixLength);\n        best_shorttext_a = shorttext.substring(0, j - suffixLength);\n        best_shorttext_b = shorttext.substring(j + prefixLength);\n      }\n    }\n    if (best_common.length * 2 >= longtext.length) {\n      return [best_longtext_a, best_longtext_b,\n              best_shorttext_a, best_shorttext_b, best_common];\n    } else {\n      return null;\n    }\n  }\n\n  // First check if the second quarter is the seed for a half-match.\n  var hm1 = diff_halfMatchI_(longtext, shorttext,\n                             Math.ceil(longtext.length / 4));\n  // Check again based on the third quarter.\n  var hm2 = diff_halfMatchI_(longtext, shorttext,\n                             Math.ceil(longtext.length / 2));\n  var hm;\n  if (!hm1 && !hm2) {\n    return null;\n  } else if (!hm2) {\n    hm = hm1;\n  } else if (!hm1) {\n    hm = hm2;\n  } else {\n    // Both matched.  Select the longest.\n    hm = hm1[4].length > hm2[4].length ? hm1 : hm2;\n  }\n\n  // A half-match was found, sort out the return data.\n  var text1_a, text1_b, text2_a, text2_b;\n  if (text1.length > text2.length) {\n    text1_a = hm[0];\n    text1_b = hm[1];\n    text2_a = hm[2];\n    text2_b = hm[3];\n  } else {\n    text2_a = hm[0];\n    text2_b = hm[1];\n    text1_a = hm[2];\n    text1_b = hm[3];\n  }\n  var mid_common = hm[4];\n  return [text1_a, text1_b, text2_a, text2_b, mid_common];\n};\n\n\n/**\n * Reorder and merge like edit sections.  Merge equalities.\n * Any edit section can move as long as it doesn't cross an equality.\n * @param {Array} diffs Array of diff tuples.\n */\nfunction diff_cleanupMerge(diffs) {\n  diffs.push([DIFF_EQUAL, '']);  // Add a dummy entry at the end.\n  var pointer = 0;\n  var count_delete = 0;\n  var count_insert = 0;\n  var text_delete = '';\n  var text_insert = '';\n  var commonlength;\n  while (pointer < diffs.length) {\n    switch (diffs[pointer][0]) {\n      case DIFF_INSERT:\n        count_insert++;\n        text_insert += diffs[pointer][1];\n        pointer++;\n        break;\n      case DIFF_DELETE:\n        count_delete++;\n        text_delete += diffs[pointer][1];\n        pointer++;\n        break;\n      case DIFF_EQUAL:\n        // Upon reaching an equality, check for prior redundancies.\n        if (count_delete + count_insert > 1) {\n          if (count_delete !== 0 && count_insert !== 0) {\n            // Factor out any common prefixies.\n            commonlength = diff_commonPrefix(text_insert, text_delete);\n            if (commonlength !== 0) {\n              if ((pointer - count_delete - count_insert) > 0 &&\n                  diffs[pointer - count_delete - count_insert - 1][0] ==\n                  DIFF_EQUAL) {\n                diffs[pointer - count_delete - count_insert - 1][1] +=\n                    text_insert.substring(0, commonlength);\n              } else {\n                diffs.splice(0, 0, [DIFF_EQUAL,\n                                    text_insert.substring(0, commonlength)]);\n                pointer++;\n              }\n              text_insert = text_insert.substring(commonlength);\n              text_delete = text_delete.substring(commonlength);\n            }\n            // Factor out any common suffixies.\n            commonlength = diff_commonSuffix(text_insert, text_delete);\n            if (commonlength !== 0) {\n              diffs[pointer][1] = text_insert.substring(text_insert.length -\n                  commonlength) + diffs[pointer][1];\n              text_insert = text_insert.substring(0, text_insert.length -\n                  commonlength);\n              text_delete = text_delete.substring(0, text_delete.length -\n                  commonlength);\n            }\n          }\n          // Delete the offending records and add the merged ones.\n          if (count_delete === 0) {\n            diffs.splice(pointer - count_insert,\n                count_delete + count_insert, [DIFF_INSERT, text_insert]);\n          } else if (count_insert === 0) {\n            diffs.splice(pointer - count_delete,\n                count_delete + count_insert, [DIFF_DELETE, text_delete]);\n          } else {\n            diffs.splice(pointer - count_delete - count_insert,\n                count_delete + count_insert, [DIFF_DELETE, text_delete],\n                [DIFF_INSERT, text_insert]);\n          }\n          pointer = pointer - count_delete - count_insert +\n                    (count_delete ? 1 : 0) + (count_insert ? 1 : 0) + 1;\n        } else if (pointer !== 0 && diffs[pointer - 1][0] == DIFF_EQUAL) {\n          // Merge this equality with the previous one.\n          diffs[pointer - 1][1] += diffs[pointer][1];\n          diffs.splice(pointer, 1);\n        } else {\n          pointer++;\n        }\n        count_insert = 0;\n        count_delete = 0;\n        text_delete = '';\n        text_insert = '';\n        break;\n    }\n  }\n  if (diffs[diffs.length - 1][1] === '') {\n    diffs.pop();  // Remove the dummy entry at the end.\n  }\n\n  // Second pass: look for single edits surrounded on both sides by equalities\n  // which can be shifted sideways to eliminate an equality.\n  // e.g: A<ins>BA</ins>C -> <ins>AB</ins>AC\n  var changes = false;\n  pointer = 1;\n  // Intentionally ignore the first and last element (don't need checking).\n  while (pointer < diffs.length - 1) {\n    if (diffs[pointer - 1][0] == DIFF_EQUAL &&\n        diffs[pointer + 1][0] == DIFF_EQUAL) {\n      // This is a single edit surrounded by equalities.\n      if (diffs[pointer][1].substring(diffs[pointer][1].length -\n          diffs[pointer - 1][1].length) == diffs[pointer - 1][1]) {\n        // Shift the edit over the previous equality.\n        diffs[pointer][1] = diffs[pointer - 1][1] +\n            diffs[pointer][1].substring(0, diffs[pointer][1].length -\n                                        diffs[pointer - 1][1].length);\n        diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];\n        diffs.splice(pointer - 1, 1);\n        changes = true;\n      } else if (diffs[pointer][1].substring(0, diffs[pointer + 1][1].length) ==\n          diffs[pointer + 1][1]) {\n        // Shift the edit over the next equality.\n        diffs[pointer - 1][1] += diffs[pointer + 1][1];\n        diffs[pointer][1] =\n            diffs[pointer][1].substring(diffs[pointer + 1][1].length) +\n            diffs[pointer + 1][1];\n        diffs.splice(pointer + 1, 1);\n        changes = true;\n      }\n    }\n    pointer++;\n  }\n  // If shifts were made, the diff needs reordering and another shift sweep.\n  if (changes) {\n    diff_cleanupMerge(diffs);\n  }\n};\n\n\nvar diff = diff_main;\ndiff.INSERT = DIFF_INSERT;\ndiff.DELETE = DIFF_DELETE;\ndiff.EQUAL = DIFF_EQUAL;\n\nmodule.exports = diff;\n\n/*\n * Modify a diff such that the cursor position points to the start of a change:\n * E.g.\n *   cursor_normalize_diff([[DIFF_EQUAL, 'abc']], 1)\n *     => [1, [[DIFF_EQUAL, 'a'], [DIFF_EQUAL, 'bc']]]\n *   cursor_normalize_diff([[DIFF_INSERT, 'new'], [DIFF_DELETE, 'xyz']], 2)\n *     => [2, [[DIFF_INSERT, 'new'], [DIFF_DELETE, 'xy'], [DIFF_DELETE, 'z']]]\n *\n * @param {Array} diffs Array of diff tuples\n * @param {Int} cursor_pos Suggested edit position. Must not be out of bounds!\n * @return {Array} A tuple [cursor location in the modified diff, modified diff]\n */\nfunction cursor_normalize_diff (diffs, cursor_pos) {\n  if (cursor_pos === 0) {\n    return [DIFF_EQUAL, diffs];\n  }\n  for (var current_pos = 0, i = 0; i < diffs.length; i++) {\n    var d = diffs[i];\n    if (d[0] === DIFF_DELETE || d[0] === DIFF_EQUAL) {\n      var next_pos = current_pos + d[1].length;\n      if (cursor_pos === next_pos) {\n        return [i + 1, diffs];\n      } else if (cursor_pos < next_pos) {\n        // copy to prevent side effects\n        diffs = diffs.slice();\n        // split d into two diff changes\n        var split_pos = cursor_pos - current_pos;\n        var d_left = [d[0], d[1].slice(0, split_pos)];\n        var d_right = [d[0], d[1].slice(split_pos)];\n        diffs.splice(i, 1, d_left, d_right);\n        return [i + 1, diffs];\n      } else {\n        current_pos = next_pos;\n      }\n    }\n  }\n  throw new Error('cursor_pos is out of bounds!')\n}\n\n/*\n * Modify a diff such that the edit position is \"shifted\" to the proposed edit location (cursor_position).\n *\n * Case 1)\n *   Check if a naive shift is possible:\n *     [0, X], [ 1, Y] -> [ 1, Y], [0, X]    (if X + Y === Y + X)\n *     [0, X], [-1, Y] -> [-1, Y], [0, X]    (if X + Y === Y + X) - holds same result\n * Case 2)\n *   Check if the following shifts are possible:\n *     [0, 'pre'], [ 1, 'prefix'] -> [ 1, 'pre'], [0, 'pre'], [ 1, 'fix']\n *     [0, 'pre'], [-1, 'prefix'] -> [-1, 'pre'], [0, 'pre'], [-1, 'fix']\n *         ^            ^\n *         d          d_next\n *\n * @param {Array} diffs Array of diff tuples\n * @param {Int} cursor_pos Suggested edit position. Must not be out of bounds!\n * @return {Array} Array of diff tuples\n */\nfunction fix_cursor (diffs, cursor_pos) {\n  var norm = cursor_normalize_diff(diffs, cursor_pos);\n  var ndiffs = norm[1];\n  var cursor_pointer = norm[0];\n  var d = ndiffs[cursor_pointer];\n  var d_next = ndiffs[cursor_pointer + 1];\n\n  if (d == null) {\n    // Text was deleted from end of original string,\n    // cursor is now out of bounds in new string\n    return diffs;\n  } else if (d[0] !== DIFF_EQUAL) {\n    // A modification happened at the cursor location.\n    // This is the expected outcome, so we can return the original diff.\n    return diffs;\n  } else {\n    if (d_next != null && d[1] + d_next[1] === d_next[1] + d[1]) {\n      // Case 1)\n      // It is possible to perform a naive shift\n      ndiffs.splice(cursor_pointer, 2, d_next, d)\n      return merge_tuples(ndiffs, cursor_pointer, 2)\n    } else if (d_next != null && d_next[1].indexOf(d[1]) === 0) {\n      // Case 2)\n      // d[1] is a prefix of d_next[1]\n      // We can assume that d_next[0] !== 0, since d[0] === 0\n      // Shift edit locations..\n      ndiffs.splice(cursor_pointer, 2, [d_next[0], d[1]], [0, d[1]]);\n      var suffix = d_next[1].slice(d[1].length);\n      if (suffix.length > 0) {\n        ndiffs.splice(cursor_pointer + 2, 0, [d_next[0], suffix]);\n      }\n      return merge_tuples(ndiffs, cursor_pointer, 3)\n    } else {\n      // Not possible to perform any modification\n      return diffs;\n    }\n  }\n}\n\n/*\n * Check diff did not split surrogate pairs.\n * Ex. [0, '\\uD83D'], [-1, '\\uDC36'], [1, '\\uDC2F'] -> [-1, '\\uD83D\\uDC36'], [1, '\\uD83D\\uDC2F']\n *     '\\uD83D\\uDC36' === '🐶', '\\uD83D\\uDC2F' === '🐯'\n *\n * @param {Array} diffs Array of diff tuples\n * @return {Array} Array of diff tuples\n */\nfunction fix_emoji (diffs) {\n  var compact = false;\n  var starts_with_pair_end = function(str) {\n    return str.charCodeAt(0) >= 0xDC00 && str.charCodeAt(0) <= 0xDFFF;\n  }\n  var ends_with_pair_start = function(str) {\n    return str.charCodeAt(str.length-1) >= 0xD800 && str.charCodeAt(str.length-1) <= 0xDBFF;\n  }\n  for (var i = 2; i < diffs.length; i += 1) {\n    if (diffs[i-2][0] === DIFF_EQUAL && ends_with_pair_start(diffs[i-2][1]) &&\n        diffs[i-1][0] === DIFF_DELETE && starts_with_pair_end(diffs[i-1][1]) &&\n        diffs[i][0] === DIFF_INSERT && starts_with_pair_end(diffs[i][1])) {\n      compact = true;\n\n      diffs[i-1][1] = diffs[i-2][1].slice(-1) + diffs[i-1][1];\n      diffs[i][1] = diffs[i-2][1].slice(-1) + diffs[i][1];\n\n      diffs[i-2][1] = diffs[i-2][1].slice(0, -1);\n    }\n  }\n  if (!compact) {\n    return diffs;\n  }\n  var fixed_diffs = [];\n  for (var i = 0; i < diffs.length; i += 1) {\n    if (diffs[i][1].length > 0) {\n      fixed_diffs.push(diffs[i]);\n    }\n  }\n  return fixed_diffs;\n}\n\n/*\n * Try to merge tuples with their neigbors in a given range.\n * E.g. [0, 'a'], [0, 'b'] -> [0, 'ab']\n *\n * @param {Array} diffs Array of diff tuples.\n * @param {Int} start Position of the first element to merge (diffs[start] is also merged with diffs[start - 1]).\n * @param {Int} length Number of consecutive elements to check.\n * @return {Array} Array of merged diff tuples.\n */\nfunction merge_tuples (diffs, start, length) {\n  // Check from (start-1) to (start+length).\n  for (var i = start + length - 1; i >= 0 && i >= start - 1; i--) {\n    if (i + 1 < diffs.length) {\n      var left_d = diffs[i];\n      var right_d = diffs[i+1];\n      if (left_d[0] === right_d[1]) {\n        diffs.splice(i, 2, [left_d[0], left_d[1] + right_d[1]]);\n      }\n    }\n  }\n  return diffs;\n}\n","'use strict';\n\nvar toStr = Object.prototype.toString;\n\nmodule.exports = function isArguments(value) {\n\tvar str = toStr.call(value);\n\tvar isArgs = str === '[object Arguments]';\n\tif (!isArgs) {\n\t\tisArgs = str !== '[object Array]' &&\n\t\t\tvalue !== null &&\n\t\t\ttypeof value === 'object' &&\n\t\t\ttypeof value.length === 'number' &&\n\t\t\tvalue.length >= 0 &&\n\t\t\ttoStr.call(value.callee) === '[object Function]';\n\t}\n\treturn isArgs;\n};\n","'use strict';\n\nvar keysShim;\nif (!Object.keys) {\n\t// modified from https://github.com/es-shims/es5-shim\n\tvar has = Object.prototype.hasOwnProperty;\n\tvar toStr = Object.prototype.toString;\n\tvar isArgs = require('./isArguments'); // eslint-disable-line global-require\n\tvar isEnumerable = Object.prototype.propertyIsEnumerable;\n\tvar hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString');\n\tvar hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype');\n\tvar dontEnums = [\n\t\t'toString',\n\t\t'toLocaleString',\n\t\t'valueOf',\n\t\t'hasOwnProperty',\n\t\t'isPrototypeOf',\n\t\t'propertyIsEnumerable',\n\t\t'constructor'\n\t];\n\tvar equalsConstructorPrototype = function (o) {\n\t\tvar ctor = o.constructor;\n\t\treturn ctor && ctor.prototype === o;\n\t};\n\tvar excludedKeys = {\n\t\t$applicationCache: true,\n\t\t$console: true,\n\t\t$external: true,\n\t\t$frame: true,\n\t\t$frameElement: true,\n\t\t$frames: true,\n\t\t$innerHeight: true,\n\t\t$innerWidth: true,\n\t\t$onmozfullscreenchange: true,\n\t\t$onmozfullscreenerror: true,\n\t\t$outerHeight: true,\n\t\t$outerWidth: true,\n\t\t$pageXOffset: true,\n\t\t$pageYOffset: true,\n\t\t$parent: true,\n\t\t$scrollLeft: true,\n\t\t$scrollTop: true,\n\t\t$scrollX: true,\n\t\t$scrollY: true,\n\t\t$self: true,\n\t\t$webkitIndexedDB: true,\n\t\t$webkitStorageInfo: true,\n\t\t$window: true\n\t};\n\tvar hasAutomationEqualityBug = (function () {\n\t\t/* global window */\n\t\tif (typeof window === 'undefined') { return false; }\n\t\tfor (var k in window) {\n\t\t\ttry {\n\t\t\t\tif (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tequalsConstructorPrototype(window[k]);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}());\n\tvar equalsConstructorPrototypeIfNotBuggy = function (o) {\n\t\t/* global window */\n\t\tif (typeof window === 'undefined' || !hasAutomationEqualityBug) {\n\t\t\treturn equalsConstructorPrototype(o);\n\t\t}\n\t\ttry {\n\t\t\treturn equalsConstructorPrototype(o);\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t}\n\t};\n\n\tkeysShim = function keys(object) {\n\t\tvar isObject = object !== null && typeof object === 'object';\n\t\tvar isFunction = toStr.call(object) === '[object Function]';\n\t\tvar isArguments = isArgs(object);\n\t\tvar isString = isObject && toStr.call(object) === '[object String]';\n\t\tvar theKeys = [];\n\n\t\tif (!isObject && !isFunction && !isArguments) {\n\t\t\tthrow new TypeError('Object.keys called on a non-object');\n\t\t}\n\n\t\tvar skipProto = hasProtoEnumBug && isFunction;\n\t\tif (isString && object.length > 0 && !has.call(object, 0)) {\n\t\t\tfor (var i = 0; i < object.length; ++i) {\n\t\t\t\ttheKeys.push(String(i));\n\t\t\t}\n\t\t}\n\n\t\tif (isArguments && object.length > 0) {\n\t\t\tfor (var j = 0; j < object.length; ++j) {\n\t\t\t\ttheKeys.push(String(j));\n\t\t\t}\n\t\t} else {\n\t\t\tfor (var name in object) {\n\t\t\t\tif (!(skipProto && name === 'prototype') && has.call(object, name)) {\n\t\t\t\t\ttheKeys.push(String(name));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (hasDontEnumBug) {\n\t\t\tvar skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);\n\n\t\t\tfor (var k = 0; k < dontEnums.length; ++k) {\n\t\t\t\tif (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {\n\t\t\t\t\ttheKeys.push(dontEnums[k]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn theKeys;\n\t};\n}\nmodule.exports = keysShim;\n","'use strict';\n\nvar slice = Array.prototype.slice;\nvar isArgs = require('./isArguments');\n\nvar origKeys = Object.keys;\nvar keysShim = origKeys ? function keys(o) { return origKeys(o); } : require('./implementation');\n\nvar originalKeys = Object.keys;\n\nkeysShim.shim = function shimObjectKeys() {\n\tif (Object.keys) {\n\t\tvar keysWorksWithArguments = (function () {\n\t\t\t// Safari 5.0 bug\n\t\t\tvar args = Object.keys(arguments);\n\t\t\treturn args && args.length === arguments.length;\n\t\t}(1, 2));\n\t\tif (!keysWorksWithArguments) {\n\t\t\tObject.keys = function keys(object) { // eslint-disable-line func-name-matching\n\t\t\t\tif (isArgs(object)) {\n\t\t\t\t\treturn originalKeys(slice.call(object));\n\t\t\t\t}\n\t\t\t\treturn originalKeys(object);\n\t\t\t};\n\t\t}\n\t} else {\n\t\tObject.keys = keysShim;\n\t}\n\treturn Object.keys || keysShim;\n};\n\nmodule.exports = keysShim;\n","'use strict';\n\n/* eslint complexity: [2, 18], max-statements: [2, 33] */\nmodule.exports = function hasSymbols() {\n\tif (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }\n\tif (typeof Symbol.iterator === 'symbol') { return true; }\n\n\tvar obj = {};\n\tvar sym = Symbol('test');\n\tvar symObj = Object(sym);\n\tif (typeof sym === 'string') { return false; }\n\n\tif (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }\n\tif (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }\n\n\t// temp disabled per https://github.com/ljharb/object.assign/issues/17\n\t// if (sym instanceof Symbol) { return false; }\n\t// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4\n\t// if (!(symObj instanceof Symbol)) { return false; }\n\n\t// if (typeof Symbol.prototype.toString !== 'function') { return false; }\n\t// if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }\n\n\tvar symVal = 42;\n\tobj[sym] = symVal;\n\tfor (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax, no-unreachable-loop\n\tif (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }\n\n\tif (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }\n\n\tvar syms = Object.getOwnPropertySymbols(obj);\n\tif (syms.length !== 1 || syms[0] !== sym) { return false; }\n\n\tif (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }\n\n\tif (typeof Object.getOwnPropertyDescriptor === 'function') {\n\t\tvar descriptor = Object.getOwnPropertyDescriptor(obj, sym);\n\t\tif (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }\n\t}\n\n\treturn true;\n};\n","'use strict';\n\nvar hasSymbols = require('has-symbols/shams');\n\nmodule.exports = function hasToStringTagShams() {\n\treturn hasSymbols() && !!Symbol.toStringTag;\n};\n","'use strict';\n\nvar origSymbol = typeof Symbol !== 'undefined' && Symbol;\nvar hasSymbolSham = require('./shams');\n\nmodule.exports = function hasNativeSymbols() {\n\tif (typeof origSymbol !== 'function') { return false; }\n\tif (typeof Symbol !== 'function') { return false; }\n\tif (typeof origSymbol('foo') !== 'symbol') { return false; }\n\tif (typeof Symbol('bar') !== 'symbol') { return false; }\n\n\treturn hasSymbolSham();\n};\n","'use strict';\n\n/* eslint no-invalid-this: 1 */\n\nvar ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';\nvar slice = Array.prototype.slice;\nvar toStr = Object.prototype.toString;\nvar funcType = '[object Function]';\n\nmodule.exports = function bind(that) {\n    var target = this;\n    if (typeof target !== 'function' || toStr.call(target) !== funcType) {\n        throw new TypeError(ERROR_MESSAGE + target);\n    }\n    var args = slice.call(arguments, 1);\n\n    var bound;\n    var binder = function () {\n        if (this instanceof bound) {\n            var result = target.apply(\n                this,\n                args.concat(slice.call(arguments))\n            );\n            if (Object(result) === result) {\n                return result;\n            }\n            return this;\n        } else {\n            return target.apply(\n                that,\n                args.concat(slice.call(arguments))\n            );\n        }\n    };\n\n    var boundLength = Math.max(0, target.length - args.length);\n    var boundArgs = [];\n    for (var i = 0; i < boundLength; i++) {\n        boundArgs.push('$' + i);\n    }\n\n    bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);\n\n    if (target.prototype) {\n        var Empty = function Empty() {};\n        Empty.prototype = target.prototype;\n        bound.prototype = new Empty();\n        Empty.prototype = null;\n    }\n\n    return bound;\n};\n","'use strict';\n\nvar implementation = require('./implementation');\n\nmodule.exports = Function.prototype.bind || implementation;\n","'use strict';\n\n/* eslint no-invalid-this: 1 */\n\nvar ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';\nvar slice = Array.prototype.slice;\nvar toStr = Object.prototype.toString;\nvar funcType = '[object Function]';\n\nmodule.exports = function bind(that) {\n    var target = this;\n    if (typeof target !== 'function' || toStr.call(target) !== funcType) {\n        throw new TypeError(ERROR_MESSAGE + target);\n    }\n    var args = slice.call(arguments, 1);\n\n    var bound;\n    var binder = function () {\n        if (this instanceof bound) {\n            var result = target.apply(\n                this,\n                args.concat(slice.call(arguments))\n            );\n            if (Object(result) === result) {\n                return result;\n            }\n            return this;\n        } else {\n            return target.apply(\n                that,\n                args.concat(slice.call(arguments))\n            );\n        }\n    };\n\n    var boundLength = Math.max(0, target.length - args.length);\n    var boundArgs = [];\n    for (var i = 0; i < boundLength; i++) {\n        boundArgs.push('$' + i);\n    }\n\n    bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);\n\n    if (target.prototype) {\n        var Empty = function Empty() {};\n        Empty.prototype = target.prototype;\n        bound.prototype = new Empty();\n        Empty.prototype = null;\n    }\n\n    return bound;\n};\n","'use strict';\n\nvar implementation = require('./implementation');\n\nmodule.exports = Function.prototype.bind || implementation;\n","'use strict';\n\nvar bind = require('function-bind');\n\nmodule.exports = bind.call(Function.call, Object.prototype.hasOwnProperty);\n","'use strict';\n\nvar undefined;\n\nvar $SyntaxError = SyntaxError;\nvar $Function = Function;\nvar $TypeError = TypeError;\n\n// eslint-disable-next-line consistent-return\nvar getEvalledConstructor = function (expressionSyntax) {\n\ttry {\n\t\treturn $Function('\"use strict\"; return (' + expressionSyntax + ').constructor;')();\n\t} catch (e) {}\n};\n\nvar $gOPD = Object.getOwnPropertyDescriptor;\nif ($gOPD) {\n\ttry {\n\t\t$gOPD({}, '');\n\t} catch (e) {\n\t\t$gOPD = null; // this is IE 8, which has a broken gOPD\n\t}\n}\n\nvar throwTypeError = function () {\n\tthrow new $TypeError();\n};\nvar ThrowTypeError = $gOPD\n\t? (function () {\n\t\ttry {\n\t\t\t// eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties\n\t\t\targuments.callee; // IE 8 does not throw here\n\t\t\treturn throwTypeError;\n\t\t} catch (calleeThrows) {\n\t\t\ttry {\n\t\t\t\t// IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '')\n\t\t\t\treturn $gOPD(arguments, 'callee').get;\n\t\t\t} catch (gOPDthrows) {\n\t\t\t\treturn throwTypeError;\n\t\t\t}\n\t\t}\n\t}())\n\t: throwTypeError;\n\nvar hasSymbols = require('has-symbols')();\n\nvar getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-proto\n\nvar needsEval = {};\n\nvar TypedArray = typeof Uint8Array === 'undefined' ? undefined : getProto(Uint8Array);\n\nvar INTRINSICS = {\n\t'%AggregateError%': typeof AggregateError === 'undefined' ? undefined : AggregateError,\n\t'%Array%': Array,\n\t'%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer,\n\t'%ArrayIteratorPrototype%': hasSymbols ? getProto([][Symbol.iterator]()) : undefined,\n\t'%AsyncFromSyncIteratorPrototype%': undefined,\n\t'%AsyncFunction%': needsEval,\n\t'%AsyncGenerator%': needsEval,\n\t'%AsyncGeneratorFunction%': needsEval,\n\t'%AsyncIteratorPrototype%': needsEval,\n\t'%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics,\n\t'%BigInt%': typeof BigInt === 'undefined' ? undefined : BigInt,\n\t'%BigInt64Array%': typeof BigInt64Array === 'undefined' ? undefined : BigInt64Array,\n\t'%BigUint64Array%': typeof BigUint64Array === 'undefined' ? undefined : BigUint64Array,\n\t'%Boolean%': Boolean,\n\t'%DataView%': typeof DataView === 'undefined' ? undefined : DataView,\n\t'%Date%': Date,\n\t'%decodeURI%': decodeURI,\n\t'%decodeURIComponent%': decodeURIComponent,\n\t'%encodeURI%': encodeURI,\n\t'%encodeURIComponent%': encodeURIComponent,\n\t'%Error%': Error,\n\t'%eval%': eval, // eslint-disable-line no-eval\n\t'%EvalError%': EvalError,\n\t'%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array,\n\t'%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array,\n\t'%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined : FinalizationRegistry,\n\t'%Function%': $Function,\n\t'%GeneratorFunction%': needsEval,\n\t'%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array,\n\t'%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array,\n\t'%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array,\n\t'%isFinite%': isFinite,\n\t'%isNaN%': isNaN,\n\t'%IteratorPrototype%': hasSymbols ? getProto(getProto([][Symbol.iterator]())) : undefined,\n\t'%JSON%': typeof JSON === 'object' ? JSON : undefined,\n\t'%Map%': typeof Map === 'undefined' ? undefined : Map,\n\t'%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols ? undefined : getProto(new Map()[Symbol.iterator]()),\n\t'%Math%': Math,\n\t'%Number%': Number,\n\t'%Object%': Object,\n\t'%parseFloat%': parseFloat,\n\t'%parseInt%': parseInt,\n\t'%Promise%': typeof Promise === 'undefined' ? undefined : Promise,\n\t'%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy,\n\t'%RangeError%': RangeError,\n\t'%ReferenceError%': ReferenceError,\n\t'%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect,\n\t'%RegExp%': RegExp,\n\t'%Set%': typeof Set === 'undefined' ? undefined : Set,\n\t'%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols ? undefined : getProto(new Set()[Symbol.iterator]()),\n\t'%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer,\n\t'%String%': String,\n\t'%StringIteratorPrototype%': hasSymbols ? getProto(''[Symbol.iterator]()) : undefined,\n\t'%Symbol%': hasSymbols ? Symbol : undefined,\n\t'%SyntaxError%': $SyntaxError,\n\t'%ThrowTypeError%': ThrowTypeError,\n\t'%TypedArray%': TypedArray,\n\t'%TypeError%': $TypeError,\n\t'%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array,\n\t'%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray,\n\t'%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array,\n\t'%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array,\n\t'%URIError%': URIError,\n\t'%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap,\n\t'%WeakRef%': typeof WeakRef === 'undefined' ? undefined : WeakRef,\n\t'%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet\n};\n\ntry {\n\tnull.error; // eslint-disable-line no-unused-expressions\n} catch (e) {\n\t// https://github.com/tc39/proposal-shadowrealm/pull/384#issuecomment-1364264229\n\tvar errorProto = getProto(getProto(e));\n\tINTRINSICS['%Error.prototype%'] = errorProto;\n}\n\nvar doEval = function doEval(name) {\n\tvar value;\n\tif (name === '%AsyncFunction%') {\n\t\tvalue = getEvalledConstructor('async function () {}');\n\t} else if (name === '%GeneratorFunction%') {\n\t\tvalue = getEvalledConstructor('function* () {}');\n\t} else if (name === '%AsyncGeneratorFunction%') {\n\t\tvalue = getEvalledConstructor('async function* () {}');\n\t} else if (name === '%AsyncGenerator%') {\n\t\tvar fn = doEval('%AsyncGeneratorFunction%');\n\t\tif (fn) {\n\t\t\tvalue = fn.prototype;\n\t\t}\n\t} else if (name === '%AsyncIteratorPrototype%') {\n\t\tvar gen = doEval('%AsyncGenerator%');\n\t\tif (gen) {\n\t\t\tvalue = getProto(gen.prototype);\n\t\t}\n\t}\n\n\tINTRINSICS[name] = value;\n\n\treturn value;\n};\n\nvar LEGACY_ALIASES = {\n\t'%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'],\n\t'%ArrayPrototype%': ['Array', 'prototype'],\n\t'%ArrayProto_entries%': ['Array', 'prototype', 'entries'],\n\t'%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'],\n\t'%ArrayProto_keys%': ['Array', 'prototype', 'keys'],\n\t'%ArrayProto_values%': ['Array', 'prototype', 'values'],\n\t'%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'],\n\t'%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'],\n\t'%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'],\n\t'%BooleanPrototype%': ['Boolean', 'prototype'],\n\t'%DataViewPrototype%': ['DataView', 'prototype'],\n\t'%DatePrototype%': ['Date', 'prototype'],\n\t'%ErrorPrototype%': ['Error', 'prototype'],\n\t'%EvalErrorPrototype%': ['EvalError', 'prototype'],\n\t'%Float32ArrayPrototype%': ['Float32Array', 'prototype'],\n\t'%Float64ArrayPrototype%': ['Float64Array', 'prototype'],\n\t'%FunctionPrototype%': ['Function', 'prototype'],\n\t'%Generator%': ['GeneratorFunction', 'prototype'],\n\t'%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'],\n\t'%Int8ArrayPrototype%': ['Int8Array', 'prototype'],\n\t'%Int16ArrayPrototype%': ['Int16Array', 'prototype'],\n\t'%Int32ArrayPrototype%': ['Int32Array', 'prototype'],\n\t'%JSONParse%': ['JSON', 'parse'],\n\t'%JSONStringify%': ['JSON', 'stringify'],\n\t'%MapPrototype%': ['Map', 'prototype'],\n\t'%NumberPrototype%': ['Number', 'prototype'],\n\t'%ObjectPrototype%': ['Object', 'prototype'],\n\t'%ObjProto_toString%': ['Object', 'prototype', 'toString'],\n\t'%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'],\n\t'%PromisePrototype%': ['Promise', 'prototype'],\n\t'%PromiseProto_then%': ['Promise', 'prototype', 'then'],\n\t'%Promise_all%': ['Promise', 'all'],\n\t'%Promise_reject%': ['Promise', 'reject'],\n\t'%Promise_resolve%': ['Promise', 'resolve'],\n\t'%RangeErrorPrototype%': ['RangeError', 'prototype'],\n\t'%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'],\n\t'%RegExpPrototype%': ['RegExp', 'prototype'],\n\t'%SetPrototype%': ['Set', 'prototype'],\n\t'%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'],\n\t'%StringPrototype%': ['String', 'prototype'],\n\t'%SymbolPrototype%': ['Symbol', 'prototype'],\n\t'%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'],\n\t'%TypedArrayPrototype%': ['TypedArray', 'prototype'],\n\t'%TypeErrorPrototype%': ['TypeError', 'prototype'],\n\t'%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'],\n\t'%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'],\n\t'%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'],\n\t'%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'],\n\t'%URIErrorPrototype%': ['URIError', 'prototype'],\n\t'%WeakMapPrototype%': ['WeakMap', 'prototype'],\n\t'%WeakSetPrototype%': ['WeakSet', 'prototype']\n};\n\nvar bind = require('function-bind');\nvar hasOwn = require('has');\nvar $concat = bind.call(Function.call, Array.prototype.concat);\nvar $spliceApply = bind.call(Function.apply, Array.prototype.splice);\nvar $replace = bind.call(Function.call, String.prototype.replace);\nvar $strSlice = bind.call(Function.call, String.prototype.slice);\nvar $exec = bind.call(Function.call, RegExp.prototype.exec);\n\n/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */\nvar rePropName = /[^%.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|%$))/g;\nvar reEscapeChar = /\\\\(\\\\)?/g; /** Used to match backslashes in property paths. */\nvar stringToPath = function stringToPath(string) {\n\tvar first = $strSlice(string, 0, 1);\n\tvar last = $strSlice(string, -1);\n\tif (first === '%' && last !== '%') {\n\t\tthrow new $SyntaxError('invalid intrinsic syntax, expected closing `%`');\n\t} else if (last === '%' && first !== '%') {\n\t\tthrow new $SyntaxError('invalid intrinsic syntax, expected opening `%`');\n\t}\n\tvar result = [];\n\t$replace(string, rePropName, function (match, number, quote, subString) {\n\t\tresult[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match;\n\t});\n\treturn result;\n};\n/* end adaptation */\n\nvar getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) {\n\tvar intrinsicName = name;\n\tvar alias;\n\tif (hasOwn(LEGACY_ALIASES, intrinsicName)) {\n\t\talias = LEGACY_ALIASES[intrinsicName];\n\t\tintrinsicName = '%' + alias[0] + '%';\n\t}\n\n\tif (hasOwn(INTRINSICS, intrinsicName)) {\n\t\tvar value = INTRINSICS[intrinsicName];\n\t\tif (value === needsEval) {\n\t\t\tvalue = doEval(intrinsicName);\n\t\t}\n\t\tif (typeof value === 'undefined' && !allowMissing) {\n\t\t\tthrow new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');\n\t\t}\n\n\t\treturn {\n\t\t\talias: alias,\n\t\t\tname: intrinsicName,\n\t\t\tvalue: value\n\t\t};\n\t}\n\n\tthrow new $SyntaxError('intrinsic ' + name + ' does not exist!');\n};\n\nmodule.exports = function GetIntrinsic(name, allowMissing) {\n\tif (typeof name !== 'string' || name.length === 0) {\n\t\tthrow new $TypeError('intrinsic name must be a non-empty string');\n\t}\n\tif (arguments.length > 1 && typeof allowMissing !== 'boolean') {\n\t\tthrow new $TypeError('\"allowMissing\" argument must be a boolean');\n\t}\n\n\tif ($exec(/^%?[^%]*%?$/, name) === null) {\n\t\tthrow new $SyntaxError('`%` may not be present anywhere but at the beginning and end of the intrinsic name');\n\t}\n\tvar parts = stringToPath(name);\n\tvar intrinsicBaseName = parts.length > 0 ? parts[0] : '';\n\n\tvar intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing);\n\tvar intrinsicRealName = intrinsic.name;\n\tvar value = intrinsic.value;\n\tvar skipFurtherCaching = false;\n\n\tvar alias = intrinsic.alias;\n\tif (alias) {\n\t\tintrinsicBaseName = alias[0];\n\t\t$spliceApply(parts, $concat([0, 1], alias));\n\t}\n\n\tfor (var i = 1, isOwn = true; i < parts.length; i += 1) {\n\t\tvar part = parts[i];\n\t\tvar first = $strSlice(part, 0, 1);\n\t\tvar last = $strSlice(part, -1);\n\t\tif (\n\t\t\t(\n\t\t\t\t(first === '\"' || first === \"'\" || first === '`')\n\t\t\t\t|| (last === '\"' || last === \"'\" || last === '`')\n\t\t\t)\n\t\t\t&& first !== last\n\t\t) {\n\t\t\tthrow new $SyntaxError('property names with quotes must have matching quotes');\n\t\t}\n\t\tif (part === 'constructor' || !isOwn) {\n\t\t\tskipFurtherCaching = true;\n\t\t}\n\n\t\tintrinsicBaseName += '.' + part;\n\t\tintrinsicRealName = '%' + intrinsicBaseName + '%';\n\n\t\tif (hasOwn(INTRINSICS, intrinsicRealName)) {\n\t\t\tvalue = INTRINSICS[intrinsicRealName];\n\t\t} else if (value != null) {\n\t\t\tif (!(part in value)) {\n\t\t\t\tif (!allowMissing) {\n\t\t\t\t\tthrow new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.');\n\t\t\t\t}\n\t\t\t\treturn void undefined;\n\t\t\t}\n\t\t\tif ($gOPD && (i + 1) >= parts.length) {\n\t\t\t\tvar desc = $gOPD(value, part);\n\t\t\t\tisOwn = !!desc;\n\n\t\t\t\t// By convention, when a data property is converted to an accessor\n\t\t\t\t// property to emulate a data property that does not suffer from\n\t\t\t\t// the override mistake, that accessor's getter is marked with\n\t\t\t\t// an `originalValue` property. Here, when we detect this, we\n\t\t\t\t// uphold the illusion by pretending to see that original data\n\t\t\t\t// property, i.e., returning the value rather than the getter\n\t\t\t\t// itself.\n\t\t\t\tif (isOwn && 'get' in desc && !('originalValue' in desc.get)) {\n\t\t\t\t\tvalue = desc.get;\n\t\t\t\t} else {\n\t\t\t\t\tvalue = value[part];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tisOwn = hasOwn(value, part);\n\t\t\t\tvalue = value[part];\n\t\t\t}\n\n\t\t\tif (isOwn && !skipFurtherCaching) {\n\t\t\t\tINTRINSICS[intrinsicRealName] = value;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n","'use strict';\n\n/* eslint no-invalid-this: 1 */\n\nvar ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';\nvar slice = Array.prototype.slice;\nvar toStr = Object.prototype.toString;\nvar funcType = '[object Function]';\n\nmodule.exports = function bind(that) {\n    var target = this;\n    if (typeof target !== 'function' || toStr.call(target) !== funcType) {\n        throw new TypeError(ERROR_MESSAGE + target);\n    }\n    var args = slice.call(arguments, 1);\n\n    var bound;\n    var binder = function () {\n        if (this instanceof bound) {\n            var result = target.apply(\n                this,\n                args.concat(slice.call(arguments))\n            );\n            if (Object(result) === result) {\n                return result;\n            }\n            return this;\n        } else {\n            return target.apply(\n                that,\n                args.concat(slice.call(arguments))\n            );\n        }\n    };\n\n    var boundLength = Math.max(0, target.length - args.length);\n    var boundArgs = [];\n    for (var i = 0; i < boundLength; i++) {\n        boundArgs.push('$' + i);\n    }\n\n    bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);\n\n    if (target.prototype) {\n        var Empty = function Empty() {};\n        Empty.prototype = target.prototype;\n        bound.prototype = new Empty();\n        Empty.prototype = null;\n    }\n\n    return bound;\n};\n","'use strict';\n\nvar implementation = require('./implementation');\n\nmodule.exports = Function.prototype.bind || implementation;\n","'use strict';\n\nvar bind = require('function-bind');\nvar GetIntrinsic = require('get-intrinsic');\n\nvar $apply = GetIntrinsic('%Function.prototype.apply%');\nvar $call = GetIntrinsic('%Function.prototype.call%');\nvar $reflectApply = GetIntrinsic('%Reflect.apply%', true) || bind.call($call, $apply);\n\nvar $gOPD = GetIntrinsic('%Object.getOwnPropertyDescriptor%', true);\nvar $defineProperty = GetIntrinsic('%Object.defineProperty%', true);\nvar $max = GetIntrinsic('%Math.max%');\n\nif ($defineProperty) {\n\ttry {\n\t\t$defineProperty({}, 'a', { value: 1 });\n\t} catch (e) {\n\t\t// IE 8 has a broken defineProperty\n\t\t$defineProperty = null;\n\t}\n}\n\nmodule.exports = function callBind(originalFunction) {\n\tvar func = $reflectApply(bind, $call, arguments);\n\tif ($gOPD && $defineProperty) {\n\t\tvar desc = $gOPD(func, 'length');\n\t\tif (desc.configurable) {\n\t\t\t// original length, plus the receiver, minus any additional arguments (after the receiver)\n\t\t\t$defineProperty(\n\t\t\t\tfunc,\n\t\t\t\t'length',\n\t\t\t\t{ value: 1 + $max(0, originalFunction.length - (arguments.length - 1)) }\n\t\t\t);\n\t\t}\n\t}\n\treturn func;\n};\n\nvar applyBind = function applyBind() {\n\treturn $reflectApply(bind, $apply, arguments);\n};\n\nif ($defineProperty) {\n\t$defineProperty(module.exports, 'apply', { value: applyBind });\n} else {\n\tmodule.exports.apply = applyBind;\n}\n","'use strict';\n\nvar GetIntrinsic = require('get-intrinsic');\n\nvar callBind = require('./');\n\nvar $indexOf = callBind(GetIntrinsic('String.prototype.indexOf'));\n\nmodule.exports = function callBoundIntrinsic(name, allowMissing) {\n\tvar intrinsic = GetIntrinsic(name, !!allowMissing);\n\tif (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) {\n\t\treturn callBind(intrinsic);\n\t}\n\treturn intrinsic;\n};\n","'use strict';\n\nvar hasToStringTag = require('has-tostringtag/shams')();\nvar callBound = require('call-bind/callBound');\n\nvar $toString = callBound('Object.prototype.toString');\n\nvar isStandardArguments = function isArguments(value) {\n\tif (hasToStringTag && value && typeof value === 'object' && Symbol.toStringTag in value) {\n\t\treturn false;\n\t}\n\treturn $toString(value) === '[object Arguments]';\n};\n\nvar isLegacyArguments = function isArguments(value) {\n\tif (isStandardArguments(value)) {\n\t\treturn true;\n\t}\n\treturn value !== null &&\n\t\ttypeof value === 'object' &&\n\t\ttypeof value.length === 'number' &&\n\t\tvalue.length >= 0 &&\n\t\t$toString(value) !== '[object Array]' &&\n\t\t$toString(value.callee) === '[object Function]';\n};\n\nvar supportsStandardArguments = (function () {\n\treturn isStandardArguments(arguments);\n}());\n\nisStandardArguments.isLegacyArguments = isLegacyArguments; // for tests\n\nmodule.exports = supportsStandardArguments ? isStandardArguments : isLegacyArguments;\n","'use strict';\n\nvar GetIntrinsic = require('get-intrinsic');\n\nvar $defineProperty = GetIntrinsic('%Object.defineProperty%', true);\n\nvar hasPropertyDescriptors = function hasPropertyDescriptors() {\n\tif ($defineProperty) {\n\t\ttry {\n\t\t\t$defineProperty({}, 'a', { value: 1 });\n\t\t\treturn true;\n\t\t} catch (e) {\n\t\t\t// IE 8 has a broken defineProperty\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn false;\n};\n\nhasPropertyDescriptors.hasArrayLengthDefineBug = function hasArrayLengthDefineBug() {\n\t// node v0.6 has a bug where array lengths can be Set but not Defined\n\tif (!hasPropertyDescriptors()) {\n\t\treturn null;\n\t}\n\ttry {\n\t\treturn $defineProperty([], 'length', { value: 1 }).length !== 1;\n\t} catch (e) {\n\t\t// In Firefox 4-22, defining length on an array throws an exception.\n\t\treturn true;\n\t}\n};\n\nmodule.exports = hasPropertyDescriptors;\n","'use strict';\n\nvar keys = require('object-keys');\nvar hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol';\n\nvar toStr = Object.prototype.toString;\nvar concat = Array.prototype.concat;\nvar origDefineProperty = Object.defineProperty;\n\nvar isFunction = function (fn) {\n\treturn typeof fn === 'function' && toStr.call(fn) === '[object Function]';\n};\n\nvar hasPropertyDescriptors = require('has-property-descriptors')();\n\nvar supportsDescriptors = origDefineProperty && hasPropertyDescriptors;\n\nvar defineProperty = function (object, name, value, predicate) {\n\tif (name in object) {\n\t\tif (predicate === true) {\n\t\t\tif (object[name] === value) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else if (!isFunction(predicate) || !predicate()) {\n\t\t\treturn;\n\t\t}\n\t}\n\tif (supportsDescriptors) {\n\t\torigDefineProperty(object, name, {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: false,\n\t\t\tvalue: value,\n\t\t\twritable: true\n\t\t});\n\t} else {\n\t\tobject[name] = value; // eslint-disable-line no-param-reassign\n\t}\n};\n\nvar defineProperties = function (object, map) {\n\tvar predicates = arguments.length > 2 ? arguments[2] : {};\n\tvar props = keys(map);\n\tif (hasSymbols) {\n\t\tprops = concat.call(props, Object.getOwnPropertySymbols(map));\n\t}\n\tfor (var i = 0; i < props.length; i += 1) {\n\t\tdefineProperty(object, props[i], map[props[i]], predicates[props[i]]);\n\t}\n};\n\ndefineProperties.supportsDescriptors = !!supportsDescriptors;\n\nmodule.exports = defineProperties;\n","'use strict';\n\nvar numberIsNaN = function (value) {\n\treturn value !== value;\n};\n\nmodule.exports = function is(a, b) {\n\tif (a === 0 && b === 0) {\n\t\treturn 1 / a === 1 / b;\n\t}\n\tif (a === b) {\n\t\treturn true;\n\t}\n\tif (numberIsNaN(a) && numberIsNaN(b)) {\n\t\treturn true;\n\t}\n\treturn false;\n};\n\n","'use strict';\n\nvar implementation = require('./implementation');\n\nmodule.exports = function getPolyfill() {\n\treturn typeof Object.is === 'function' ? Object.is : implementation;\n};\n","'use strict';\n\nvar getPolyfill = require('./polyfill');\nvar define = require('define-properties');\n\nmodule.exports = function shimObjectIs() {\n\tvar polyfill = getPolyfill();\n\tdefine(Object, { is: polyfill }, {\n\t\tis: function testObjectIs() {\n\t\t\treturn Object.is !== polyfill;\n\t\t}\n\t});\n\treturn polyfill;\n};\n","'use strict';\n\nvar define = require('define-properties');\nvar callBind = require('call-bind');\n\nvar implementation = require('./implementation');\nvar getPolyfill = require('./polyfill');\nvar shim = require('./shim');\n\nvar polyfill = callBind(getPolyfill(), Object);\n\ndefine(polyfill, {\n\tgetPolyfill: getPolyfill,\n\timplementation: implementation,\n\tshim: shim\n});\n\nmodule.exports = polyfill;\n","'use strict';\n\nvar callBound = require('call-bind/callBound');\nvar hasToStringTag = require('has-tostringtag/shams')();\nvar has;\nvar $exec;\nvar isRegexMarker;\nvar badStringifier;\n\nif (hasToStringTag) {\n\thas = callBound('Object.prototype.hasOwnProperty');\n\t$exec = callBound('RegExp.prototype.exec');\n\tisRegexMarker = {};\n\n\tvar throwRegexMarker = function () {\n\t\tthrow isRegexMarker;\n\t};\n\tbadStringifier = {\n\t\ttoString: throwRegexMarker,\n\t\tvalueOf: throwRegexMarker\n\t};\n\n\tif (typeof Symbol.toPrimitive === 'symbol') {\n\t\tbadStringifier[Symbol.toPrimitive] = throwRegexMarker;\n\t}\n}\n\nvar $toString = callBound('Object.prototype.toString');\nvar gOPD = Object.getOwnPropertyDescriptor;\nvar regexClass = '[object RegExp]';\n\nmodule.exports = hasToStringTag\n\t// eslint-disable-next-line consistent-return\n\t? function isRegex(value) {\n\t\tif (!value || typeof value !== 'object') {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar descriptor = gOPD(value, 'lastIndex');\n\t\tvar hasLastIndexDataProperty = descriptor && has(descriptor, 'value');\n\t\tif (!hasLastIndexDataProperty) {\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\t$exec(value, badStringifier);\n\t\t} catch (e) {\n\t\t\treturn e === isRegexMarker;\n\t\t}\n\t}\n\t: function isRegex(value) {\n\t\t// In older browsers, typeof regex incorrectly returns 'function'\n\t\tif (!value || (typeof value !== 'object' && typeof value !== 'function')) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn $toString(value) === regexClass;\n\t};\n","'use strict';\n\nvar functionsHaveNames = function functionsHaveNames() {\n\treturn typeof function f() {}.name === 'string';\n};\n\nvar gOPD = Object.getOwnPropertyDescriptor;\nif (gOPD) {\n\ttry {\n\t\tgOPD([], 'length');\n\t} catch (e) {\n\t\t// IE 8 has a broken gOPD\n\t\tgOPD = null;\n\t}\n}\n\nfunctionsHaveNames.functionsHaveConfigurableNames = function functionsHaveConfigurableNames() {\n\tif (!functionsHaveNames() || !gOPD) {\n\t\treturn false;\n\t}\n\tvar desc = gOPD(function () {}, 'name');\n\treturn !!desc && !!desc.configurable;\n};\n\nvar $bind = Function.prototype.bind;\n\nfunctionsHaveNames.boundFunctionsHaveNames = function boundFunctionsHaveNames() {\n\treturn functionsHaveNames() && typeof $bind === 'function' && function f() {}.bind().name !== '';\n};\n\nmodule.exports = functionsHaveNames;\n","'use strict';\n\nvar functionsHaveConfigurableNames = require('functions-have-names').functionsHaveConfigurableNames();\n\nvar $Object = Object;\nvar $TypeError = TypeError;\n\nmodule.exports = function flags() {\n\tif (this != null && this !== $Object(this)) {\n\t\tthrow new $TypeError('RegExp.prototype.flags getter called on non-object');\n\t}\n\tvar result = '';\n\tif (this.hasIndices) {\n\t\tresult += 'd';\n\t}\n\tif (this.global) {\n\t\tresult += 'g';\n\t}\n\tif (this.ignoreCase) {\n\t\tresult += 'i';\n\t}\n\tif (this.multiline) {\n\t\tresult += 'm';\n\t}\n\tif (this.dotAll) {\n\t\tresult += 's';\n\t}\n\tif (this.unicode) {\n\t\tresult += 'u';\n\t}\n\tif (this.sticky) {\n\t\tresult += 'y';\n\t}\n\treturn result;\n};\n\nif (functionsHaveConfigurableNames && Object.defineProperty) {\n\tObject.defineProperty(module.exports, 'name', { value: 'get flags' });\n}\n","'use strict';\n\nvar implementation = require('./implementation');\n\nvar supportsDescriptors = require('define-properties').supportsDescriptors;\nvar $gOPD = Object.getOwnPropertyDescriptor;\n\nmodule.exports = function getPolyfill() {\n\tif (supportsDescriptors && (/a/mig).flags === 'gim') {\n\t\tvar descriptor = $gOPD(RegExp.prototype, 'flags');\n\t\tif (\n\t\t\tdescriptor\n\t\t\t&& typeof descriptor.get === 'function'\n\t\t\t&& typeof RegExp.prototype.dotAll === 'boolean'\n\t\t\t&& typeof RegExp.prototype.hasIndices === 'boolean'\n\t\t) {\n\t\t\t/* eslint getter-return: 0 */\n\t\t\tvar calls = '';\n\t\t\tvar o = {};\n\t\t\tObject.defineProperty(o, 'hasIndices', {\n\t\t\t\tget: function () {\n\t\t\t\t\tcalls += 'd';\n\t\t\t\t}\n\t\t\t});\n\t\t\tObject.defineProperty(o, 'sticky', {\n\t\t\t\tget: function () {\n\t\t\t\t\tcalls += 'y';\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (calls === 'dy') {\n\t\t\t\treturn descriptor.get;\n\t\t\t}\n\t\t}\n\t}\n\treturn implementation;\n};\n","'use strict';\n\nvar supportsDescriptors = require('define-properties').supportsDescriptors;\nvar getPolyfill = require('./polyfill');\nvar gOPD = Object.getOwnPropertyDescriptor;\nvar defineProperty = Object.defineProperty;\nvar TypeErr = TypeError;\nvar getProto = Object.getPrototypeOf;\nvar regex = /a/;\n\nmodule.exports = function shimFlags() {\n\tif (!supportsDescriptors || !getProto) {\n\t\tthrow new TypeErr('RegExp.prototype.flags requires a true ES5 environment that supports property descriptors');\n\t}\n\tvar polyfill = getPolyfill();\n\tvar proto = getProto(regex);\n\tvar descriptor = gOPD(proto, 'flags');\n\tif (!descriptor || descriptor.get !== polyfill) {\n\t\tdefineProperty(proto, 'flags', {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: false,\n\t\t\tget: polyfill\n\t\t});\n\t}\n\treturn polyfill;\n};\n","'use strict';\n\nvar define = require('define-properties');\nvar callBind = require('call-bind');\n\nvar implementation = require('./implementation');\nvar getPolyfill = require('./polyfill');\nvar shim = require('./shim');\n\nvar flagsBound = callBind(getPolyfill());\n\ndefine(flagsBound, {\n\tgetPolyfill: getPolyfill,\n\timplementation: implementation,\n\tshim: shim\n});\n\nmodule.exports = flagsBound;\n","'use strict';\n\nvar getDay = Date.prototype.getDay;\nvar tryDateObject = function tryDateGetDayCall(value) {\n\ttry {\n\t\tgetDay.call(value);\n\t\treturn true;\n\t} catch (e) {\n\t\treturn false;\n\t}\n};\n\nvar toStr = Object.prototype.toString;\nvar dateClass = '[object Date]';\nvar hasToStringTag = require('has-tostringtag/shams')();\n\nmodule.exports = function isDateObject(value) {\n\tif (typeof value !== 'object' || value === null) {\n\t\treturn false;\n\t}\n\treturn hasToStringTag ? tryDateObject(value) : toStr.call(value) === dateClass;\n};\n","var objectKeys = require('object-keys');\nvar isArguments = require('is-arguments');\nvar is = require('object-is');\nvar isRegex = require('is-regex');\nvar flags = require('regexp.prototype.flags');\nvar isDate = require('is-date-object');\n\nvar getTime = Date.prototype.getTime;\n\nfunction deepEqual(actual, expected, options) {\n  var opts = options || {};\n\n  // 7.1. All identical values are equivalent, as determined by ===.\n  if (opts.strict ? is(actual, expected) : actual === expected) {\n    return true;\n  }\n\n  // 7.3. Other pairs that do not both pass typeof value == 'object', equivalence is determined by ==.\n  if (!actual || !expected || (typeof actual !== 'object' && typeof expected !== 'object')) {\n    return opts.strict ? is(actual, expected) : actual == expected;\n  }\n\n  /*\n   * 7.4. For all other Object pairs, including Array objects, equivalence is\n   * determined by having the same number of owned properties (as verified\n   * with Object.prototype.hasOwnProperty.call), the same set of keys\n   * (although not necessarily the same order), equivalent values for every\n   * corresponding key, and an identical 'prototype' property. Note: this\n   * accounts for both named and indexed properties on Arrays.\n   */\n  // eslint-disable-next-line no-use-before-define\n  return objEquiv(actual, expected, opts);\n}\n\nfunction isUndefinedOrNull(value) {\n  return value === null || value === undefined;\n}\n\nfunction isBuffer(x) {\n  if (!x || typeof x !== 'object' || typeof x.length !== 'number') {\n    return false;\n  }\n  if (typeof x.copy !== 'function' || typeof x.slice !== 'function') {\n    return false;\n  }\n  if (x.length > 0 && typeof x[0] !== 'number') {\n    return false;\n  }\n  return true;\n}\n\nfunction objEquiv(a, b, opts) {\n  /* eslint max-statements: [2, 50] */\n  var i, key;\n  if (typeof a !== typeof b) { return false; }\n  if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) { return false; }\n\n  // an identical 'prototype' property.\n  if (a.prototype !== b.prototype) { return false; }\n\n  if (isArguments(a) !== isArguments(b)) { return false; }\n\n  var aIsRegex = isRegex(a);\n  var bIsRegex = isRegex(b);\n  if (aIsRegex !== bIsRegex) { return false; }\n  if (aIsRegex || bIsRegex) {\n    return a.source === b.source && flags(a) === flags(b);\n  }\n\n  if (isDate(a) && isDate(b)) {\n    return getTime.call(a) === getTime.call(b);\n  }\n\n  var aIsBuffer = isBuffer(a);\n  var bIsBuffer = isBuffer(b);\n  if (aIsBuffer !== bIsBuffer) { return false; }\n  if (aIsBuffer || bIsBuffer) { // && would work too, because both are true or both false here\n    if (a.length !== b.length) { return false; }\n    for (i = 0; i < a.length; i++) {\n      if (a[i] !== b[i]) { return false; }\n    }\n    return true;\n  }\n\n  if (typeof a !== typeof b) { return false; }\n\n  try {\n    var ka = objectKeys(a);\n    var kb = objectKeys(b);\n  } catch (e) { // happens when one is a string literal and the other isn't\n    return false;\n  }\n  // having the same number of owned properties (keys incorporates hasOwnProperty)\n  if (ka.length !== kb.length) { return false; }\n\n  // the same set of keys (although not necessarily the same order),\n  ka.sort();\n  kb.sort();\n  // ~~~cheap key test\n  for (i = ka.length - 1; i >= 0; i--) {\n    if (ka[i] != kb[i]) { return false; }\n  }\n  // equivalent values for every corresponding key, and ~~~possibly expensive deep test\n  for (i = ka.length - 1; i >= 0; i--) {\n    key = ka[i];\n    if (!deepEqual(a[key], b[key], opts)) { return false; }\n  }\n\n  return true;\n}\n\nmodule.exports = deepEqual;\n","'use strict';\n\nvar hasOwn = Object.prototype.hasOwnProperty;\nvar toStr = Object.prototype.toString;\nvar defineProperty = Object.defineProperty;\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nvar isArray = function isArray(arr) {\n\tif (typeof Array.isArray === 'function') {\n\t\treturn Array.isArray(arr);\n\t}\n\n\treturn toStr.call(arr) === '[object Array]';\n};\n\nvar isPlainObject = function isPlainObject(obj) {\n\tif (!obj || toStr.call(obj) !== '[object Object]') {\n\t\treturn false;\n\t}\n\n\tvar hasOwnConstructor = hasOwn.call(obj, 'constructor');\n\tvar hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, 'isPrototypeOf');\n\t// Not own constructor property must be Object\n\tif (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {\n\t\treturn false;\n\t}\n\n\t// Own properties are enumerated firstly, so to speed up,\n\t// if last one is own, then all properties are own.\n\tvar key;\n\tfor (key in obj) { /**/ }\n\n\treturn typeof key === 'undefined' || hasOwn.call(obj, key);\n};\n\n// If name is '__proto__', and Object.defineProperty is available, define __proto__ as an own property on target\nvar setProperty = function setProperty(target, options) {\n\tif (defineProperty && options.name === '__proto__') {\n\t\tdefineProperty(target, options.name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t\tvalue: options.newValue,\n\t\t\twritable: true\n\t\t});\n\t} else {\n\t\ttarget[options.name] = options.newValue;\n\t}\n};\n\n// Return undefined instead of __proto__ if '__proto__' is not an own property\nvar getProperty = function getProperty(obj, name) {\n\tif (name === '__proto__') {\n\t\tif (!hasOwn.call(obj, name)) {\n\t\t\treturn void 0;\n\t\t} else if (gOPD) {\n\t\t\t// In early versions of node, obj['__proto__'] is buggy when obj has\n\t\t\t// __proto__ as an own property. Object.getOwnPropertyDescriptor() works.\n\t\t\treturn gOPD(obj, name).value;\n\t\t}\n\t}\n\n\treturn obj[name];\n};\n\nmodule.exports = function extend() {\n\tvar options, name, src, copy, copyIsArray, clone;\n\tvar target = arguments[0];\n\tvar i = 1;\n\tvar length = arguments.length;\n\tvar deep = false;\n\n\t// Handle a deep copy situation\n\tif (typeof target === 'boolean') {\n\t\tdeep = target;\n\t\ttarget = arguments[1] || {};\n\t\t// skip the boolean and the target\n\t\ti = 2;\n\t}\n\tif (target == null || (typeof target !== 'object' && typeof target !== 'function')) {\n\t\ttarget = {};\n\t}\n\n\tfor (; i < length; ++i) {\n\t\toptions = arguments[i];\n\t\t// Only deal with non-null/undefined values\n\t\tif (options != null) {\n\t\t\t// Extend the base object\n\t\t\tfor (name in options) {\n\t\t\t\tsrc = getProperty(target, name);\n\t\t\t\tcopy = getProperty(options, name);\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif (target !== copy) {\n\t\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\t\tif (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) {\n\t\t\t\t\t\tif (copyIsArray) {\n\t\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\t\tclone = src && isArray(src) ? src : [];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tclone = src && isPlainObject(src) ? src : {};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\t\tsetProperty(target, { name: name, newValue: extend(deep, clone, copy) });\n\n\t\t\t\t\t// Don't bring in undefined values\n\t\t\t\t\t} else if (typeof copy !== 'undefined') {\n\t\t\t\t\t\tsetProperty(target, { name: name, newValue: copy });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n","var equal = require('deep-equal');\nvar extend = require('extend');\n\n\nvar lib = {\n  attributes: {\n    compose: function (a, b, keepNull) {\n      if (typeof a !== 'object') a = {};\n      if (typeof b !== 'object') b = {};\n      var attributes = extend(true, {}, b);\n      if (!keepNull) {\n        attributes = Object.keys(attributes).reduce(function (copy, key) {\n          if (attributes[key] != null) {\n            copy[key] = attributes[key];\n          }\n          return copy;\n        }, {});\n      }\n      for (var key in a) {\n        if (a[key] !== undefined && b[key] === undefined) {\n          attributes[key] = a[key];\n        }\n      }\n      return Object.keys(attributes).length > 0 ? attributes : undefined;\n    },\n\n    diff: function(a, b) {\n      if (typeof a !== 'object') a = {};\n      if (typeof b !== 'object') b = {};\n      var attributes = Object.keys(a).concat(Object.keys(b)).reduce(function (attributes, key) {\n        if (!equal(a[key], b[key])) {\n          attributes[key] = b[key] === undefined ? null : b[key];\n        }\n        return attributes;\n      }, {});\n      return Object.keys(attributes).length > 0 ? attributes : undefined;\n    },\n\n    transform: function (a, b, priority) {\n      if (typeof a !== 'object') return b;\n      if (typeof b !== 'object') return undefined;\n      if (!priority) return b;  // b simply overwrites us without priority\n      var attributes = Object.keys(b).reduce(function (attributes, key) {\n        if (a[key] === undefined) attributes[key] = b[key];  // null is a valid value\n        return attributes;\n      }, {});\n      return Object.keys(attributes).length > 0 ? attributes : undefined;\n    }\n  },\n\n  iterator: function (ops) {\n    return new Iterator(ops);\n  },\n\n  length: function (op) {\n    if (typeof op['delete'] === 'number') {\n      return op['delete'];\n    } else if (typeof op.retain === 'number') {\n      return op.retain;\n    } else {\n      return typeof op.insert === 'string' ? op.insert.length : 1;\n    }\n  }\n};\n\n\nfunction Iterator(ops) {\n  this.ops = ops;\n  this.index = 0;\n  this.offset = 0;\n};\n\nIterator.prototype.hasNext = function () {\n  return this.peekLength() < Infinity;\n};\n\nIterator.prototype.next = function (length) {\n  if (!length) length = Infinity;\n  var nextOp = this.ops[this.index];\n  if (nextOp) {\n    var offset = this.offset;\n    var opLength = lib.length(nextOp)\n    if (length >= opLength - offset) {\n      length = opLength - offset;\n      this.index += 1;\n      this.offset = 0;\n    } else {\n      this.offset += length;\n    }\n    if (typeof nextOp['delete'] === 'number') {\n      return { 'delete': length };\n    } else {\n      var retOp = {};\n      if (nextOp.attributes) {\n        retOp.attributes = nextOp.attributes;\n      }\n      if (typeof nextOp.retain === 'number') {\n        retOp.retain = length;\n      } else if (typeof nextOp.insert === 'string') {\n        retOp.insert = nextOp.insert.substr(offset, length);\n      } else {\n        // offset should === 0, length should === 1\n        retOp.insert = nextOp.insert;\n      }\n      return retOp;\n    }\n  } else {\n    return { retain: Infinity };\n  }\n};\n\nIterator.prototype.peek = function () {\n  return this.ops[this.index];\n};\n\nIterator.prototype.peekLength = function () {\n  if (this.ops[this.index]) {\n    // Should never return 0 if our index is being managed correctly\n    return lib.length(this.ops[this.index]) - this.offset;\n  } else {\n    return Infinity;\n  }\n};\n\nIterator.prototype.peekType = function () {\n  if (this.ops[this.index]) {\n    if (typeof this.ops[this.index]['delete'] === 'number') {\n      return 'delete';\n    } else if (typeof this.ops[this.index].retain === 'number') {\n      return 'retain';\n    } else {\n      return 'insert';\n    }\n  }\n  return 'retain';\n};\n\nIterator.prototype.rest = function () {\n  if (!this.hasNext()) {\n    return [];\n  } else if (this.offset === 0) {\n    return this.ops.slice(this.index);\n  } else {\n    var offset = this.offset;\n    var index = this.index;\n    var next = this.next();\n    var rest = this.ops.slice(this.index);\n    this.offset = offset;\n    this.index = index;\n    return [next].concat(rest);\n  }\n};\n\n\nmodule.exports = lib;\n","var diff = require('fast-diff');\nvar equal = require('deep-equal');\nvar extend = require('extend');\nvar op = require('./op');\n\n\nvar NULL_CHARACTER = String.fromCharCode(0);  // Placeholder char for embed in diff()\n\n\nvar Delta = function (ops) {\n  // Assume we are given a well formed ops\n  if (Array.isArray(ops)) {\n    this.ops = ops;\n  } else if (ops != null && Array.isArray(ops.ops)) {\n    this.ops = ops.ops;\n  } else {\n    this.ops = [];\n  }\n};\n\n\nDelta.prototype.insert = function (text, attributes) {\n  var newOp = {};\n  if (text.length === 0) return this;\n  newOp.insert = text;\n  if (attributes != null && typeof attributes === 'object' && Object.keys(attributes).length > 0) {\n    newOp.attributes = attributes;\n  }\n  return this.push(newOp);\n};\n\nDelta.prototype['delete'] = function (length) {\n  if (length <= 0) return this;\n  return this.push({ 'delete': length });\n};\n\nDelta.prototype.retain = function (length, attributes) {\n  if (length <= 0) return this;\n  var newOp = { retain: length };\n  if (attributes != null && typeof attributes === 'object' && Object.keys(attributes).length > 0) {\n    newOp.attributes = attributes;\n  }\n  return this.push(newOp);\n};\n\nDelta.prototype.push = function (newOp) {\n  var index = this.ops.length;\n  var lastOp = this.ops[index - 1];\n  newOp = extend(true, {}, newOp);\n  if (typeof lastOp === 'object') {\n    if (typeof newOp['delete'] === 'number' && typeof lastOp['delete'] === 'number') {\n      this.ops[index - 1] = { 'delete': lastOp['delete'] + newOp['delete'] };\n      return this;\n    }\n    // Since it does not matter if we insert before or after deleting at the same index,\n    // always prefer to insert first\n    if (typeof lastOp['delete'] === 'number' && newOp.insert != null) {\n      index -= 1;\n      lastOp = this.ops[index - 1];\n      if (typeof lastOp !== 'object') {\n        this.ops.unshift(newOp);\n        return this;\n      }\n    }\n    if (equal(newOp.attributes, lastOp.attributes)) {\n      if (typeof newOp.insert === 'string' && typeof lastOp.insert === 'string') {\n        this.ops[index - 1] = { insert: lastOp.insert + newOp.insert };\n        if (typeof newOp.attributes === 'object') this.ops[index - 1].attributes = newOp.attributes\n        return this;\n      } else if (typeof newOp.retain === 'number' && typeof lastOp.retain === 'number') {\n        this.ops[index - 1] = { retain: lastOp.retain + newOp.retain };\n        if (typeof newOp.attributes === 'object') this.ops[index - 1].attributes = newOp.attributes\n        return this;\n      }\n    }\n  }\n  if (index === this.ops.length) {\n    this.ops.push(newOp);\n  } else {\n    this.ops.splice(index, 0, newOp);\n  }\n  return this;\n};\n\nDelta.prototype.chop = function () {\n  var lastOp = this.ops[this.ops.length - 1];\n  if (lastOp && lastOp.retain && !lastOp.attributes) {\n    this.ops.pop();\n  }\n  return this;\n};\n\nDelta.prototype.filter = function (predicate) {\n  return this.ops.filter(predicate);\n};\n\nDelta.prototype.forEach = function (predicate) {\n  this.ops.forEach(predicate);\n};\n\nDelta.prototype.map = function (predicate) {\n  return this.ops.map(predicate);\n};\n\nDelta.prototype.partition = function (predicate) {\n  var passed = [], failed = [];\n  this.forEach(function(op) {\n    var target = predicate(op) ? passed : failed;\n    target.push(op);\n  });\n  return [passed, failed];\n};\n\nDelta.prototype.reduce = function (predicate, initial) {\n  return this.ops.reduce(predicate, initial);\n};\n\nDelta.prototype.changeLength = function () {\n  return this.reduce(function (length, elem) {\n    if (elem.insert) {\n      return length + op.length(elem);\n    } else if (elem.delete) {\n      return length - elem.delete;\n    }\n    return length;\n  }, 0);\n};\n\nDelta.prototype.length = function () {\n  return this.reduce(function (length, elem) {\n    return length + op.length(elem);\n  }, 0);\n};\n\nDelta.prototype.slice = function (start, end) {\n  start = start || 0;\n  if (typeof end !== 'number') end = Infinity;\n  var ops = [];\n  var iter = op.iterator(this.ops);\n  var index = 0;\n  while (index < end && iter.hasNext()) {\n    var nextOp;\n    if (index < start) {\n      nextOp = iter.next(start - index);\n    } else {\n      nextOp = iter.next(end - index);\n      ops.push(nextOp);\n    }\n    index += op.length(nextOp);\n  }\n  return new Delta(ops);\n};\n\n\nDelta.prototype.compose = function (other) {\n  var thisIter = op.iterator(this.ops);\n  var otherIter = op.iterator(other.ops);\n  var ops = [];\n  var firstOther = otherIter.peek();\n  if (firstOther != null && typeof firstOther.retain === 'number' && firstOther.attributes == null) {\n    var firstLeft = firstOther.retain;\n    while (thisIter.peekType() === 'insert' && thisIter.peekLength() <= firstLeft) {\n      firstLeft -= thisIter.peekLength();\n      ops.push(thisIter.next());\n    }\n    if (firstOther.retain - firstLeft > 0) {\n      otherIter.next(firstOther.retain - firstLeft);\n    }\n  }\n  var delta = new Delta(ops);\n  while (thisIter.hasNext() || otherIter.hasNext()) {\n    if (otherIter.peekType() === 'insert') {\n      delta.push(otherIter.next());\n    } else if (thisIter.peekType() === 'delete') {\n      delta.push(thisIter.next());\n    } else {\n      var length = Math.min(thisIter.peekLength(), otherIter.peekLength());\n      var thisOp = thisIter.next(length);\n      var otherOp = otherIter.next(length);\n      if (typeof otherOp.retain === 'number') {\n        var newOp = {};\n        if (typeof thisOp.retain === 'number') {\n          newOp.retain = length;\n        } else {\n          newOp.insert = thisOp.insert;\n        }\n        // Preserve null when composing with a retain, otherwise remove it for inserts\n        var attributes = op.attributes.compose(thisOp.attributes, otherOp.attributes, typeof thisOp.retain === 'number');\n        if (attributes) newOp.attributes = attributes;\n        delta.push(newOp);\n\n        // Optimization if rest of other is just retain\n        if (!otherIter.hasNext() && equal(delta.ops[delta.ops.length - 1], newOp)) {\n          var rest = new Delta(thisIter.rest());\n          return delta.concat(rest).chop();\n        }\n\n      // Other op should be delete, we could be an insert or retain\n      // Insert + delete cancels out\n      } else if (typeof otherOp['delete'] === 'number' && typeof thisOp.retain === 'number') {\n        delta.push(otherOp);\n      }\n    }\n  }\n  return delta.chop();\n};\n\nDelta.prototype.concat = function (other) {\n  var delta = new Delta(this.ops.slice());\n  if (other.ops.length > 0) {\n    delta.push(other.ops[0]);\n    delta.ops = delta.ops.concat(other.ops.slice(1));\n  }\n  return delta;\n};\n\nDelta.prototype.diff = function (other, index) {\n  if (this.ops === other.ops) {\n    return new Delta();\n  }\n  var strings = [this, other].map(function (delta) {\n    return delta.map(function (op) {\n      if (op.insert != null) {\n        return typeof op.insert === 'string' ? op.insert : NULL_CHARACTER;\n      }\n      var prep = (delta === other) ? 'on' : 'with';\n      throw new Error('diff() called ' + prep + ' non-document');\n    }).join('');\n  });\n  var delta = new Delta();\n  var diffResult = diff(strings[0], strings[1], index);\n  var thisIter = op.iterator(this.ops);\n  var otherIter = op.iterator(other.ops);\n  diffResult.forEach(function (component) {\n    var length = component[1].length;\n    while (length > 0) {\n      var opLength = 0;\n      switch (component[0]) {\n        case diff.INSERT:\n          opLength = Math.min(otherIter.peekLength(), length);\n          delta.push(otherIter.next(opLength));\n          break;\n        case diff.DELETE:\n          opLength = Math.min(length, thisIter.peekLength());\n          thisIter.next(opLength);\n          delta['delete'](opLength);\n          break;\n        case diff.EQUAL:\n          opLength = Math.min(thisIter.peekLength(), otherIter.peekLength(), length);\n          var thisOp = thisIter.next(opLength);\n          var otherOp = otherIter.next(opLength);\n          if (equal(thisOp.insert, otherOp.insert)) {\n            delta.retain(opLength, op.attributes.diff(thisOp.attributes, otherOp.attributes));\n          } else {\n            delta.push(otherOp)['delete'](opLength);\n          }\n          break;\n      }\n      length -= opLength;\n    }\n  });\n  return delta.chop();\n};\n\nDelta.prototype.eachLine = function (predicate, newline) {\n  newline = newline || '\\n';\n  var iter = op.iterator(this.ops);\n  var line = new Delta();\n  var i = 0;\n  while (iter.hasNext()) {\n    if (iter.peekType() !== 'insert') return;\n    var thisOp = iter.peek();\n    var start = op.length(thisOp) - iter.peekLength();\n    var index = typeof thisOp.insert === 'string' ?\n      thisOp.insert.indexOf(newline, start) - start : -1;\n    if (index < 0) {\n      line.push(iter.next());\n    } else if (index > 0) {\n      line.push(iter.next(index));\n    } else {\n      if (predicate(line, iter.next(1).attributes || {}, i) === false) {\n        return;\n      }\n      i += 1;\n      line = new Delta();\n    }\n  }\n  if (line.length() > 0) {\n    predicate(line, {}, i);\n  }\n};\n\nDelta.prototype.transform = function (other, priority) {\n  priority = !!priority;\n  if (typeof other === 'number') {\n    return this.transformPosition(other, priority);\n  }\n  var thisIter = op.iterator(this.ops);\n  var otherIter = op.iterator(other.ops);\n  var delta = new Delta();\n  while (thisIter.hasNext() || otherIter.hasNext()) {\n    if (thisIter.peekType() === 'insert' && (priority || otherIter.peekType() !== 'insert')) {\n      delta.retain(op.length(thisIter.next()));\n    } else if (otherIter.peekType() === 'insert') {\n      delta.push(otherIter.next());\n    } else {\n      var length = Math.min(thisIter.peekLength(), otherIter.peekLength());\n      var thisOp = thisIter.next(length);\n      var otherOp = otherIter.next(length);\n      if (thisOp['delete']) {\n        // Our delete either makes their delete redundant or removes their retain\n        continue;\n      } else if (otherOp['delete']) {\n        delta.push(otherOp);\n      } else {\n        // We retain either their retain or insert\n        delta.retain(length, op.attributes.transform(thisOp.attributes, otherOp.attributes, priority));\n      }\n    }\n  }\n  return delta.chop();\n};\n\nDelta.prototype.transformPosition = function (index, priority) {\n  priority = !!priority;\n  var thisIter = op.iterator(this.ops);\n  var offset = 0;\n  while (thisIter.hasNext() && offset <= index) {\n    var length = thisIter.peekLength();\n    var nextType = thisIter.peekType();\n    thisIter.next();\n    if (nextType === 'delete') {\n      index -= Math.min(length, index - offset);\n      continue;\n    } else if (nextType === 'insert' && (offset < index || !priority)) {\n      index += length;\n    }\n    offset += length;\n  }\n  return index;\n};\n\n\nmodule.exports = Delta;\n","import Parchment from 'parchment';\n\n\nclass Break extends Parchment.Embed {\n  static value() {\n    return undefined;\n  }\n\n  insertInto(parent, ref) {\n    if (parent.children.length === 0) {\n      super.insertInto(parent, ref);\n    } else {\n      this.remove();\n    }\n  }\n\n  length() {\n    return 0;\n  }\n\n  value() {\n    return '';\n  }\n}\nBreak.blotName = 'break';\nBreak.tagName = 'BR';\n\n\nexport default Break;\n","import Parchment from 'parchment';\n\nclass TextBlot extends Parchment.Text { }\n\nexport default TextBlot;\n","import Text from './text';\nimport Parchment from 'parchment';\n\n\nclass Inline extends Parchment.Inline {\n  static compare(self, other) {\n    let selfIndex = Inline.order.indexOf(self);\n    let otherIndex = Inline.order.indexOf(other);\n    if (selfIndex >= 0 || otherIndex >= 0) {\n      return selfIndex - otherIndex;\n    } else if (self === other) {\n      return 0;\n    } else if (self < other) {\n      return -1;\n    } else {\n      return 1;\n    }\n  }\n\n  formatAt(index, length, name, value) {\n    if (Inline.compare(this.statics.blotName, name) < 0 && Parchment.query(name, Parchment.Scope.BLOT)) {\n      let blot = this.isolate(index, length);\n      if (value) {\n        blot.wrap(name, value);\n      }\n    } else {\n      super.formatAt(index, length, name, value);\n    }\n  }\n\n  optimize(context) {\n    super.optimize(context);\n    if (this.parent instanceof Inline &&\n        Inline.compare(this.statics.blotName, this.parent.statics.blotName) > 0) {\n      let parent = this.parent.isolate(this.offset(), this.length());\n      this.moveChildren(parent);\n      parent.wrap(this);\n    }\n  }\n}\nInline.allowedChildren = [Inline, Parchment.Embed, Text];\n// Lower index means deeper in the DOM tree, since not found (-1) is for embeds\nInline.order = [\n  'cursor', 'inline',   // Must be lower\n  'underline', 'strike', 'italic', 'bold', 'script',\n  'link', 'code'        // Must be higher\n];\n\n\nexport default Inline;\n","import extend from 'extend';\nimport Delta from 'quill-delta';\nimport Parchment from 'parchment';\nimport Break from './break';\nimport Inline from './inline';\nimport TextBlot from './text';\n\n\nconst NEWLINE_LENGTH = 1;\n\n\nclass BlockEmbed extends Parchment.Embed {\n  attach() {\n    super.attach();\n    this.attributes = new Parchment.Attributor.Store(this.domNode);\n  }\n\n  delta() {\n    return new Delta().insert(this.value(), extend(this.formats(), this.attributes.values()));\n  }\n\n  format(name, value) {\n    let attribute = Parchment.query(name, Parchment.Scope.BLOCK_ATTRIBUTE);\n    if (attribute != null) {\n      this.attributes.attribute(attribute, value);\n    }\n  }\n\n  formatAt(index, length, name, value) {\n    this.format(name, value);\n  }\n\n  insertAt(index, value, def) {\n    if (typeof value === 'string' && value.endsWith('\\n')) {\n      let block = Parchment.create(Block.blotName);\n      this.parent.insertBefore(block, index === 0 ? this : this.next);\n      block.insertAt(0, value.slice(0, -1));\n    } else {\n      super.insertAt(index, value, def);\n    }\n  }\n}\nBlockEmbed.scope = Parchment.Scope.BLOCK_BLOT;\n// It is important for cursor behavior BlockEmbeds use tags that are block level elements\n\n\nclass Block extends Parchment.Block {\n  constructor(domNode) {\n    super(domNode);\n    this.cache = {};\n  }\n\n  delta() {\n    if (this.cache.delta == null) {\n      this.cache.delta = this.descendants(Parchment.Leaf).reduce((delta, leaf) => {\n        if (leaf.length() === 0) {\n          return delta;\n        } else {\n          return delta.insert(leaf.value(), bubbleFormats(leaf));\n        }\n      }, new Delta()).insert('\\n', bubbleFormats(this));\n    }\n    return this.cache.delta;\n  }\n\n  deleteAt(index, length) {\n    super.deleteAt(index, length);\n    this.cache = {};\n  }\n\n  formatAt(index, length, name, value) {\n    if (length <= 0) return;\n    if (Parchment.query(name, Parchment.Scope.BLOCK)) {\n      if (index + length === this.length()) {\n        this.format(name, value);\n      }\n    } else {\n      super.formatAt(index, Math.min(length, this.length() - index - 1), name, value);\n    }\n    this.cache = {};\n  }\n\n  insertAt(index, value, def) {\n    if (def != null) return super.insertAt(index, value, def);\n    if (value.length === 0) return;\n    let lines = value.split('\\n');\n    let text = lines.shift();\n    if (text.length > 0) {\n      if (index < this.length() - 1 || this.children.tail == null) {\n        super.insertAt(Math.min(index, this.length() - 1), text);\n      } else {\n        this.children.tail.insertAt(this.children.tail.length(), text);\n      }\n      this.cache = {};\n    }\n    let block = this;\n    lines.reduce(function(index, line) {\n      block = block.split(index, true);\n      block.insertAt(0, line);\n      return line.length;\n    }, index + text.length);\n  }\n\n  insertBefore(blot, ref) {\n    let head = this.children.head;\n    super.insertBefore(blot, ref);\n    if (head instanceof Break) {\n      head.remove();\n    }\n    this.cache = {};\n  }\n\n  length() {\n    if (this.cache.length == null) {\n      this.cache.length = super.length() + NEWLINE_LENGTH;\n    }\n    return this.cache.length;\n  }\n\n  moveChildren(target, ref) {\n    super.moveChildren(target, ref);\n    this.cache = {};\n  }\n\n  optimize(context) {\n    super.optimize(context);\n    this.cache = {};\n  }\n\n  path(index) {\n    return super.path(index, true);\n  }\n\n  removeChild(child) {\n    super.removeChild(child);\n    this.cache = {};\n  }\n\n  split(index, force = false) {\n    if (force && (index === 0 || index >= this.length() - NEWLINE_LENGTH)) {\n      let clone = this.clone();\n      if (index === 0) {\n        this.parent.insertBefore(clone, this);\n        return this;\n      } else {\n        this.parent.insertBefore(clone, this.next);\n        return clone;\n      }\n    } else {\n      let next = super.split(index, force);\n      this.cache = {};\n      return next;\n    }\n  }\n}\nBlock.blotName = 'block';\nBlock.tagName = 'P';\nBlock.defaultChild = 'break';\nBlock.allowedChildren = [Inline, Parchment.Embed, TextBlot];\n\n\nfunction bubbleFormats(blot, formats = {}) {\n  if (blot == null) return formats;\n  if (typeof blot.formats === 'function') {\n    formats = extend(formats, blot.formats());\n  }\n  if (blot.parent == null || blot.parent.blotName == 'scroll' || blot.parent.statics.scope !== blot.statics.scope) {\n    return formats;\n  }\n  return bubbleFormats(blot.parent, formats);\n}\n\n\nexport { bubbleFormats, BlockEmbed, Block as default };\n","import Delta from 'quill-delta';\nimport Parchment from 'parchment';\nimport Block from '../blots/block';\nimport Inline from '../blots/inline';\nimport TextBlot from '../blots/text';\n\n\nclass Code extends Inline {}\nCode.blotName = 'code';\nCode.tagName = 'CODE';\n\n\nclass CodeBlock extends Block {\n  static create(value) {\n    let domNode = super.create(value);\n    domNode.setAttribute('spellcheck', false);\n    return domNode;\n  }\n\n  static formats() {\n    return true;\n  }\n\n  delta() {\n    let text = this.domNode.textContent;\n    if (text.endsWith('\\n')) {      // Should always be true\n      text = text.slice(0, -1);\n    }\n    return text.split('\\n').reduce((delta, frag) => {\n      return delta.insert(frag).insert('\\n', this.formats());\n    }, new Delta());\n  }\n\n  format(name, value) {\n    if (name === this.statics.blotName && value) return;\n    let [text, ] = this.descendant(TextBlot, this.length() - 1);\n    if (text != null) {\n      text.deleteAt(text.length() - 1, 1);\n    }\n    super.format(name, value);\n  }\n\n  formatAt(index, length, name, value) {\n    if (length === 0) return;\n    if (Parchment.query(name, Parchment.Scope.BLOCK) == null ||\n        (name === this.statics.blotName && value === this.statics.formats(this.domNode))) {\n      return;\n    }\n    let nextNewline = this.newlineIndex(index);\n    if (nextNewline < 0 || nextNewline >= index + length) return;\n    let prevNewline = this.newlineIndex(index, true) + 1;\n    let isolateLength = nextNewline - prevNewline + 1;\n    let blot = this.isolate(prevNewline, isolateLength);\n    let next = blot.next;\n    blot.format(name, value);\n    if (next instanceof CodeBlock) {\n      next.formatAt(0, index - prevNewline + length - isolateLength, name, value);\n    }\n  }\n\n  insertAt(index, value, def) {\n    if (def != null) return;\n    let [text, offset] = this.descendant(TextBlot, index);\n    text.insertAt(offset, value);\n  }\n\n  length() {\n    let length = this.domNode.textContent.length;\n    if (!this.domNode.textContent.endsWith('\\n')) {\n      return length + 1;\n    }\n    return length;\n  }\n\n  newlineIndex(searchIndex, reverse = false) {\n    if (!reverse) {\n      let offset = this.domNode.textContent.slice(searchIndex).indexOf('\\n');\n      return offset > -1 ? searchIndex + offset : -1;\n    } else {\n      return this.domNode.textContent.slice(0, searchIndex).lastIndexOf('\\n');\n    }\n  }\n\n  optimize(context) {\n    if (!this.domNode.textContent.endsWith('\\n')) {\n      this.appendChild(Parchment.create('text', '\\n'));\n    }\n    super.optimize(context);\n    let next = this.next;\n    if (next != null && next.prev === this &&\n        next.statics.blotName === this.statics.blotName &&\n        this.statics.formats(this.domNode) === next.statics.formats(next.domNode)) {\n      next.optimize(context);\n      next.moveChildren(this);\n      next.remove();\n    }\n  }\n\n  replace(target) {\n    super.replace(target);\n    [].slice.call(this.domNode.querySelectorAll('*')).forEach(function(node) {\n      let blot = Parchment.find(node);\n      if (blot == null) {\n        node.parentNode.removeChild(node);\n      } else if (blot instanceof Parchment.Embed) {\n        blot.remove();\n      } else {\n        blot.unwrap();\n      }\n    });\n  }\n}\nCodeBlock.blotName = 'code-block';\nCodeBlock.tagName = 'PRE';\nCodeBlock.TAB = '  ';\n\n\nexport { Code, CodeBlock as default };\n","import Parchment from 'parchment';\nimport TextBlot from './text';\n\n\nclass Cursor extends Parchment.Embed {\n  static value() {\n    return undefined;\n  }\n\n  constructor(domNode, selection) {\n    super(domNode);\n    this.selection = selection;\n    this.textNode = document.createTextNode(Cursor.CONTENTS);\n    this.domNode.appendChild(this.textNode);\n    this._length = 0;\n  }\n\n  detach() {\n    // super.detach() will also clear domNode.__blot\n    if (this.parent != null) this.parent.removeChild(this);\n  }\n\n  format(name, value) {\n    if (this._length !== 0) {\n      return super.format(name, value);\n    }\n    let target = this, index = 0;\n    while (target != null && target.statics.scope !== Parchment.Scope.BLOCK_BLOT) {\n      index += target.offset(target.parent);\n      target = target.parent;\n    }\n    if (target != null) {\n      this._length = Cursor.CONTENTS.length;\n      target.optimize();\n      target.formatAt(index, Cursor.CONTENTS.length, name, value);\n      this._length = 0;\n    }\n  }\n\n  index(node, offset) {\n    if (node === this.textNode) return 0;\n    return super.index(node, offset);\n  }\n\n  length() {\n    return this._length;\n  }\n\n  position() {\n    return [this.textNode, this.textNode.data.length];\n  }\n\n  remove() {\n    super.remove();\n    this.parent = null;\n  }\n\n  restore() {\n    if (this.selection.composing || this.parent == null) return;\n    let textNode = this.textNode;\n    let range = this.selection.getNativeRange();\n    let restoreText, start, end;\n    if (range != null && range.start.node === textNode && range.end.node === textNode) {\n      [restoreText, start, end] = [textNode, range.start.offset, range.end.offset];\n    }\n    // Link format will insert text outside of anchor tag\n    while (this.domNode.lastChild != null && this.domNode.lastChild !== this.textNode) {\n      this.domNode.parentNode.insertBefore(this.domNode.lastChild, this.domNode);\n    }\n    if (this.textNode.data !== Cursor.CONTENTS) {\n      let text = this.textNode.data.split(Cursor.CONTENTS).join('');\n      if (this.next instanceof TextBlot) {\n        restoreText = this.next.domNode;\n        this.next.insertAt(0, text);\n        this.textNode.data = Cursor.CONTENTS;\n      } else {\n        this.textNode.data = text;\n        this.parent.insertBefore(Parchment.create(this.textNode), this);\n        this.textNode = document.createTextNode(Cursor.CONTENTS);\n        this.domNode.appendChild(this.textNode);\n      }\n    }\n    this.remove();\n    if (start != null) {\n      [start, end] = [start, end].map(function(offset) {\n        return Math.max(0, Math.min(restoreText.data.length, offset - 1));\n      });\n      return {\n        startNode: restoreText,\n        startOffset: start,\n        endNode: restoreText,\n        endOffset: end\n      };\n    }\n  }\n\n  update(mutations, context) {\n    if (mutations.some((mutation) => {\n      return mutation.type === 'characterData' && mutation.target === this.textNode;\n    })) {\n      let range = this.restore();\n      if (range) context.range = range;\n    }\n  }\n\n  value() {\n    return '';\n  }\n}\nCursor.blotName = 'cursor';\nCursor.className = 'ql-cursor';\nCursor.tagName = 'span';\nCursor.CONTENTS = \"\\uFEFF\";   // Zero width no break space\n\n\nexport default Cursor;\n","var clone = (function() {\n'use strict';\n\nfunction _instanceof(obj, type) {\n  return type != null && obj instanceof type;\n}\n\nvar nativeMap;\ntry {\n  nativeMap = Map;\n} catch(_) {\n  // maybe a reference error because no `Map`. Give it a dummy value that no\n  // value will ever be an instanceof.\n  nativeMap = function() {};\n}\n\nvar nativeSet;\ntry {\n  nativeSet = Set;\n} catch(_) {\n  nativeSet = function() {};\n}\n\nvar nativePromise;\ntry {\n  nativePromise = Promise;\n} catch(_) {\n  nativePromise = function() {};\n}\n\n/**\n * Clones (copies) an Object using deep copying.\n *\n * This function supports circular references by default, but if you are certain\n * there are no circular references in your object, you can save some CPU time\n * by calling clone(obj, false).\n *\n * Caution: if `circular` is false and `parent` contains circular references,\n * your program may enter an infinite loop and crash.\n *\n * @param `parent` - the object to be cloned\n * @param `circular` - set to true if the object to be cloned may contain\n *    circular references. (optional - true by default)\n * @param `depth` - set to a number if the object is only to be cloned to\n *    a particular depth. (optional - defaults to Infinity)\n * @param `prototype` - sets the prototype to be used when cloning an object.\n *    (optional - defaults to parent prototype).\n * @param `includeNonEnumerable` - set to true if the non-enumerable properties\n *    should be cloned as well. Non-enumerable properties on the prototype\n *    chain will be ignored. (optional - false by default)\n*/\nfunction clone(parent, circular, depth, prototype, includeNonEnumerable) {\n  if (typeof circular === 'object') {\n    depth = circular.depth;\n    prototype = circular.prototype;\n    includeNonEnumerable = circular.includeNonEnumerable;\n    circular = circular.circular;\n  }\n  // maintain two arrays for circular references, where corresponding parents\n  // and children have the same index\n  var allParents = [];\n  var allChildren = [];\n\n  var useBuffer = typeof Buffer != 'undefined';\n\n  if (typeof circular == 'undefined')\n    circular = true;\n\n  if (typeof depth == 'undefined')\n    depth = Infinity;\n\n  // recurse this function so we don't reset allParents and allChildren\n  function _clone(parent, depth) {\n    // cloning null always returns null\n    if (parent === null)\n      return null;\n\n    if (depth === 0)\n      return parent;\n\n    var child;\n    var proto;\n    if (typeof parent != 'object') {\n      return parent;\n    }\n\n    if (_instanceof(parent, nativeMap)) {\n      child = new nativeMap();\n    } else if (_instanceof(parent, nativeSet)) {\n      child = new nativeSet();\n    } else if (_instanceof(parent, nativePromise)) {\n      child = new nativePromise(function (resolve, reject) {\n        parent.then(function(value) {\n          resolve(_clone(value, depth - 1));\n        }, function(err) {\n          reject(_clone(err, depth - 1));\n        });\n      });\n    } else if (clone.__isArray(parent)) {\n      child = [];\n    } else if (clone.__isRegExp(parent)) {\n      child = new RegExp(parent.source, __getRegExpFlags(parent));\n      if (parent.lastIndex) child.lastIndex = parent.lastIndex;\n    } else if (clone.__isDate(parent)) {\n      child = new Date(parent.getTime());\n    } else if (useBuffer && Buffer.isBuffer(parent)) {\n      if (Buffer.allocUnsafe) {\n        // Node.js >= 4.5.0\n        child = Buffer.allocUnsafe(parent.length);\n      } else {\n        // Older Node.js versions\n        child = new Buffer(parent.length);\n      }\n      parent.copy(child);\n      return child;\n    } else if (_instanceof(parent, Error)) {\n      child = Object.create(parent);\n    } else {\n      if (typeof prototype == 'undefined') {\n        proto = Object.getPrototypeOf(parent);\n        child = Object.create(proto);\n      }\n      else {\n        child = Object.create(prototype);\n        proto = prototype;\n      }\n    }\n\n    if (circular) {\n      var index = allParents.indexOf(parent);\n\n      if (index != -1) {\n        return allChildren[index];\n      }\n      allParents.push(parent);\n      allChildren.push(child);\n    }\n\n    if (_instanceof(parent, nativeMap)) {\n      parent.forEach(function(value, key) {\n        var keyChild = _clone(key, depth - 1);\n        var valueChild = _clone(value, depth - 1);\n        child.set(keyChild, valueChild);\n      });\n    }\n    if (_instanceof(parent, nativeSet)) {\n      parent.forEach(function(value) {\n        var entryChild = _clone(value, depth - 1);\n        child.add(entryChild);\n      });\n    }\n\n    for (var i in parent) {\n      var attrs;\n      if (proto) {\n        attrs = Object.getOwnPropertyDescriptor(proto, i);\n      }\n\n      if (attrs && attrs.set == null) {\n        continue;\n      }\n      child[i] = _clone(parent[i], depth - 1);\n    }\n\n    if (Object.getOwnPropertySymbols) {\n      var symbols = Object.getOwnPropertySymbols(parent);\n      for (var i = 0; i < symbols.length; i++) {\n        // Don't need to worry about cloning a symbol because it is a primitive,\n        // like a number or string.\n        var symbol = symbols[i];\n        var descriptor = Object.getOwnPropertyDescriptor(parent, symbol);\n        if (descriptor && !descriptor.enumerable && !includeNonEnumerable) {\n          continue;\n        }\n        child[symbol] = _clone(parent[symbol], depth - 1);\n        if (!descriptor.enumerable) {\n          Object.defineProperty(child, symbol, {\n            enumerable: false\n          });\n        }\n      }\n    }\n\n    if (includeNonEnumerable) {\n      var allPropertyNames = Object.getOwnPropertyNames(parent);\n      for (var i = 0; i < allPropertyNames.length; i++) {\n        var propertyName = allPropertyNames[i];\n        var descriptor = Object.getOwnPropertyDescriptor(parent, propertyName);\n        if (descriptor && descriptor.enumerable) {\n          continue;\n        }\n        child[propertyName] = _clone(parent[propertyName], depth - 1);\n        Object.defineProperty(child, propertyName, {\n          enumerable: false\n        });\n      }\n    }\n\n    return child;\n  }\n\n  return _clone(parent, depth);\n}\n\n/**\n * Simple flat clone using prototype, accepts only objects, usefull for property\n * override on FLAT configuration object (no nested props).\n *\n * USE WITH CAUTION! This may not behave as you wish if you do not know how this\n * works.\n */\nclone.clonePrototype = function clonePrototype(parent) {\n  if (parent === null)\n    return null;\n\n  var c = function () {};\n  c.prototype = parent;\n  return new c();\n};\n\n// private utility functions\n\nfunction __objToStr(o) {\n  return Object.prototype.toString.call(o);\n}\nclone.__objToStr = __objToStr;\n\nfunction __isDate(o) {\n  return typeof o === 'object' && __objToStr(o) === '[object Date]';\n}\nclone.__isDate = __isDate;\n\nfunction __isArray(o) {\n  return typeof o === 'object' && __objToStr(o) === '[object Array]';\n}\nclone.__isArray = __isArray;\n\nfunction __isRegExp(o) {\n  return typeof o === 'object' && __objToStr(o) === '[object RegExp]';\n}\nclone.__isRegExp = __isRegExp;\n\nfunction __getRegExpFlags(re) {\n  var flags = '';\n  if (re.global) flags += 'g';\n  if (re.ignoreCase) flags += 'i';\n  if (re.multiline) flags += 'm';\n  return flags;\n}\nclone.__getRegExpFlags = __getRegExpFlags;\n\nreturn clone;\n})();\n\nif (typeof module === 'object' && module.exports) {\n  module.exports = clone;\n}\n","import Delta from 'quill-delta';\nimport DeltaOp from 'quill-delta/lib/op';\nimport Parchment from 'parchment';\nimport CodeBlock from '../formats/code';\nimport CursorBlot from '../blots/cursor';\nimport Block, { bubbleFormats } from '../blots/block';\nimport Break from '../blots/break';\nimport clone from 'clone';\nimport equal from 'deep-equal';\nimport extend from 'extend';\n\n\nconst ASCII = /^[ -~]*$/;\n\n\nclass Editor {\n  constructor(scroll) {\n    this.scroll = scroll;\n    this.delta = this.getDelta();\n  }\n\n  applyDelta(delta) {\n    let consumeNextNewline = false;\n    this.scroll.update();\n    let scrollLength = this.scroll.length();\n    this.scroll.batchStart();\n    delta = normalizeDelta(delta);\n    delta.reduce((index, op) => {\n      let length = op.retain || op.delete || op.insert.length || 1;\n      let attributes = op.attributes || {};\n      if (op.insert != null) {\n        if (typeof op.insert === 'string') {\n          let text = op.insert;\n          if (text.endsWith('\\n') && consumeNextNewline) {\n            consumeNextNewline = false;\n            text = text.slice(0, -1);\n          }\n          if (index >= scrollLength && !text.endsWith('\\n')) {\n            consumeNextNewline = true;\n          }\n          this.scroll.insertAt(index, text);\n          let [line, offset] = this.scroll.line(index);\n          let formats = extend({}, bubbleFormats(line));\n          if (line instanceof Block) {\n            let [leaf, ] = line.descendant(Parchment.Leaf, offset);\n            formats = extend(formats, bubbleFormats(leaf));\n          }\n          attributes = DeltaOp.attributes.diff(formats, attributes) || {};\n        } else if (typeof op.insert === 'object') {\n          let key = Object.keys(op.insert)[0];  // There should only be one key\n          if (key == null) return index;\n          this.scroll.insertAt(index, key, op.insert[key]);\n        }\n        scrollLength += length;\n      }\n      Object.keys(attributes).forEach((name) => {\n        this.scroll.formatAt(index, length, name, attributes[name]);\n      });\n      return index + length;\n    }, 0);\n    delta.reduce((index, op) => {\n      if (typeof op.delete === 'number') {\n        this.scroll.deleteAt(index, op.delete);\n        return index;\n      }\n      return index + (op.retain || op.insert.length || 1);\n    }, 0);\n    this.scroll.batchEnd();\n    return this.update(delta);\n  }\n\n  deleteText(index, length) {\n    this.scroll.deleteAt(index, length);\n    return this.update(new Delta().retain(index).delete(length));\n  }\n\n  formatLine(index, length, formats = {}) {\n    this.scroll.update();\n    Object.keys(formats).forEach((format) => {\n      if (this.scroll.whitelist != null && !this.scroll.whitelist[format]) return;\n      let lines = this.scroll.lines(index, Math.max(length, 1));\n      let lengthRemaining = length;\n      lines.forEach((line) => {\n        let lineLength = line.length();\n        if (!(line instanceof CodeBlock)) {\n          line.format(format, formats[format]);\n        } else {\n          let codeIndex = index - line.offset(this.scroll);\n          let codeLength = line.newlineIndex(codeIndex + lengthRemaining) - codeIndex + 1;\n          line.formatAt(codeIndex, codeLength, format, formats[format]);\n        }\n        lengthRemaining -= lineLength;\n      });\n    });\n    this.scroll.optimize();\n    return this.update(new Delta().retain(index).retain(length, clone(formats)));\n  }\n\n  formatText(index, length, formats = {}) {\n    Object.keys(formats).forEach((format) => {\n      this.scroll.formatAt(index, length, format, formats[format]);\n    });\n    return this.update(new Delta().retain(index).retain(length, clone(formats)));\n  }\n\n  getContents(index, length) {\n    return this.delta.slice(index, index + length);\n  }\n\n  getDelta() {\n    return this.scroll.lines().reduce((delta, line) => {\n      return delta.concat(line.delta());\n    }, new Delta());\n  }\n\n  getFormat(index, length = 0) {\n    let lines = [], leaves = [];\n    if (length === 0) {\n      this.scroll.path(index).forEach(function(path) {\n        let [blot, ] = path;\n        if (blot instanceof Block) {\n          lines.push(blot);\n        } else if (blot instanceof Parchment.Leaf) {\n          leaves.push(blot);\n        }\n      });\n    } else {\n      lines = this.scroll.lines(index, length);\n      leaves = this.scroll.descendants(Parchment.Leaf, index, length);\n    }\n    let formatsArr = [lines, leaves].map(function(blots) {\n      if (blots.length === 0) return {};\n      let formats = bubbleFormats(blots.shift());\n      while (Object.keys(formats).length > 0) {\n        let blot = blots.shift();\n        if (blot == null) return formats;\n        formats = combineFormats(bubbleFormats(blot), formats);\n      }\n      return formats;\n    });\n    return extend.apply(extend, formatsArr);\n  }\n\n  getText(index, length) {\n    return this.getContents(index, length).filter(function(op) {\n      return typeof op.insert === 'string';\n    }).map(function(op) {\n      return op.insert;\n    }).join('');\n  }\n\n  insertEmbed(index, embed, value) {\n    this.scroll.insertAt(index, embed, value);\n    return this.update(new Delta().retain(index).insert({ [embed]: value }));\n  }\n\n  insertText(index, text, formats = {}) {\n    text = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n    this.scroll.insertAt(index, text);\n    Object.keys(formats).forEach((format) => {\n      this.scroll.formatAt(index, text.length, format, formats[format]);\n    });\n    return this.update(new Delta().retain(index).insert(text, clone(formats)));\n  }\n\n  isBlank() {\n    if (this.scroll.children.length == 0) return true;\n    if (this.scroll.children.length > 1) return false;\n    let block = this.scroll.children.head;\n    if (block.statics.blotName !== Block.blotName) return false;\n    if (block.children.length > 1) return false;\n    return block.children.head instanceof Break;\n  }\n\n  removeFormat(index, length) {\n    let text = this.getText(index, length);\n    let [line, offset] = this.scroll.line(index + length);\n    let suffixLength = 0, suffix = new Delta();\n    if (line != null) {\n      if (!(line instanceof CodeBlock)) {\n        suffixLength = line.length() - offset;\n      } else {\n        suffixLength = line.newlineIndex(offset) - offset + 1;\n      }\n      suffix = line.delta().slice(offset, offset + suffixLength - 1).insert('\\n');\n    }\n    let contents = this.getContents(index, length + suffixLength);\n    let diff = contents.diff(new Delta().insert(text).concat(suffix));\n    let delta = new Delta().retain(index).concat(diff);\n    return this.applyDelta(delta);\n  }\n\n  update(change, mutations = [], cursorIndex = undefined) {\n    let oldDelta = this.delta;\n    if (mutations.length === 1 &&\n        mutations[0].type === 'characterData' &&\n        mutations[0].target.data.match(ASCII) &&\n        Parchment.find(mutations[0].target)) {\n      // Optimization for character changes\n      let textBlot = Parchment.find(mutations[0].target);\n      let formats = bubbleFormats(textBlot);\n      let index = textBlot.offset(this.scroll);\n      let oldValue = mutations[0].oldValue.replace(CursorBlot.CONTENTS, '');\n      let oldText = new Delta().insert(oldValue);\n      let newText = new Delta().insert(textBlot.value());\n      let diffDelta = new Delta().retain(index).concat(oldText.diff(newText, cursorIndex));\n      change = diffDelta.reduce(function(delta, op) {\n        if (op.insert) {\n          return delta.insert(op.insert, formats);\n        } else {\n          return delta.push(op);\n        }\n      }, new Delta());\n      this.delta = oldDelta.compose(change);\n    } else {\n      this.delta = this.getDelta();\n      if (!change || !equal(oldDelta.compose(change), this.delta)) {\n        change = oldDelta.diff(this.delta, cursorIndex);\n      }\n    }\n    return change;\n  }\n}\n\n\nfunction combineFormats(formats, combined) {\n  return Object.keys(combined).reduce(function(merged, name) {\n    if (formats[name] == null) return merged;\n    if (combined[name] === formats[name]) {\n      merged[name] = combined[name];\n    } else if (Array.isArray(combined[name])) {\n      if (combined[name].indexOf(formats[name]) < 0) {\n        merged[name] = combined[name].concat([formats[name]]);\n      }\n    } else {\n      merged[name] = [combined[name], formats[name]];\n    }\n    return merged;\n  }, {});\n}\n\nfunction normalizeDelta(delta) {\n  return delta.reduce(function(delta, op) {\n    if (op.insert === 1) {\n      let attributes = clone(op.attributes);\n      delete attributes['image'];\n      return delta.insert({ image: op.attributes.image }, attributes);\n    }\n    if (op.attributes != null && (op.attributes.list === true || op.attributes.bullet === true)) {\n      op = clone(op);\n      if (op.attributes.list) {\n        op.attributes.list = 'ordered';\n      } else {\n        op.attributes.list = 'bullet';\n        delete op.attributes.bullet;\n      }\n    }\n    if (typeof op.insert === 'string') {\n      let text = op.insert.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n      return delta.insert(text, op.attributes);\n    }\n    return delta.push(op);\n  }, new Delta());\n}\n\n\nexport default Editor;\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n  , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @api private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n  Events.prototype = Object.create(null);\n\n  //\n  // This hack is needed because the `__proto__` property is still inherited in\n  // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n  //\n  if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {Mixed} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @api private\n */\nfunction EE(fn, context, once) {\n  this.fn = fn;\n  this.context = context;\n  this.once = once || false;\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @api public\n */\nfunction EventEmitter() {\n  this._events = new Events();\n  this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @api public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n  var names = []\n    , events\n    , name;\n\n  if (this._eventsCount === 0) return names;\n\n  for (name in (events = this._events)) {\n    if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n  }\n\n  if (Object.getOwnPropertySymbols) {\n    return names.concat(Object.getOwnPropertySymbols(events));\n  }\n\n  return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {String|Symbol} event The event name.\n * @param {Boolean} exists Only check if there are listeners.\n * @returns {Array|Boolean}\n * @api public\n */\nEventEmitter.prototype.listeners = function listeners(event, exists) {\n  var evt = prefix ? prefix + event : event\n    , available = this._events[evt];\n\n  if (exists) return !!available;\n  if (!available) return [];\n  if (available.fn) return [available.fn];\n\n  for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) {\n    ee[i] = available[i].fn;\n  }\n\n  return ee;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {String|Symbol} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @api public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) return false;\n\n  var listeners = this._events[evt]\n    , len = arguments.length\n    , args\n    , i;\n\n  if (listeners.fn) {\n    if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n    switch (len) {\n      case 1: return listeners.fn.call(listeners.context), true;\n      case 2: return listeners.fn.call(listeners.context, a1), true;\n      case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n      case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n      case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n      case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n    }\n\n    for (i = 1, args = new Array(len -1); i < len; i++) {\n      args[i - 1] = arguments[i];\n    }\n\n    listeners.fn.apply(listeners.context, args);\n  } else {\n    var length = listeners.length\n      , j;\n\n    for (i = 0; i < length; i++) {\n      if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n      switch (len) {\n        case 1: listeners[i].fn.call(listeners[i].context); break;\n        case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n        case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n        case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n        default:\n          if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n            args[j - 1] = arguments[j];\n          }\n\n          listeners[i].fn.apply(listeners[i].context, args);\n      }\n    }\n  }\n\n  return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {String|Symbol} event The event name.\n * @param {Function} fn The listener function.\n * @param {Mixed} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @api public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n  var listener = new EE(fn, context || this)\n    , evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++;\n  else if (!this._events[evt].fn) this._events[evt].push(listener);\n  else this._events[evt] = [this._events[evt], listener];\n\n  return this;\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {String|Symbol} event The event name.\n * @param {Function} fn The listener function.\n * @param {Mixed} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @api public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n  var listener = new EE(fn, context || this, true)\n    , evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++;\n  else if (!this._events[evt].fn) this._events[evt].push(listener);\n  else this._events[evt] = [this._events[evt], listener];\n\n  return this;\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {String|Symbol} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {Mixed} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @api public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) return this;\n  if (!fn) {\n    if (--this._eventsCount === 0) this._events = new Events();\n    else delete this._events[evt];\n    return this;\n  }\n\n  var listeners = this._events[evt];\n\n  if (listeners.fn) {\n    if (\n         listeners.fn === fn\n      && (!once || listeners.once)\n      && (!context || listeners.context === context)\n    ) {\n      if (--this._eventsCount === 0) this._events = new Events();\n      else delete this._events[evt];\n    }\n  } else {\n    for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n      if (\n           listeners[i].fn !== fn\n        || (once && !listeners[i].once)\n        || (context && listeners[i].context !== context)\n      ) {\n        events.push(listeners[i]);\n      }\n    }\n\n    //\n    // Reset the array, or remove it completely if we have no more listeners.\n    //\n    if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n    else if (--this._eventsCount === 0) this._events = new Events();\n    else delete this._events[evt];\n  }\n\n  return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {String|Symbol} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @api public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n  var evt;\n\n  if (event) {\n    evt = prefix ? prefix + event : event;\n    if (this._events[evt]) {\n      if (--this._eventsCount === 0) this._events = new Events();\n      else delete this._events[evt];\n    }\n  } else {\n    this._events = new Events();\n    this._eventsCount = 0;\n  }\n\n  return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// This function doesn't apply anymore.\n//\nEventEmitter.prototype.setMaxListeners = function setMaxListeners() {\n  return this;\n};\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n  module.exports = EventEmitter;\n}\n","let levels = ['error', 'warn', 'log', 'info'];\nlet level = 'warn';\n\nfunction debug(method, ...args) {\n  if (levels.indexOf(method) <= levels.indexOf(level)) {\n    console[method](...args);  // eslint-disable-line no-console\n  }\n}\n\nfunction namespace(ns) {\n  return levels.reduce(function(logger, method) {\n    logger[method] = debug.bind(console, method, ns);\n    return logger;\n  }, {});\n}\n\ndebug.level = namespace.level = function(newLevel) {\n  level = newLevel;\n};\n\n\nexport default namespace;\n","import EventEmitter from 'eventemitter3';\nimport logger from './logger';\n\nlet debug = logger('quill:events');\n\nconst EVENTS = ['selectionchange', 'mousedown', 'mouseup', 'click'];\n\nEVENTS.forEach(function(eventName) {\n  document.addEventListener(eventName, (...args) => {\n    [].slice.call(document.querySelectorAll('.ql-container')).forEach((node) => {\n      // TODO use WeakMap\n      if (node.__quill && node.__quill.emitter) {\n        node.__quill.emitter.handleDOM(...args);\n      }\n    });\n  });\n});\n\n\nclass Emitter extends EventEmitter {\n  constructor() {\n    super();\n    this.listeners = {};\n    this.on('error', debug.error);\n  }\n\n  emit() {\n    debug.log.apply(debug, arguments);\n    super.emit.apply(this, arguments);\n  }\n\n  handleDOM(event, ...args) {\n    (this.listeners[event.type] || []).forEach(function({ node, handler }) {\n      if (event.target === node || node.contains(event.target)) {\n        handler(event, ...args);\n      }\n    });\n  }\n\n  listenDOM(eventName, node, handler) {\n    if (!this.listeners[eventName]) {\n      this.listeners[eventName] = [];\n    }\n    this.listeners[eventName].push({ node, handler })\n  }\n}\n\nEmitter.events = {\n  EDITOR_CHANGE        : 'editor-change',\n  SCROLL_BEFORE_UPDATE : 'scroll-before-update',\n  SCROLL_OPTIMIZE      : 'scroll-optimize',\n  SCROLL_UPDATE        : 'scroll-update',\n  SELECTION_CHANGE     : 'selection-change',\n  TEXT_CHANGE          : 'text-change'\n};\nEmitter.sources = {\n  API    : 'api',\n  SILENT : 'silent',\n  USER   : 'user'\n};\n\n\nexport default Emitter;\n","class Module {\n  constructor(quill, options = {}) {\n    this.quill = quill;\n    this.options = options;\n  }\n}\nModule.DEFAULTS = {};\n\n\nexport default Module;\n","import Parchment from 'parchment';\nimport clone from 'clone';\nimport equal from 'deep-equal';\nimport Emitter from './emitter';\nimport logger from './logger';\n\nlet debug = logger('quill:selection');\n\n\nclass Range {\n  constructor(index, length = 0) {\n    this.index = index;\n    this.length = length;\n  }\n}\n\n\nclass Selection {\n  constructor(scroll, emitter) {\n    this.emitter = emitter;\n    this.scroll = scroll;\n    this.composing = false;\n    this.mouseDown = false;\n    this.root = this.scroll.domNode;\n    this.cursor = Parchment.create('cursor', this);\n    // savedRange is last non-null range\n    this.lastRange = this.savedRange = new Range(0, 0);\n    this.handleComposition();\n    this.handleDragging();\n    this.emitter.listenDOM('selectionchange', document, () => {\n      if (!this.mouseDown) {\n        setTimeout(this.update.bind(this, Emitter.sources.USER), 1);\n      }\n    });\n    this.emitter.on(Emitter.events.EDITOR_CHANGE, (type, delta) => {\n      if (type === Emitter.events.TEXT_CHANGE && delta.length() > 0) {\n        this.update(Emitter.sources.SILENT);\n      }\n    });\n    this.emitter.on(Emitter.events.SCROLL_BEFORE_UPDATE, () => {\n      if (!this.hasFocus()) return;\n      let native = this.getNativeRange();\n      if (native == null) return;\n      if (native.start.node === this.cursor.textNode) return;  // cursor.restore() will handle\n      // TODO unclear if this has negative side effects\n      this.emitter.once(Emitter.events.SCROLL_UPDATE, () => {\n        try {\n          this.setNativeRange(native.start.node, native.start.offset, native.end.node, native.end.offset);\n        } catch (ignored) {}\n      });\n    });\n    this.emitter.on(Emitter.events.SCROLL_OPTIMIZE, (mutations, context) => {\n      if (context.range) {\n        const { startNode, startOffset, endNode, endOffset } = context.range;\n        this.setNativeRange(startNode, startOffset, endNode, endOffset);\n      }\n    });\n    this.update(Emitter.sources.SILENT);\n  }\n\n  handleComposition() {\n    this.root.addEventListener('compositionstart', () => {\n      this.composing = true;\n    });\n    this.root.addEventListener('compositionend', () => {\n      this.composing = false;\n      if (this.cursor.parent) {\n        const range = this.cursor.restore();\n        if (!range) return;\n        setTimeout(() => {\n          this.setNativeRange(range.startNode, range.startOffset, range.endNode, range.endOffset);\n        }, 1);\n      }\n    });\n  }\n\n  handleDragging() {\n    this.emitter.listenDOM('mousedown', document.body, () => {\n      this.mouseDown = true;\n    });\n    this.emitter.listenDOM('mouseup', document.body, () => {\n      this.mouseDown = false;\n      this.update(Emitter.sources.USER);\n    });\n  }\n\n  focus() {\n    if (this.hasFocus()) return;\n    this.root.focus();\n    this.setRange(this.savedRange);\n  }\n\n  format(format, value) {\n    if (this.scroll.whitelist != null && !this.scroll.whitelist[format]) return;\n    this.scroll.update();\n    let nativeRange = this.getNativeRange();\n    if (nativeRange == null || !nativeRange.native.collapsed || Parchment.query(format, Parchment.Scope.BLOCK)) return;\n    if (nativeRange.start.node !== this.cursor.textNode) {\n      let blot = Parchment.find(nativeRange.start.node, false);\n      if (blot == null) return;\n      // TODO Give blot ability to not split\n      if (blot instanceof Parchment.Leaf) {\n        let after = blot.split(nativeRange.start.offset);\n        blot.parent.insertBefore(this.cursor, after);\n      } else {\n        blot.insertBefore(this.cursor, nativeRange.start.node);  // Should never happen\n      }\n      this.cursor.attach();\n    }\n    this.cursor.format(format, value);\n    this.scroll.optimize();\n    this.setNativeRange(this.cursor.textNode, this.cursor.textNode.data.length);\n    this.update();\n  }\n\n  getBounds(index, length = 0) {\n    let scrollLength = this.scroll.length();\n    index = Math.min(index, scrollLength - 1);\n    length = Math.min(index + length, scrollLength - 1) - index;\n    let node, [leaf, offset] = this.scroll.leaf(index);\n    if (leaf == null) return null;\n    [node, offset] = leaf.position(offset, true);\n    let range = document.createRange();\n    if (length > 0) {\n      range.setStart(node, offset);\n      [leaf, offset] = this.scroll.leaf(index + length);\n      if (leaf == null) return null;\n      [node, offset] = leaf.position(offset, true);\n      range.setEnd(node, offset);\n      return range.getBoundingClientRect();\n    } else {\n      let side = 'left';\n      let rect;\n      if (node instanceof Text) {\n        if (offset < node.data.length) {\n          range.setStart(node, offset);\n          range.setEnd(node, offset + 1);\n        } else {\n          range.setStart(node, offset - 1);\n          range.setEnd(node, offset);\n          side = 'right';\n        }\n        rect = range.getBoundingClientRect();\n      } else {\n        rect = leaf.domNode.getBoundingClientRect();\n        if (offset > 0) side = 'right';\n      }\n      return {\n        bottom: rect.top + rect.height,\n        height: rect.height,\n        left: rect[side],\n        right: rect[side],\n        top: rect.top,\n        width: 0\n      };\n    }\n  }\n\n  getNativeRange() {\n    let selection = document.getSelection();\n    if (selection == null || selection.rangeCount <= 0) return null;\n    let nativeRange = selection.getRangeAt(0);\n    if (nativeRange == null) return null;\n    let range = this.normalizeNative(nativeRange);\n    debug.info('getNativeRange', range);\n    return range;\n  }\n\n  getRange() {\n    let normalized = this.getNativeRange();\n    if (normalized == null) return [null, null];\n    let range = this.normalizedToRange(normalized);\n    return [range, normalized];\n  }\n\n  hasFocus() {\n    return document.activeElement === this.root;\n  }\n\n  normalizedToRange(range) {\n    let positions = [[range.start.node, range.start.offset]];\n    if (!range.native.collapsed) {\n      positions.push([range.end.node, range.end.offset]);\n    }\n    let indexes = positions.map((position) => {\n      let [node, offset] = position;\n      let blot = Parchment.find(node, true);\n      let index = blot.offset(this.scroll);\n      if (offset === 0) {\n        return index;\n      } else if (blot instanceof Parchment.Container) {\n        return index + blot.length();\n      } else {\n        return index + blot.index(node, offset);\n      }\n    });\n    let end = Math.min(Math.max(...indexes), this.scroll.length() - 1);\n    let start = Math.min(end, ...indexes);\n    return new Range(start, end-start);\n  }\n\n  normalizeNative(nativeRange) {\n    if (!contains(this.root, nativeRange.startContainer) ||\n        (!nativeRange.collapsed && !contains(this.root, nativeRange.endContainer))) {\n      return null;\n    }\n    let range = {\n      start: { node: nativeRange.startContainer, offset: nativeRange.startOffset },\n      end: { node: nativeRange.endContainer, offset: nativeRange.endOffset },\n      native: nativeRange\n    };\n    [range.start, range.end].forEach(function(position) {\n      let node = position.node, offset = position.offset;\n      while (!(node instanceof Text) && node.childNodes.length > 0) {\n        if (node.childNodes.length > offset) {\n          node = node.childNodes[offset];\n          offset = 0;\n        } else if (node.childNodes.length === offset) {\n          node = node.lastChild;\n          offset = node instanceof Text ? node.data.length : node.childNodes.length + 1;\n        } else {\n          break;\n        }\n      }\n      position.node = node, position.offset = offset;\n    });\n    return range;\n  }\n\n  rangeToNative(range) {\n    let indexes = range.collapsed ? [range.index] : [range.index, range.index + range.length];\n    let args = [];\n    let scrollLength = this.scroll.length();\n    indexes.forEach((index, i) => {\n      index = Math.min(scrollLength - 1, index);\n      let node, [leaf, offset] = this.scroll.leaf(index);\n      [node, offset] = leaf.position(offset, i !== 0);\n      args.push(node, offset);\n    });\n    if (args.length < 2) {\n      args = args.concat(args);\n    }\n    return args;\n  }\n\n  scrollIntoView(scrollingContainer) {\n    let range = this.lastRange;\n    if (range == null) return;\n    let bounds = this.getBounds(range.index, range.length);\n    if (bounds == null) return;\n    let limit = this.scroll.length()-1;\n    let [first, ] = this.scroll.line(Math.min(range.index, limit));\n    let last = first;\n    if (range.length > 0) {\n      [last, ] = this.scroll.line(Math.min(range.index + range.length, limit));\n    }\n    if (first == null || last == null) return;\n    let scrollBounds = scrollingContainer.getBoundingClientRect();\n    if (bounds.top < scrollBounds.top) {\n      scrollingContainer.scrollTop -= (scrollBounds.top - bounds.top);\n    } else if (bounds.bottom > scrollBounds.bottom) {\n      scrollingContainer.scrollTop += (bounds.bottom - scrollBounds.bottom);\n    }\n  }\n\n  setNativeRange(startNode, startOffset, endNode = startNode, endOffset = startOffset, force = false) {\n    debug.info('setNativeRange', startNode, startOffset, endNode, endOffset);\n    if (startNode != null && (this.root.parentNode == null || startNode.parentNode == null || endNode.parentNode == null)) {\n      return;\n    }\n    let selection = document.getSelection();\n    if (selection == null) return;\n    if (startNode != null) {\n      if (!this.hasFocus()) this.root.focus();\n      let native = (this.getNativeRange() || {}).native;\n      if (native == null || force ||\n          startNode !== native.startContainer ||\n          startOffset !== native.startOffset ||\n          endNode !== native.endContainer ||\n          endOffset !== native.endOffset) {\n\n        if (startNode.tagName == \"BR\") {\n          startOffset = [].indexOf.call(startNode.parentNode.childNodes, startNode);\n          startNode = startNode.parentNode;\n        }\n        if (endNode.tagName == \"BR\") {\n          endOffset = [].indexOf.call(endNode.parentNode.childNodes, endNode);\n          endNode = endNode.parentNode;\n        }\n        let range = document.createRange();\n        range.setStart(startNode, startOffset);\n        range.setEnd(endNode, endOffset);\n        selection.removeAllRanges();\n        selection.addRange(range);\n      }\n    } else {\n      selection.removeAllRanges();\n      this.root.blur();\n      document.body.focus();  // root.blur() not enough on IE11+Travis+SauceLabs (but not local VMs)\n    }\n  }\n\n  setRange(range, force = false, source = Emitter.sources.API) {\n    if (typeof force === 'string') {\n      source = force;\n      force = false;\n    }\n    debug.info('setRange', range);\n    if (range != null) {\n      let args = this.rangeToNative(range);\n      this.setNativeRange(...args, force);\n    } else {\n      this.setNativeRange(null);\n    }\n    this.update(source);\n  }\n\n  update(source = Emitter.sources.USER) {\n    let oldRange = this.lastRange;\n    let [lastRange, nativeRange] = this.getRange();\n    this.lastRange = lastRange;\n    if (this.lastRange != null) {\n      this.savedRange = this.lastRange;\n    }\n    if (!equal(oldRange, this.lastRange)) {\n      if (!this.composing && nativeRange != null && nativeRange.native.collapsed && nativeRange.start.node !== this.cursor.textNode) {\n        this.cursor.restore();\n      }\n      let args = [Emitter.events.SELECTION_CHANGE, clone(this.lastRange), clone(oldRange), source];\n      this.emitter.emit(Emitter.events.EDITOR_CHANGE, ...args);\n      if (source !== Emitter.sources.SILENT) {\n        this.emitter.emit(...args);\n      }\n    }\n  }\n}\n\n\nfunction contains(parent, descendant) {\n  try {\n    // Firefox inserts inaccessible nodes around video elements\n    descendant.parentNode;\n  } catch (e) {\n    return false;\n  }\n  // IE11 has bug with Text nodes\n  // https://connect.microsoft.com/IE/feedback/details/780874/node-contains-is-incorrect\n  if (descendant instanceof Text) {\n    descendant = descendant.parentNode;\n  }\n  return parent.contains(descendant);\n}\n\n\nexport { Range, Selection as default };\n","class Theme {\n  constructor(quill, options) {\n    this.quill = quill;\n    this.options = options;\n    this.modules = {};\n  }\n\n  init() {\n    Object.keys(this.options.modules).forEach((name) => {\n      if (this.modules[name] == null) {\n        this.addModule(name);\n      }\n    });\n  }\n\n  addModule(name) {\n    let moduleClass = this.quill.constructor.import(`modules/${name}`);\n    this.modules[name] = new moduleClass(this.quill, this.options.modules[name] || {});\n    return this.modules[name];\n  }\n}\nTheme.DEFAULTS = {\n  modules: {}\n};\nTheme.themes = {\n  'default': Theme\n};\n\n\nexport default Theme;\n","import './polyfill';\nimport Delta from 'quill-delta';\nimport Editor from './editor';\nimport Emitter from './emitter';\nimport Module from './module';\nimport Parchment from 'parchment';\nimport Selection, { Range } from './selection';\nimport extend from 'extend';\nimport logger from './logger';\nimport Theme from './theme';\n\nlet debug = logger('quill');\n\n\nclass Quill {\n  static debug(limit) {\n    if (limit === true) {\n      limit = 'log';\n    }\n    logger.level(limit);\n  }\n\n  static find(node) {\n    return node.__quill || Parchment.find(node);\n  }\n\n  static import(name) {\n    if (this.imports[name] == null) {\n      debug.error(`Cannot import ${name}. Are you sure it was registered?`);\n    }\n    return this.imports[name];\n  }\n\n  static register(path, target, overwrite = false) {\n    if (typeof path !== 'string') {\n      let name = path.attrName || path.blotName;\n      if (typeof name === 'string') {\n        // register(Blot | Attributor, overwrite)\n        this.register('formats/' + name, path, target);\n      } else {\n        Object.keys(path).forEach((key) => {\n          this.register(key, path[key], target);\n        });\n      }\n    } else {\n      if (this.imports[path] != null && !overwrite) {\n        debug.warn(`Overwriting ${path} with`, target);\n      }\n      this.imports[path] = target;\n      if ((path.startsWith('blots/') || path.startsWith('formats/')) &&\n          target.blotName !== 'abstract') {\n        Parchment.register(target);\n      } else if (path.startsWith('modules') && typeof target.register === 'function') {\n        target.register();\n      }\n    }\n  }\n\n  constructor(container, options = {}) {\n    this.options = expandConfig(container, options);\n    this.container = this.options.container;\n    if (this.container == null) {\n      return debug.error('Invalid Quill container', container);\n    }\n    if (this.options.debug) {\n      Quill.debug(this.options.debug);\n    }\n    let html = this.container.innerHTML.trim();\n    this.container.classList.add('ql-container');\n    this.container.innerHTML = '';\n    this.container.__quill = this;\n    this.root = this.addContainer('ql-editor');\n    this.root.classList.add('ql-blank');\n    this.root.setAttribute('data-gramm', false);\n    this.scrollingContainer = this.options.scrollingContainer || this.root;\n    this.emitter = new Emitter();\n    this.scroll = Parchment.create(this.root, {\n      emitter: this.emitter,\n      whitelist: this.options.formats\n    });\n    this.editor = new Editor(this.scroll);\n    this.selection = new Selection(this.scroll, this.emitter);\n    this.theme = new this.options.theme(this, this.options);\n    this.keyboard = this.theme.addModule('keyboard');\n    this.clipboard = this.theme.addModule('clipboard');\n    this.history = this.theme.addModule('history');\n    this.theme.init();\n    this.emitter.on(Emitter.events.EDITOR_CHANGE, (type) => {\n      if (type === Emitter.events.TEXT_CHANGE) {\n        this.root.classList.toggle('ql-blank', this.editor.isBlank());\n      }\n    });\n    this.emitter.on(Emitter.events.SCROLL_UPDATE, (source, mutations) => {\n      let range = this.selection.lastRange;\n      let index = range && range.length === 0 ? range.index : undefined;\n      modify.call(this, () => {\n        return this.editor.update(null, mutations, index);\n      }, source);\n    });\n    let contents = this.clipboard.convert(`<div class='ql-editor' style=\"white-space: normal;\">${html}<p><br></p></div>`);\n    this.setContents(contents);\n    this.history.clear();\n    if (this.options.placeholder) {\n      this.root.setAttribute('data-placeholder', this.options.placeholder);\n    }\n    if (this.options.readOnly) {\n      this.disable();\n    }\n  }\n\n  addContainer(container, refNode = null) {\n    if (typeof container === 'string') {\n      let className = container;\n      container = document.createElement('div');\n      container.classList.add(className);\n    }\n    this.container.insertBefore(container, refNode);\n    return container;\n  }\n\n  blur() {\n    this.selection.setRange(null);\n  }\n\n  deleteText(index, length, source) {\n    [index, length, , source] = overload(index, length, source);\n    return modify.call(this, () => {\n      return this.editor.deleteText(index, length);\n    }, source, index, -1*length);\n  }\n\n  disable() {\n    this.enable(false);\n  }\n\n  enable(enabled = true) {\n    this.scroll.enable(enabled);\n    this.container.classList.toggle('ql-disabled', !enabled);\n  }\n\n  focus() {\n    let scrollTop = this.scrollingContainer.scrollTop;\n    this.selection.focus();\n    this.scrollingContainer.scrollTop = scrollTop;\n    this.scrollIntoView();\n  }\n\n  format(name, value, source = Emitter.sources.API) {\n    return modify.call(this, () => {\n      let range = this.getSelection(true);\n      let change = new Delta();\n      if (range == null) {\n        return change;\n      } else if (Parchment.query(name, Parchment.Scope.BLOCK)) {\n        change = this.editor.formatLine(range.index, range.length, { [name]: value });\n      } else if (range.length === 0) {\n        this.selection.format(name, value);\n        return change;\n      } else {\n        change = this.editor.formatText(range.index, range.length, { [name]: value });\n      }\n      this.setSelection(range, Emitter.sources.SILENT);\n      return change;\n    }, source);\n  }\n\n  formatLine(index, length, name, value, source) {\n    let formats;\n    [index, length, formats, source] = overload(index, length, name, value, source);\n    return modify.call(this, () => {\n      return this.editor.formatLine(index, length, formats);\n    }, source, index, 0);\n  }\n\n  formatText(index, length, name, value, source) {\n    let formats;\n    [index, length, formats, source] = overload(index, length, name, value, source);\n    return modify.call(this, () => {\n      return this.editor.formatText(index, length, formats);\n    }, source, index, 0);\n  }\n\n  getBounds(index, length = 0) {\n    let bounds;\n    if (typeof index === 'number') {\n      bounds = this.selection.getBounds(index, length);\n    } else {\n      bounds = this.selection.getBounds(index.index, index.length);\n    }\n    let containerBounds = this.container.getBoundingClientRect();\n    return {\n      bottom: bounds.bottom - containerBounds.top,\n      height: bounds.height,\n      left: bounds.left - containerBounds.left,\n      right: bounds.right - containerBounds.left,\n      top: bounds.top - containerBounds.top,\n      width: bounds.width\n    };\n  }\n\n  getContents(index = 0, length = this.getLength() - index) {\n    [index, length] = overload(index, length);\n    return this.editor.getContents(index, length);\n  }\n\n  getFormat(index = this.getSelection(true), length = 0) {\n    if (typeof index === 'number') {\n      return this.editor.getFormat(index, length);\n    } else {\n      return this.editor.getFormat(index.index, index.length);\n    }\n  }\n\n  getIndex(blot) {\n    return blot.offset(this.scroll);\n  }\n\n  getLength() {\n    return this.scroll.length();\n  }\n\n  getLeaf(index) {\n    return this.scroll.leaf(index);\n  }\n\n  getLine(index) {\n    return this.scroll.line(index);\n  }\n\n  getLines(index = 0, length = Number.MAX_VALUE) {\n    if (typeof index !== 'number') {\n      return this.scroll.lines(index.index, index.length);\n    } else {\n      return this.scroll.lines(index, length);\n    }\n  }\n\n  getModule(name) {\n    return this.theme.modules[name];\n  }\n\n  getSelection(focus = false) {\n    if (focus) this.focus();\n    this.update();  // Make sure we access getRange with editor in consistent state\n    return this.selection.getRange()[0];\n  }\n\n  getText(index = 0, length = this.getLength() - index) {\n    [index, length] = overload(index, length);\n    return this.editor.getText(index, length);\n  }\n\n  hasFocus() {\n    return this.selection.hasFocus();\n  }\n\n  insertEmbed(index, embed, value, source = Quill.sources.API) {\n    return modify.call(this, () => {\n      return this.editor.insertEmbed(index, embed, value);\n    }, source, index);\n  }\n\n  insertText(index, text, name, value, source) {\n    let formats;\n    [index, , formats, source] = overload(index, 0, name, value, source);\n    return modify.call(this, () => {\n      return this.editor.insertText(index, text, formats);\n    }, source, index, text.length);\n  }\n\n  isEnabled() {\n    return !this.container.classList.contains('ql-disabled');\n  }\n\n  off() {\n    return this.emitter.off.apply(this.emitter, arguments);\n  }\n\n  on() {\n    return this.emitter.on.apply(this.emitter, arguments);\n  }\n\n  once() {\n    return this.emitter.once.apply(this.emitter, arguments);\n  }\n\n  pasteHTML(index, html, source) {\n    this.clipboard.dangerouslyPasteHTML(index, html, source);\n  }\n\n  removeFormat(index, length, source) {\n    [index, length, , source] = overload(index, length, source);\n    return modify.call(this, () => {\n      return this.editor.removeFormat(index, length);\n    }, source, index);\n  }\n\n  scrollIntoView() {\n    this.selection.scrollIntoView(this.scrollingContainer);\n  }\n\n  setContents(delta, source = Emitter.sources.API) {\n    return modify.call(this, () => {\n      delta = new Delta(delta);\n      let length = this.getLength();\n      let deleted = this.editor.deleteText(0, length);\n      let applied = this.editor.applyDelta(delta);\n      let lastOp = applied.ops[applied.ops.length - 1];\n      if (lastOp != null && typeof(lastOp.insert) === 'string' && lastOp.insert[lastOp.insert.length-1] === '\\n') {\n        this.editor.deleteText(this.getLength() - 1, 1);\n        applied.delete(1);\n      }\n      let ret = deleted.compose(applied);\n      return ret;\n    }, source);\n  }\n\n  setSelection(index, length, source) {\n    if (index == null) {\n      this.selection.setRange(null, length || Quill.sources.API);\n    } else {\n      [index, length, , source] = overload(index, length, source);\n      this.selection.setRange(new Range(index, length), source);\n      if (source !== Emitter.sources.SILENT) {\n        this.selection.scrollIntoView(this.scrollingContainer);\n      }\n    }\n  }\n\n  setText(text, source = Emitter.sources.API) {\n    let delta = new Delta().insert(text);\n    return this.setContents(delta, source);\n  }\n\n  update(source = Emitter.sources.USER) {\n    let change = this.scroll.update(source);   // Will update selection before selection.update() does if text changes\n    this.selection.update(source);\n    return change;\n  }\n\n  updateContents(delta, source = Emitter.sources.API) {\n    return modify.call(this, () => {\n      delta = new Delta(delta);\n      return this.editor.applyDelta(delta, source);\n    }, source, true);\n  }\n}\nQuill.DEFAULTS = {\n  bounds: null,\n  formats: null,\n  modules: {},\n  placeholder: '',\n  readOnly: false,\n  scrollingContainer: null,\n  strict: true,\n  theme: 'default'\n};\nQuill.events = Emitter.events;\nQuill.sources = Emitter.sources;\n// eslint-disable-next-line no-undef\nQuill.version = typeof(QUILL_VERSION) === 'undefined' ? 'dev' : QUILL_VERSION;\n\nQuill.imports = {\n  'delta'       : Delta,\n  'parchment'   : Parchment,\n  'core/module' : Module,\n  'core/theme'  : Theme\n};\n\n\nfunction expandConfig(container, userConfig) {\n  userConfig = extend(true, {\n    container: container,\n    modules: {\n      clipboard: true,\n      keyboard: true,\n      history: true\n    }\n  }, userConfig);\n  if (!userConfig.theme || userConfig.theme === Quill.DEFAULTS.theme) {\n    userConfig.theme = Theme;\n  } else {\n    userConfig.theme = Quill.import(`themes/${userConfig.theme}`);\n    if (userConfig.theme == null) {\n      throw new Error(`Invalid theme ${userConfig.theme}. Did you register it?`);\n    }\n  }\n  let themeConfig = extend(true, {}, userConfig.theme.DEFAULTS);\n  [themeConfig, userConfig].forEach(function(config) {\n    config.modules = config.modules || {};\n    Object.keys(config.modules).forEach(function(module) {\n      if (config.modules[module] === true) {\n        config.modules[module] = {};\n      }\n    });\n  });\n  let moduleNames = Object.keys(themeConfig.modules).concat(Object.keys(userConfig.modules));\n  let moduleConfig = moduleNames.reduce(function(config, name) {\n    let moduleClass = Quill.import(`modules/${name}`);\n    if (moduleClass == null) {\n      debug.error(`Cannot load ${name} module. Are you sure you registered it?`);\n    } else {\n      config[name] = moduleClass.DEFAULTS || {};\n    }\n    return config;\n  }, {});\n  // Special case toolbar shorthand\n  if (userConfig.modules != null && userConfig.modules.toolbar &&\n      userConfig.modules.toolbar.constructor !== Object) {\n    userConfig.modules.toolbar = {\n      container: userConfig.modules.toolbar\n    };\n  }\n  userConfig = extend(true, {}, Quill.DEFAULTS, { modules: moduleConfig }, themeConfig, userConfig);\n  ['bounds', 'container', 'scrollingContainer'].forEach(function(key) {\n    if (typeof userConfig[key] === 'string') {\n      userConfig[key] = document.querySelector(userConfig[key]);\n    }\n  });\n  userConfig.modules = Object.keys(userConfig.modules).reduce(function(config, name) {\n    if (userConfig.modules[name]) {\n      config[name] = userConfig.modules[name];\n    }\n    return config;\n  }, {});\n  return userConfig;\n}\n\n// Handle selection preservation and TEXT_CHANGE emission\n// common to modification APIs\nfunction modify(modifier, source, index, shift) {\n  if (this.options.strict && !this.isEnabled() && source === Emitter.sources.USER) {\n    return new Delta();\n  }\n  let range = index == null ? null : this.getSelection();\n  let oldDelta = this.editor.delta;\n  let change = modifier();\n  if (range != null) {\n    if (index === true) index = range.index;\n    if (shift == null) {\n      range = shiftRange(range, change, source);\n    } else if (shift !== 0) {\n      range = shiftRange(range, index, shift, source);\n    }\n    this.setSelection(range, Emitter.sources.SILENT);\n  }\n  if (change.length() > 0) {\n    let args = [Emitter.events.TEXT_CHANGE, change, oldDelta, source];\n    this.emitter.emit(Emitter.events.EDITOR_CHANGE, ...args);\n    if (source !== Emitter.sources.SILENT) {\n      this.emitter.emit(...args);\n    }\n  }\n  return change;\n}\n\nfunction overload(index, length, name, value, source) {\n  let formats = {};\n  if (typeof index.index === 'number' && typeof index.length === 'number') {\n    // Allow for throwaway end (used by insertText/insertEmbed)\n    if (typeof length !== 'number') {\n      source = value, value = name, name = length, length = index.length, index = index.index;\n    } else {\n      length = index.length, index = index.index;\n    }\n  } else if (typeof length !== 'number') {\n    source = value, value = name, name = length, length = 0;\n  }\n  // Handle format being object, two format name/value strings or excluded\n  if (typeof name === 'object') {\n    formats = name;\n    source = value;\n  } else if (typeof name === 'string') {\n    if (value != null) {\n      formats[name] = value;\n    } else {\n      source = name;\n    }\n  }\n  // Handle optional source\n  source = source || Emitter.sources.API;\n  return [index, length, formats, source];\n}\n\nfunction shiftRange(range, index, length, source) {\n  if (range == null) return null;\n  let start, end;\n  if (index instanceof Delta) {\n    [start, end] = [range.index, range.index + range.length].map(function(pos) {\n      return index.transformPosition(pos, source !== Emitter.sources.USER);\n    });\n  } else {\n    [start, end] = [range.index, range.index + range.length].map(function(pos) {\n      if (pos < index || (pos === index && source === Emitter.sources.USER)) return pos;\n      if (length >= 0) {\n        return pos + length;\n      } else {\n        return Math.max(index, pos + length);\n      }\n    });\n  }\n  return new Range(start, end - start);\n}\n\n\nexport { expandConfig, overload, Quill as default };\n","import Parchment from 'parchment';\nimport Block, { BlockEmbed } from './block';\n\n\nclass Container extends Parchment.Container { }\nContainer.allowedChildren = [Block, BlockEmbed, Container];\n\n\nexport default Container;\n","import Parchment from 'parchment';\nimport TextBlot from './text';\n\nconst GUARD_TEXT = \"\\uFEFF\";\n\n\nclass Embed extends Parchment.Embed {\n  constructor(node) {\n    super(node);\n    this.contentNode = document.createElement('span');\n    this.contentNode.setAttribute('contenteditable', false);\n    [].slice.call(this.domNode.childNodes).forEach((childNode) => {\n      this.contentNode.appendChild(childNode);\n    });\n    this.leftGuard = document.createTextNode(GUARD_TEXT);\n    this.rightGuard = document.createTextNode(GUARD_TEXT);\n    this.domNode.appendChild(this.leftGuard);\n    this.domNode.appendChild(this.contentNode);\n    this.domNode.appendChild(this.rightGuard);\n  }\n\n  index(node, offset) {\n    if (node === this.leftGuard) return 0;\n    if (node === this.rightGuard) return 1;\n    return super.index(node, offset);\n  }\n\n  restore(node) {\n    let range, textNode;\n    let text = node.data.split(GUARD_TEXT).join('');\n    if (node === this.leftGuard) {\n      if (this.prev instanceof TextBlot) {\n        let prevLength = this.prev.length();\n        this.prev.insertAt(prevLength, text);\n        range = {\n          startNode: this.prev.domNode,\n          startOffset: prevLength + text.length\n        };\n      } else {\n        textNode = document.createTextNode(text);\n        this.parent.insertBefore(Parchment.create(textNode), this);\n        range = {\n          startNode: textNode,\n          startOffset: text.length\n        };\n      }\n    } else if (node === this.rightGuard) {\n      if (this.next instanceof TextBlot) {\n        this.next.insertAt(0, text);\n        range = {\n          startNode: this.next.domNode,\n          startOffset: text.length\n        }\n      } else {\n        textNode = document.createTextNode(text);\n        this.parent.insertBefore(Parchment.create(textNode), this.next);\n        range = {\n          startNode: textNode,\n          startOffset: text.length\n        };\n      }\n    }\n    node.data = GUARD_TEXT;\n    return range;\n  }\n\n  update(mutations, context) {\n    mutations.forEach((mutation) => {\n      if (mutation.type === 'characterData' &&\n          (mutation.target === this.leftGuard || mutation.target === this.rightGuard)) {\n        let range = this.restore(mutation.target);\n        if (range) context.range = range;\n      }\n    });\n  }\n}\n\n\nexport default Embed;\n","import Parchment from 'parchment';\nimport Emitter from '../core/emitter';\nimport Block, { BlockEmbed } from './block';\nimport Break from './break';\nimport CodeBlock from '../formats/code';\nimport Container from './container';\n\n\nfunction isLine(blot) {\n  return (blot instanceof Block || blot instanceof BlockEmbed);\n}\n\n\nclass Scroll extends Parchment.Scroll {\n  constructor(domNode, config) {\n    super(domNode);\n    this.emitter = config.emitter;\n    if (Array.isArray(config.whitelist)) {\n      this.whitelist = config.whitelist.reduce(function(whitelist, format) {\n        whitelist[format] = true;\n        return whitelist;\n      }, {});\n    }\n    // Some reason fixes composition issues with character languages in Windows/Chrome, Safari\n    this.domNode.addEventListener('DOMNodeInserted', function() {});\n    this.optimize();\n    this.enable();\n  }\n\n  batchStart() {\n    this.batch = true;\n  }\n\n  batchEnd() {\n    this.batch = false;\n    this.optimize();\n  }\n\n  deleteAt(index, length) {\n    let [first, offset] = this.line(index);\n    let [last, ] = this.line(index + length);\n    super.deleteAt(index, length);\n    if (last != null && first !== last && offset > 0) {\n      if (first instanceof BlockEmbed || last instanceof BlockEmbed) {\n        this.optimize();\n        return;\n      }\n      if (first instanceof CodeBlock) {\n        let newlineIndex = first.newlineIndex(first.length(), true);\n        if (newlineIndex > -1) {\n          first = first.split(newlineIndex + 1);\n          if (first === last) {\n            this.optimize();\n            return;\n          }\n        }\n      } else if (last instanceof CodeBlock) {\n        let newlineIndex = last.newlineIndex(0);\n        if (newlineIndex > -1) {\n          last.split(newlineIndex + 1);\n        }\n      }\n      let ref = last.children.head instanceof Break ? null : last.children.head;\n      first.moveChildren(last, ref);\n      first.remove();\n    }\n    this.optimize();\n  }\n\n  enable(enabled = true) {\n    this.domNode.setAttribute('contenteditable', enabled);\n  }\n\n  formatAt(index, length, format, value) {\n    if (this.whitelist != null && !this.whitelist[format]) return;\n    super.formatAt(index, length, format, value);\n    this.optimize();\n  }\n\n  insertAt(index, value, def) {\n    if (def != null && this.whitelist != null && !this.whitelist[value]) return;\n    if (index >= this.length()) {\n      if (def == null || Parchment.query(value, Parchment.Scope.BLOCK) == null) {\n        let blot = Parchment.create(this.statics.defaultChild);\n        this.appendChild(blot);\n        if (def == null && value.endsWith('\\n')) {\n          value = value.slice(0, -1);\n        }\n        blot.insertAt(0, value, def);\n      } else {\n        let embed = Parchment.create(value, def);\n        this.appendChild(embed);\n      }\n    } else {\n      super.insertAt(index, value, def);\n    }\n    this.optimize();\n  }\n\n  insertBefore(blot, ref) {\n    if (blot.statics.scope === Parchment.Scope.INLINE_BLOT) {\n      let wrapper = Parchment.create(this.statics.defaultChild);\n      wrapper.appendChild(blot);\n      blot = wrapper;\n    }\n    super.insertBefore(blot, ref);\n  }\n\n  leaf(index) {\n    return this.path(index).pop() || [null, -1];\n  }\n\n  line(index) {\n    if (index === this.length()) {\n      return this.line(index - 1);\n    }\n    return this.descendant(isLine, index);\n  }\n\n  lines(index = 0, length = Number.MAX_VALUE) {\n    let getLines = (blot, index, length) => {\n      let lines = [], lengthLeft = length;\n      blot.children.forEachAt(index, length, function(child, index, length) {\n        if (isLine(child)) {\n          lines.push(child);\n        } else if (child instanceof Parchment.Container) {\n          lines = lines.concat(getLines(child, index, lengthLeft));\n        }\n        lengthLeft -= length;\n      });\n      return lines;\n    };\n    return getLines(this, index, length);\n  }\n\n  optimize(mutations = [], context = {}) {\n    if (this.batch === true) return;\n    super.optimize(mutations, context);\n    if (mutations.length > 0) {\n      this.emitter.emit(Emitter.events.SCROLL_OPTIMIZE, mutations, context);\n    }\n  }\n\n  path(index) {\n    return super.path(index).slice(1);  // Exclude self\n  }\n\n  update(mutations) {\n    if (this.batch === true) return;\n    let source = Emitter.sources.USER;\n    if (typeof mutations === 'string') {\n      source = mutations;\n    }\n    if (!Array.isArray(mutations)) {\n      mutations = this.observer.takeRecords();\n    }\n    if (mutations.length > 0) {\n      this.emitter.emit(Emitter.events.SCROLL_BEFORE_UPDATE, source, mutations);\n    }\n    super.update(mutations.concat([]));   // pass copy\n    if (mutations.length > 0) {\n      this.emitter.emit(Emitter.events.SCROLL_UPDATE, source, mutations);\n    }\n  }\n}\nScroll.blotName = 'scroll';\nScroll.className = 'ql-editor';\nScroll.tagName = 'DIV';\nScroll.defaultChild = 'block';\nScroll.allowedChildren = [Block, BlockEmbed, Container];\n\n\nexport default Scroll;\n","import Parchment from 'parchment';\n\nlet config = {\n  scope: Parchment.Scope.BLOCK,\n  whitelist: ['right', 'center', 'justify']\n};\n\nlet AlignAttribute = new Parchment.Attributor.Attribute('align', 'align', config);\nlet AlignClass = new Parchment.Attributor.Class('align', 'ql-align', config);\nlet AlignStyle = new Parchment.Attributor.Style('align', 'text-align', config);\n\nexport { AlignAttribute, AlignClass, AlignStyle };\n","import Parchment from 'parchment';\n\nclass ColorAttributor extends Parchment.Attributor.Style {\n  value(domNode) {\n    let value = super.value(domNode);\n    if (!value.startsWith('rgb(')) return value;\n    value = value.replace(/^[^\\d]+/, '').replace(/[^\\d]+$/, '');\n    return '#' + value.split(',').map(function(component) {\n      return ('00' + parseInt(component).toString(16)).slice(-2);\n    }).join('');\n  }\n}\n\nlet ColorClass = new Parchment.Attributor.Class('color', 'ql-color', {\n  scope: Parchment.Scope.INLINE\n});\nlet ColorStyle = new ColorAttributor('color', 'color', {\n  scope: Parchment.Scope.INLINE\n});\n\nexport { ColorAttributor, ColorClass, ColorStyle };\n","import Parchment from 'parchment';\nimport { ColorAttributor } from './color';\n\nlet BackgroundClass = new Parchment.Attributor.Class('background', 'ql-bg', {\n  scope: Parchment.Scope.INLINE\n});\nlet BackgroundStyle = new ColorAttributor('background', 'background-color', {\n  scope: Parchment.Scope.INLINE\n});\n\nexport { BackgroundClass, BackgroundStyle };\n","import Parchment from 'parchment';\n\nlet config = {\n  scope: Parchment.Scope.BLOCK,\n  whitelist: ['rtl']\n};\n\nlet DirectionAttribute = new Parchment.Attributor.Attribute('direction', 'dir', config);\nlet DirectionClass = new Parchment.Attributor.Class('direction', 'ql-direction', config);\nlet DirectionStyle = new Parchment.Attributor.Style('direction', 'direction', config);\n\nexport { DirectionAttribute, DirectionClass, DirectionStyle };\n","import Parchment from 'parchment';\n\nlet config = {\n  scope: Parchment.Scope.INLINE,\n  whitelist: ['serif', 'monospace']\n};\n\nlet FontClass = new Parchment.Attributor.Class('font', 'ql-font', config);\n\nclass FontStyleAttributor extends Parchment.Attributor.Style {\n  value(node) {\n    return super.value(node).replace(/[\"']/g, '');\n  }\n}\n\nlet FontStyle = new FontStyleAttributor('font', 'font-family', config);\n\nexport { FontStyle, FontClass };\n","import Parchment from 'parchment';\n\nlet SizeClass = new Parchment.Attributor.Class('size', 'ql-size', {\n  scope: Parchment.Scope.INLINE,\n  whitelist: ['small', 'large', 'huge']\n});\nlet SizeStyle = new Parchment.Attributor.Style('size', 'font-size', {\n  scope: Parchment.Scope.INLINE,\n  whitelist: ['10px', '18px', '32px']\n});\n\nexport { SizeClass, SizeStyle };\n","import extend from 'extend';\nimport Delta from 'quill-delta';\nimport Parchment from 'parchment';\nimport Quill from '../core/quill';\nimport logger from '../core/logger';\nimport Module from '../core/module';\n\nimport { AlignAttribute, AlignStyle } from '../formats/align';\nimport { BackgroundStyle } from '../formats/background';\nimport CodeBlock from '../formats/code';\nimport { ColorStyle } from '../formats/color';\nimport { DirectionAttribute, DirectionStyle } from '../formats/direction';\nimport { FontStyle } from '../formats/font';\nimport { SizeStyle } from '../formats/size';\n\nlet debug = logger('quill:clipboard');\n\n\nconst DOM_KEY = '__ql-matcher';\n\nconst CLIPBOARD_CONFIG = [\n  [Node.TEXT_NODE, matchText],\n  [Node.TEXT_NODE, matchNewline],\n  ['br', matchBreak],\n  [Node.ELEMENT_NODE, matchNewline],\n  [Node.ELEMENT_NODE, matchBlot],\n  [Node.ELEMENT_NODE, matchSpacing],\n  [Node.ELEMENT_NODE, matchAttributor],\n  [Node.ELEMENT_NODE, matchStyles],\n  ['li', matchIndent],\n  ['b', matchAlias.bind(matchAlias, 'bold')],\n  ['i', matchAlias.bind(matchAlias, 'italic')],\n  ['style', matchIgnore]\n];\n\nconst ATTRIBUTE_ATTRIBUTORS = [\n  AlignAttribute,\n  DirectionAttribute\n].reduce(function(memo, attr) {\n  memo[attr.keyName] = attr;\n  return memo;\n}, {});\n\nconst STYLE_ATTRIBUTORS = [\n  AlignStyle,\n  BackgroundStyle,\n  ColorStyle,\n  DirectionStyle,\n  FontStyle,\n  SizeStyle\n].reduce(function(memo, attr) {\n  memo[attr.keyName] = attr;\n  return memo;\n}, {});\n\n\nclass Clipboard extends Module {\n  constructor(quill, options) {\n    super(quill, options);\n    this.quill.root.addEventListener('paste', this.onPaste.bind(this));\n    this.container = this.quill.addContainer('ql-clipboard');\n    this.container.setAttribute('contenteditable', true);\n    this.container.setAttribute('tabindex', -1);\n    this.matchers = [];\n    CLIPBOARD_CONFIG.concat(this.options.matchers).forEach(([selector, matcher]) => {\n      if (!options.matchVisual && matcher === matchSpacing) return;\n      this.addMatcher(selector, matcher);\n    });\n  }\n\n  addMatcher(selector, matcher) {\n    this.matchers.push([selector, matcher]);\n  }\n\n  convert(html) {\n    if (typeof html === 'string') {\n      this.container.innerHTML = html.replace(/\\>\\r?\\n +\\</g, '><'); // Remove spaces between tags\n      return this.convert();\n    }\n    const formats = this.quill.getFormat(this.quill.selection.savedRange.index);\n    if (formats[CodeBlock.blotName]) {\n      const text = this.container.innerText;\n      this.container.innerHTML = '';\n      return new Delta().insert(text, { [CodeBlock.blotName]: formats[CodeBlock.blotName] });\n    }\n    let [elementMatchers, textMatchers] = this.prepareMatching();\n    let delta = traverse(this.container, elementMatchers, textMatchers);\n    // Remove trailing newline\n    if (deltaEndsWith(delta, '\\n') && delta.ops[delta.ops.length - 1].attributes == null) {\n      delta = delta.compose(new Delta().retain(delta.length() - 1).delete(1));\n    }\n    debug.log('convert', this.container.innerHTML, delta);\n    this.container.innerHTML = '';\n    return delta;\n  }\n\n  dangerouslyPasteHTML(index, html, source = Quill.sources.API) {\n    if (typeof index === 'string') {\n      this.quill.setContents(this.convert(index), html);\n      this.quill.setSelection(0, Quill.sources.SILENT);\n    } else {\n      let paste = this.convert(html);\n      this.quill.updateContents(new Delta().retain(index).concat(paste), source);\n      this.quill.setSelection(index + paste.length(), Quill.sources.SILENT);\n    }\n  }\n\n  onPaste(e) {\n    if (e.defaultPrevented || !this.quill.isEnabled()) return;\n    let range = this.quill.getSelection();\n    let delta = new Delta().retain(range.index);\n    let scrollTop = this.quill.scrollingContainer.scrollTop;\n    this.container.focus();\n    this.quill.selection.update(Quill.sources.SILENT);\n    setTimeout(() => {\n      delta = delta.concat(this.convert()).delete(range.length);\n      this.quill.updateContents(delta, Quill.sources.USER);\n      // range.length contributes to delta.length()\n      this.quill.setSelection(delta.length() - range.length, Quill.sources.SILENT);\n      this.quill.scrollingContainer.scrollTop = scrollTop;\n      this.quill.focus();\n    }, 1);\n  }\n\n  prepareMatching() {\n    let elementMatchers = [], textMatchers = [];\n    this.matchers.forEach((pair) => {\n      let [selector, matcher] = pair;\n      switch (selector) {\n        case Node.TEXT_NODE:\n          textMatchers.push(matcher);\n          break;\n        case Node.ELEMENT_NODE:\n          elementMatchers.push(matcher);\n          break;\n        default:\n          [].forEach.call(this.container.querySelectorAll(selector), (node) => {\n            // TODO use weakmap\n            node[DOM_KEY] = node[DOM_KEY] || [];\n            node[DOM_KEY].push(matcher);\n          });\n          break;\n      }\n    });\n    return [elementMatchers, textMatchers];\n  }\n}\nClipboard.DEFAULTS = {\n  matchers: [],\n  matchVisual: true\n};\n\n\nfunction applyFormat(delta, format, value) {\n  if (typeof format === 'object') {\n    return Object.keys(format).reduce(function(delta, key) {\n      return applyFormat(delta, key, format[key]);\n    }, delta);\n  } else {\n    return delta.reduce(function(delta, op) {\n      if (op.attributes && op.attributes[format]) {\n        return delta.push(op);\n      } else {\n        return delta.insert(op.insert, extend({}, {[format]: value}, op.attributes));\n      }\n    }, new Delta());\n  }\n}\n\nfunction computeStyle(node) {\n  if (node.nodeType !== Node.ELEMENT_NODE) return {};\n  const DOM_KEY = '__ql-computed-style';\n  return node[DOM_KEY] || (node[DOM_KEY] = window.getComputedStyle(node));\n}\n\nfunction deltaEndsWith(delta, text) {\n  let endText = \"\";\n  for (let i = delta.ops.length - 1; i >= 0 && endText.length < text.length; --i) {\n    let op  = delta.ops[i];\n    if (typeof op.insert !== 'string') break;\n    endText = op.insert + endText;\n  }\n  return endText.slice(-1*text.length) === text;\n}\n\nfunction isLine(node) {\n  if (node.childNodes.length === 0) return false;   // Exclude embed blocks\n  let style = computeStyle(node);\n  return ['block', 'list-item'].indexOf(style.display) > -1;\n}\n\nfunction traverse(node, elementMatchers, textMatchers) {  // Post-order\n  if (node.nodeType === node.TEXT_NODE) {\n    return textMatchers.reduce(function(delta, matcher) {\n      return matcher(node, delta);\n    }, new Delta());\n  } else if (node.nodeType === node.ELEMENT_NODE) {\n    return [].reduce.call(node.childNodes || [], (delta, childNode) => {\n      let childrenDelta = traverse(childNode, elementMatchers, textMatchers);\n      if (childNode.nodeType === node.ELEMENT_NODE) {\n        childrenDelta = elementMatchers.reduce(function(childrenDelta, matcher) {\n          return matcher(childNode, childrenDelta);\n        }, childrenDelta);\n        childrenDelta = (childNode[DOM_KEY] || []).reduce(function(childrenDelta, matcher) {\n          return matcher(childNode, childrenDelta);\n        }, childrenDelta);\n      }\n      return delta.concat(childrenDelta);\n    }, new Delta());\n  } else {\n    return new Delta();\n  }\n}\n\n\nfunction matchAlias(format, node, delta) {\n  return applyFormat(delta, format, true);\n}\n\nfunction matchAttributor(node, delta) {\n  let attributes = Parchment.Attributor.Attribute.keys(node);\n  let classes = Parchment.Attributor.Class.keys(node);\n  let styles = Parchment.Attributor.Style.keys(node);\n  let formats = {};\n  attributes.concat(classes).concat(styles).forEach((name) => {\n    let attr = Parchment.query(name, Parchment.Scope.ATTRIBUTE);\n    if (attr != null) {\n      formats[attr.attrName] = attr.value(node);\n      if (formats[attr.attrName]) return;\n    }\n    attr = ATTRIBUTE_ATTRIBUTORS[name];\n    if (attr != null && (attr.attrName === name || attr.keyName === name)) {\n      formats[attr.attrName] = attr.value(node) || undefined;\n    }\n    attr = STYLE_ATTRIBUTORS[name]\n    if (attr != null && (attr.attrName === name || attr.keyName === name)) {\n      attr = STYLE_ATTRIBUTORS[name];\n      formats[attr.attrName] = attr.value(node) || undefined;\n    }\n  });\n  if (Object.keys(formats).length > 0) {\n    delta = applyFormat(delta, formats);\n  }\n  return delta;\n}\n\nfunction matchBlot(node, delta) {\n  let match = Parchment.query(node);\n  if (match == null) return delta;\n  if (match.prototype instanceof Parchment.Embed) {\n    let embed = {};\n    let value = match.value(node);\n    if (value != null) {\n      embed[match.blotName] = value;\n      delta = new Delta().insert(embed, match.formats(node));\n    }\n  } else if (typeof match.formats === 'function') {\n    delta = applyFormat(delta, match.blotName, match.formats(node));\n  }\n  return delta;\n}\n\nfunction matchBreak(node, delta) {\n  if (!deltaEndsWith(delta, '\\n')) {\n    delta.insert('\\n');\n  }\n  return delta;\n}\n\nfunction matchIgnore() {\n  return new Delta();\n}\n\nfunction matchIndent(node, delta) {\n  let match = Parchment.query(node);\n  if (match == null || match.blotName !== 'list-item' || !deltaEndsWith(delta, '\\n')) {\n    return delta;\n  }\n  let indent = -1, parent = node.parentNode;\n  while (!parent.classList.contains('ql-clipboard')) {\n    if ((Parchment.query(parent) || {}).blotName === 'list') {\n      indent += 1;\n    }\n    parent = parent.parentNode;\n  }\n  if (indent <= 0) return delta;\n  return delta.compose(new Delta().retain(delta.length() - 1).retain(1, { indent: indent}));\n}\n\nfunction matchNewline(node, delta) {\n  if (!deltaEndsWith(delta, '\\n')) {\n    if (isLine(node) || (delta.length() > 0 && node.nextSibling && isLine(node.nextSibling))) {\n      delta.insert('\\n');\n    }\n  }\n  return delta;\n}\n\nfunction matchSpacing(node, delta) {\n  if (isLine(node) && node.nextElementSibling != null && !deltaEndsWith(delta, '\\n\\n')) {\n    let nodeHeight = node.offsetHeight + parseFloat(computeStyle(node).marginTop) + parseFloat(computeStyle(node).marginBottom);\n    if (node.nextElementSibling.offsetTop > node.offsetTop + nodeHeight*1.5) {\n      delta.insert('\\n');\n    }\n  }\n  return delta;\n}\n\nfunction matchStyles(node, delta) {\n  let formats = {};\n  let style = node.style || {};\n  if (style.fontStyle && computeStyle(node).fontStyle === 'italic') {\n    formats.italic = true;\n  }\n  if (style.fontWeight && (computeStyle(node).fontWeight.startsWith('bold') ||\n                           parseInt(computeStyle(node).fontWeight) >= 700)) {\n    formats.bold = true;\n  }\n  if (Object.keys(formats).length > 0) {\n    delta = applyFormat(delta, formats);\n  }\n  if (parseFloat(style.textIndent || 0) > 0) {  // Could be 0.5in\n    delta = new Delta().insert('\\t').concat(delta);\n  }\n  return delta;\n}\n\nfunction matchText(node, delta) {\n  let text = node.data;\n  // Word represents empty line with <o:p>&nbsp;</o:p>\n  if (node.parentNode.tagName === 'O:P') {\n    return delta.insert(text.trim());\n  }\n  if (text.trim().length === 0 && node.parentNode.classList.contains('ql-clipboard')) {\n    return delta;\n  }\n  if (!computeStyle(node.parentNode).whiteSpace.startsWith('pre')) {\n    // eslint-disable-next-line func-style\n    let replacer = function(collapse, match) {\n      match = match.replace(/[^\\u00a0]/g, '');    // \\u00a0 is nbsp;\n      return match.length < 1 && collapse ? ' ' : match;\n    };\n    text = text.replace(/\\r\\n/g, ' ').replace(/\\n/g, ' ');\n    text = text.replace(/\\s\\s+/g, replacer.bind(replacer, true));  // collapse whitespace\n    if ((node.previousSibling == null && isLine(node.parentNode)) ||\n        (node.previousSibling != null && isLine(node.previousSibling))) {\n      text = text.replace(/^\\s+/, replacer.bind(replacer, false));\n    }\n    if ((node.nextSibling == null && isLine(node.parentNode)) ||\n        (node.nextSibling != null && isLine(node.nextSibling))) {\n      text = text.replace(/\\s+$/, replacer.bind(replacer, false));\n    }\n  }\n  return delta.insert(text);\n}\n\n\nexport { Clipboard as default, matchAttributor, matchBlot, matchNewline, matchSpacing, matchText };\n","import Parchment from 'parchment';\nimport Quill from '../core/quill';\nimport Module from '../core/module';\n\n\nclass History extends Module {\n  constructor(quill, options) {\n    super(quill, options);\n    this.lastRecorded = 0;\n    this.ignoreChange = false;\n    this.clear();\n    this.quill.on(Quill.events.EDITOR_CHANGE, (eventName, delta, oldDelta, source) => {\n      if (eventName !== Quill.events.TEXT_CHANGE || this.ignoreChange) return;\n      if (!this.options.userOnly || source === Quill.sources.USER) {\n        this.record(delta, oldDelta);\n      } else {\n        this.transform(delta);\n      }\n    });\n    this.quill.keyboard.addBinding({ key: 'Z', shortKey: true }, this.undo.bind(this));\n    this.quill.keyboard.addBinding({ key: 'Z', shortKey: true, shiftKey: true }, this.redo.bind(this));\n    if (/Win/i.test(navigator.platform)) {\n      this.quill.keyboard.addBinding({ key: 'Y', shortKey: true }, this.redo.bind(this));\n    }\n  }\n\n  change(source, dest) {\n    if (this.stack[source].length === 0) return;\n    let delta = this.stack[source].pop();\n    this.stack[dest].push(delta);\n    this.lastRecorded = 0;\n    this.ignoreChange = true;\n    this.quill.updateContents(delta[source], Quill.sources.USER);\n    this.ignoreChange = false;\n    let index = getLastChangeIndex(delta[source]);\n    this.quill.setSelection(index);\n  }\n\n  clear() {\n    this.stack = { undo: [], redo: [] };\n  }\n\n  cutoff() {\n    this.lastRecorded = 0;\n  }\n\n  record(changeDelta, oldDelta) {\n    if (changeDelta.ops.length === 0) return;\n    this.stack.redo = [];\n    let undoDelta = this.quill.getContents().diff(oldDelta);\n    let timestamp = Date.now();\n    if (this.lastRecorded + this.options.delay > timestamp && this.stack.undo.length > 0) {\n      let delta = this.stack.undo.pop();\n      undoDelta = undoDelta.compose(delta.undo);\n      changeDelta = delta.redo.compose(changeDelta);\n    } else {\n      this.lastRecorded = timestamp;\n    }\n    this.stack.undo.push({\n      redo: changeDelta,\n      undo: undoDelta\n    });\n    if (this.stack.undo.length > this.options.maxStack) {\n      this.stack.undo.shift();\n    }\n  }\n\n  redo() {\n    this.change('redo', 'undo');\n  }\n\n  transform(delta) {\n    this.stack.undo.forEach(function(change) {\n      change.undo = delta.transform(change.undo, true);\n      change.redo = delta.transform(change.redo, true);\n    });\n    this.stack.redo.forEach(function(change) {\n      change.undo = delta.transform(change.undo, true);\n      change.redo = delta.transform(change.redo, true);\n    });\n  }\n\n  undo() {\n    this.change('undo', 'redo');\n  }\n}\nHistory.DEFAULTS = {\n  delay: 1000,\n  maxStack: 100,\n  userOnly: false\n};\n\nfunction endsWithNewlineChange(delta) {\n  let lastOp = delta.ops[delta.ops.length - 1];\n  if (lastOp == null) return false;\n  if (lastOp.insert != null) {\n    return typeof lastOp.insert === 'string' && lastOp.insert.endsWith('\\n');\n  }\n  if (lastOp.attributes != null) {\n    return Object.keys(lastOp.attributes).some(function(attr) {\n      return Parchment.query(attr, Parchment.Scope.BLOCK) != null;\n    });\n  }\n  return false;\n}\n\nfunction getLastChangeIndex(delta) {\n  let deleteLength = delta.reduce(function(length, op) {\n    length += (op.delete || 0);\n    return length;\n  }, 0);\n  let changeIndex = delta.length() - deleteLength;\n  if (endsWithNewlineChange(delta)) {\n    changeIndex -= 1;\n  }\n  return changeIndex;\n}\n\n\nexport { History as default, getLastChangeIndex };\n","import clone from 'clone';\nimport equal from 'deep-equal';\nimport extend from 'extend';\nimport Delta from 'quill-delta';\nimport DeltaOp from 'quill-delta/lib/op';\nimport Parchment from 'parchment';\nimport Quill from '../core/quill';\nimport logger from '../core/logger';\nimport Module from '../core/module';\n\nlet debug = logger('quill:keyboard');\n\nconst SHORTKEY = /Mac/i.test(navigator.platform) ? 'metaKey' : 'ctrlKey';\n\n\nclass Keyboard extends Module {\n  static match(evt, binding) {\n    binding = normalize(binding);\n    if (['altKey', 'ctrlKey', 'metaKey', 'shiftKey'].some(function(key) {\n      return (!!binding[key] !== evt[key] && binding[key] !== null);\n    })) {\n      return false;\n    }\n    return binding.key === (evt.which || evt.keyCode);\n  }\n\n  constructor(quill, options) {\n    super(quill, options);\n    this.bindings = {};\n    Object.keys(this.options.bindings).forEach((name) => {\n      if (name === 'list autofill' &&\n          quill.scroll.whitelist != null &&\n          !quill.scroll.whitelist['list']) {\n        return;\n      }\n      if (this.options.bindings[name]) {\n        this.addBinding(this.options.bindings[name]);\n      }\n    });\n    this.addBinding({ key: Keyboard.keys.ENTER, shiftKey: null }, handleEnter);\n    this.addBinding({ key: Keyboard.keys.ENTER, metaKey: null, ctrlKey: null, altKey: null }, function() {});\n    if (/Firefox/i.test(navigator.userAgent)) {\n      // Need to handle delete and backspace for Firefox in the general case #1171\n      this.addBinding({ key: Keyboard.keys.BACKSPACE }, { collapsed: true }, handleBackspace);\n      this.addBinding({ key: Keyboard.keys.DELETE }, { collapsed: true }, handleDelete);\n    } else {\n      this.addBinding({ key: Keyboard.keys.BACKSPACE }, { collapsed: true, prefix: /^.?$/ }, handleBackspace);\n      this.addBinding({ key: Keyboard.keys.DELETE }, { collapsed: true, suffix: /^.?$/ }, handleDelete);\n    }\n    this.addBinding({ key: Keyboard.keys.BACKSPACE }, { collapsed: false }, handleDeleteRange);\n    this.addBinding({ key: Keyboard.keys.DELETE }, { collapsed: false }, handleDeleteRange);\n    this.addBinding({ key: Keyboard.keys.BACKSPACE, altKey: null, ctrlKey: null, metaKey: null, shiftKey: null },\n                    { collapsed: true, offset: 0 },\n                    handleBackspace);\n    this.listen();\n  }\n\n  addBinding(key, context = {}, handler = {}) {\n    let binding = normalize(key);\n    if (binding == null || binding.key == null) {\n      return debug.warn('Attempted to add invalid keyboard binding', binding);\n    }\n    if (typeof context === 'function') {\n      context = { handler: context };\n    }\n    if (typeof handler === 'function') {\n      handler = { handler: handler };\n    }\n    binding = extend(binding, context, handler);\n    this.bindings[binding.key] = this.bindings[binding.key] || [];\n    this.bindings[binding.key].push(binding);\n  }\n\n  listen() {\n    this.quill.root.addEventListener('keydown', (evt) => {\n      if (evt.defaultPrevented) return;\n      let which = evt.which || evt.keyCode;\n      let bindings = (this.bindings[which] || []).filter(function(binding) {\n        return Keyboard.match(evt, binding);\n      });\n      if (bindings.length === 0) return;\n      let range = this.quill.getSelection();\n      if (range == null || !this.quill.hasFocus()) return;\n      let [line, offset] = this.quill.getLine(range.index);\n      let [leafStart, offsetStart] = this.quill.getLeaf(range.index);\n      let [leafEnd, offsetEnd] = range.length === 0 ? [leafStart, offsetStart] : this.quill.getLeaf(range.index + range.length);\n      let prefixText = leafStart instanceof Parchment.Text ? leafStart.value().slice(0, offsetStart) : '';\n      let suffixText = leafEnd instanceof Parchment.Text ? leafEnd.value().slice(offsetEnd) : '';\n      let curContext = {\n        collapsed: range.length === 0,\n        empty: range.length === 0 && line.length() <= 1,\n        format: this.quill.getFormat(range),\n        offset: offset,\n        prefix: prefixText,\n        suffix: suffixText\n      };\n      let prevented = bindings.some((binding) => {\n        if (binding.collapsed != null && binding.collapsed !== curContext.collapsed) return false;\n        if (binding.empty != null && binding.empty !== curContext.empty) return false;\n        if (binding.offset != null && binding.offset !== curContext.offset) return false;\n        if (Array.isArray(binding.format)) {\n          // any format is present\n          if (binding.format.every(function(name) {\n            return curContext.format[name] == null;\n          })) {\n            return false;\n          }\n        } else if (typeof binding.format === 'object') {\n          // all formats must match\n          if (!Object.keys(binding.format).every(function(name) {\n            if (binding.format[name] === true) return curContext.format[name] != null;\n            if (binding.format[name] === false) return curContext.format[name] == null;\n            return equal(binding.format[name], curContext.format[name]);\n          })) {\n            return false;\n          }\n        }\n        if (binding.prefix != null && !binding.prefix.test(curContext.prefix)) return false;\n        if (binding.suffix != null && !binding.suffix.test(curContext.suffix)) return false;\n        return binding.handler.call(this, range, curContext) !== true;\n      });\n      if (prevented) {\n        evt.preventDefault();\n      }\n    });\n  }\n}\n\nKeyboard.keys = {\n  BACKSPACE: 8,\n  TAB: 9,\n  ENTER: 13,\n  ESCAPE: 27,\n  LEFT: 37,\n  UP: 38,\n  RIGHT: 39,\n  DOWN: 40,\n  DELETE: 46\n};\n\nKeyboard.DEFAULTS = {\n  bindings: {\n    'bold'      : makeFormatHandler('bold'),\n    'italic'    : makeFormatHandler('italic'),\n    'underline' : makeFormatHandler('underline'),\n    'indent': {\n      // highlight tab or tab at beginning of list, indent or blockquote\n      key: Keyboard.keys.TAB,\n      format: ['blockquote', 'indent', 'list'],\n      handler: function(range, context) {\n        if (context.collapsed && context.offset !== 0) return true;\n        this.quill.format('indent', '+1', Quill.sources.USER);\n      }\n    },\n    'outdent': {\n      key: Keyboard.keys.TAB,\n      shiftKey: true,\n      format: ['blockquote', 'indent', 'list'],\n      // highlight tab or tab at beginning of list, indent or blockquote\n      handler: function(range, context) {\n        if (context.collapsed && context.offset !== 0) return true;\n        this.quill.format('indent', '-1', Quill.sources.USER);\n      }\n    },\n    'outdent backspace': {\n      key: Keyboard.keys.BACKSPACE,\n      collapsed: true,\n      shiftKey: null,\n      metaKey: null,\n      ctrlKey: null,\n      altKey: null,\n      format: ['indent', 'list'],\n      offset: 0,\n      handler: function(range, context) {\n        if (context.format.indent != null) {\n          this.quill.format('indent', '-1', Quill.sources.USER);\n        } else if (context.format.list != null) {\n          this.quill.format('list', false, Quill.sources.USER);\n        }\n      }\n    },\n    'indent code-block': makeCodeBlockHandler(true),\n    'outdent code-block': makeCodeBlockHandler(false),\n    'remove tab': {\n      key: Keyboard.keys.TAB,\n      shiftKey: true,\n      collapsed: true,\n      prefix: /\\t$/,\n      handler: function(range) {\n        this.quill.deleteText(range.index - 1, 1, Quill.sources.USER);\n      }\n    },\n    'tab': {\n      key: Keyboard.keys.TAB,\n      handler: function(range) {\n        this.quill.history.cutoff();\n        let delta = new Delta().retain(range.index)\n                               .delete(range.length)\n                               .insert('\\t');\n        this.quill.updateContents(delta, Quill.sources.USER);\n        this.quill.history.cutoff();\n        this.quill.setSelection(range.index + 1, Quill.sources.SILENT);\n      }\n    },\n    'list empty enter': {\n      key: Keyboard.keys.ENTER,\n      collapsed: true,\n      format: ['list'],\n      empty: true,\n      handler: function(range, context) {\n        this.quill.format('list', false, Quill.sources.USER);\n        if (context.format.indent) {\n          this.quill.format('indent', false, Quill.sources.USER);\n        }\n      }\n    },\n    'checklist enter': {\n      key: Keyboard.keys.ENTER,\n      collapsed: true,\n      format: { list: 'checked' },\n      handler: function(range) {\n        let [line, offset] = this.quill.getLine(range.index);\n        let formats = extend({}, line.formats(), { list: 'checked' });\n        let delta = new Delta().retain(range.index)\n                               .insert('\\n', formats)\n                               .retain(line.length() - offset - 1)\n                               .retain(1, { list: 'unchecked' });\n        this.quill.updateContents(delta, Quill.sources.USER);\n        this.quill.setSelection(range.index + 1, Quill.sources.SILENT);\n        this.quill.scrollIntoView();\n      }\n    },\n    'header enter': {\n      key: Keyboard.keys.ENTER,\n      collapsed: true,\n      format: ['header'],\n      suffix: /^$/,\n      handler: function(range, context) {\n        let [line, offset] = this.quill.getLine(range.index);\n        let delta = new Delta().retain(range.index)\n                               .insert('\\n', context.format)\n                               .retain(line.length() - offset - 1)\n                               .retain(1, { header: null });\n        this.quill.updateContents(delta, Quill.sources.USER);\n        this.quill.setSelection(range.index + 1, Quill.sources.SILENT);\n        this.quill.scrollIntoView();\n      }\n    },\n    'list autofill': {\n      key: ' ',\n      collapsed: true,\n      format: { list: false },\n      prefix: /^\\s*?(\\d+\\.|-|\\*|\\[ ?\\]|\\[x\\])$/,\n      handler: function(range, context) {\n        let length = context.prefix.length;\n        let [line, offset] = this.quill.getLine(range.index);\n        if (offset > length) return true;\n        let value;\n        switch (context.prefix.trim()) {\n          case '[]': case '[ ]':\n            value = 'unchecked';\n            break;\n          case '[x]':\n            value = 'checked';\n            break;\n          case '-': case '*':\n            value = 'bullet';\n            break;\n          default:\n            value = 'ordered';\n        }\n        this.quill.insertText(range.index, ' ', Quill.sources.USER);\n        this.quill.history.cutoff();\n        let delta = new Delta().retain(range.index - offset)\n                               .delete(length + 1)\n                               .retain(line.length() - 2 - offset)\n                               .retain(1, { list: value });\n        this.quill.updateContents(delta, Quill.sources.USER);\n        this.quill.history.cutoff();\n        this.quill.setSelection(range.index - length, Quill.sources.SILENT);\n      }\n    },\n    'code exit': {\n      key: Keyboard.keys.ENTER,\n      collapsed: true,\n      format: ['code-block'],\n      prefix: /\\n\\n$/,\n      suffix: /^\\s+$/,\n      handler: function(range) {\n        const [line, offset] = this.quill.getLine(range.index);\n        const delta = new Delta()\n          .retain(range.index + line.length() - offset - 2)\n          .retain(1, { 'code-block': null })\n          .delete(1);\n        this.quill.updateContents(delta, Quill.sources.USER);\n      }\n    },\n    'embed left': makeEmbedArrowHandler(Keyboard.keys.LEFT, false),\n    'embed left shift': makeEmbedArrowHandler(Keyboard.keys.LEFT, true),\n    'embed right': makeEmbedArrowHandler(Keyboard.keys.RIGHT, false),\n    'embed right shift': makeEmbedArrowHandler(Keyboard.keys.RIGHT, true)\n  }\n};\n\nfunction makeEmbedArrowHandler(key, shiftKey) {\n  const where = key === Keyboard.keys.LEFT ? 'prefix' : 'suffix';\n  return {\n    key,\n    shiftKey,\n    altKey: null,\n    [where]: /^$/,\n    handler: function(range) {\n      let index = range.index;\n      if (key === Keyboard.keys.RIGHT) {\n        index += (range.length + 1);\n      }\n      const [leaf, ] = this.quill.getLeaf(index);\n      if (!(leaf instanceof Parchment.Embed)) return true;\n      if (key === Keyboard.keys.LEFT) {\n        if (shiftKey) {\n          this.quill.setSelection(range.index - 1, range.length + 1, Quill.sources.USER);\n        } else {\n          this.quill.setSelection(range.index - 1, Quill.sources.USER);\n        }\n      } else {\n        if (shiftKey) {\n          this.quill.setSelection(range.index, range.length + 1, Quill.sources.USER);\n        } else {\n          this.quill.setSelection(range.index + range.length + 1, Quill.sources.USER);\n        }\n      }\n      return false;\n    }\n  };\n}\n\n\nfunction handleBackspace(range, context) {\n  if (range.index === 0 || this.quill.getLength() <= 1) return;\n  let [line, ] = this.quill.getLine(range.index);\n  let formats = {};\n  if (context.offset === 0) {\n    let [prev, ] = this.quill.getLine(range.index - 1);\n    if (prev != null && prev.length() > 1) {\n      let curFormats = line.formats();\n      let prevFormats = this.quill.getFormat(range.index-1, 1);\n      formats = DeltaOp.attributes.diff(curFormats, prevFormats) || {};\n    }\n  }\n  // Check for astral symbols\n  let length = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]$/.test(context.prefix) ? 2 : 1;\n  this.quill.deleteText(range.index-length, length, Quill.sources.USER);\n  if (Object.keys(formats).length > 0) {\n    this.quill.formatLine(range.index-length, length, formats, Quill.sources.USER);\n  }\n  this.quill.focus();\n}\n\nfunction handleDelete(range, context) {\n  // Check for astral symbols\n  let length = /^[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/.test(context.suffix) ? 2 : 1;\n  if (range.index >= this.quill.getLength() - length) return;\n  let formats = {}, nextLength = 0;\n  let [line, ] = this.quill.getLine(range.index);\n  if (context.offset >= line.length() - 1) {\n    let [next, ] = this.quill.getLine(range.index + 1);\n    if (next) {\n      let curFormats = line.formats();\n      let nextFormats = this.quill.getFormat(range.index, 1);\n      formats = DeltaOp.attributes.diff(curFormats, nextFormats) || {};\n      nextLength = next.length();\n    }\n  }\n  this.quill.deleteText(range.index, length, Quill.sources.USER);\n  if (Object.keys(formats).length > 0) {\n    this.quill.formatLine(range.index + nextLength - 1, length, formats, Quill.sources.USER);\n  }\n}\n\nfunction handleDeleteRange(range) {\n  let lines = this.quill.getLines(range);\n  let formats = {};\n  if (lines.length > 1) {\n    let firstFormats = lines[0].formats();\n    let lastFormats = lines[lines.length - 1].formats();\n    formats = DeltaOp.attributes.diff(lastFormats, firstFormats) || {};\n  }\n  this.quill.deleteText(range, Quill.sources.USER);\n  if (Object.keys(formats).length > 0) {\n    this.quill.formatLine(range.index, 1, formats, Quill.sources.USER);\n  }\n  this.quill.setSelection(range.index, Quill.sources.SILENT);\n  this.quill.focus();\n}\n\nfunction handleEnter(range, context) {\n  if (range.length > 0) {\n    this.quill.scroll.deleteAt(range.index, range.length);  // So we do not trigger text-change\n  }\n  let lineFormats = Object.keys(context.format).reduce(function(lineFormats, format) {\n    if (Parchment.query(format, Parchment.Scope.BLOCK) && !Array.isArray(context.format[format])) {\n      lineFormats[format] = context.format[format];\n    }\n    return lineFormats;\n  }, {});\n  this.quill.insertText(range.index, '\\n', lineFormats, Quill.sources.USER);\n  // Earlier scroll.deleteAt might have messed up our selection,\n  // so insertText's built in selection preservation is not reliable\n  this.quill.setSelection(range.index + 1, Quill.sources.SILENT);\n  this.quill.focus();\n  Object.keys(context.format).forEach((name) => {\n    if (lineFormats[name] != null) return;\n    if (Array.isArray(context.format[name])) return;\n    if (name === 'link') return;\n    this.quill.format(name, context.format[name], Quill.sources.USER);\n  });\n}\n\nfunction makeCodeBlockHandler(indent) {\n  return {\n    key: Keyboard.keys.TAB,\n    shiftKey: !indent,\n    format: {'code-block': true },\n    handler: function(range) {\n      let CodeBlock = Parchment.query('code-block');\n      let index = range.index, length = range.length;\n      let [block, offset] = this.quill.scroll.descendant(CodeBlock, index);\n      if (block == null) return;\n      let scrollIndex = this.quill.getIndex(block);\n      let start = block.newlineIndex(offset, true) + 1;\n      let end = block.newlineIndex(scrollIndex + offset + length);\n      let lines = block.domNode.textContent.slice(start, end).split('\\n');\n      offset = 0;\n      lines.forEach((line, i) => {\n        if (indent) {\n          block.insertAt(start + offset, CodeBlock.TAB);\n          offset += CodeBlock.TAB.length;\n          if (i === 0) {\n            index += CodeBlock.TAB.length;\n          } else {\n            length += CodeBlock.TAB.length;\n          }\n        } else if (line.startsWith(CodeBlock.TAB)) {\n          block.deleteAt(start + offset, CodeBlock.TAB.length);\n          offset -= CodeBlock.TAB.length;\n          if (i === 0) {\n            index -= CodeBlock.TAB.length;\n          } else {\n            length -= CodeBlock.TAB.length;\n          }\n        }\n        offset += line.length + 1;\n      });\n      this.quill.update(Quill.sources.USER);\n      this.quill.setSelection(index, length, Quill.sources.SILENT);\n    }\n  };\n}\n\nfunction makeFormatHandler(format) {\n  return {\n    key: format[0].toUpperCase(),\n    shortKey: true,\n    handler: function(range, context) {\n      this.quill.format(format, !context.format[format], Quill.sources.USER);\n    }\n  };\n}\n\nfunction normalize(binding) {\n  if (typeof binding === 'string' || typeof binding === 'number') {\n    return normalize({ key: binding });\n  }\n  if (typeof binding === 'object') {\n    binding = clone(binding, false);\n  }\n  if (typeof binding.key === 'string') {\n    if (Keyboard.keys[binding.key.toUpperCase()] != null) {\n      binding.key = Keyboard.keys[binding.key.toUpperCase()];\n    } else if (binding.key.length === 1) {\n      binding.key = binding.key.toUpperCase().charCodeAt(0);\n    } else {\n      return null;\n    }\n  }\n  if (binding.shortKey) {\n    binding[SHORTKEY] = binding.shortKey;\n    delete binding.shortKey;\n  }\n  return binding;\n}\n\n\nexport { Keyboard as default, SHORTKEY };\n","import Parchment from 'parchment';\nimport Quill from './core/quill';\n\nimport Block, { BlockEmbed } from './blots/block';\nimport Break from './blots/break';\nimport Container from './blots/container';\nimport Cursor from './blots/cursor';\nimport Embed from './blots/embed';\nimport Inline from './blots/inline';\nimport Scroll from './blots/scroll';\nimport TextBlot from './blots/text';\n\nimport Clipboard from './modules/clipboard';\nimport History from './modules/history';\nimport Keyboard from './modules/keyboard';\n\nQuill.register({\n  'blots/block'        : Block,\n  'blots/block/embed'  : BlockEmbed,\n  'blots/break'        : Break,\n  'blots/container'    : Container,\n  'blots/cursor'       : Cursor,\n  'blots/embed'        : Embed,\n  'blots/inline'       : Inline,\n  'blots/scroll'       : Scroll,\n  'blots/text'         : TextBlot,\n\n  'modules/clipboard'  : Clipboard,\n  'modules/history'    : History,\n  'modules/keyboard'   : Keyboard\n});\n\nParchment.register(Block, Break, Cursor, Inline, Scroll, TextBlot);\n\n\nexport default Quill;\n","/**\n * The function whose prototype chain sequence wrappers inherit from.\n *\n * @private\n */\nfunction baseLodash() {\n  // No operation performed.\n}\n\nmodule.exports = baseLodash;\n","var baseCreate = require('./_baseCreate'),\n    baseLodash = require('./_baseLodash');\n\n/**\n * The base constructor for creating `lodash` wrapper objects.\n *\n * @private\n * @param {*} value The value to wrap.\n * @param {boolean} [chainAll] Enable explicit method chain sequences.\n */\nfunction LodashWrapper(value, chainAll) {\n  this.__wrapped__ = value;\n  this.__actions__ = [];\n  this.__chain__ = !!chainAll;\n  this.__index__ = 0;\n  this.__values__ = undefined;\n}\n\nLodashWrapper.prototype = baseCreate(baseLodash.prototype);\nLodashWrapper.prototype.constructor = LodashWrapper;\n\nmodule.exports = LodashWrapper;\n","var flatten = require('./flatten'),\n    overRest = require('./_overRest'),\n    setToString = require('./_setToString');\n\n/**\n * A specialized version of `baseRest` which flattens the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\nfunction flatRest(func) {\n  return setToString(overRest(func, undefined, flatten), func + '');\n}\n\nmodule.exports = flatRest;\n","var WeakMap = require('./_WeakMap');\n\n/** Used to store function metadata. */\nvar metaMap = WeakMap && new WeakMap;\n\nmodule.exports = metaMap;\n","var metaMap = require('./_metaMap'),\n    noop = require('./noop');\n\n/**\n * Gets metadata for `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {*} Returns the metadata for `func`.\n */\nvar getData = !metaMap ? noop : function(func) {\n  return metaMap.get(func);\n};\n\nmodule.exports = getData;\n","/** Used to lookup unminified function names. */\nvar realNames = {};\n\nmodule.exports = realNames;\n","var realNames = require('./_realNames');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the name of `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {string} Returns the function name.\n */\nfunction getFuncName(func) {\n  var result = (func.name + ''),\n      array = realNames[result],\n      length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n  while (length--) {\n    var data = array[length],\n        otherFunc = data.func;\n    if (otherFunc == null || otherFunc == func) {\n      return data.name;\n    }\n  }\n  return result;\n}\n\nmodule.exports = getFuncName;\n","var baseCreate = require('./_baseCreate'),\n    baseLodash = require('./_baseLodash');\n\n/** Used as references for the maximum length and index of an array. */\nvar MAX_ARRAY_LENGTH = 4294967295;\n\n/**\n * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n *\n * @private\n * @constructor\n * @param {*} value The value to wrap.\n */\nfunction LazyWrapper(value) {\n  this.__wrapped__ = value;\n  this.__actions__ = [];\n  this.__dir__ = 1;\n  this.__filtered__ = false;\n  this.__iteratees__ = [];\n  this.__takeCount__ = MAX_ARRAY_LENGTH;\n  this.__views__ = [];\n}\n\n// Ensure `LazyWrapper` is an instance of `baseLodash`.\nLazyWrapper.prototype = baseCreate(baseLodash.prototype);\nLazyWrapper.prototype.constructor = LazyWrapper;\n\nmodule.exports = LazyWrapper;\n","var LazyWrapper = require('./_LazyWrapper'),\n    LodashWrapper = require('./_LodashWrapper'),\n    copyArray = require('./_copyArray');\n\n/**\n * Creates a clone of `wrapper`.\n *\n * @private\n * @param {Object} wrapper The wrapper to clone.\n * @returns {Object} Returns the cloned wrapper.\n */\nfunction wrapperClone(wrapper) {\n  if (wrapper instanceof LazyWrapper) {\n    return wrapper.clone();\n  }\n  var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n  result.__actions__ = copyArray(wrapper.__actions__);\n  result.__index__  = wrapper.__index__;\n  result.__values__ = wrapper.__values__;\n  return result;\n}\n\nmodule.exports = wrapperClone;\n","var LazyWrapper = require('./_LazyWrapper'),\n    LodashWrapper = require('./_LodashWrapper'),\n    baseLodash = require('./_baseLodash'),\n    isArray = require('./isArray'),\n    isObjectLike = require('./isObjectLike'),\n    wrapperClone = require('./_wrapperClone');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates a `lodash` object which wraps `value` to enable implicit method\n * chain sequences. Methods that operate on and return arrays, collections,\n * and functions can be chained together. Methods that retrieve a single value\n * or may return a primitive value will automatically end the chain sequence\n * and return the unwrapped value. Otherwise, the value must be unwrapped\n * with `_#value`.\n *\n * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n * enabled using `_.chain`.\n *\n * The execution of chained methods is lazy, that is, it's deferred until\n * `_#value` is implicitly or explicitly called.\n *\n * Lazy evaluation allows several methods to support shortcut fusion.\n * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n * the creation of intermediate arrays and can greatly reduce the number of\n * iteratee executions. Sections of a chain sequence qualify for shortcut\n * fusion if the section is applied to an array and iteratees accept only\n * one argument. The heuristic for whether a section qualifies for shortcut\n * fusion is subject to change.\n *\n * Chaining is supported in custom builds as long as the `_#value` method is\n * directly or indirectly included in the build.\n *\n * In addition to lodash methods, wrappers have `Array` and `String` methods.\n *\n * The wrapper `Array` methods are:\n * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n *\n * The wrapper `String` methods are:\n * `replace` and `split`\n *\n * The wrapper methods that support shortcut fusion are:\n * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n *\n * The chainable wrapper methods are:\n * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n * `zipObject`, `zipObjectDeep`, and `zipWith`\n *\n * The wrapper methods that are **not** chainable by default are:\n * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n * `upperFirst`, `value`, and `words`\n *\n * @name _\n * @constructor\n * @category Seq\n * @param {*} value The value to wrap in a `lodash` instance.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * function square(n) {\n *   return n * n;\n * }\n *\n * var wrapped = _([1, 2, 3]);\n *\n * // Returns an unwrapped value.\n * wrapped.reduce(_.add);\n * // => 6\n *\n * // Returns a wrapped value.\n * var squares = wrapped.map(square);\n *\n * _.isArray(squares);\n * // => false\n *\n * _.isArray(squares.value());\n * // => true\n */\nfunction lodash(value) {\n  if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n    if (value instanceof LodashWrapper) {\n      return value;\n    }\n    if (hasOwnProperty.call(value, '__wrapped__')) {\n      return wrapperClone(value);\n    }\n  }\n  return new LodashWrapper(value);\n}\n\n// Ensure wrappers are instances of `baseLodash`.\nlodash.prototype = baseLodash.prototype;\nlodash.prototype.constructor = lodash;\n\nmodule.exports = lodash;\n","var LazyWrapper = require('./_LazyWrapper'),\n    getData = require('./_getData'),\n    getFuncName = require('./_getFuncName'),\n    lodash = require('./wrapperLodash');\n\n/**\n * Checks if `func` has a lazy counterpart.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n *  else `false`.\n */\nfunction isLaziable(func) {\n  var funcName = getFuncName(func),\n      other = lodash[funcName];\n\n  if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n    return false;\n  }\n  if (func === other) {\n    return true;\n  }\n  var data = getData(other);\n  return !!data && func === data[0];\n}\n\nmodule.exports = isLaziable;\n","var LodashWrapper = require('./_LodashWrapper'),\n    flatRest = require('./_flatRest'),\n    getData = require('./_getData'),\n    getFuncName = require('./_getFuncName'),\n    isArray = require('./isArray'),\n    isLaziable = require('./_isLaziable');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_CURRY_FLAG = 8,\n    WRAP_PARTIAL_FLAG = 32,\n    WRAP_ARY_FLAG = 128,\n    WRAP_REARG_FLAG = 256;\n\n/**\n * Creates a `_.flow` or `_.flowRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new flow function.\n */\nfunction createFlow(fromRight) {\n  return flatRest(function(funcs) {\n    var length = funcs.length,\n        index = length,\n        prereq = LodashWrapper.prototype.thru;\n\n    if (fromRight) {\n      funcs.reverse();\n    }\n    while (index--) {\n      var func = funcs[index];\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\n        var wrapper = new LodashWrapper([], true);\n      }\n    }\n    index = wrapper ? index : length;\n    while (++index < length) {\n      func = funcs[index];\n\n      var funcName = getFuncName(func),\n          data = funcName == 'wrapper' ? getData(func) : undefined;\n\n      if (data && isLaziable(data[0]) &&\n            data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\n            !data[4].length && data[9] == 1\n          ) {\n        wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n      } else {\n        wrapper = (func.length == 1 && isLaziable(func))\n          ? wrapper[funcName]()\n          : wrapper.thru(func);\n      }\n    }\n    return function() {\n      var args = arguments,\n          value = args[0];\n\n      if (wrapper && args.length == 1 && isArray(value)) {\n        return wrapper.plant(value).value();\n      }\n      var index = 0,\n          result = length ? funcs[index].apply(this, args) : value;\n\n      while (++index < length) {\n        result = funcs[index].call(this, result);\n      }\n      return result;\n    };\n  });\n}\n\nmodule.exports = createFlow;\n","var createFlow = require('./_createFlow');\n\n/**\n * Creates a function that returns the result of invoking the given functions\n * with the `this` binding of the created function, where each successive\n * invocation is supplied the return value of the previous.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Util\n * @param {...(Function|Function[])} [funcs] The functions to invoke.\n * @returns {Function} Returns the new composite function.\n * @see _.flowRight\n * @example\n *\n * function square(n) {\n *   return n * n;\n * }\n *\n * var addSquare = _.flow([_.add, square]);\n * addSquare(1, 2);\n * // => 9\n */\nvar flow = createFlow();\n\nmodule.exports = flow;\n","/**\n * The base implementation of `_.propertyOf` without support for deep paths.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyOf(object) {\n  return function(key) {\n    return object == null ? undefined : object[key];\n  };\n}\n\nmodule.exports = basePropertyOf;\n","var basePropertyOf = require('./_basePropertyOf');\n\n/** Used to map characters to HTML entities. */\nvar htmlEscapes = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  \"'\": '&#39;'\n};\n\n/**\n * Used by `_.escape` to convert characters to HTML entities.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @returns {string} Returns the escaped character.\n */\nvar escapeHtmlChar = basePropertyOf(htmlEscapes);\n\nmodule.exports = escapeHtmlChar;\n","var escapeHtmlChar = require('./_escapeHtmlChar'),\n    toString = require('./toString');\n\n/** Used to match HTML entities and HTML characters. */\nvar reUnescapedHtml = /[&<>\"']/g,\n    reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n/**\n * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n * corresponding HTML entities.\n *\n * **Note:** No other characters are escaped. To escape additional\n * characters use a third-party library like [_he_](https://mths.be/he).\n *\n * Though the \">\" character is escaped for symmetry, characters like\n * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n * unless they're part of a tag or unquoted attribute value. See\n * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n * (under \"semi-related fun fact\") for more details.\n *\n * When working with HTML you should always\n * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n * XSS vectors.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escape('fred, barney, & pebbles');\n * // => 'fred, barney, &amp; pebbles'\n */\nfunction escape(string) {\n  string = toString(string);\n  return (string && reHasUnescapedHtml.test(string))\n    ? string.replace(reUnescapedHtml, escapeHtmlChar)\n    : string;\n}\n\nmodule.exports = escape;\n","var basePropertyOf = require('./_basePropertyOf');\n\n/** Used to map HTML entities to characters. */\nvar htmlUnescapes = {\n  '&amp;': '&',\n  '&lt;': '<',\n  '&gt;': '>',\n  '&quot;': '\"',\n  '&#39;': \"'\"\n};\n\n/**\n * Used by `_.unescape` to convert HTML entities to characters.\n *\n * @private\n * @param {string} chr The matched character to unescape.\n * @returns {string} Returns the unescaped character.\n */\nvar unescapeHtmlChar = basePropertyOf(htmlUnescapes);\n\nmodule.exports = unescapeHtmlChar;\n","var toString = require('./toString'),\n    unescapeHtmlChar = require('./_unescapeHtmlChar');\n\n/** Used to match HTML entities and HTML characters. */\nvar reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\n    reHasEscapedHtml = RegExp(reEscapedHtml.source);\n\n/**\n * The inverse of `_.escape`; this method converts the HTML entities\n * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to\n * their corresponding characters.\n *\n * **Note:** No other HTML entities are unescaped. To unescape additional\n * HTML entities use a third-party library like [_he_](https://mths.be/he).\n *\n * @static\n * @memberOf _\n * @since 0.6.0\n * @category String\n * @param {string} [string=''] The string to unescape.\n * @returns {string} Returns the unescaped string.\n * @example\n *\n * _.unescape('fred, barney, &amp; pebbles');\n * // => 'fred, barney, & pebbles'\n */\nfunction unescape(string) {\n  string = toString(string);\n  return (string && reHasEscapedHtml.test(string))\n    ? string.replace(reEscapedHtml, unescapeHtmlChar)\n    : string;\n}\n\nmodule.exports = unescape;\n","import Delta from 'quill-delta';\nimport Parchment from 'parchment';\nimport Quill from '../core/quill';\nimport logger from '../core/logger';\nimport Module from '../core/module';\n\nlet debug = logger('quill:toolbar');\n\n\nclass Toolbar extends Module {\n  constructor(quill, options) {\n    super(quill, options);\n    if (Array.isArray(this.options.container)) {\n      let container = document.createElement('div');\n      addControls(container, this.options.container);\n      quill.container.parentNode.insertBefore(container, quill.container);\n      this.container = container;\n    } else if (typeof this.options.container === 'string') {\n      this.container = document.querySelector(this.options.container);\n    } else {\n      this.container = this.options.container;\n    }\n    if (!(this.container instanceof HTMLElement)) {\n      return debug.error('Container required for toolbar', this.options);\n    }\n    this.container.classList.add('ql-toolbar');\n    this.controls = [];\n    this.handlers = {};\n    Object.keys(this.options.handlers).forEach((format) => {\n      this.addHandler(format, this.options.handlers[format]);\n    });\n    [].forEach.call(this.container.querySelectorAll('button, select'), (input) => {\n      this.attach(input);\n    });\n    this.quill.on(Quill.events.EDITOR_CHANGE, (type, range) => {\n      if (type === Quill.events.SELECTION_CHANGE) {\n        this.update(range);\n      }\n    });\n    this.quill.on(Quill.events.SCROLL_OPTIMIZE, () => {\n      let [range, ] = this.quill.selection.getRange();  // quill.getSelection triggers update\n      this.update(range);\n    });\n  }\n\n  addHandler(format, handler) {\n    this.handlers[format] = handler;\n  }\n\n  attach(input) {\n    let format = [].find.call(input.classList, (className) => {\n      return className.indexOf('ql-') === 0;\n    });\n    if (!format) return;\n    format = format.slice('ql-'.length);\n    if (input.tagName === 'BUTTON') {\n      input.setAttribute('type', 'button');\n    }\n    if (this.handlers[format] == null) {\n      if (this.quill.scroll.whitelist != null && this.quill.scroll.whitelist[format] == null) {\n        debug.warn('ignoring attaching to disabled format', format, input);\n        return;\n      }\n      if (Parchment.query(format) == null) {\n        debug.warn('ignoring attaching to nonexistent format', format, input);\n        return;\n      }\n    }\n    let eventName = input.tagName === 'SELECT' ? 'change' : 'click';\n    input.addEventListener(eventName, (e) => {\n      let value;\n      if (input.tagName === 'SELECT') {\n        if (input.selectedIndex < 0) return;\n        let selected = input.options[input.selectedIndex];\n        if (selected.hasAttribute('selected')) {\n          value = false;\n        } else {\n          value = selected.value || false;\n        }\n      } else {\n        if (input.classList.contains('ql-active')) {\n          value = false;\n        } else {\n          value = input.value || !input.hasAttribute('value');\n        }\n        e.preventDefault();\n      }\n      this.quill.focus();\n      let [range, ] = this.quill.selection.getRange();\n      if (this.handlers[format] != null) {\n        this.handlers[format].call(this, value);\n      } else if (Parchment.query(format).prototype instanceof Parchment.Embed) {\n        value = prompt(`Enter ${format}`);\n        if (!value) return;\n        this.quill.updateContents(new Delta()\n          .retain(range.index)\n          .delete(range.length)\n          .insert({ [format]: value })\n        , Quill.sources.USER);\n      } else {\n        this.quill.format(format, value, Quill.sources.USER);\n      }\n      this.update(range);\n    });\n    // TODO use weakmap\n    this.controls.push([format, input]);\n  }\n\n  update(range) {\n    let formats = range == null ? {} : this.quill.getFormat(range);\n    this.controls.forEach(function(pair) {\n      let [format, input] = pair;\n      if (input.tagName === 'SELECT') {\n        let option;\n        if (range == null) {\n          option = null;\n        } else if (formats[format] == null) {\n          option = input.querySelector('option[selected]');\n        } else if (!Array.isArray(formats[format])) {\n          let value = formats[format];\n          if (typeof value === 'string') {\n            value = value.replace(/\\\"/g, '\\\\\"');\n          }\n          option = input.querySelector(`option[value=\"${value}\"]`);\n        }\n        if (option == null) {\n          input.value = '';   // TODO make configurable?\n          input.selectedIndex = -1;\n        } else {\n          option.selected = true;\n        }\n      } else {\n        if (range == null) {\n          input.classList.remove('ql-active');\n        } else if (input.hasAttribute('value')) {\n          // both being null should match (default values)\n          // '1' should match with 1 (headers)\n          let isActive = formats[format] === input.getAttribute('value') ||\n                         (formats[format] != null && formats[format].toString() === input.getAttribute('value')) ||\n                         (formats[format] == null && !input.getAttribute('value'));\n          input.classList.toggle('ql-active', isActive);\n        } else {\n          input.classList.toggle('ql-active', formats[format] != null);\n        }\n      }\n    });\n  }\n}\nToolbar.DEFAULTS = {};\n\n\nfunction addButton(container, format, value) {\n  let input = document.createElement('button');\n  input.setAttribute('type', 'button');\n  input.classList.add('ql-' + format);\n  if (value != null) {\n    input.value = value;\n  }\n  container.appendChild(input);\n}\n\nfunction addControls(container, groups) {\n  if (!Array.isArray(groups[0])) {\n    groups = [groups];\n  }\n  groups.forEach(function(controls) {\n    let group = document.createElement('span');\n    group.classList.add('ql-formats');\n    controls.forEach(function(control) {\n      if (typeof control === 'string') {\n        addButton(group, control);\n      } else {\n        let format = Object.keys(control)[0];\n        let value = control[format];\n        if (Array.isArray(value)) {\n          addSelect(group, format, value);\n        } else {\n          addButton(group, format, value);\n        }\n      }\n    });\n    container.appendChild(group);\n  });\n}\n\nfunction addSelect(container, format, values) {\n  let input = document.createElement('select');\n  input.classList.add('ql-' + format);\n  values.forEach(function(value) {\n    let option = document.createElement('option');\n    if (value !== false) {\n      option.setAttribute('value', value);\n    } else {\n      option.setAttribute('selected', 'selected');\n    }\n    input.appendChild(option);\n  });\n  container.appendChild(input);\n}\n\nToolbar.DEFAULTS = {\n  container: null,\n  handlers: {\n    clean: function() {\n      let range = this.quill.getSelection();\n      if (range == null) return;\n      if (range.length == 0) {\n        let formats = this.quill.getFormat();\n        Object.keys(formats).forEach((name) => {\n          // Clean functionality in existing apps only clean inline formats\n          if (Parchment.query(name, Parchment.Scope.INLINE) != null) {\n            this.quill.format(name, false);\n          }\n        });\n      } else {\n        this.quill.removeFormat(range, Quill.sources.USER);\n      }\n    },\n    direction: function(value) {\n      let align = this.quill.getFormat()['align'];\n      if (value === 'rtl' && align == null) {\n        this.quill.format('align', 'right', Quill.sources.USER);\n      } else if (!value && align === 'right') {\n        this.quill.format('align', false, Quill.sources.USER);\n      }\n      this.quill.format('direction', value, Quill.sources.USER);\n    },\n    indent: function(value) {\n      let range = this.quill.getSelection();\n      let formats = this.quill.getFormat(range);\n      let indent = parseInt(formats.indent || 0);\n      if (value === '+1' || value === '-1') {\n        let modifier = (value === '+1') ? 1 : -1;\n        if (formats.direction === 'rtl') modifier *= -1;\n        this.quill.format('indent', indent + modifier, Quill.sources.USER);\n      }\n    },\n    link: function(value) {\n      if (value === true) {\n        value = prompt('Enter link URL:');\n      }\n      this.quill.format('link', value, Quill.sources.USER);\n    },\n    list: function(value) {\n      let range = this.quill.getSelection();\n      let formats = this.quill.getFormat(range);\n      if (value === 'check') {\n        if (formats['list'] === 'checked' || formats['list'] === 'unchecked') {\n          this.quill.format('list', false, Quill.sources.USER);\n        } else {\n          this.quill.format('list', 'unchecked', Quill.sources.USER);\n        }\n      } else {\n        this.quill.format('list', value, Quill.sources.USER);\n      }\n    }\n  }\n}\n\n\nexport { Toolbar as default, addControls };\n","import Inline from '../blots/inline';\n\nclass Bold extends Inline {\n  static create() {\n    return super.create();\n  }\n\n  static formats() {\n    return true;\n  }\n\n  optimize(context) {\n    super.optimize(context);\n    if (this.domNode.tagName !== this.statics.tagName[0]) {\n      this.replaceWith(this.statics.blotName);\n    }\n  }\n}\nBold.blotName = 'bold';\nBold.tagName = ['STRONG', 'B'];\n\nexport default Bold;\n","import Bold from './bold';\n\nclass Italic extends Bold { }\nItalic.blotName = 'italic';\nItalic.tagName = ['EM', 'I'];\n\nexport default Italic;\n","import Inline from '../blots/inline';\n\nclass Underline extends Inline { }\nUnderline.blotName = 'underline';\nUnderline.tagName = 'U';\n\nexport default Underline;\n","import Inline from '../blots/inline';\n\nclass Strike extends Inline { }\nStrike.blotName = 'strike';\nStrike.tagName = 'S';\n\nexport default Strike;\n","import Parchment from 'parchment'\n\nclass FontAttributor extends Parchment.Attributor.Style {\n  value(node) {\n    return super.value(node).replace(/\"([^\"]+)\"/, '$1');\n  }\n}\n\nlet FontStyle = new FontAttributor('font', 'font-family', {\n  scope: Parchment.Scope.INLINE\n});\n\nexport default FontStyle;\n","function sizeFromQuillToUser(quillSize, multiplier) {\n  return quillSize / multiplier;\n}\n\nfunction sizeFromUserToQuill(userSize, multiplier) {\n  return Math.round(userSize * multiplier);\n}\n\nfunction setDefaultParagraphSize(element, slot) {\n  const pTag = element.querySelector('p');\n\n  const elementNodes = pTag.querySelectorAll('[style*=font-size]');\n  const largestFontSize = largestTextSize(elementNodes, slot);\n  const shouldSetFontSize = element.innerHTML == '<p></p>' || slot.isUnconfirmedTextSlot;\n\n  const tagFontSize = shouldSetFontSize ? `${sizeFromUserToQuill(largestFontSize, slot.scale)}pt` : 'unset';\n  pTag.style.fontSize = tagFontSize;\n  pTag.style.fontFamily = slot.fontName;\n  pTag.style.color = slot.fontColour;\n}\n\nfunction setParagraphFontSizes(element, slot) {\n  const pTags = element.querySelectorAll('p');\n\n  for (const el of pTags) {\n    const elementNodes = el.querySelectorAll('[style*=font-size]');\n    const largestFontSize = largestTextSize(elementNodes, slot);\n    const shouldSetFontSize = elementNodes.length > 0;\n    const tagFontSize = shouldSetFontSize ?\n      `${sizeFromUserToQuill(largestFontSize, slot.scale)}pt`\n      : `${sizeFromUserToQuill(slot.fontSize, slot.scale)}pt`;\n\n    el.style.fontSize = tagFontSize;\n    el.style.fontFamily = slot.fontName;\n    el.style.color = slot.fontColour;\n  }\n}\n\nfunction largestTextSize(elementNodes, slot) {\n  const textSizes = textSizesFromNodes(elementNodes);\n\n  if (textSizes.length) return sizeFromQuillToUser(Math.max(...textSizes), slot.scale);\n  return slot.fontSize;\n}\n\nfunction smallestTextSize(elementNodes, slot) {\n  const textSizes = textSizesFromNodes(elementNodes);\n\n  if (textSizes.length) return sizeFromQuillToUser(Math.min(...textSizes), slot.scale);\n  return slot.fontSize;\n}\n\nfunction textSizesFromNodes(elementNodes) {\n  return Array.from(elementNodes).reduce((sizes, textNode) => {\n    sizes.push(parseInt(textNode.style.fontSize));\n    return sizes;\n  }, []);\n}\n\nexport {\n  largestTextSize, smallestTextSize, sizeFromQuillToUser, sizeFromUserToQuill, setDefaultParagraphSize, setParagraphFontSizes\n}\n","import Parchment from 'parchment';\nimport { sizeFromQuillToUser, sizeFromUserToQuill } from '../../font-size-converter';\nimport { useSlotStore } from 'stores/useSlotStore';\n\nclass SizeAttributor extends Parchment.Attributor.Style {\n\n  add(node, value) {\n    const converted = sizeFromUserToQuill(value, this.scaleFactor);\n\n    if (!this.canAdd(node, converted)) return false;\n    node.style.fontSize = `${converted}pt`;\n\n    return true;\n  }\n\n  value(node) {\n    let size = Number(super.value(node).replace(/pt$/, ''));\n\n    // Sometimes Quill will randomly convert to pixels;\n    // needs further investigation.\n    if (isNaN(size) || size === 0) return null;\n\n    return sizeFromQuillToUser(size, this.scaleFactor);\n  }\n\n  get scaleFactor() {\n    const selected = useSlotStore.getState().slot;\n\n    const scale = selected?.scale ?? 0;\n\n    return scale\n  }\n}\n\nlet SizeStyle = new SizeAttributor('size', 'font-size', {\n  scope: Parchment.Scope.INLINE\n});\n\n\nexport default SizeStyle;\n","function lazyGoogleFont(fontName) {\n  const fontID = fontName.toLowerCase().replace(/\\s+/, '-');\n\n  if (!document.getElementById(fontID)) {\n    const head = document.getElementsByTagName('head')[0];\n    const link = document.createElement('link');\n    link.id = fontID;\n    link.rel = 'stylesheet';\n    link.type = 'text/css';\n    link.href = `//fonts.googleapis.com/css2?family=${fontName}:ital,wght@0,300;0,400;0,700;1,300;1,400;1,700`;\n    link.media = 'all';\n    head.appendChild(link);\n  }\n}\n\nexport default lazyGoogleFont;","import Quill from 'quill/core';\nimport flow from 'lodash/flow';\nimport escape from 'lodash/escape';\nimport unescape from 'lodash/unescape';\nimport tinycolor from 'tinycolor2';\nimport Toolbar from 'quill/modules/toolbar';\nimport Bold from 'quill/formats/bold';\nimport Italic from 'quill/formats/italic';\nimport Underline from 'quill/formats/underline';\nimport Strike from 'quill/formats/strike';\nimport { ColorStyle } from 'quill/formats/color';\nimport FontStyle from './quill/formats/font-style'\nimport SizeStyle from './quill/formats/size-style'\nimport lazyGoogleFont from './lazy-google-font';\nimport { sizeFromQuillToUser, sizeFromUserToQuill } from './font-size-converter';\nimport { getViewport } from './hoc/with-viewport-size';\n\n// Quill defaults to <strong /> and <em /> which are not\n// compatible with Pango.\nBold.tagName = 'b';\nItalic.tagName = 'i';\n\nconst debug = false;\n\nQuill.register({\n  'modules/toolbar': Toolbar,\n  'formats/bold': Bold,\n  'formats/italic': Italic,\n  'formats/underline': Underline,\n  'formats/strike': Strike,\n  'formats/color': ColorStyle,\n  'formats/font': FontStyle,\n  'formats/size': SizeStyle\n});\n\n// Initialize quill with some sensible defaults.\nQuill.init = function (id, toolbar, keyBindings = {}) {\n  const quill = new Quill(id, {\n    scrollingContainer: 'in-place__scroller',\n    modules: {\n      keyboard: {\n        bindings: keyBindings\n      },\n      toolbar,\n      clipboard: { matchVisual: false }\n    }\n  });\n\n  // Remove the tab hotkey for ADA\n  delete quill.getModule('keyboard').bindings['9'];\n\n  return quill;\n}\n\nclass PangoToQuillResult {\n  constructor({html, colors, fonts, fontSizes}) {\n    this.html = html;\n    this.colors = colors;\n    this.fonts = fonts;\n    this.fontSizes = fontSizes;\n  }\n\n  toString() {\n    return this.html;\n  }\n}\nclass QuillToPangoResult {\n  constructor({ html }) {\n    this.html = html;\n  }\n\n  toString() {\n    return this.html;\n  }\n}\n\nclass QuillHelpers {\n  static get tags() {\n    return ['i', 'b', 's', 'u', 'span'];\n  }\n\n  static pangoToQuill(html, scale) {\n    if (!html) return '';\n\n    const colors = [];\n    const fonts = [];\n    const fontSizes = [];\n\n    const result = flow([\n      applyFonts,\n      applySizes,\n      applyColors,\n      mergeStyles,\n      formatLineBreaks\n    ])(html);\n\n    if (debug) console.log('pangoToQuill', result);\n\n    return new PangoToQuillResult({html: result, colors, fonts, fontSizes});\n\n    function applyColors(text) {\n      return styleAttributeFromPango(text, 'foreground', 'color', value => {\n        colors.push(value);\n        return tinycolor(value).toRgbString();\n      });\n    }\n\n    function applyFonts(text) {\n      const result = styleAttributeFromPango(text, 'font_family', 'font-family', value => {\n        lazyGoogleFont(value);\n        fonts.push(value);\n        return `\"${value}\"`;\n      });\n\n      return result;\n    }\n\n    function applySizes(text) {\n      const result = styleAttributeFromPango(text, 'size', 'font-size', value => {\n        fontSizes.push(value);\n        return `${sizeFromUserToQuill(Number(value), scale)}pt`;\n      });\n\n      return result;\n    }\n\n    function mergeStyles(text) {\n      return text.replace(/\"\\s*style=\"/g, ';');\n    }\n\n    function formatLineBreaks(text) {\n      const lines = text.split('\\n');\n      if (lines.length <= 1) return text;\n\n      return lines.map(line => `${line}<br />`).join('');\n    }\n\n    function styleAttributeFromPango(text, pangoAttribute, cssAttribute, transform) {\n      return text.replace((new RegExp(`${pangoAttribute}=\"([^\"]+)\"`, 'g')), (attribute, value) => {\n        return `style=\"${cssAttribute}: ${escape(transform(value))}\"`;\n      });\n    }\n  }\n\n  static quillToPango(html, scale) {\n    const result = flow([\n      applySizes,\n      applyFonts,\n      applyColors,\n      stripStyleAttributes,\n      convertToSpans,\n      formatWhiteSpace,\n      removeCursorTag,\n      removeEmptySpan\n    ])(html);\n\n    if (debug) console.log('quillToPango', result);\n\n    return new QuillToPangoResult({html: result});\n\n    function applyColors(text) {\n      return appendPangoAttributesFromStyle(text, 'color', 'foreground', value => {\n        return tinycolor(value).toHexString();\n      });\n    }\n\n    function applyFonts(text) {\n      return appendPangoAttributesFromStyle(text, 'font-family', 'font_family', value => {\n        return value.replace(/[\"']([^'\"]+)[\"']/, '$1');\n      });\n    }\n\n    function applySizes(text) {\n      return appendPangoAttributesFromStyle(text, 'font-size', 'size', value => {\n        return Math.round(sizeFromQuillToUser(Number(value.replace('pt', '')), scale));\n      });\n    }\n\n    function convertToSpans(text) {\n      return text.replace(/<\\/?([a-z]+) ?[^>]*>/gi, (match, tag) => {\n        if (tag === 'p') {\n          if (match !== '</p>') return match.replace('<p', '<span');\n          return '</span>\\n';\n        }\n\n        if (QuillHelpers.tags.includes(tag)) {\n          // Apply any styles on non 'span' tags to nested spans:\n          //   `<b foreground=\"red\">Hello</b>` ->\n          //   `<b><span foreground=\"red\">Hello</span></b>`\n          if (tag !== 'span') {\n            if (match !== `</${tag}>`) return match.replace(`<${tag}`, `<${tag}><span`);\n            return match.replace(`</${tag}>`, `</span></${tag}>`);\n          }\n\n          return match;\n        }\n\n        return '';\n      });\n    }\n\n    // If you start clicking around without any text, Quill\n    // will inject a weird cursor span as a placeholder.\n    function removeCursorTag(text) {\n      return text.replace(/<span class=\\\"ql-cursor\\\">.<\\/span>/, '');\n    }\n\n    // Non breaking white space will display in the canvas,\n    // so replace then with normal spaces.\n    function formatWhiteSpace(text) {\n      return text.replace(/&nbsp;/g, ' ');\n    }\n\n    function appendPangoAttributesFromStyle(text, cssAttribute, pangoAttribute, transform) {\n      return text.replace(/style=\"([^\"]+)\"/g, (attribute, style) => {\n        const match = unescape(style).match(new RegExp(`${cssAttribute}:\\s*([^;]+)`));\n\n        if (!match) return attribute;\n\n        const value = match[1];\n        const transformed = value ? transform(value.trim()) : null;\n\n        // Append, leaving style attribute alone in case there are more.\n        return transformed ? `${attribute} ${pangoAttribute}=\"${transformed}\"` : attribute;\n      });\n    }\n\n    function stripStyleAttributes(text) {\n      return text.replace(/\\s*style=\"([^\"]+)\"/g, '');\n    }\n\n    function removeEmptySpan(text) {\n      return text.trim().match(/^<span([^>]*)><\\/span>$/) ? '' : text;\n    }\n  }\n}\n\nexport { Quill, QuillHelpers };\n","import { create } from 'zustand';\n\n// We would expand this in the future to handle side tabs and trays\nexport const useTabTray = create(set => ({\n  showPhotosTray: false,\n  updateShowPhotosTray: (bool) => set({ showPhotosTray: bool}),\n}));\n","import each from 'lodash/each';\nimport findIndex from 'lodash/findIndex';\nimport { PrismUI } from '../../_utils/ui';\nimport fetchImage from '../../_utils/fetch-image';\nimport IU from '../../_utils/img/img-utils';\nimport tinycolor from 'tinycolor2';\nimport Snapster from '@livelink/snapster';\nimport wkLogger from './logger.js';\nimport { EventEmitter } from 'wk-event-emitter';\nimport {\n  MyMatrix,\n  TextSlot,\n  customSlots,\n  ImageSlot,\n  imgComplete,\n} from './slots';\nimport customColourHistory from '../misc/custom-colour-history';\nimport PrismJSON from './prism-json-encoder';\nimport TemplateCache from '../templates/template-cache';\nimport { prismAction } from '../utils/stores';\nimport Point from './geom/point';\nimport filledImageSlotConfirmation from '../utils/filled-image-slot-confirmation';\nimport { isClonedSlot } from '../utils/special-slots';\nimport templateInterrogator from '../misc/template-interrogator.js';\nimport PrismBuilderHistory from './prism-builder-history';\nimport { QuillHelpers } from '../../_utils/quill';\nimport { getViewport } from '../../_utils/hoc/with-viewport-size';\nimport genericHelpers from '../../_utils/generic-helpers';\nimport sendToGoogleAnalytics from '../desktop/slot-tools/send-to-google-analytics';\nimport { usePrismItemStore } from 'stores/usePrismItemStore';\nimport { useSlotStore, useFocusedSlotStore } from 'stores/useSlotStore';\nimport { useTemplateSelectStore } from 'stores/useTemplateStore';\nimport { useTabTray } from 'stores/useTabTray';\nimport { hasFoilText } from '../utils/has-foil-text';\n\nconst MOUSE_DOWN = 'pointerdown touchstart mousedown';\n\nconst MOUSE_MOVE = 'pointermove touchmove mousemove';\n\nconst MOUSE_UP = 'pointerup touchend mouseup';\n\nconst toInteger = (str, default_value) => {\n  let i;\n  i = parseInt(str, 10);\n  if (isNaN(i)) {\n    if (arguments_.length > 1) {\n      return default_value;\n    }\n    return 0;\n  }\n  return i;\n};\n\nconst stopEvent = (e) => {\n  e.preventDefault();\n  return e.stopPropagation();\n};\n\nconst __indexOf =\n  Array.prototype.indexOf ||\n  function(item) {\n    for (let i = 0, l = this.length; i < l; i++) {\n      if (i in this && this[i] === item) return i;\n    }\n    return -1;\n  };\nconst { imgHelpers } = IU;\n// temporarily until 'mobile-ui' is webpackified: not proud of this!!\nwindow.PrismJSON = PrismJSON;\n\nconst OPTIONAL_BG = 'optional-bg';\n\nconst cornerCursorSegments = (() => {\n  const circle = 360;\n  const eighth = circle / 8;\n  const sixteenth = eighth / 2;\n  const segments = [];\n  for (let step = sixteenth; step < circle; step += eighth) {\n    segments.push(step);\n  }\n  return segments;\n})();\n\nconst capitalizedDirection = {\n  horizontal: 'Horizontal',\n  vertical: 'Vertical',\n};\n\nclass PrismViewCanvas {\n  constructor(id, template, data, element = null) {\n    const _this = this;\n    this.stashFns = null; // Placeholder for a mixin\n    this.id = id;\n    this.mode = 1;\n    this.el = element ? $(element) : $(`#${id}`);\n    this.element = this.el.get(0);\n    this.editable = true;\n    this.template = null;\n    this.scale = 1;\n    this.revision = 0;\n    this._allow_redraw = true;\n    this.saveBlocked = false;\n    this.user_actions = [];\n    this._snapster =\n      window.featureFlags &&\n      window.featureFlags.show_slot_positioning_tools &&\n      new Snapster({\n        document,\n        container: this.element.closest('.snap-container'),\n        threshold: 4,\n        positioner: ({ element, edge }) => {\n          const shrinkage = this.element.clientWidth / this.element.width;\n          const position = edge.position * this.scale * shrinkage;\n          const from = edge.direction === 'horizontal' ? 'top' : 'left';\n\n          element.style[from] = `${position}px`;\n          element.ariaLabel =\n            `${capitalizedDirection[edge.direction]} guide at ${Math.round(\n              position\n            )} ` + `pixels from the ${from}`;\n        },\n      });\n    if (!this.historyStack) this.historyStack = new PrismBuilderHistory(this);\n    this.wrapperHighlight = false;\n    if (this.undoStack == null) this.undoStack = [];\n    if (this.undoPointer == null) this.undoPointer = 0;\n\n    EventEmitter.on('text-slot-updated', slot => {\n      if (_this.slots && __indexOf.call(_this.slots, slot) >= 0) {\n        return _this.do_save();\n      }\n    });\n\n    // Polyfill to test handling of the offscreen canvas in test suite\n    if (!window.OffscreenCanvas) {\n      window.OffscreenCanvas = class OffscreenCanvas {\n        constructor(width, height) {\n          this.canvas = document.createElement(\"canvas\");\n          this.canvas.width = width;\n          this.canvas.height = height;\n\n          this.canvas.convertToBlob = () => {\n            return new Promise(resolve => {\n              this.canvas.toBlob(resolve);\n            });\n          };\n\n          return this.canvas;\n        }\n      };\n    }\n\n    let offscreenWidth = 800;\n    let offscreenHeight = 800;\n\n    if (this.element && this.element.width && this.element.height){\n      offscreenWidth = this.element.width;\n      offscreenHeight = this.element.height;\n    }\n\n    // REALBUILD\n    this.contentCanvas = new OffscreenCanvas(offscreenWidth, offscreenHeight);\n    this.contentContext = this.contentCanvas.getContext('2d');\n    this.annotateCanvas = new OffscreenCanvas(offscreenWidth, offscreenHeight);\n    this.annotateContext = this.annotateCanvas.getContext('2d');\n\n    if (wkData.prism_view_text_adjustments && !this.productHasFoilText)\n      this.productHasFoilText = hasFoilText(wkData.prism_view_text_adjustments);\n\n    if (this.productHasFoilText == true) {\n      this.foilTextCanvas = new OffscreenCanvas(offscreenWidth, offscreenHeight,);\n      this.foilTextContext = this.foilTextCanvas.getContext('2d');\n    };\n\n    this.el.addClass('prism-viewport-canvas');\n    this.el.on('focusin', () => {\n      _this.queueRedraw('focusin');\n    });\n    this.el.on('focusout', () => {\n      _this.queueRedraw('focusout');\n    });\n    this.el.on('keydown', ({ originalEvent: event }) => {\n      const ymod = 10;\n      const xmod = 10;\n      const angleMod = 1;\n      const shiftMod = event.shiftKey ? 3 : 1;\n\n      switch (event.keyCode) {\n        case 83: // s\n        case 40: // ArrowDown\n          // Handle 'downwards'\n          if (_this.selected && _this.selected.stackable() && event.altKey) {\n            event.preventDefault();\n            event.ctrlKey || event.metaKey\n              ? // Decrease selected slot's Z-index\n                _this.decreaseIndex()\n              : // Move selected slot down\n                event.shiftKey &&\n                _this.selected.moveTo(_this.selected.x, _this.selected.y + 8);\n            break;\n          }\n          if (_this.selected && _this.selected.isImage)\n            _this.selected.moveImgBy(0, -1 * ymod * shiftMod);\n          break;\n        case 87: // w\n        case 38: // ArrowUp\n          // Handle 'upwards'\n          if (_this.selected && _this.selected.stackable() && event.altKey) {\n            event.preventDefault();\n            event.ctrlKey || event.metaKey\n              ? // Increase selected slot's Z-index\n                _this.increaseIndex()\n              : // Move selected slot up\n                event.shiftKey &&\n                _this.selected.moveTo(_this.selected.x, _this.selected.y - 8);\n            break;\n          }\n          if (_this.selected && _this.selected.isImage)\n            _this.selected.moveImgBy(0, 1 * ymod * shiftMod);\n          break;\n        case 65: // a\n        case 37: // ArrowLeft\n          // Handle 'leftwards'\n          if (\n            _this.selected &&\n            _this.selected.stackable() &&\n            event.altKey &&\n            event.shiftKey\n          ) {\n            event.preventDefault();\n            event.ctrlKey || event.metaKey\n              ? // Rotate selected slot 'anti-clockwise'\n                _this.selected.isImage\n                ? _this.rotate(-5)\n                : _this.selected.keyRotate(-5)\n              : // Move selected slot left\n                _this.selected.moveTo(_this.selected.x - 8, _this.selected.y);\n            break;\n          }\n          if (_this.selected && _this.selected.isImage)\n            _this.selected.moveImgBy(-1 * xmod * shiftMod, 0);\n          break;\n        case 68: // d\n        case 39: // ArrowRight\n          // Handle 'rightwards'\n          if (\n            _this.selected &&\n            _this.selected.stackable() &&\n            event.altKey &&\n            event.shiftKey\n          ) {\n            event.preventDefault();\n            event.ctrlKey || event.metaKey\n              ? // Rotate selected slot 'clockwise'\n                _this.selected.isImage\n                ? _this.rotate(5)\n                : _this.selected.keyRotate(5)\n              : // Move selected slot right\n                _this.selected.moveTo(_this.selected.x + 8, _this.selected.y);\n            break;\n          }\n          if (_this.selected && _this.selected.isImage)\n            _this.selected.moveImgBy(xmod * shiftMod, 0);\n          break;\n        case 82: // r\n          // Rotate\n          if (_this.selected && _this.selected.isImage)\n            _this.rotate(event.shiftKey ? 90 : -90);\n          break;\n        case 84: // t\n          if (_this.selected && _this.selected.isText)\n            _this.selected.keyRotate(event.shiftKey ? -3 : 3);\n          break;\n        case 13: // Enter\n          if (!_this.selected) _this.selectSlotByIndex(0);\n          else {\n            EventEmitter.emit(PrismUI.SLOT_ACTIVATE, {\n              view: _this,\n              slot: _this.selected,\n            });\n          }\n          if (_this.selected.isText) this.clickFixedTextSlot();\n          break;\n        case 27: // Escape\n          if (_this.selected) _this.deselectAll();\n          break;\n        case 67: // c\n          _this.setFilter('colour');\n          break;\n        case 66: // b\n          _this.setFilter('greyscale');\n          break;\n        case 86: // v\n          _this.setFilter('sepia');\n          break;\n        case 187: // Equal\n          if (_this.selected && _this.selected.isImage)\n            _this._scrollWheelZoom(_this.selected, 10 * shiftMod);\n          break;\n        case 189: // Minus\n          if (_this.selected && _this.selected.isImage)\n            _this._scrollWheelZoom(_this.selected, -10 * shiftMod);\n          break;\n        case 78: // n\n          _this.straightenBy(-1 * angleMod * shiftMod);\n          break;\n        case 77: // m\n          _this.straightenBy(angleMod * shiftMod);\n          break;\n        case 188: // Comma\n          _this.brightenBy(-0.1 * shiftMod);\n          break;\n        case 190: // Period\n          _this.brightenBy(0.1 * shiftMod);\n          break;\n        case 9: // Tab\n          if (\n            !event.shiftKey &&\n            _this.selected &&\n            _this.selectedIndex + 1 < _this.slots.length\n          ) {\n            _this.selectNextSlot();\n          } else if (\n            event.shiftKey &&\n            _this.selected &&\n            _this.selectedIndex > 0\n          ) {\n            _this.selectPreviousSlot();\n          } else {\n            return;\n            // allow default\n          }\n          break;\n        case 8: // Backspace\n        case 46: // Delete\n          if (_this.selected && _this.selected.isImage) {\n            const slot = _this.selected;\n\n            if (!_this.selected.isEmbellishment() && slot.img) {\n              slot.view.removeImageFromSlot(slot.id);\n            } else if (slot.stackable()) {\n              slot.view.deleteSlotById(slot.id);\n            }\n          }\n          break;\n        case 49: // 1\n        case 50: // 2\n        case 51: // 3\n        case 52: // 4\n        case 53: // 5\n        case 54: // 6\n        case 55: // 7\n        case 56: // 8\n        case 57: // 9\n          const { key: index } = event;\n          _this.selectSlotByIndex(index - 1);\n          break;\n        case 48: // 0\n          _this.deselectAll();\n          break;\n        default:\n          return;\n      }\n\n      event.preventDefault();\n      _this.queueRedraw('key event');\n    });\n    // this.el.on('dblclick', e => {\n    //   e.stopPropagation();\n    //   if (!_this.ready(e)) return;\n    //   _this.doubleClickTextSlot();\n    //   return false;\n    // });\n    this.el.on('click', e => {\n      e.stopPropagation();\n      if (!_this.ready(e)) return;\n      _this.clickFixedTextSlot();\n      return false;\n    });\n    this.el.on(MOUSE_DOWN, e => {\n      if (!_this.ready(e)) return;\n      _this.activateView();\n      _this.control = false;\n      _this.drag = false;\n      e.preventDefault();\n      _this.mouseDown(_this.slotIndex(_this.relativePoint(e)), e);\n      return false;\n    });\n    this.el.on(MOUSE_UP, e => {\n      if (!_this.ready(e)) return;\n      _this.activateView();\n      e.preventDefault();\n      _this.mouseUp(\n        _this.slotIndex(_this.relativePoint(e), { dragIsActive: true }),\n        e\n      );\n      return false;\n    });\n    this.el.on(MOUSE_MOVE, e => {\n      if (!_this.ready(e)) return;\n      e.preventDefault();\n      _this.mouseMove(\n        _this.slotIndex(_this.relativePoint(e), { dragIsActive: true }),\n        e\n      );\n      return false;\n    });\n    this.el.on('dragover dragenter dragleave', (e, syntheticEvent) => {\n      e = syntheticEvent || e;\n      if (!_this.ready(e) || _this.saveBlocked) return;\n      _this.activateView();\n      _this.dragImageHover(e);\n      e.preventDefault();\n      return false;\n    });\n    this.el.on('drop', e => {\n      if (!_this.ready(e) || _this.saveBlocked) return;\n      _this.activateView();\n      e.stopPropagation();\n      _this.onDrop(_this.slotIndex(_this.relativePoint(e)), e);\n      return false;\n    });\n    this.el.on('mouseover', e => {\n      if (!_this.ready(e)) return;\n      _this.mouseIn(_this.slotIndex(_this.relativePoint(e)), e);\n      return false;\n    });\n    this.el.on('mouseout', e => {\n      if (!_this.ready(e)) return;\n      _this.mouseOut(_this.slotIndex(_this.relativePoint(e)), e);\n      return false;\n    });\n    this.el.on('mousewheel', e => {\n      if (!_this.ready(e)) return;\n      _this.scrollWheel(_this.slotIndex(_this.relativePoint(e)), e);\n      return false;\n    });\n    this.el.on('DOMMouseScroll', e => {\n      if (!_this.ready(e)) return;\n      _this.scrollWheel(_this.slotIndex(_this.relativePoint(e)), e);\n      return false;\n    });\n    if (template) {\n      this.loadTemplate(template);\n\n      if (data) {\n        this.setData(data);\n      }\n      this.do_save();\n    }\n\n    EventEmitter.on(PrismUI.PAGE_CHANGED_OUTSIDE_EDITOR, (payload) => {\n      if (payload.page.index == this.pageIndex) {\n        // it's us - update\n        this.setData(payload.page);\n        this.queueRedraw();\n      }\n    })\n  }\n\n  static IMAGE_EDIT = 1;\n\n  static LAYOUT_EDIT = 2;\n\n  static SLOT_MANIPULATION = 4;\n\n  static slotHasUserData (slot) {\n    if (!slot) return;\n    if (!slot.data) return;\n    const data = slot.data();\n\n    switch (slot.content_type || slot.type) {\n      case 'text':\n        return data.string && data.string.length && true;\n      case 'image':\n        return data.url && data.url.length && true;\n    }\n  };\n\n  static hasUserData (data) {\n    let slot;\n    let _i;\n    let _len;\n    let _ref;\n    if ((data != null ? data.slots : void 0) != null) {\n      _ref = data.slots;\n      for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n        slot = _ref[_i];\n        if (PrismViewCanvas.slotHasUserData(slot)) return true;\n      }\n    }\n    return false;\n  };\n\n  setMode (mode) {\n    if (\n      this.selected?.stackable() &&\n      !this.template.context_canvas &&\n      mode !== PrismViewCanvas.SLOT_MANIPULATION\n    ) {\n      this.selected.setSlotState(\n        this.selected.isUnconfirmedTextSlot ? 'editing' : 'moving'\n      );\n    }\n\n    return this.queueRedraw();\n  };\n\n  ready (e) {\n    return (\n      this.editable &&\n      this.template &&\n      this.inDOM() &&\n      this.el.hasClass('showing')\n    );\n  };\n\n  active () {\n    return (\n      this === window.activeView && this.inDOM() && this.el.hasClass('showing')\n    );\n  };\n\n  inDOM () {\n    return (\n      window.getComputedStyle &&\n      window.getComputedStyle(this.element).display !== 'none'\n    );\n  };\n\n  hasTexts () {\n    if (!this.editable) return false;\n    if (this.template) return this.template.tso.length > 0;\n    return false;\n  };\n\n  hasPhotos () {\n    if (!this.editable) return false;\n    if (this.template) return this.template.pso.length > 0;\n    return false;\n  };\n\n  changeTemplate (template) {\n    return this.loadTemplate(template);\n  };\n\n  setFilter (filter, slot) {\n    slot = slot || this.selected;\n    if (!slot || !slot.isImage) return;\n    if (slot.setFilter(filter)) {\n      this.do_save();\n      this.queueRedraw('filter changed');\n    }\n  };\n\n  brightenBy (value, slot) {\n    slot = slot || this.selected;\n    if (!slot || !slot.isImage) return;\n    if (slot.brightenBy(value)) {\n      this.do_save();\n      this.queueRedraw('gamma changed');\n    }\n  };\n\n  loadTemplateAndData (template, data) {\n    this.suppressSave('load-template-and-data', () => {\n      this.loadTemplate(template);\n      this._setData(data);\n    });\n  };\n\n  loadTemplate (template, noSave) {\n    let id;\n    let im;\n    let imageProps;\n    let p;\n    let re;\n    let slot;\n    let slot_data;\n    let _fn;\n    let _i;\n    let _j;\n    let _k;\n    let _len;\n    let num_photo_slots;\n    let num_text_slots;\n    let photo_slots;\n    let text_slots;\n    let slot_id;\n    let _ref5;\n    let _ref6;\n    const _this = this;\n    this.theme_loading = true;\n    this.template = template;\n    this.slots = [];\n    if (!template.size && !template['pixel-size']) {\n      throw 'Incomplete template';\n    }\n    if (window.TemplateCache) {\n      TemplateCache.get(template.id, () => {});\n    }\n    try {\n      this.clearCanvas('loadTemplate');\n    } catch (ez) {\n      wkLogger.error(ez);\n    }\n    this.do_selectTheme(this.template.id);\n    imageProps = ['fgImage', 'bgImage', 'lfgImage', 'lbgImage'];\n    _fn = function(p) {\n      _this[p] = new Image();\n      return $(_this[p]).on('load', e =>\n        _this.queueRedraw(`${p} loaded : ${_this[p].src}`)\n      );\n    };\n    for (_i = 0, _len = imageProps.length; _i < _len; _i++) {\n      p = imageProps[_i];\n      _fn(p);\n    }\n    this.updateSize(false);\n\n    this.overlays = {};\n    this.editableArea = null;\n    this.acceptsUserContent = false;\n\n    if (this.template.id != '@blank') {\n      this.editableArea = this.template['context-area'] || [\n        0,\n        0,\n        this.template.size.width,\n        this.template.size.height,\n      ];\n      this.acceptsUserContent =\n        this.editableArea[IU.X] + this.editableArea[IU.WIDTH] > -1 &&\n        this.editableArea[IU.Y] + this.editableArea[IU.HEIGHT] > -1;\n\n      this.fgImage.crossOrigin = 'use-credentials';\n      this.fgImage.src = this.template.over;\n      this.bgImage.crossOrigin = 'use-credentials';\n      this.bgImage.src = this.template.back;\n      this.lfgImage.crossOrigin = 'use-credentials';\n\n      const size = this.isDoubleCover() ? 'dbl' : 'lrg';\n\n      this.lfgImage.src =\n        (this.template.prefix || '') +\n        this.fgImage.src.replace(/fg\\.ui\\.png/, `${size}.fg.ui.png`);\n      this.lbgImage.crossOrigin = 'use-credentials';\n      this.lbgImage.src =\n        (this.template.prefix || '') +\n        this.bgImage.src.replace(/bg\\.ui\\.png/, `${size}.bg.ui.png`);\n\n      if (this.template.overlays) {\n        for (let j = 0; j < this.template.overlays.length; j++) {\n          (function(index, overlay) {\n            const im = new Image();\n            im.crossOrigin = 'use-credentials';\n            im.onload = this.queueRedraw.bind(this, `loaded ${template.id}`);\n            im.src = overlay.src;\n            this.overlays[index] = im;\n          }.bind(this)(j, this.template.overlays[j]));\n        }\n      }\n\n      photo_slots = this.template.pso;\n      for (\n        _j = 0, num_photo_slots = photo_slots.length;\n        _j < num_photo_slots;\n        _j++\n      ) {\n        id = photo_slots[_j];\n        this.addPhotoSlot(this.template.photo_slots[id]);\n      }\n\n      text_slots = template.tso;\n      for (\n        _k = 0, num_text_slots = text_slots.length;\n        _k < num_text_slots;\n        _k++\n      ) {\n        id = text_slots[_k];\n        if (!(id != null)) continue;\n        slot_data = this.template.text_slots[id.toString()];\n        slot = new TextSlot(slot_data.id);\n        slot._set('fontName', slot_data.font);\n        slot._set('fontWeight', +(slot_data.weight.toLowerCase() !== 'normal'));\n        slot._set('fontSlant', +(slot_data.style.toLowerCase() !== 'normal'));\n        slot._set('fontSize', toInteger(slot_data.size, 12));\n        slot._set('fontColour', tinycolor(slot_data.fill).toHexString());\n        slot._set('stroke', slot_data.stroke);\n        if (\n          (slot_id = slot_data.id) === 'credits' ||\n          slot_id === 'recipient' ||\n          slot_id === 'message' ||\n          slot_id === 'sender'\n        ) {\n          slot._set('string', '');\n        } else {\n          re = /(your text|text here|your message|name here|your name|name or message|^name|^message$)/i;\n          if (re.test((_ref5 = slot_data.default) != null ? _ref5 : '')) {\n            slot._set('string', '');\n          } else {\n            slot._set(\n              'string',\n              (_ref6 = slot_data.default) != null ? _ref6 : ''\n            );\n          }\n        }\n        [slot.x, slot.y, slot.w, slot.h] = slot_data['pixel-coords'];\n        slot_data.fromTemplate = true;\n        slot._set('align', slot_data.align);\n        slot._set('valign', slot_data.valign);\n\n        // Override defaults\n        if (slot_data.id === 'spine-text') {\n          if (toInteger(slot_data.size) < 5) {\n            slot._set('fontSize', 27);\n          }\n          slot._set('valign', 'middle');\n        }\n\n        im = slot_data.imatrix;\n        slot.imatrix = new MyMatrix(im[0], im[1], im[2], im[3], im[4], im[5]);\n        im = slot_data.matrix;\n        slot.matrix = new MyMatrix(im[0], im[1], im[2], im[3], im[4], im[5]);\n        slot._set('scale', this.scale);\n        slot.fromTemplate = true;\n        slot.inEditableArea = slot.insideRectangle(this.editableArea);\n        slot.editable = false;\n        slot.locked = slot_data.locked;\n        slot.meta = slot_data;\n        this.addTextSlot(slot);\n      }\n    }\n    this.deselectAll();\n    this.theme_loading = false;\n\n    return this.updateSize(true);\n  };\n\n  outputDimensions () {\n    let width, height;\n\n    if (!this.template) return;\n\n    if (this.template['print-area']) {\n      [, , width, height] = this.template['print-area'];\n      return { width, height };\n    }\n    if (this.template['context-area']) {\n      [, , width, height] = this.template['context-area'];\n      return { width, height };\n    }\n    // This is an object with width & height\n    return this.template.size;\n  };\n\n  eventOffset (event) {\n    let ex;\n    let ey;\n    let touch;\n\n    // Used for <DragItem />\n    if (!event.originalEvent) {\n      // event.touches is empty when releasing so you need\n      // to use event.changedTouches\n      const touches =\n        (event.touches && event.touches[0]) ||\n        (event.changedTouches && event.changedTouches[0]) ||\n        {};\n\n      // You can't modify the React SyntheticEvent so use\n      // a jQuery event instead\n      return $.Event('touchmove', {\n        pageX: touches.clientX,\n        pageY: touches.clientY,\n      });\n    }\n\n    if (event.originalEvent.changedTouches) {\n      touch = event.originalEvent.changedTouches[0];\n      if (touch) {\n        ex = touch.pageX;\n        ey = touch.pageY;\n      }\n    }\n\n    if (!(ex || ey)) {\n      ex = event.pageX;\n      ey = event.pageY;\n\n      if (ex || ey) return event;\n    }\n\n    if (!(ex || ey)) {\n      ex = event.originalEvent.pageX;\n      ey = event.originalEvent.pageY;\n    }\n\n    if (!(ex || ey)) {\n      if (event.originalEvent.touches) {\n        touch = event.originalEvent.touches[0];\n        if (touch) {\n          ex = touch.pageX;\n          ey = touch.pageY;\n        }\n      }\n    }\n    event.pageX = ex;\n    event.pageY = ey;\n\n    return event;\n  };\n\n  relativePoint (event) {\n    event = this.eventOffset(event);\n    const pos = this.el.offset();\n\n    if (pos) {\n      const scale = this.element.clientWidth / this.element.width;\n\n      return {\n        x: (event.pageX - pos.left - this.xOffset) / (scale * this.scale),\n        y: (event.pageY - pos.top - this.yOffset) / (scale * this.scale),\n      };\n    }\n\n    return {\n      x: 0,\n      y: 0,\n    };\n  };\n\n  activateView () {\n    if (this.blank) return;\n\n    usePrismItemStore.setState(({ prismItem }) => ({\n      prismItem: { ...prismItem, currentPage: this.pageIndex },\n    }));\n\n    if (window.activeView !== this) {\n      if (window.prismViews) {\n        for (const k in prismViews) {\n          if (prismViews[k].selectSlotById) {\n            prismViews[k].selectSlotById(null);\n          }\n        }\n      }\n\n      const oldView = activeView;\n\n      window.activeView = this;\n    }\n  };\n\n  clearCanvas (reason) {\n    if (!this.element.getContext) return;\n    this.context = this.element.getContext('2d');\n    return this.context.clearRect(\n      0,\n      0,\n      this.element.clientWidth,\n      this.element.clientHeight\n    );\n  };\n\n  updateSize (auto_redraw) {\n    let i,\n      minDim,\n      oldscale,\n      slot,\n      theight,\n      tpr,\n      twidth,\n      vpheight,\n      vpr,\n      vpwidth,\n      xoff,\n      yoff;\n    vpwidth = this.element.width;\n    vpheight = this.element.height;\n    this.contentCanvas.width = vpwidth;\n    this.contentCanvas.height = vpheight;\n    this.annotateCanvas.width = vpwidth;\n    this.annotateCanvas.height = vpheight;\n    if (this.productHasFoilText && this.productHasFoilText == true) {\n      this.foilTextCanvas.width = vpwidth;\n      this.foilTextCanvas.height = vpheight;\n    };\n    vpr = (vpwidth + 0.0) / vpheight;\n    oldscale = this.scale;\n    xoff = this.xOffset;\n    yoff = this.yOffset;\n    if (this.template) {\n      if (!this.template.size) {\n        this.template.size = this.template['pixel-size'];\n      }\n      twidth = this.template.size.width;\n      theight = this.template.size.height;\n\n      if (auto_redraw) {\n        let extraResize = 2;\n        if (this.isDoubleCover()) extraResize = 4;\n\n        this.el.attr('width', twidth * extraResize);\n        this.el.attr('height', theight * extraResize);\n      }\n\n      tpr = (twidth + 0.0) / theight;\n      if (tpr > vpr) {\n        this.scale = (vpwidth + 0.0) / twidth;\n      } else {\n        this.scale = (vpheight + 0.0) / theight;\n      }\n      if (this.scale > 2.0 && !this.isDoubleCover()) this.scale = 2.0;\n      this.xOffset = parseInt((vpwidth - this.scale * twidth) / 2, 10);\n      this.yOffset = 0;\n    } else {\n      minDim = vpwidth;\n      if (minDim > vpheight) minDim = vpheight;\n      this.scale = minDim / 400.0;\n      if (this.scale > 2.0) this.scale = 2.0;\n    }\n    if (this.slots) {\n      i = 0;\n      while (i < this.slots.length) {\n        slot = this.slots[i];\n        try {\n          if (slot) {\n            if (slot.isText && slot.setScale) {\n              slot.setScale(this.scale);\n            } else {\n              slot.viewscale = this.scale;\n            }\n          }\n        } catch (e) {\n          wkLogger.error(e, {\n            slot,\n          });\n        }\n        i += 1;\n      }\n    }\n    if (auto_redraw) return this.queueRedraw();\n  };\n\n  queueRedraw (reason) {\n    this.updateSize(false);\n    return this.redraw();\n  };\n\n  redraw (reason, highlight = false) {\n    this.highlight = highlight;\n    if (highlight) this.setWrapperBorder(false);\n    this.pending_redraw = true;\n    return true;\n  };\n\n  stopRedraw () {};\n\n  allowRedraw () {\n    if (this.pending_redraw) return this.redraw();\n  };\n\n  draw_wrapper (method, what, ctx) {\n    const args = Array.prototype.slice.call(arguments, 1);\n    let err;\n    let response;\n    if (this.debug_render_time) console.time(what);\n    ctx.save();\n    try {\n      response = method.call(this, ctx);\n    } catch (e) {\n      if (window.debugPrism) console.error(`view.render.${what} - %o`, e);\n    } finally {\n      ctx.restore();\n    }\n    if (this.debug_render_time) console.timeEnd(what);\n\n    return response;\n  };\n\n  _draw_clear () {\n    this.context.clearRect(0, 0, this.element.width, this.element.height);\n    this.contentContext.clearRect(0, 0, this.element.width, this.element.height);\n    this.annotateContext.clearRect(0, 0, this.element.width, this.element.height);\n  };\n\n  _draw_spy (ctx) {\n    if (!this.debug_save_restore) return;\n    if (!ctx.XX) {\n      (function(ctx) {\n        let i = 0;\n        const sv = ctx.save.bind(ctx);\n        ctx.save = function() {\n          const e = new Error();\n          console.warn('%i save - %s', i++, e.stack.split(/\\n/)[2]);\n          sv();\n        };\n        const rs = ctx.restore.bind(ctx);\n        ctx.restore = function() {\n          const e = new Error();\n          console.warn('%i restore - %s', --i, e.stack.split(/\\n/)[2]);\n          rs();\n        };\n        ctx.XX = true;\n      })(ctx);\n    }\n  };\n\n  _draw_hatch() {\n    const ctx = this.context;\n    let i;\n    ctx.beginPath();\n    ctx.fillStyle = '#fff';\n    ctx.fillRect(0, 0, this.element.width, this.element.height);\n    ctx.lineWidth = 5;\n    ctx.strokeStyle = '#f7f7f7';\n    for (i = -1 * this.element.height; i < this.element.width; i += 30) {\n      ctx.moveTo(i + this.element.height, 0);\n      ctx.lineTo(i, this.element.height);\n    }\n    ctx.stroke();\n    ctx.lineWidth = 2;\n    ctx.strokeStyle = '#d9d9d9';\n    ctx.strokeRect(1, 1, this.element.width - 2, this.element.height - 2);\n  };\n\n  _draw_text_for_blank() {\n    const ctx = this.context;\n    const twidth = (this.template.size.width * this.scale) / 2;\n    const theight = (this.template.size.height * this.scale) / 2;\n    const clientBaseFont = window\n      .getComputedStyle(document.body, null)\n      .getPropertyValue('font-family')\n      .split('-')[0];\n\n    ctx.fillStyle = '#6d6e71';\n    // text1\n    const text1 = 'Inside Cover';\n\n    ctx.font = `32px ${clientBaseFont}-Bold`;\n\n    const text1PosX = twidth - ctx.measureText(text1).width / 2 || twidth / 2;\n    const text1Height =\n      ctx.measureText(text1).actualBoundingBoxAscent +\n        ctx.measureText(text1).actualBoundingBoxDescent || 32;\n    const text1PosY = theight - text1Height / 2;\n\n    ctx.globalCompositeOperation = 'source-over';\n    ctx.fillText(text1, text1PosX, text1PosY);\n\n    // text2\n    const text2 = 'This will remain blank';\n    ctx.font = `24px ${clientBaseFont}-Regular`;\n\n    const text2PosX = twidth - ctx.measureText(text2).width / 2 || twidth / 2;\n    const text2Height =\n      ctx.measureText(text1).actualBoundingBoxAscent +\n        ctx.measureText(text1).actualBoundingBoxDescent || 24;\n    const text2PosY = text1PosY + text2Height / 2 + text1Height;\n\n    ctx.globalCompositeOperation = 'source-over';\n    ctx.fillText(text2, text2PosX, text2PosY);\n  };\n\n  _draw_inside_cover() {\n    this._draw_hatch();\n  };\n\n  _redraw (reason, highlight = false) {\n    let ctx;\n    let i;\n    let rect;\n    let slot;\n    let theight;\n    let twidth;\n    let _i;\n    let _len;\n    let _ref;\n\n    if (!this.inDOM()) {\n      // Ignore redraws when canvas is not visible.\n      return;\n    }\n\n    this.pending_redraw = false;\n    this.timeoutID = null;\n    if (!this.template) return;\n    if (!this.context) {\n      if (this.element.getContext) {\n        this.context = this.element.getContext('2d');\n      } else {\n        return false;\n      }\n    }\n\n    ctx = this.context;\n\n    if (!ctx) {\n      // alert(\"Trying to draw, but unable to get context...?\");\n      return false;\n    }\n    if (this.debug_render_time) console.time('drawAll');\n\n    this._draw_clear();\n\n    this._draw_spy(ctx);\n\n    if (this.blank) {\n      switch (this.hatch) {\n        case 'blank':\n        case 'lines':\n          this._draw_hatch(this.annotateContext);\n          this._draw_text_for_blank(this.annotateContext);\n          break;\n        case 'inside-cover':\n          this._draw_inside_cover(this.annotateContext);\n          break;\n      }\n      return;\n    }\n\n    this.draw_wrapper(function(ctx) {\n      ctx.translate(this.xOffset, this.yOffset);\n      ctx.scale(this.scale, this.scale);\n\n      // if (imgComplete(this.bgImage)) ctx.drawImage(this.bgImage, 0, 0);\n      this.draw_wrapper(function(ctx) {\n        if (\n          this.scale > 1 &&\n          this.lbgImage &&\n          imgComplete(this.lbgImage) &&\n          this.lbgImage.width > 0\n        ) {\n          ctx.scale(1 / this.scale, 1 / this.scale);\n          ctx.drawImage(this.lbgImage, 0, 0);\n        } else if (imgComplete(this.bgImage)) {\n          ctx.drawImage(this.bgImage, 0, 0);\n        }\n      }, 'draw.bgImage', this.contentContext);\n\n      i = 0;\n      while (i < this.slots.length) {\n        slot = this.slots[i];\n        if (slot.isImage && !slot.stackable() && !this.slotIsOverridden(slot)) {\n          this.draw_wrapper((ctx) => {\n            // ctx.rect(1, 1, this.template.size.width - 2, this.template.size.height - 2);\n            // ctx.clip();\n            slot.draw(ctx);\n          }, `draw.slot.${slot.id}`, this.contentContext);\n        }\n        i += 1;\n      }\n    }, 'bgAndSlots', this.contentContext);\n\n    this.draw_wrapper(function(ctx) {\n      ctx.translate(this.xOffset, this.yOffset);\n      ctx.scale(this.scale, this.scale);\n      if (false && window.wkData && window.wkData.product.type === 'album') {\n        // XXX: nasty hacky way to avoid showing bleed overlay\n        // WM only have backgrounds\n      } else if (\n        this.scale > 1 &&\n        this.lfgImage &&\n        imgComplete(this.lfgImage) &&\n        this.lfgImage.width > 0\n      ) {\n        ctx.scale(1 / this.scale, 1 / this.scale);\n        ctx.drawImage(this.lfgImage, 0, 0);\n      } else if (imgComplete(this.fgImage)) {\n        ctx.drawImage(this.fgImage, 0, 0);\n      }\n    }, 'draw.fgImage', this.contentContext);\n\n    if (!this.typeIs(/^(canvas|album|framedcanvas)/)) {\n      // if (this.show_overlays) this.drawOverlays(ctx, this.contentContext); // REALBUILD\n      if (this.show_overlays) this.drawOverlays(this.contentContext);\n    }\n\n    this.draw_wrapper(function(ctx) {\n      if (\n        this.template.context_canvas &&\n        typeof this.template.context_area !== 'undefined'\n      ) {\n        rect = this.template.context_area;\n        ctx.translate(this.xOffset, this.yOffset);\n        ctx.scale(this.scale, this.scale); // XXX : is this used?\n\n        ctx.lineWidth = 1;\n        ctx.globalAlpha = 0.3;\n        ctx.fillRect(0, 0, this.template.size.width, rect[1]);\n        ctx.fillRect(0, rect[1], rect[0], this.template.size.height - rect[1]);\n        ctx.fillRect(\n          rect[0],\n          rect[1] + rect[3],\n          rect[2],\n          this.template.size.height - rect[1] - rect[3]\n        );\n        ctx.fillRect(\n          rect[0] + rect[2],\n          rect[1],\n          this.template.size.width - rect[2] - rect[0],\n          this.template.size.height - rect[1]\n        );\n        ctx.globalAlpha = 1;\n        ctx.strokeStyle = '#009';\n        ctx.strokeRect(rect[0] - 0.5, rect[1] - 0.5, rect[2] + 1, rect[3] + 1);\n      }\n    }, 'draw.bounds', this.annotateContext);\n\n    // draw shadows for photobook pages here...?\n    this.draw_wrapper(function(ctx) {\n      if (this.template.canvas) {\n        let m = 1;\n        if (window.activeView === this && this.selectable) {\n          ctx.lineWidth = 5;\n          m = 1;\n          ctx.strokeStyle = '#ffc003';\n          ctx.fillStyle = '#000';\n          twidth = this.template.size.width * this.scale;\n          theight = this.template.size.height * this.scale;\n          ctx.strokeRect(\n            Math.ceil(this.xOffset) + m * 0.5,\n            Math.ceil(this.yOffset) + m * 0.5,\n            Math.floor(twidth) - m,\n            Math.floor(theight) - m\n          );\n        }\n      }\n    }, 'draw.pageSelectState', this.annotateContext);\n\n    // We'll probably want to remove this when WM realise that\n    // it's really confusing to display the wrong background colour\n    // for no good reason other than someone liked it on a wireframe\n    if (this.editable && this.selected && this.selected.shouldRender()) {\n      this.draw_wrapper(function(ctx) {\n        ctx.translate(this.xOffset, this.yOffset);\n        ctx.scale(this.scale, this.scale);\n        this.selected.drawControlBackground(ctx, true);\n      }, 'draw.textControls', this.annotateContext);\n    }\n\n    _ref = this.getSlotsToDraw();\n    if (_ref && _ref.length) {\n      if (this.productHasFoilText === true) this.foilSlots = [];\n\n      for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n        slot = _ref[_i];\n        if (slot && slot.shouldRender()) {\n          this.draw_wrapper(function(ctx) {\n            ctx.translate(this.xOffset, this.yOffset);\n            ctx.scale(this.scale, this.scale);\n            slot.draw(ctx);\n          }, `draw.slot.${slot.id}`, this.contentContext);\n\n          if (this.productHasFoilText === true && slot.id.includes('foiltext'))\n            this.foilSlots.push(slot);\n        }\n      }\n\n      if (\n        wkData.three_dimensional_view.quick_preview_available === true &&\n        this.productHasFoilText === true &&\n        this.foilSlots.length >= 1\n      ) {\n        if (this.onFoilClear) {\n          this.onFoilClear(this);\n        }\n\n        for (const slot of this.foilSlots) {\n          this.draw_wrapper(\n            function (ctx) {\n              ctx.canvas.id = '3DFoil';\n              ctx.translate(this.xOffset, this.yOffset);\n              ctx.scale(this.scale, this.scale);\n              slot.draw(ctx);\n            },\n            `draw.slot.${slot.id}`,\n            this.foilTextContext,\n          );\n        }\n\n        if (this.onFoilDraw) {\n          this.onFoilDraw(this);\n        }\n      }\n    }\n\n    if (this.typeIs(/^(canvas|album|framedcanvas)/)) {\n      if (this.show_overlays) this.drawOverlays(this.annotateContext);\n    }\n\n    if (this.wrapperHighlight) {\n      this.draw_wrapper(function(ctx) {\n        ctx.translate(0, 0);\n        ctx.shadowBlur = 5;\n        ctx.lineWidth = 5;\n        ctx.strokeStyle = '#cd3695';\n        ctx.strokeRect(0, 0, this.element.width, this.element.height);\n      }, 'draw.wrapperHighlight', this.annotateContext);\n    }\n\n    if (\n      this.selected &&\n      this.selected.isImage &&\n      this.editable\n    ) {\n      this.draw_wrapper(function(ctx) {\n        ctx.translate(this.xOffset, this.yOffset);\n        ctx.scale(this.scale, this.scale);\n        if (\n          this.selected.stackable() &&\n          !this.highlight &&\n          !genericHelpers.isMobileViewport()\n        ) {\n          this.selected.drawControls(ctx, true);\n          this.selected.drawOrientationWarning(ctx, this.selected);\n          this.selected.drawLowDpiWarning(ctx);\n        } else {\n          this.selected.drawHighlight(ctx);\n          this.selected.drawOrientationWarning(ctx, this.selected);\n          this.selected.drawLowDpiWarning(ctx);\n        }\n      }, 'draw.imageHighlight', this.annotateContext);\n    }\n\n    if (this.editable && this.selected && this.selected.isText) {\n      this.draw_wrapper(function(ctx) {\n        ctx.translate(this.xOffset, this.yOffset);\n        ctx.scale(this.scale, this.scale);\n        this.selected.drawControls(ctx, true);\n      }, 'draw.textControls', this.annotateContext);\n    }\n\n    if (this.isLoading()) {\n      this.draw_wrapper(function (ctx) {\n        const sz = 30;\n        const offset = sz + 6;\n        const str = `${parseInt(this.loadStatus() * 100, 10)}%`;\n        let text_size;\n\n        twidth = this.template.size.width * this.scale;\n        theight = this.template.size.height * this.scale;\n\n        ctx.fillStyle = 'rgba(255,255,255,1)';\n        ctx.beginPath();\n        ctx.arc(twidth - offset, offset, sz, 0, Math.PI * 2);\n        ctx.fill();\n\n        ctx.beginPath();\n        ctx.fillStyle = 'rgb(0,0,0)';\n        ctx.font = '14px BogleWeb-Regular';\n        text_size = ctx.measureText(str);\n        ctx.fillText(\n          str,\n          twidth - offset - text_size.width / 2,\n          offset + (text_size.height || ctx.measureText('0').width) / 2\n        );\n\n        ctx.strokeStyle = 'rgb(233,233,233)';\n        ctx.lineWidth = 6;\n        ctx.lineCap = 'round';\n\n        ctx.beginPath();\n        ctx.arc(twidth - offset, offset, sz, 0, Math.PI * 2);\n        ctx.stroke();\n\n        ctx.strokeStyle = '#cb2c90';\n        ctx.lineWidth = 6;\n        ctx.beginPath();\n        ctx.arc(\n          twidth - offset,\n          offset,\n          sz,\n          0 - Math.PI / 2,\n          Math.PI * 2 * this.loadStatus() - Math.PI / 2\n        );\n        ctx.stroke();\n      }, 'loading', this.annotateContext);\n    }\n\n    // REALBUILD\n    this.context.drawImage(this.contentCanvas, 0, 0)\n    this.context.drawImage(this.annotateCanvas, 0, 0)\n    if (this.onDraw) {\n      this.onDraw(this);\n    }\n\n    if (this.debug_render_time) console.timeEnd('drawAll');\n  };\n\n  typeIs (pattern) {\n    const klass = '';\n    if (window.wkData && wkData.product.type) {\n      return wkData.product.type.match(pattern);\n    }\n    return undefined;\n  };\n\n  /**\n   * This relies on pattern matching in the product id\n   * probably reliable but there may be a more reliable way of doing this!\n   *\n   */\n  subTypeIs (pattern) {\n    if (window.wkData && wkData.product.id) {\n      return wkData.product.id.match(pattern);\n    }\n  };\n\n  hasFocus () {\n    return document.activeElement === this.element;\n  };\n\n  drawOverlays (ctx) {\n    this.draw_wrapper(function(ctx) {\n      ctx.translate(this.xOffset, this.yOffset);\n      ctx.scale(this.scale, this.scale); // XXX : is this used?\n\n      const overlays = this.overlayImages();\n\n      for (let i = 0; i < overlays.length; i++) {\n        const overlay = overlays[i];\n        if (overlay && overlay.complete && !overlay.error) {\n          ctx.save();\n          try {\n            if (overlay.width > 400 || overlay.height > 400) {\n              ctx.scale(0.5, 0.5);\n            }\n            ctx.drawImage(overlay, 0, 0);\n          } catch (eg) {}\n          ctx.restore();\n        } else if (imgComplete(this.fgImage)) {\n          ctx.drawImage(this.fgImage, 0, 0);\n        }\n      }\n    }, 'draw.overlays', ctx);\n  };\n\n  slotIndex (point, { dragIsActive, allow, ignoreSelected } = {}) {\n    let control;\n    let i;\n    let slot;\n\n    allow = allow || (slot => true);\n\n    // A drag/move is already active\n    if (\n      this.control &&\n      this.drag &&\n      dragIsActive &&\n      this.selected &&\n      this.selectedIndex === this.drag.index\n    ) {\n      return this.selectedIndex;\n    }\n\n    this.control = false;\n    if (!this.slots) return null;\n\n    // Check selected image first\n    if (!ignoreSelected && this.selected && this.selected.stackable()) {\n      slot = this.selected;\n      if (allow(slot)) {\n        control = slot.hasControlPoint(point.x, point.y);\n        if (control) {\n          this.control = control;\n          return this.selectedIndex;\n        }\n      }\n    }\n\n    i = this.slots.length;\n    while (i >= 1) {\n      i -= 1;\n      slot = this.slots[i];\n      if (!allow(slot)) continue;\n\n      if (slot && slot.hasPoint(point.x, point.y)) {\n        this.control = slot.isText ? 'text' : 'image';\n        return i;\n      }\n    }\n    return null;\n  };\n\n  overlayImages () {\n    if (!window.wkData) return null;\n    const overlays = [];\n    const values = [];\n\n    for (const key in wkData.values) {\n      values.push(wkData.values[key]);\n    }\n\n    for (let i = 0; i < this.template.overlays.length; i++) {\n      const template = this.template.overlays[i];\n\n      if (values.indexOf(template.id) !== -1) {\n        overlays.push(this.overlays[i]);\n      }\n    }\n\n    return overlays;\n  };\n\n  slotFind (name) {\n    return this.slots.find(s => s.id === name);\n  };\n\n  addTextSlot (slot) {\n    if (!slot.fromTemplate) slot.editable = true;\n\n    slot.view = this;\n    slot.constrain = this.editableArea;\n\n    this.overriddenSlotIdsMemo = null;\n    this.slots.push(slot);\n    this.orderToZindex();\n\n    slot.moveTo(slot.x, slot.y);\n    slot.queueReload();\n  };\n\n  removeTextSlot (slot) {\n    this.overriddenSlotIdsMemo = null;\n    this.slots = this.slots.filter(s => s.id === slot.id);\n\n    this.do_save();\n\n    if (this.selected && slot.id === this.selected.id) {\n      this._selectSlot(null, null);\n    }\n    return this.queueRedraw();\n  };\n\n  addPhotoSlot (slotData) {\n    const slot = ImageSlot.from(slotData, {\n      view: this,\n      constrain: this.editableArea,\n    });\n\n    this.overriddenSlotIdsMemo = null;\n\n    slot.inEditableArea = slot.insideRectangle(this.editableArea, true);\n    slot.fromTemplate = true;\n\n    if (slot.stackable()) {\n      this.slots.push(slot);\n      this.orderToZindex();\n    } else {\n      this.slots[slotData.index] = slot;\n    }\n\n    return slot;\n  };\n\n  startDragImage (index, e) {\n    e = this.eventOffset(e);\n    this.dragPending = null;\n\n    return (this.drag = {\n      control: this.control,\n      index,\n      x: e.pageX,\n      y: e.pageY,\n    });\n  };\n\n  startDragText (index, e) {\n    e = this.eventOffset(e);\n    this.dragPending = null;\n\n    return (this.drag = {\n      control: this.control,\n      index,\n      x: e.pageX,\n      y: e.pageY,\n    });\n  };\n\n  startMoveImage (index, e) {\n    // e = this.eventOffset(e);\n    this.dragPending = null;\n\n    return (this.drag = {\n      control: this.control,\n      index,\n      x: e.pageX,\n      y: e.pageY,\n    });\n  };\n\n  startDragImageLayout (index, e) {\n    e = this.eventOffset(e);\n    this.dragPending = null;\n\n    return (this.drag = {\n      control: this.control,\n      index,\n      x: e.pageX,\n      y: e.pageY,\n    });\n  };\n\n  setTextProperty (propName, value) {\n    if (this.selected && this.selected.isText) {\n      this.selected.setProperty(propName, value);\n      this.selected.queueReload();\n    }\n  };\n\n  setTextProperties (properties) {\n    if (this.selected && this.selected.isText) {\n      for (const property in properties) {\n        if (properties.hasOwnProperty(property)) {\n          this.selected.setProperty(property, properties[property]);\n        }\n      }\n      this.selected.queueReload();\n    }\n  };\n\n  clickFixedTextSlot() {\n    // TBD: This method is likely not doing anything worthwhile\n    if (this.selected && !this.selected.editable && this.selected.isText) {\n      useSlotStore.getState().updateSlot(this.selected);\n    }\n  }\n\n  mouseDown (index, e) {\n    let curSelected;\n    let slot;\n    if (this.blank) return;\n    if (!this.hasFocus()) {\n      window.requestAnimationFrame(() => {\n        this.element.focus();\n      });\n    }\n\n    curSelected = this.selectedIndex;\n    this.click(index, e);\n\n    if (this.selectedIndex !== curSelected) return;\n    if (!this.drag && index !== null) {\n      stopEvent(e);\n      this.dragModified = false;\n      const slot = this.slots[index];\n      slot.resetXYWH();\n      switch (this.mode) {\n        case PrismViewCanvas.IMAGE_EDIT:\n          if (slot.isImage) {\n            this.setDragActive(e);\n            this.startDragImage(index, e);\n            slot.slotState = 'panning';\n          }\n          break;\n        case PrismViewCanvas.SLOT_MANIPULATION:\n          this.setDragActive(e);\n          this.startMoveImage(index, e);\n          break;\n        case PrismViewCanvas.LAYOUT_EDIT:\n          break;\n      }\n    }\n  };\n\n  setDragActive (e) {\n    $(document.body).addClass('editor-drag');\n    if (this.element.setPointerCapture && e.pointerId)\n      this.element.setPointerCapture(e.pointerId);\n  };\n\n  setDragNotActive (e) {\n    $(document.body).removeClass('editor-drag');\n    if (this.element.releasePointerCapture && e.pointerId)\n      this.element.releasePointerCapture(e.pointerId);\n  };\n\n  hide () {\n    this.element.style.display = 'none';\n  };\n\n  show () {\n    this.element.style.display = 'inline-block';\n  };\n\n  calculateImageSlotOnDropDimensions (photoData, maxSlotSize) {\n    const { height: imageHeight, width: imageWidth } = photoData;\n    const imageSizeRelation = imageHeight / imageWidth;\n    let adjustedImageHeight = maxSlotSize;\n    let adjustedImageWidth = maxSlotSize;\n\n    if (imageSizeRelation >= 1) {\n      adjustedImageWidth = maxSlotSize / imageSizeRelation;\n    } else {\n      adjustedImageHeight = maxSlotSize * imageSizeRelation;\n    }\n    return { height: adjustedImageHeight, width: adjustedImageWidth };\n  };\n\n  calculateImageSlotOnDropPosition (e, imageSize) {\n    const relativePointerPosition = this.relativePoint(e);\n    return {\n      x: relativePointerPosition.x - imageSize.width / 2,\n      y: relativePointerPosition.y - imageSize.height / 2,\n    };\n  };\n\n  createImageSlotOnDrop (e) {\n    const slot = customSlots.photos.add({ view: this });\n    sendToGoogleAnalytics('stackable-photo', 'add-on-drop');\n\n    if (!slot) return;\n    const photoId = e.originalEvent.dataTransfer.getData('photoId');\n    const prismItem = usePrismItemStore.getState().prismItem;\n\n    const photoData = prismItem.imageList.find(\n      image => image.id === Number(photoId)\n    );\n    const wrapperDimensions = this.outputDimensions();\n    const smallerSideSize = Math.min(...Object.values(wrapperDimensions));\n    const maxSlotSize = Number((smallerSideSize / 4).toFixed(2));\n\n    const imageSize = this.calculateImageSlotOnDropDimensions(\n      photoData,\n      maxSlotSize\n    );\n    const slotPosition = this.calculateImageSlotOnDropPosition(e, imageSize);\n\n    slot.setClipSize(imageSize.width, imageSize.height);\n    slot.enforceBounds(window.activeView.editableArea);\n    slot.moveTo(slotPosition.x, slotPosition.y);\n    return slot;\n  };\n\n  onDrop = async function onDrop(index, e) {\n    this.setWrapperBorder(false);\n\n    if (this.blank || (this.slots[index] && this.slots[index].id.match(/\\:/)))\n      return;\n\n    const data = this.getEventPayload(e);\n\n    if (!data) return;\n\n    if (data.photoId) {\n      let imageSlot =\n        this.topLayerImageSlotAcceptingImage(e) ||\n        this.createImageSlotOnDrop(e);\n      if (!imageSlot) return;\n      const { photoId: id, url } = data;\n      const imgData = { id, image: id, url };\n      const img = fetchImage(imgHelpers.urlMunge(url), 'use-credentials');\n      this.dropImage(e, img, imgData, imageSlot);\n\n      return;\n    }\n\n    if (data.embellishmentId) {\n      this.dropEmbellishment(e, data);\n      return this.deselectAll();\n    }\n\n    if (data.colour) {\n      this.dropColour(e, data.colour);\n      return this.deselectAll();\n    }\n\n    if (data.layoutId) {\n      const { layoutId: templateID, orientation } = data;\n\n      this.activateView();\n\n      useTemplateSelectStore\n        .getState()\n        .updateTemplateSelectStore({ templateID, orientation });\n\n      useTabTray.getState().updateShowPhotosTray(true);\n\n      return this.deselectAll();\n    }\n\n    if (data.themeName) {\n      this.activateView();\n      filledImageSlotConfirmation(() => {\n        prismAction.set_theme(data.themeName, templateData => {\n          const { historyStack } = this;\n          historyStack.addToPushCallback(historyStack.setStepTheme, [\n            templateData.theme,\n          ]);\n        });\n      });\n    }\n  };\n\n  isEditingState () {\n    return this.selected.slotState === 'editing';\n  };\n\n  mouseUp (index, e) {\n    if (this.blank) return;\n    if (this.drag) {\n      stopEvent(e);\n      if (MOUSE_UP === 'mouseup') this.mouseMove(this.drag.index, e);\n      switch (this.mode) {\n        case PrismViewCanvas.IMAGE_EDIT:\n          this.slots[this.drag.index].dragStopped();\n          break;\n        case PrismViewCanvas.SLOT_MANIPULATION:\n          this.keepSelected = true;\n          break;\n        case PrismViewCanvas.LAYOUT_EDIT:\n          break;\n      }\n      const slot = this.slots[this.drag.index];\n      if (slot) {\n        slot.resetXYWH();\n      }\n      this.drag = null;\n      if (this.dragModified) {\n        this.do_save();\n        this.queueRedraw();\n      }\n    }\n    this.clearGuides();\n    this.setDragNotActive(e);\n  };\n\n  mouseMove (index, e) {\n    if (this.selected && this.isEditingState()) return;\n    if (this.blank) return;\n\n    if (this.drag) {\n      const slot = this.slots[this.drag.index];\n      if (!slot) {\n        return;\n      }\n\n      stopEvent(e);\n\n      e = this.eventOffset(e);\n\n      const scale = this.element.clientWidth / this.element.width;\n      let dx = (e.pageX - this.drag.x) / (scale * this.scale);\n      let dy = (e.pageY - this.drag.y) / (scale * this.scale);\n\n      if (dx !== 0 || dy !== 0) this.dragModified = true;\n\n      switch (this.mode) {\n        case PrismViewCanvas.SLOT_MANIPULATION:\n          switch (this.drag.control) {\n            case 'text':\n            case 'image':\n              slot.moveTo(slot._x + dx, slot._y + dy);\n              this.snap(slot);\n              break;\n            case 'top-right':\n            case 'top-left':\n            case 'bottom-right':\n            case 'bottom-left':\n            case 'top-middle':\n            case 'middle-left':\n            case 'middle-right':\n            case 'bottom-middle':\n              const coords = (() => {\n                switch (this.drag.control) {\n                  case 'top-middle':\n                    return {\n                      handler: { x: slot._x + slot._w / 2, y: slot._y },\n                      opposite: {\n                        x: slot._x + slot._w / 2,\n                        y: slot._y + slot._h,\n                      },\n                    };\n                  case 'middle-right':\n                    return {\n                      handler: {\n                        x: slot._x + slot._w,\n                        y: slot._y + slot._h / 2,\n                      },\n                      opposite: { x: slot._x, y: slot._y + slot._h / 2 },\n                    };\n                  case 'middle-left':\n                    return {\n                      handler: { x: slot._x, y: slot._y + slot._h / 2 },\n                      opposite: { x: slot._x + slot._w, y: slot._y + slot._h / 2 }\n                    };\n                  case 'bottom-middle':\n                    return {\n                      handler: { x: slot._x + slot._w / 2, y: slot._y + slot._h },\n                      opposite: { x: slot._x + slot._w / 2, y: slot._y }\n                    };\n                  case 'top-left':\n                    return {\n                      handler: { x: slot._x, y: slot._y },\n                      opposite: { x: slot._x + slot._w, y: slot._y + slot._h }\n                    };\n                  case 'top-right':\n                    return {\n                      handler: { x: slot._x + slot._w, y: slot._y },\n                      opposite: { x: slot._x, y: slot._y + slot._h }\n                    };\n                  case 'bottom-right':\n                    return {\n                      handler: { x: slot._x + slot._w, y: slot._y + slot._h },\n                      opposite: { x: slot._x, y: slot._y }\n                    };\n                  case 'bottom-left':\n                    return {\n                      handler: { x: slot._x, y: slot._y + slot._h },\n                      opposite: { x: slot._x + slot._w, y: slot._y }\n                    };\n                }\n              })();\n\n              const resizedCoords = Point.createResizeValues(\n                this.relativePoint(e),\n                coords,\n                this.drag.control,\n                slot\n              );\n\n              if (!resizedCoords) return;\n\n              this.drawGuides();\n              slot.resize(resizedCoords, this.drag.control);\n\n              break;\n          }\n          setTimeout(() => {\n            EventEmitter.emit('prism-edit-slot-moved', {\n              view: this,\n              slot,\n            });\n          }, 10);\n          break;\n        case PrismViewCanvas.IMAGE_EDIT:\n          switch (this.drag.control) {\n            case 'image':\n              if (slot.isSticker()) {\n                slot.moveTo(slot._x + dx, slot._y + dy);\n                // this.startMoveImage(index, e);\n                setTimeout(() => {\n                  EventEmitter.emit('prism-edit-slot-moved', {\n                    view: this,\n                    slot,\n                  });\n                }, 10);\n              } else {\n                let { imatrix } = slot;\n                const scale = slot.stackable() ? 3 : 1;\n\n                if (slot.stackable()) {\n                  imatrix = MyMatrix.rotate(-slot.angle).invert();\n                }\n\n                let xy1 = [];\n                let xy2 = [];\n\n                xy1[0] = e.pageX - this.xOffset;\n                xy1[1] = e.pageY - this.yOffset;\n\n                xy2[0] = this.drag.x - this.xOffset;\n                xy2[1] = this.drag.y - this.yOffset;\n\n                dx = (xy1[0] - xy2[0]) * scale;\n                dy = (xy1[1] - xy2[1]) * scale;\n\n                this.slots[this.drag.index].moveImgBy(dx, dy);\n              }\n              break;\n          }\n          // this.startDragImage(this.drag.index, e);\n          setTimeout(() => {\n            EventEmitter.emit('prism-edit-slot-moved', {\n              view: this,\n              slot,\n            });\n          }, 10);\n\n          break;\n      }\n\n      if (!(dx === 0 && dy === 0)) {\n        return this.queueRedraw('Image drag');\n      }\n\n      return;\n    } // end of if (this.drag) {\n\n    if (index !== null) {\n      const slot = this.slots[index];\n      if (!slot || this.slotIsOverridden(slot)) {\n        return;\n      }\n\n      const cornersArray = [\n        'image',\n        'text',\n        'top-left',\n        'up-down',\n        'top-right',\n        'left-right',\n      ].join(' ');\n\n      $(this.element).removeClass(cornersArray);\n      if (slot.isMovingState()) {\n        switch (this.control) {\n          case 'image':\n            if (slot.stackable() && !slot.isSticker()) {\n              $(this.element).addClass(this.control);\n            }\n            break;\n          case 'text':\n            $(this.element).addClass(this.control);\n            break;\n          case 'top-left':\n          case 'bottom-right':\n            if (slot.stackable()) {\n              $(this.element).addClass(nodeClass(slot));\n            }\n            break;\n          case 'top-middle':\n          case 'bottom-middle':\n            if (slot.stackable()) {\n              $(this.element).addClass(nodeClass(slot, 1));\n            }\n            break;\n          case 'top-right':\n          case 'bottom-left':\n            if (slot.stackable()) {\n              $(this.element).addClass(nodeClass(slot, 2));\n            }\n            break;\n          case 'middle-right':\n          case 'middle-left':\n            if (slot.stackable()) {\n              $(this.element).addClass(nodeClass(slot, 3));\n            }\n            break;\n        }\n      }\n\n      function nodeClass({ angle: currentAngle }, rotate = 0) {\n        const cursors = ['top-left', 'up-down', 'top-right', 'left-right'];\n\n        let index = cornerCursorSegments.reduceRight(\n          (accumulator, segment, index) =>\n            currentAngle < segment ? index : accumulator,\n          0\n        );\n\n        index += rotate;\n\n        return cursors[index % cursors.length];\n      }\n    }\n  };\n\n  mouseIn (index, e) {};\n\n  mouseOut (index, e) {\n    return index;\n  };\n\n  click(index, e) {\n    e.stopPropagation();\n    if (this.selected && this.isEditingState()) return;\n\n    if (index === null) this.deselectAll();\n\n    if (this.blank) return;\n    wkLogger.log({\n      index,\n      event: e,\n    });\n\n    const clickedOnSlot = this.slots[index];\n\n    if (clickedOnSlot && getViewport().isDesktop) {\n      const interactionMode =\n        clickedOnSlot.editable || !clickedOnSlot.isText ? 'moving' : 'editing';\n      clickedOnSlot.setSlotState(interactionMode);\n    }\n\n    EventEmitter.emit('prism-edit-slot-click', {\n      view: this,\n      slot: clickedOnSlot,\n    });\n\n    if (index === this.selectedIndex) return;\n    this._selectSlot(this.slots[index], index);\n    return this.queueRedraw();\n  }\n\n  populateGuides (slot) {\n    if (!this._snapster) return;\n\n    const [x, y, width, height] = this.editableArea;\n\n    this._snapster.populate([\n      {\n        x,\n        y,\n        width,\n        height,\n        type: 'page',\n      },\n      ...[\n        ...this.slots.filter(\n          slot => slot.stackable() && slot !== this.selected\n        ),\n      ].map(slot => ({\n        x: slot.bounds().x,\n        y: slot.bounds().y,\n        width: slot.bounds().w,\n        height: slot.bounds().h,\n        type: 'normal',\n      })),\n    ]);\n  };\n\n  snap (slot) {\n    if (!this._snapster) return;\n\n    const { x, y, w: width, h: height } = slot.bounds();\n    const offsetX = width - (width + slot.w) / 2;\n    const offsetY = height - (height + slot.h) / 2;\n    const position = this._snapster.snap({ x, y, width, height });\n\n    slot.moveTo(position.x + offsetX, position.y + offsetY);\n  };\n\n  drawGuides () {\n    if (!this._snapster) return;\n    if (!this.selected) return;\n    const { x, y, w: width, h: height } = this.selected.bounds();\n\n    this._snapster.snap({ x, y, width, height });\n  };\n\n  clearGuides () {\n    if (!this._snapster) return;\n    this._snapster.clear();\n  };\n\n  slotRegion (slot) {\n    const p1 = this.pointToPage(slot, slot.x, slot.y);\n    const p2 = this.pointToPage(slot, slot.x, slot.y + slot.h);\n    const p3 = this.pointToPage(slot, slot.x + slot.w, slot.y);\n    const p4 = this.pointToPage(slot, slot.x + slot.w, slot.y + slot.h);\n\n    const x1 = Math.min(p1[0], p2[0], p3[0], p4[0]);\n    const x2 = Math.max(p1[0], p2[0], p3[0], p4[0]);\n    const y1 = Math.min(p1[1], p2[1], p3[1], p4[1]);\n    const y2 = Math.max(p1[1], p2[1], p3[1], p4[1]);\n    return {\n      x1,\n      x2,\n      y1,\n      y2,\n    };\n  };\n\n  pointToPage (slot, x, y) {\n    const scale = this.element.clientWidth / this.element.width;\n    const off = this.el.offset();\n    let yo;\n    let xo;\n    if (slot.matrix) {\n      const xy = slot.matrix.transform_point(x, y);\n      xo = scale * (xy[0] + this.xOffset) * this.scale;\n      yo = scale * (xy[1] + this.yOffset) * this.scale;\n      return [off.left + xo, off.top + yo];\n    }\n    // Need to visit scaling for images\n    xo = this.scale * scale * (x + this.xOffset);\n    yo = this.scale * scale * (y + this.yOffset);\n    return [off.left + xo, off.top + yo];\n  };\n\n  selectSlotById (slot_id) {\n    let index;\n    let slot;\n    let _len;\n    let _ref;\n    _ref = this.slots;\n    if (!_ref) return;\n    for (index = 0, _len = _ref.length; index < _len; index++) {\n      slot = _ref[index];\n      if (slot.id === slot_id) return this._selectSlot(slot, index);\n    }\n    return this._selectSlot(null, null);\n  };\n\n  selectFirstImageSlot () {\n    let i = 0;\n    while (i < this.slots.length) {\n      if (this.slots[i].acceptsImage()) {\n        // This function was wrongly doing the logic of selectNextEmptyImageSlot\n        this._selectSlot(this.slots[i], i);\n        return this.slots[i].id;\n      }\n      i += 1;\n    }\n    return null;\n  };\n\n  selectFirstSlot () {\n    for (let i = 0; i < this.slots.length; i++) {\n      if (!this.slots[i].isOptionalBackground()) {\n        const slot = this.slots[i];\n        this._selectSlot(slot, i, { fireEvent: false });\n        this.el.focus();\n\n        useFocusedSlotStore.getState().updateFocusedSlot(slot);\n\n        return slot.id;\n      }\n    }\n\n    return null;\n  };\n\n  selectNextImageSlot () {\n    let i = this.selectedIndex + 1;\n    while (i < this.slots.length) {\n      if (this.slots[i].acceptsImage()) {\n        this._selectSlot(this.slots[i], i);\n        return this.slots[i].id;\n      }\n      i += 1;\n    }\n    return null;\n  };\n\n  selectPreviousSlot () {\n    let i = this.selectedIndex - 1;\n    if (i > -1) {\n      this._selectSlot(this.slots[i], i);\n      return this.slots[i].id;\n    }\n    // should we check for background image?\n    i = this.slots.length - 1;\n    this._selectSlot(this.slots[i], i);\n\n    return null;\n  };\n\n  selectSlotByIndex (index) {\n    if (index >= 0 && index < this.slots.length) {\n      this._selectSlot(this.slots[index], index);\n      return this.slots[index].id;\n    }\n    this._selectSlot(null, null);\n\n    return null;\n  };\n\n  selectNextSlot () {\n    let i = this.selectedIndex + 1;\n    if (i >= this.slots.length) {\n      i = 0;\n    }\n\n    const slot = this.slots[i];\n\n    this._selectSlot(slot, i, { fireEvent: false });\n    this.el.focus();\n\n    useFocusedSlotStore.getState().updateFocusedSlot(slot);\n\n    return slot.id;\n  };\n\n  selectNextEmptyImageSlot () {\n    let i = this.selectedIndex + 1;\n    while (i < this.slots.length) {\n      if (this.slots[i].acceptsImage() && !this.slots[i].img) {\n        this._selectSlot(this.slots[i], i);\n        return this.slots[i].id;\n      }\n      i += 1;\n    }\n    return null;\n  };\n\n  findFirstAvailableImageSlot () {\n    const imageSlots = this.slots.filter(slot => slot.acceptsImage());\n    if (imageSlots.length === 1) {\n      return imageSlots[0].id;\n    }\n\n    return (imageSlots.find(slot => !slot.img) || {}).id;\n  };\n\n  deselectASlot (select_slot) {\n    if (this.isEditingState()) {\n      this.selected.slotState = 'moving';\n    }\n\n    if (this.selected === select_slot) {\n      this._selectSlot(null, null);\n      return this.queueRedraw();\n    }\n  };\n\n  textSlotIsEmpty () {\n    const editor = document.querySelector('.in-place__content');\n\n    return editor.textContent.trim() === '' && this.selected.string === '';\n  };\n\n  deleteSelectedSlot () {\n    const selectedSlot = this.selected;\n\n    if (selectedSlot.fixed()) {\n      this.setSlotStateAndSave('moving');\n      return;\n    }\n\n    selectedSlot.view.deleteSlotById(selectedSlot.id);\n  };\n\n  saveOrDiscardTextSlot () {\n    this.textSlotIsEmpty()\n      ? this.deleteSelectedSlot()\n      : this.selectAndSaveTextSlot();\n  };\n\n  selectAndSaveTextSlot () {\n    const editor = document.querySelector('.in-place__content');\n\n    const selectedSlot = this.selected;\n    const pango = QuillHelpers.quillToPango(\n      editor.innerHTML,\n      selectedSlot.scale\n    ).toString();\n\n    selectedSlot.setString(pango);\n    selectedSlot.isUnconfirmedTextSlot = false;\n    this.setSlotStateAndSave('inactive');\n  };\n\n  setSlotStateAndSave (state) {\n    this.selected.setSlotState(state);\n    this.do_save();\n  };\n\n  deselectAll () {\n    const selectedSlot = this.selected;\n\n    if (selectedSlot && (selectedSlot.isText || !this.keepSelected)) {\n      if (selectedSlot.isEditingState()) this.saveOrDiscardTextSlot();\n\n      this._selectSlot(null, null);\n    }\n\n    this.keepSelected = false;\n    return this.queueRedraw();\n  };\n\n  selectASlot (select_slot) {\n    const previousIndex = this.selectedIndex;\n\n    this.slots.forEach((slot, index) => {\n      if (slot === select_slot) this._selectSlot(slot, index);\n    });\n\n    if (this.selectedIndex !== previousIndex) return this.queueRedraw();\n  };\n\n  _selectSlot (slot, index, options = {}) {\n    if (slot && this.slotIsOverridden(slot)) {\n      return;\n    }\n\n    const oldIndex = this.selectedIndex;\n\n    if (oldIndex !== index) {\n      this.do_save();\n    }\n\n    if (typeof index === 'number') {\n      this.lastSelectedIndex = index;\n    }\n\n    wkLogger.log({\n      selectSlot: 'yes',\n      index,\n      slot: this.slots[index],\n    });\n\n    if (index !== null && this.slots[index] && !this.slots[index].isClone()) {\n      if (slot.canOverride()) {\n        customSlots.text.overrideSlot(slot);\n        return;\n      }\n\n      this.selected = slot;\n\n      this.selectedIndex = index;\n\n      useSlotStore.getState().updateSlot(this.selected);\n\n      useSlotStore.getState().updateSlotIndex(this.selectedIndex);\n    } else {\n      this.selected = null;\n      this.selectedIndex = null;\n\n      // setting consumable store to null\n      useSlotStore.getState().updateSlot(null);\n      useSlotStore.getState().updateSlotIndex(null);\n    }\n\n    if (this.selected) {\n      this.mode = PrismViewCanvas.IMAGE_EDIT;\n\n      if (this.selected.stackable()) {\n        if (this.selected.isInactiveState()) {\n          this.selected.setSlotState('moving');\n        }\n        this.mode = PrismViewCanvas.SLOT_MANIPULATION;\n      }\n\n      if (this.canConvertPhotoFromTemplateToStackable(slot)) {\n        this.setMode(PrismViewCanvas.SLOT_MANIPULATION);\n        slot.convertFromTemplateToStackable(this.editableArea);\n        this.orderToZindex();\n      }\n\n      this.populateGuides(slot);\n    }\n\n    if (oldIndex !== this.selectedIndex) {\n      if (this.selected) {\n        this.selected.activatedAt = new Date().getTime();\n      }\n\n      const { fireEvent = true } = options;\n      if (fireEvent) {\n        EventEmitter.emit('prism-edit-slot-changed', {\n          view: this,\n          slot: this.selected,\n        });\n      }\n    }\n  };\n\n  canConvertPhotoFromTemplateToStackable (slot) {\n    return (\n      !genericHelpers.disallowStackable() &&\n      this.template &&\n      slot.isImage &&\n      templateInterrogator.tagIntersect(this.template, 'blank-overlay') &&\n      slot.permittedToBeStacked() &&\n      wkData.builder_static_photos_editable\n    );\n  };\n\n  removeImageFromSlot (slot_id, callback = () => {}) {\n    each(this.slots, (slot, index) => {\n      // Using match instead of equal will make sure we also clean out this slot mirrors if there is any\n      if (slot.id === slot_id || slot.id.match(`${slot_id}:`)) {\n        slot.clearData();\n      }\n    });\n    this.keepSelected = true;\n    this.deselectAll();\n    this.do_save();\n    this.queueRedraw('Slot emptied');\n    // Investigate this \"callback\". Doesn't seem to be used anywhere;\n    callback();\n  };\n\n  _scrollWheelZoom (toZoom, delta) {\n    const zoomed = toZoom.zoomBy(0.05 * (delta / 3)); // Smoother zooming - was doing three 'clicks' at a time\n    if (zoomed) {\n      EventEmitter.emit(PrismUI.ZOOM_CHANGED, {\n        zoom: zoomed,\n        view: this,\n        slot: toZoom,\n      });\n      this.stashFns.setEl1ZoomSlider(toZoom, zoomed);\n      this.do_save();\n      this.queueRedraw('Image zoomed');\n    }\n  };\n\n  scrollWheel (index, e) {\n    let delta = 0;\n\n    if (!this.selected || this.selected !== this.slots[index]) return;\n    if (this.mode === PrismViewCanvas.SLOT_MANIPULATION) return;\n\n    if (!e) e = window.event;\n    if (e != null ? e.originalEvent : void 0) e = e.originalEvent;\n    if (e.wheelDelta) {\n      delta = e.wheelDelta / 40;\n      if (window.opera) delta = -delta;\n    } else if (e.detail) delta = -e.detail / 1;\n    if (delta) {\n      if (index !== null && this.slots[index].zoomBy) {\n        this._scrollWheelZoom(this.slots[index], delta);\n      } else if (this.selected) {\n        this._scrollWheelZoom(this.selected, delta);\n      }\n    }\n    if (e.preventDefault) e.preventDefault();\n    return (e.returnValue = false);\n  };\n\n  zoomIn () {\n    if (this.selected) {\n      this.selected.zoomBy(0.05);\n      this.do_save();\n    }\n    return this.redraw('Image zoomed in');\n  };\n\n  zoomOut () {\n    if (this.selected) {\n      this.selected.zoomBy(-0.05);\n      this.do_save();\n    }\n    return this.redraw('Image zoomed out');\n  };\n\n  zoomBy (value) {\n    let _ref;\n    if (((_ref = this.selected) != null ? _ref.zoomBy : void 0) != null) {\n      // WTF CoffeeScript !\n      this.selected.zoomBy(value);\n      this.do_save();\n    }\n    return this.redraw('Image zoomed out');\n  };\n\n  setZoom (value) {\n    let _ref;\n    if (((_ref = this.selected) != null ? _ref.setZoom : void 0) != null) {\n      // WTF CoffeeScript !\n      this.selected.setZoom(value);\n      this.do_save();\n    }\n    return this.redraw('Zoom set');\n  };\n\n  moveBy (field, value) {\n    if (this.selected) {\n      this.selected.setProperty(field, this.selected[field] + value);\n      this.do_save();\n    }\n    return this.redraw();\n  };\n\n  // this adds angle onto the current image\n  straightenBy (angle, slot) {\n    slot = slot || this.selected;\n    if (!slot || !slot.isImage) return;\n\n    if (slot.straightenBy(angle)) {\n      this.do_save();\n      this.redraw('Image straightened');\n    }\n  };\n\n  // this adds angle onto the current image\n  rotate (angle) {\n    if (this.selected) {\n      this.selected.rotate(angle);\n      this.do_save();\n    }\n    return this.redraw('Image rotated');\n  };\n\n  setSelectedImage (img, id, data) {\n    data = data || {};\n    data.image = id;\n\n    if (this.selected && this.selected.isImage) {\n      this.setImageById(this.selected.id, img, data);\n    }\n    return this.do_save();\n  };\n\n  _appendImage (img, img_id, slot_id, data) {\n    let i;\n\n    if (this.selected) {\n      if (this.selected.isImage && !this.selected.img) {\n        this.setSelectedImage(img, img_id);\n\n        if (data) this.selected.restoreData(data);\n\n        return {\n          index: this.selectedIndex,\n          slot: this.selected,\n        };\n      }\n    }\n\n    i = 0;\n    while (i < this.slots.length) {\n      if (this.slots[i].isImage && this.slots[i].canAppend()) {\n        this.setImageById(this.slots[i].id, img, { image: img_id });\n\n        if (data) {\n          this.findImageSlotById(this.slots[i].id).restoreData(data);\n        }\n\n        return {\n          index: i,\n          slot: this.slots[i],\n        };\n      }\n      i += 1;\n    }\n    return false;\n  };\n\n  _addText (textSlot) {\n    // Copy just editable textSlots or copy if the new\n    // template have a slot with the same id\n    if (textSlot.editable) {\n      textSlot.angle || (textSlot.angle = 0);\n      this.addTextSlot(textSlot);\n      return;\n    }\n\n    let found = false;\n\n    for (var i = 0; i < this.slots.length; i++) {\n      var slot = this.slots[i];\n\n      if (\n        slot.isText &&\n        slot.id === textSlot.id &&\n        textSlot.string.length > 0\n      ) {\n        found = true;\n        slot.copyFrom(textSlot);\n        break;\n      }\n    }\n\n    if (found) return;\n\n    for (var i = 0; i < this.slots.length; i++) {\n      slot = this.slots[i];\n\n      if (slot.isText && textSlot.string.length > 0) {\n        slot.copyFrom(textSlot);\n      }\n    }\n  };\n\n  appendImage (img, id) {\n    let info;\n    info = this._appendImage(img, id);\n    if (info) {\n      this._selectSlot(info.slot, info.index);\n      return this.do_save();\n    }\n  };\n\n  findTextSlotById (id) {\n    return this.slots.find(s => s.isText && s.id === id);\n  };\n\n  findImageSlotById (id) {\n    return this.slots.find(s => s.isImage && s.id === id);\n  };\n\n  getClones (id) {\n    const clonePrefix = `${id}:`;\n    return function() {\n      const ref = this.slots;\n      let i;\n      let len;\n      const results = [];\n      let slot;\n      for (i = 0, len = ref.length; i < len; i++) {\n        slot = ref[i];\n        if (slot.id.slice(0, clonePrefix.length) === clonePrefix) {\n          results.push(slot);\n        }\n      }\n      return results;\n    }.call(this);\n  };\n\n  _setImageAsColourWithoutSaving (id, colour) {\n    let clone;\n    let clones;\n    let slot;\n    let i;\n    let len;\n\n    slot = this.findImageSlotById(id);\n    if (!slot) {\n      return false;\n    }\n\n    clones = this.getClones(id);\n\n    slot.setAsColour(colour);\n    for (i = 0, len = clones.length; i < len; i++) {\n      clone = clones[i];\n      clone.setAsColour(colour);\n      clone.setAsClone(slot);\n    }\n    return true;\n  };\n\n  setImageAsColour (id, colour) {\n    if (this._setImageAsColourWithoutSaving(id, colour)) {\n      wkLogger.log('setImageAsColour', id, colour);\n      this.queueRedraw();\n      this.do_save();\n    }\n  };\n\n  setBackgroundColour (colour) {\n    return this.setImageAsColour(OPTIONAL_BG, colour);\n  };\n\n  getBackgroundColour () {\n    const slot = this.findImageSlotById(OPTIONAL_BG);\n\n    if (!slot) return null;\n    if (!slot.isColour()) return null;\n\n    return slot.imgId;\n  };\n\n  noPhotoBackground () {\n    if (!this.template || !this.template.tags) return null;\n    return this.template.tags.indexOf('no-image-bg') !== -1;\n  };\n\n  slotAccepts (id, data) {\n    data = data || {};\n    const imgId = data.image || data.imgId;\n\n    if (id !== OPTIONAL_BG) {\n      return true;\n    }\n\n    if (this.noPhotoBackground() && imgId) {\n      // photo -> imgId is a number\n      // colour -> imgId is a string\n      return typeof imgId === 'string';\n    }\n\n    return true;\n  };\n\n  setImageById (id, img, data) {\n    if (!this.slotAccepts(id, data)) {\n      wkLogger.log('[blocked] setImageById', id, img, data);\n      return false;\n    }\n\n    wkLogger.log('setImageById', id, img, data);\n\n    const slot = this.findImageSlotById(id);\n    if (!slot) return; // TODO - images needs updating when design changes (background colour canvases )\n\n    let imgId = 'missing-image-param';\n    if (data) {\n      imgId = data.image || data.imgId;\n      data.angle = slot.angle || 0;\n    }\n    slot.setImage(img, imgId, data);\n    const results = [];\n\n    for (const clone of this.getClones(id)) {\n      clone.setImage(img, imgId, data);\n      results.push(clone.setAsClone(slot));\n    }\n\n    return results;\n  };\n\n  dropImage (e, img, data = {}, slot = null) {\n    let slotIdx = null;\n    if (!slot) {\n      slotIdx = this.slotIndex(this.relativePoint(e), {\n        allow: slot => slot.isImage && !slot.isEmbellishment(),\n      });\n      slot = slotIdx !== null && this.slots[slotIdx];\n    }\n\n    if (slot && slot.acceptsImage({ allowOptionalBackground: true })) {\n      const { stashFns } = this;\n      if (stashFns) {\n        const imgSlotRef = stashFns.getImgSlotRef({\n          id: slot.id,\n          imgId: data.id,\n        });\n        data = stashFns.getAllImageStateValues(imgSlotRef, data);\n      }\n\n      this.setImageById(slot.id, img, data);\n      this.setMode(PrismViewCanvas.IMAGE_EDIT);\n      this.do_save();\n      return true;\n    }\n    return false;\n  };\n\n  dropEmbellishment = async function(e, { src, type }) {\n    // COMMENTED OUT UNTIL WEBPRISM CAN HANDLE EMBELLISHMENTS IN CUSTOM BACKGROUND\n    // if (type === 'pattern') {\n    //   const slotIdx = this.slotIndex(this.relativePoint(e), { allow: (slot => slot.isImage) });\n    //   const slot = slotIdx !== null && this.slots[slotIdx];\n\n    //   if (slot && slot.isOptionalBackground()) {\n    //     const { img } = await customSlots.embellishments.buildSlotData(src);\n    //     this.dropImage(e, img);\n    //     return;\n    //   }\n    // }\n    // END OF COMMENTED OUT UNTIL WEBPRISM CAN HANDLE EMBELLISHMENTS IN CUSTOM BACKGROUND\n    const { x, y } = this.relativePoint(e);\n    const slot = await customSlots.embellishments.add({\n      src,\n      type,\n      view: this,\n      x,\n      y,\n    });\n    if (this.active()) {\n      this.selectASlot(slot);\n    }\n  };\n\n  dropColour (e, colour) {\n    const slotIdx = this.slotIndex(this.relativePoint(e), {\n      allow: slot => slot.isImage && !slot.isEmbellishment(),\n    });\n    const slot = slotIdx !== null && this.slots[slotIdx];\n\n    if (slot && slot.isImage && !slot.stackable()) {\n      this._setImageAsColourWithoutSaving(slot.id, colour);\n      this.setMode(PrismViewCanvas.IMAGE_EDIT);\n      this.do_save();\n      return true;\n    }\n    return false;\n  };\n\n  setWrapperBorder (borderState) {\n    this.wrapperHighlight = borderState;\n  };\n\n  setWrapperBorderWhenDragging (e) {\n    if (e.type === 'dragleave') {\n      this.setWrapperBorder(false);\n    } else {\n      this.deselectAll();\n      this.setWrapperBorder(true);\n    }\n    this.redraw('Image dragged over wrapper', false);\n  };\n\n  dragImageHover (e) {\n    const ev = e.originalEvent || e;\n\n    if (\n      ev.dataTransfer &&\n      ev.dataTransfer.types.indexOf('embellishmentid') != -1\n    ) {\n      this.deselectAll();\n      this.redraw('Embellishment drag', false);\n      return true;\n    }\n\n    const slotIdx = this.slotIndex(this.relativePoint(e), {\n      allow: slot => slot.isImage,\n      ignoreSelected: true,\n    });\n\n    if (slotIdx !== null && ev.dataTransfer) {\n      ev.dataTransfer.dropEffect = 'copy';\n    }\n\n    if (!slotIdx) {\n      this.setWrapperBorderWhenDragging(ev);\n    }\n\n    if (slotIdx !== this.selectedIndex) {\n      const slot = this.slots[slotIdx];\n      if (slot && slot.acceptsImage({ allowOptionalBackground: true })) {\n        this._selectSlot(slot, slotIdx, { fireEvent: false });\n        this.redraw('Image dragged over slot', true);\n      }\n      return true;\n    }\n    return false;\n  };\n\n  getImages () {\n    const list = [];\n\n    let i = 0;\n    while (i < this.slots.length) {\n      const slot = this.slots[i];\n      if (slot.isImage && (slot.img || slot.imgId || slot.stackable())) {\n        list.push({\n          img: slot.img,\n          imgId: slot.imgId,\n          slotId: slot.id,\n          data: slot.data(),\n          content_type: slot.content_type,\n        });\n      }\n      i += 1;\n    }\n\n    return list;\n  };\n\n  getTexts () {\n    let i, list, slot;\n\n    list = [];\n\n    for (i = 0; i < this.slots.length; i++) {\n      slot = this.slots[i];\n      if (slot.isText && slot.string) {\n        list.push(slot);\n      }\n    }\n\n    return list;\n  };\n\n  setImages (list) {\n    const selectedID = this.selected ? this.selected.id : null;\n    const self = this;\n    this.deselectAll();\n\n    list.forEach(({ slotId, img, imgId, image, content_type, data }) => {\n      if (slotId === OPTIONAL_BG) {\n        if (img) {\n          this.setImageById(slotId, img, { image: imgId });\n          const slot = this.findImageSlotById(slotId);\n          slot && slot.restoreData(data);\n        } else {\n          this._setImageAsColourWithoutSaving(slotId, imgId);\n        }\n        return;\n      }\n\n      if (content_type === 'image') {\n        const slot = customSlots.photos.restore({\n          id: slotId,\n          img,\n          imgId,\n          data,\n          view: self,\n        });\n\n        restoreSelection(slot);\n      } else if (content_type === 'embellishment') {\n        const embellishment = { id: slotId, img, data, view: self };\n        const slot = customSlots.embellishments.restore(embellishment);\n        restoreSelection(slot);\n      } else {\n        const slot = this._appendImage(img, image || imgId, slotId, data);\n        restoreSelection(slot);\n      }\n    });\n\n    return this.do_save();\n\n    function restoreSelection(slot) {\n      if (slot && slot.id === selectedID) {\n        self.selectASlot(slot);\n      }\n    }\n  };\n  setTexts (list) {\n    for (let i = 0; i < list.length; i++) {\n      this._addText(list[i]);\n    }\n\n    return this.do_save();\n  };\n\n  hasMissingImages () {\n    return this.slots.some(slot => slot.isImage && !slot.img);\n  };\n\n  deleteSlotById (id) {\n    this.overriddenSlotIdsMemo = null;\n    this.slots = this.slots.filter(el => el.id !== id);\n\n    if (this.selected && this.selected.id === id) {\n      this._selectSlot(null, null);\n\n      this.do_save();\n      this.queueRedraw();\n    }\n  };\n\n  deleteImage (imageId) {\n    const slotsToEmpty = this.slots.filter(el => el.imgId === imageId);\n\n    for (let i = 0; i < slotsToEmpty.length; i++) {\n      this.removeImageFromSlot(slotsToEmpty[i].id);\n    }\n  };\n\n  orderToZindex () {\n    let index = 0;\n    for (let i = 0; i < this.slots.length; i++) {\n      if (this.slots[i] && this.slots[i].stackable()) {\n        this.slots[i].zindex = index++;\n      }\n    }\n  };\n\n  _setData (data) {\n    const { stashFns } = this;\n    const self = this;\n\n    if (data === null || (data && data.hatch) || (data && data.blank)) {\n      this.blank = true;\n      this.hatch = data.hatch;\n      this.data = null;\n      this.pageIndex = undefined;\n      return;\n    }\n\n    if (data.hasOwnProperty('output_width')) {\n      this.output_width = data.output_width;\n      this.output_width_l = data.output_width_l;\n      this.output_width_p = data.output_width_p;\n    }\n\n    if (data.hasOwnProperty('index')) {\n      if (this.pageIndex !== data.index) {\n        // page change?\n        this.historyStack.clear();\n      }\n      this.pageIndex = data.index;\n    }\n\n    data.slots\n      .sort((a, b) => {\n        if (a.type === 'stackable' && b.type !== 'stackable') {\n          return -1;\n        }\n        if (a.type !== 'stackable' && b.type === 'stackable') {\n          return 1;\n        }\n        if (a.type !== 'stackable' && b.type !== 'stackable') {\n          return 0;\n        }\n        if (\n          a.data &&\n          a.data.zindex !== undefined &&\n          b.data &&\n          b.data.zindex !== undefined\n        ) {\n          return a.data.zindex - b.data.zindex;\n        }\n      })\n      .forEach(json_slot => {\n        switch (json_slot.content_type || json_slot.type) {\n          case 'image':\n            setSlotImage.call(this, json_slot);\n            break;\n          case 'text':\n            setSlotText.call(this, json_slot);\n            break;\n          case 'embellishment':\n            const image = new Image();\n            image.src = json_slot.content_url;\n            json_slot.img = image;\n            setSlotImage.call(this, json_slot);\n            break;\n          default:\n            console.error('Unable to restore slot: %o', json_slot);\n            break;\n        }\n      });\n\n    function setSlotText(json_slot) {\n      const slotIsPredefined = ![/^text[0-9]*/i, /^override-text-/].some(r =>\n        json_slot.id.match(r)\n      );\n\n      let slot = this.findTextSlotById(json_slot.id);\n      if (!slot) {\n        if (slotIsPredefined) {\n          // Do not copy over text slots unless those are\n          // user inserted floating texts.\n          return;\n        }\n\n        slot = new TextSlot(json_slot.id);\n        stackableInit(json_slot, slot);\n\n        this.addTextSlot(slot);\n      }\n\n      if (!isClonedSlot(json_slot.id)) {\n        this.getClones(json_slot.id).forEach(clone => {\n          clone.restoreData(json_slot.data);\n          clone.setAsClone(slot);\n        });\n\n        slot.restoreData(json_slot.data);\n\n        if (json_slot.type === 'stackable') {\n          stackableChecks(slot);\n        }\n      }\n\n      // When copying data from an existing slot,\n      // do not copy over the position, unless the slot is\n      // a user inserted one.\n      if (slotIsPredefined) {\n        delete json_slot.data.w;\n        delete json_slot.data.h;\n        delete json_slot.data.x;\n        delete json_slot.data.y;\n      }\n\n      slot.restoreData(json_slot.data);\n      slot.moveTo(slot.x, slot.y);\n\n      if (json_slot.type === 'stackable') {\n        stackableChecks(slot);\n      }\n\n      slot.queueReload('after resize', 5);\n    }\n\n    function setSlotImage(json_slot) {\n      let slot = this.findImageSlotById(json_slot.id);\n\n      if (!slot && json_slot.type === 'stackable') {\n        slot = this.addPhotoSlot(json_slot);\n        stackableInit(json_slot, slot);\n      }\n\n      if (!slot) return;\n\n      ['imgId', 'image', 'img'].forEach(\n        property =>\n          json_slot[property] && (slot[property] = json_slot[property])\n      );\n\n      if (this.imageManager) {\n        json_slot = this.imageManager.findImage(json_slot);\n      }\n\n      if (!isClonedSlot(json_slot.id)) {\n        // not a clone\n        slot.imgId = slot.imgId || slot.image;\n\n        const imgSlotRef = stashFns.getImgSlotRef(slot);\n        stashFns.straightenChangeDelegator(imgSlotRef, slot.angle);\n        stashFns.gammaChangeDelegator(imgSlotRef, slot.gamma);\n        stashFns.zoomChangeDelegator(imgSlotRef, slot.zoomFactor);\n\n        this.getClones(json_slot.id).forEach(clone => {\n          clone.restoreData(json_slot.data);\n          clone.setAsClone(slot);\n        });\n\n        slot.restoreData(json_slot.data);\n\n        if (json_slot.type === 'stackable') {\n          stackableChecks(slot);\n        }\n      }\n    }\n\n    function stackableInit(json_slot, slot) {\n      ['type', 'content_type'].forEach(\n        property =>\n          json_slot.hasOwnProperty(property) &&\n          (slot[property] = json_slot[property])\n      );\n    }\n\n    function stackableChecks(slot) {\n      slot.enforceBounds(self.editableArea);\n    }\n  };\n\n  hideCanvas () {\n    this.hatch = false;\n    this.blank = false;\n    this.firstPage = false;\n    this.el.addClass('invisible');\n    this.show_overlays = this.firstPage;\n    this.hint = 'invisible';\n  };\n\n  sanitiseSlotColour (slot) {\n    const sanitiseTextSlot = () => {\n      slot.data.fontColour = tinycolor(slot.data.fontColour).toHexString();\n      customColourHistory.push(slot.data.fontColour);\n    };\n\n    switch (slot.type) {\n      case 'text':\n        return sanitiseTextSlot();\n    }\n  };\n\n  setData (data, hint, skipTemplateCache = false) {\n    if (!data || !data.slots) return;\n\n    const selectedID = this.selected ? this.selected.id : null;\n\n    data.slots.forEach(this.sanitiseSlotColour);\n\n    this.hatch = false;\n    this.blank = false;\n\n    // the following logic determines whether we are on the cover page\n    // N.B. when changing pages, hint always set to a value; thus we know we are\n    // no longer at the cover page\n    if (!!data.name && hint === undefined) {\n      this.firstPage = true;\n    } else if (hint !== undefined) {\n      this.firstPage = false;\n    }\n\n    if (hint === 'invisible') this.el.addClass('invisible');\n    else this.el.removeClass('invisible');\n\n    if (data === null) {\n      this.blank = true;\n      this.hatch = false;\n      if (this.selected) this.deselectAll();\n      return;\n    }\n\n    // De-select any slots & notify UI\n    if (data.hasOwnProperty('index') && data.index !== this.pageIndex) {\n      this.deselectAll();\n    }\n\n    // to ensure show_overlays shows correctly\n    this.show_overlays = this.firstPage;\n\n    this.blank = false;\n    this.hint = hint; // (this.hint) being used anywhere?\n\n    switch (hint) {\n      case 'blank':\n      case 'hatch':\n        this.blank = true;\n        data.hatch = 'lines';\n        break;\n      case 'invisible':\n        this.blank = true;\n        data.hatch = false;\n        break;\n      case 'open-cover':\n        this.show_overlays = false;\n        break;\n      case 'inside-cover':\n        this.blank = true;\n        data.hatch = 'inside-cover';\n        break;\n    }\n\n    if (data.template) {\n      this.loadTemplateAndData(data.template, data);\n    } else if (skipTemplateCache) {\n      this.loadTemplateAndData(this.template, data);\n    } else if (data.templateID && TemplateCache.store[data.templateID]) {\n      this.loadTemplateAndData(TemplateCache.store[data.templateID], data);\n    } else {\n      TemplateCache.get(data.templateID, () => {\n        this.loadTemplateAndData(TemplateCache.store[data.templateID], data);\n      });\n      return;\n    }\n\n    if (selectedID) {\n      this.selectSlotById(selectedID);\n    }\n    return this.do_save(data);\n  };\n\n  getData () {\n    const slots = this.getSlotsToDraw().map(slot => {\n      const { img, ...data } = slot.data();\n      const { imgId, image } = data;\n\n      return {\n        id: slot.id,\n        type: slot.type,\n        content_type: slot.content_type,\n        content_url: slot.isEmbellishment() && (data.url || (img && img.src)),\n        url: img && img.src,\n        image: imgId || image,\n        data,\n      };\n    });\n\n    // clean up any undefinedes\n    slots.forEach(slot => {\n      Object.entries(slot).forEach(\n        ([key, value]) => Boolean(value) === false && delete slot[key]\n      );\n    });\n\n    return {\n      slots,\n      dtID: this.template['cc-dt-id'],\n      templateID: this.template.id,\n      theme: this.album_manager.theme,\n    };\n  };\n\n  push_undo_state (state) {\n    if (this.selected && this.selected.isUnconfirmedTextSlot) return;\n    if (this.in_undo) return;\n\n    if (this.historyStack.stepsAreDifferent(state)) {\n      this.el.trigger('ccSave');\n      this.historyStack.push(state);\n\n      useSlotStore.getState().updateSlot(this.selected);\n    }\n  };\n\n  do_undo () {\n    try {\n      this.in_undo = true;\n      this.historyStack.undo();\n      if (this.selected) {\n        this.selectSlotById(this.selected.id);\n      }\n    } catch (_error) {}\n    return (this.in_undo = false);\n  };\n\n  can_undo () {\n    return this.historyStack.canUndo();\n  };\n\n  can_redo () {\n    return this.historyStack.canRedo();\n  };\n\n  loadStatus () {\n    let slot;\n    let _i;\n    let _len;\n    let _ref;\n    let total = 4.25;\n    let complete = 0.25;\n\n    if (imgComplete(this.fgImage)) complete++;\n    if (imgComplete(this.bgImage)) complete++;\n    if (imgComplete(this.lfgImage)) complete++;\n    if (imgComplete(this.lbgImage)) complete++;\n    for (_i in this.overlays) {\n      _ref = this.overlays[_i];\n      total++;\n      if (imgComplete(_ref)) complete++;\n    }\n    _ref = this.slots;\n    for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n      slot = _ref[_i];\n      total++;\n      if (slot && !slot.isLoading()) complete++;\n    }\n    return complete / total;\n  };\n\n  isLoading () {\n    let slot;\n    let _i;\n    let _len;\n    let _ref;\n    if (!(imgComplete(this.fgImage) && imgComplete(this.bgImage))) return true;\n    if (!(imgComplete(this.lfgImage) && imgComplete(this.lbgImage)))\n      return true;\n    for (_i in this.overlays) {\n      _ref = this.overlays[_i];\n      if (!imgComplete(_ref)) return true;\n    }\n    _ref = this.slots;\n    for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n      slot = _ref[_i];\n      if (slot && slot.isLoading()) return true;\n    }\n    return false;\n  };\n\n  do_redo () {\n    try {\n      this.in_undo = true;\n      this.historyStack.redo();\n    } catch (_error) {}\n    return (this.in_undo = false);\n  };\n\n  setSaveBlocked (setBlockedValue) {\n    this.saveBlocked = setBlockedValue;\n  };\n\n  // Set saves to undefined to prevent this action from triggering a save.\n  userAction (what, action, saves = 0) {\n    try {\n      this.user_actions.unshift({ what, saves });\n      return action(this);\n    } finally {\n      const result = this.user_actions.shift();\n      if (result.saves > 0) {\n        this.do_save();\n      }\n    }\n  };\n\n  suppressSave (what, action) {\n    return this.userAction(what, action, undefined);\n  };\n\n  do_save (data = null) {\n    if (data && this.historyStack.preventSave(data)) return;\n    if (this.saveBlocked) return;\n    if (this.user_actions[0]) {\n      this.user_actions[0].save++;\n      return;\n    }\n\n    if (!this.theme_loading) {\n      useSlotStore.getState().updateLastSaved();\n      this.push_undo_state(this.getData())\n    };\n\n    if (this.album_manager) {\n      this.album_manager.fireSave(this);\n    }\n  };\n\n  do_selectTheme (theme) {\n    if (this.album_manager) return this.album_manager.selectTheme(theme);\n  };\n\n  can_edit () {\n    let _ref;\n    return (\n      this.editable && ((_ref = this.slots) != null ? _ref.length : void 0) > 0\n    );\n  };\n\n  overlaps (x, y) {\n    const rect = this.element.getBoundingClientRect();\n\n    if (x < rect.left || x > rect.right) {\n      return false;\n    }\n    if (y < rect.top || y > rect.bottom) {\n      return false;\n    }\n    return true;\n  };\n\n  hasOptionalBackground () {\n    return (this.slots || []).some(slot => slot.isOptionalBackground());\n  };\n\n  getEventPayload (event) {\n    if (event.dataTransfer) {\n      return JSON.parse(event.dataTransfer.getData('text') || '{}');\n    }\n\n    if (event.originalEvent) {\n      return JSON.parse(event.originalEvent.dataTransfer.getData('text') || '{}');\n    }\n\n    if (event.target.hasAttribute('data-payload')) {\n      return JSON.parse(event.target.getAttribute('data-payload') || '{}');\n    }\n\n    return null;\n  };\n\n  menuPoints (slot) {\n    const { topMenu, bottomMenu } = slot.getControlPoints();\n    const bMenu = this.pointToPage(slot, bottomMenu.x, bottomMenu.y);\n    const tMenu = this.pointToPage(slot, topMenu.x, topMenu.y);\n    return {\n      tMenu,\n      bMenu,\n    };\n  };\n\n  highestPoint (slot, extraHeight) {\n    let {\n      topLeft,\n      topRight,\n      bottomRight,\n      bottomLeft,\n      bottomMiddle,\n    } = slot.getSlotPoints();\n    bottomMiddle.y -= extraHeight;\n    const points = [topLeft, topRight, bottomRight, bottomLeft, bottomMiddle];\n    const yPoints = points.map(p => this.pointToPage(slot, p.x, p.y)[1]);\n\n    return Math.min(yPoints[0], yPoints[1], yPoints[2], yPoints[3], yPoints[4]);\n  };\n\n  decreaseIndex () {\n    const index = useSlotStore.getState().slotIndex;\n\n    const prevSlot = this.slots[index - 1];\n    if (!prevSlot) {\n      // there's no slot below this one\n      return;\n    }\n\n    if (!prevSlot.stackable()) {\n      return;\n    }\n\n    const currentSlot = this.slots[index];\n\n    this.slots[index] = prevSlot;\n    this.slots[index - 1] = currentSlot;\n    this.orderToZindex();\n\n    this.selectedIndex -= 1;\n\n    useSlotStore.getState().updateSlotIndex(index - 1);\n\n    this.do_save();\n    return this.queueRedraw();\n  };\n\n  increaseIndex () {\n    const index = useSlotStore.getState().slotIndex;\n\n    const nextSlot = this.slots[index + 1];\n\n    if (!nextSlot) {\n      // there's no slot above this one\n      return;\n    }\n\n    const currentSlot = this.slots[index];\n\n    this.slots[index] = nextSlot;\n    this.slots[index + 1] = currentSlot;\n    this.orderToZindex();\n\n    this.selectedIndex += 1;\n\n    useSlotStore.getState().updateSlotIndex(index + 1);\n\n    this.do_save();\n    return this.queueRedraw();\n  };\n\n  overriddenSlotIds () {\n    return (\n      this.overriddenSlotIdsMemo ||\n      (this.overriddenSlotIdsMemo = this.slots\n        .map(s => s.overriddenId())\n        .filter(Boolean)\n        .reduce((memo, overriddenId) => {\n          memo[overriddenId] = true;\n          return memo;\n        }, {}))\n    );\n  };\n\n  slotIsOverridden (slot) {\n    return this.overriddenSlotIds()[slot.id] === true;\n  };\n\n  getSlotsToDraw () {\n    // we want all slots except those which have been overridden\n\n    // find the ids of those slots which have been overridden\n    const overriddenSlotIds = this.overriddenSlotIds();\n\n    // and ensure we don't return any overridden slots\n    return this.slots.filter(s => !overriddenSlotIds[s.id]);\n  };\n\n  deleteAllOverrideImageSlots () {\n    this.slots = this.slots.filter(slot => {\n      if (slot.isImage && slot.isOverridePhoto()) return false;\n      return true;\n    });\n  };\n\n  deleteAllTextSlots() {\n    this.slots = this.slots.filter(slot => {\n      return !slot.isText;\n    });\n  }\n\n  repositionTextSlots (templateData) {\n    this.slots.forEach(slot => {\n      if (slot.isText && slot.type === 'text' && slot.string) { // ensure it only happens for fixed text slots and not calendar events and spine text\n        const templateSlot = templateData.text_slots[slot.id];\n        if (templateSlot) {\n          slot.x = templateSlot['pixel-coords'][0];\n          slot.y = templateSlot['pixel-coords'][1];\n          slot.w = templateSlot['pixel-coords'][2];\n          slot.h = templateSlot['pixel-coords'][3];\n        }\n      }\n    });\n  }\n\n  onMoveMouseDown (slot, e) {\n    this.control = false;\n    this.drag = false;\n    this.mode = PrismViewCanvas.SLOT_MANIPULATION;\n\n    this.control = slot.isText ? 'text' : 'image';\n\n    const index = findIndex(this.slots, s => s.id === slot.id);\n    this.mouseDown(index, e);\n  };\n\n  onMoveMouseMove (slot, e) {\n    this.mode = PrismViewCanvas.SLOT_MANIPULATION;\n\n    const index = findIndex(this.slots, s => s.id === slot.id);\n    this.mouseMove(index, e);\n  };\n\n  onMoveMousePanning () {\n    this.mode = PrismViewCanvas.IMAGE_EDIT;\n  };\n\n  topLayerImageSlotAcceptingImage (e) {\n    const { x, y } = this.relativePoint(e);\n    const slotsInPosition = this.slots.filter(slot => {\n      return (\n        slot.hasPoint(x, y) &&\n        slot.isImage &&\n        slot.acceptsImage({ allowOptionalBackground: false })\n      );\n    });\n\n    if (slotsInPosition.length === 0) return null;\n\n    slotsInPosition\n      .sort((a, b) => {\n        const aValue = isNaN(Number(a.zindex)) ? -1 : Number(a.zindex);\n        const bValue = isNaN(Number(b.zindex)) ? -1 : Number(b.zindex);\n        return aValue - bValue;\n      })\n      .reverse();\n\n    return slotsInPosition[0];\n  };\n\n  isDoubleCover () {\n    if (!this.template.tags) return false;\n\n    return templateInterrogator.tagIntersect(this.template, 'wrap-cover');\n  };\n}\n\nexport default PrismViewCanvas;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n// React 16\n// export const AppType = React.createContext('web');\n\nclass AppTypeProvider extends React.Component {\n  getChildContext() {\n    return { appType: this.props.value };\n  }\n\n  render() {\n    return React.Children.only(this.props.children);\n  }\n}\nAppTypeProvider.childContextTypes = {\n  appType: PropTypes.string,\n};\n\nexport const AppType = { Provider: AppTypeProvider };\n","import React from \"react\";\nimport Store from '../../../_utils/tools/store';\n\nexport default function ChangeOrientationNotice() {\n\n  const alertColour = () => Store.isWalmart() ? 'alert-yellow' : 'alert-light';\n\n  return (\n    <div\n      className =  { `change-orientation alert ${alertColour()} fade show d-flex mx-auto border-0`}\n      role=\"alert\"\n      aria-label=\"Change Orientation Notice\"\n    >\n      <i className=\"fas fa-exclamation-circle mr-1\" />\n      <p className=\"m-0\">Select the <strong>Layouts</strong> panel to switch<br />between Landscape and Portrait orientation</p>\n      <button type=\"button\" className=\"close py-1 px-2\" data-dismiss=\"alert\" aria-label=\"Close\">\n        <span aria-hidden=\"true\">&times;</span>\n      </button>\n    </div>\n  )\n};\n","'use strict';\n\n// Import Libraries\nimport React from 'react';\nimport classNames from 'classnames';\nimport reactMixin from 'react-mixin';\n// Import JS Modules\nimport has from 'lodash/has';\nimport {\n  WebUI,\n  PrismUI,\n  TrackPreviewMode,\n  RefreshOnEvents,\n  builderDispatch,\n} from '../../_utils/ui';\nimport stashFns from '../misc/stash-fns';\nimport {\n  isAlbum,\n  isCalendar,\n  isCanvas,\n  isMultiPageStandardProduct,\n} from '../trays/tray-determiner';\nimport { usePrismItemStore } from 'stores/usePrismItemStore';\n// Import JSX Modules\nimport cardTopNavActive from '../misc/card-top-nav-active';\nimport Chevron from '../misc/chevron';\nimport EnvelopePage from '../misc/envelope-page';\nimport AddressModal from '../misc/address-form';\nimport PageSpreads from './page-spreads';\nimport PrismViewCanvas from '../prism/prism-view-canvas';\nimport { AppType } from '../context/app-type';\nimport ChangeOrientationNotice from '../desktop/notices/change-orientation-notice';\nimport { hasLayoutsTray } from '../trays/tray-determiner';\nimport { EventEmitter } from 'wk-event-emitter';\nimport { useSlotStore, useFocusedSlotStore } from 'stores/useSlotStore';\n\nexport const slotEvents = {\n  focus: 'focus',\n  changed: 'changed',\n};\n// -----------------------------------------------------------\n//  PrismView\n// -----------------------------------------------------------\nclass PrismView extends React.Component {\n  refreshOn = [\n    WebUI.UPLOAD_PROGRESS,\n    WebUI.UPDATE_PHOTOS,\n    PrismUI.ITEM_LOADED,\n    PrismUI.SLOT_MOVED,\n    PrismUI.PREVIEW_2D_LOADED,\n  ];\n\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      selected: null,\n      selectedID: null,\n      double: false,\n      customPage: undefined,\n      previewDimensions: {\n        height: 0,\n      },\n      slotEvent: null,\n      saving: false,\n    };\n\n    this.handleZoom = this.handleZoom.bind(this);\n    this.clearBG = this.clearBG.bind(this);\n    this.navigateToNextSpread = this.navigateToNextSpread.bind(this);\n    this.navigateToPreviousSpread = this.navigateToPreviousSpread.bind(this);\n    this.showEnvelopeAddressForm = this.showEnvelopeAddressForm.bind(this);\n    this.closeEnvelopeAddressForm = this.closeEnvelopeAddressForm.bind(this);\n  }\n\n  get canvasHeight() {\n    return Math.min(this.props.maxHeight, 800);\n  }\n\n  get canvasWidth() {\n    return Math.min(this.props.maxWidth, 800);\n  }\n\n  get canvasMaxWidth() {\n    return window.innerWidth >= 1024\n      ? Math.floor(this.props.maxWidth / 2)\n      : this.props.maxWidth;\n  }\n\n  get appClass() {\n    // React 16\n    //switch(this.context) {\n    switch (this.context.appType) {\n      case 'app':\n        return 'app';\n      case 'web':\n        return 'web';\n      default:\n        return 'unknown';\n    }\n  }\n\n  componentDidMount() {\n    this.view = new PrismViewCanvas('pageView', undefined, undefined);\n    this.view.stashFns = stashFns;\n    this.viewRight = new PrismViewCanvas('pageViewRight', undefined, undefined);\n    this.viewRight.stashFns = stashFns;\n\n    window.prismViews.page = this.view;\n    window.prismViews.page.imageManager = usePrismItemStore.getState();\n    window.prismViews.page.album_manager = usePrismItemStore.getState();\n\n    window.prismViews.pageRight = this.viewRight;\n    window.prismViews.pageRight.imageManager = usePrismItemStore.getState();\n    window.prismViews.pageRight.album_manager = usePrismItemStore.getState();\n\n    window.activeView = this.view;\n\n    if (this.view.selected || this.viewRight.selected) {\n      setTimeout(() => {\n        this.forceUpdate();\n      }, 10);\n    }\n\n    EventEmitter.on(PrismUI.SLOT_ACTIVATE, ({ slot }) =>\n      this.handleSlotChanged(slot)\n    );\n\n    this.dispatchBaseToken = builderDispatch.register(payload => {\n      switch (payload.type) {\n        case PrismUI.SLOT_CHANGED:\n          this.handleSlotChanged(payload.slot);\n          break;\n\n        case WebUI.SHOW_CUSTOM_PAGE:\n          this.setState({\n            customPage: {\n              id: payload.customPageId,\n              index: payload.customPageIndex,\n            },\n          });\n          break;\n\n        case WebUI.HIDE_CUSTOM_PAGE:\n          this.setState({ customPage: undefined });\n          break;\n\n        case WebUI.DO_SHOW_SPREAD:\n          const { spread, dateIdentifier } = payload;\n          if (spread) {\n            this.setState({ spread }, function() {\n              const { pageIndex = spread.spread } = payload;\n              this.navigateToPage(pageIndex, dateIdentifier);\n            });\n          }\n          break;\n\n        case WebUI.EDIT_AREA_RESIZED:\n          setTimeout(this.forceUpdate.bind(this), 10);\n          break;\n\n        case PrismUI.SAVE_START:\n          this.showSaving();\n          this.setState({ saving: true });\n          break;\n\n        case PrismUI.SAVE_DONE:\n          this.hideSaving();\n          this.setState({ saving: false });\n          break;\n      }\n    });\n\n    (() => {\n      window.requestAnimationFrame(draw);\n\n      function draw() {\n        if (\n          window.prismViews &&\n          prismViews.page &&\n          prismViews.page.pending_redraw\n        ) {\n          prismViews.page._redraw('interval');\n        }\n        if (\n          window.prismViews &&\n          prismViews.pageRight &&\n          prismViews.pageRight.pending_redraw\n        ) {\n          prismViews.pageRight._redraw('interval');\n        }\n        window.requestAnimationFrame(draw);\n      }\n    })();\n  }\n\n  componentWillUnmount() {\n    EventEmitter.off(PrismUI.SLOT_ACTIVATE);\n\n    if (this.dispatchBaseToken) builderDispatch.unregister(this.dispatchBaseToken);\n\n    window.prismViews.page = null;\n  }\n\n  componentDidUpdate() {\n    if (this.inPreview() && window.previewImage) {\n      return;\n    }\n\n    const prismItem = usePrismItemStore.getState().prismItem;\n\n    if (prismItem.pages) {\n      this.view.queueRedraw();\n      if (this.state.double) {\n        this.viewRight.queueRedraw();\n      }\n    }\n\n    this.view.editable = this.viewRight.editable = !this.inPreview();\n  }\n\n  get canvasPositioningStyle() {\n    // This should only affect mobile and should not show if there's only a single page\n    if (window.innerWidth >= 1024 || !this.state.double) return {};\n\n    const canvasWidth = this.canvasWidth;\n    const canvasHeight = this.canvasHeight;\n    const offsetWidth = document.querySelector('#pageView').offsetWidth;\n    const offsetHeight = document.querySelector('#pageView').offsetHeight;\n\n    const transform = (() => {\n      const centerWidth = offsetWidth / 2;\n      const centerHeight = offsetHeight / 2;\n\n      return offsetWidth == canvasWidth || offsetWidth > offsetHeight\n        ? this.props.visiblePage === 'left'\n          ? centerWidth\n          : centerWidth - offsetWidth\n        : this.props.visiblePage === 'left'\n        ? centerHeight\n        : centerHeight - offsetHeight;\n    })();\n\n    return {\n      width: canvasWidth * 2,\n      transform: `translateX(${transform}px)`,\n    };\n  }\n\n  calculateHeight = () => {\n    const { maxHeight } = this.props;\n    if (window.innerWidth >= 2000 && !isAlbum() && !this.isMobile) {\n      return maxHeight * 0.8;\n    }\n    return 'unset';\n  };\n\n  render() {\n    const { maxWidth, maxHeight } = this.props,\n      canvasStyle = {\n        display: 'block',\n        maxWidth,\n        maxHeight,\n        height: this.calculateHeight(),\n      },\n      canvasStyleRight = Object.assign({}, canvasStyle, {\n        display: this.state.double ? 'inline-block' : 'none',\n      }),\n      { statusText, descriptionText } = this.ariaDescription();\n\n    if (document.querySelectorAll('.ub-view-bg')[0] && this.state.double) {\n      canvasStyle.maxWidth = canvasStyleRight.maxWidth = this.canvasMaxWidth;\n    }\n    const $customPageHtml = (() => {\n      if (this.state.customPage) {\n        if (this.state.customPage.id === 'envelope') {\n          return [\n            <EnvelopePage\n              key=\"envelope-page\"\n              onClick={this.showEnvelopeAddressForm}\n            />,\n            this.renderEnvelopeAddressForm(),\n          ];\n        }\n\n        return (\n          <div>\n            Please add html template for custom section:{' '}\n            {this.state.customPage.id}\n          </div>\n        );\n      }\n    })();\n\n    const { visiblePage } = this.props;\n\n    if (['album', 'print'].some(type => type === wkData.product.type)) {\n      return (\n        <div\n          className={classNames(\n            'ub-canvas-container ub-view-bg w-100 canvas-surround',\n            { 'preview-mode': this.inPreview() }\n          )}\n          onClick={this.clearBG}\n          onTouchEnd={this.clearBG}>\n          <div className=\"saving\" ref=\"saving\" style={{ display: 'none' }}>\n            <div className=\"spinner spinner-mini\"></div>\n            <span> Saving... </span>\n          </div>\n          {$customPageHtml}\n          {this.renderUpsellButton()}\n          <div\n            className={classNames(\n              'canvas-wrapper canvas-surround',\n              wkData.product.type\n            )}\n            style={{ maxWidth }}>\n            <div>\n              {isAlbum() && this.renderAddRemovePages()}\n              <div\n                className=\"canvas-positioning canvas-surround\"\n                style={this.canvasPositioningStyle}>\n                <div className=\"snap-container d-inline-block\">\n                  <canvas\n                    id=\"pageView\"\n                    className={classNames(\n                      'showing prism-viewport-canvas',\n                      this.appClass,\n                      {\n                        'ub-view-selected': this.isSelected('view'),\n                        'noselect-album': isAlbum() && visiblePage === 'right',\n                      }\n                    )}\n                    width={window.innerWidth}\n                    height={window.innerHeight}\n                    style={canvasStyle}\n                    tabIndex=\"0\"\n                    aria-describedby=\"editor-description\"\n                    aria-label=\"main canvas\"\n                  />\n                </div>\n                <div className=\"snap-container d-inline-block\">\n                  <canvas\n                    id=\"pageViewRight\"\n                    className={classNames(\n                      'showing prism-viewport-canvas',\n                      this.appClass,\n                      {\n                        'ub-view-selected': this.isSelected('viewRight'),\n                        'noselect-album': isAlbum() && visiblePage === 'left',\n                      }\n                    )}\n                    width={window.innerWidth}\n                    height={window.innerHeight}\n                    style={canvasStyleRight}\n                    tabIndex=\"0\"\n                    aria-describedby=\"editor-description\"\n                    aria-label=\"main canvas\"\n                  />\n                </div>\n                <div\n                  role=\"status\"\n                  id=\"editor-description\"\n                  className=\"editor-description sr-only\"\n                  aria-live=\"polite\">\n                  {statusText + ' ' + descriptionText}\n                </div>\n              </div>\n            </div>\n          </div>\n          {[isAlbum, isMultiPageStandardProduct].some(fn => fn.call()) &&\n            this.renderPagination()}\n          {!this.inPreview() && this.renderTools()}\n        </div>\n      );\n    }\n\n    const { $3DPreview, $progressBar } =\n      this.inPreview() && typeof this.renderThreeDPreview === 'function'\n        ? this.renderThreeDPreview()\n        : {};\n    const isSquare =\n      window.activeView &&\n      window.activeView.template &&\n      window.activeView.template.size.width ===\n        window.activeView.template.size.height;\n    const shouldDisplayOrientationNotice = !hasLayoutsTray()\n      ? null\n      : isCanvas() && !isSquare && <ChangeOrientationNotice />;\n    return (\n      <div\n        className={classNames(\n          'ub-canvas-container ub-view-bg w-100 canvas-surround',\n          {\n            'preview-mode': this.inPreview(),\n            'top-nav-active': cardTopNavActive(),\n          }\n        )}\n        id={this.state.spread ? this.state.spread.title.toLowerCase() : ''}\n        onClick={this.clearBG}\n        ref={ref => (this.canvasCont = ref)}\n        role=\"tabpanel\"\n        onTouchEnd={this.clearBG}>\n        <div className=\"saving\" ref=\"saving\" style={{ display: 'none' }}>\n          <div className=\"spinner spinner-mini\"></div>\n          <span> Saving... </span>\n        </div>\n        {shouldDisplayOrientationNotice}\n        {$3DPreview}\n        {$progressBar}\n        {$customPageHtml}\n        {this.renderUpsellButton()}\n        <div\n          className={classNames('canvas-wrapper canvas-surround', {\n            'd-none': this.customPageId() === 'envelope' || $3DPreview,\n          })}\n          style={{ maxWidth }}\n          onClick={this.handleWrapperClick}>\n          <div className=\"d-flex flex-column canvas-surround snap-container\">\n            {isCalendar() && this.renderPagination('d-none d-lg-flex')}\n            <div className=\"snap-container d-inline-block\">\n              <canvas\n                id=\"pageView\"\n                className={classNames(\n                  'showing left is-spread prism-viewport-canvas',\n                  this.appClass,\n                  { 'ub-view-selected': this.isSelected('view') }\n                )}\n                style={canvasStyle}\n                tabIndex=\"0\"\n                aria-describedby=\"editor-description\"\n                aria-label=\"main canvas\"\n              />\n            </div>\n            <div className=\"snap-container d-inline-block\">\n              <canvas\n                id=\"pageViewRight\"\n                className={classNames(\n                  'showing right prism-viewport-canvas',\n                  this.appClass,\n                  { 'ub-view-selected': this.isSelected('viewRight') }\n                )}\n                width={window.innerWidth}\n                height={window.innerHeight}\n                style={canvasStyleRight}\n                tabIndex=\"0\"\n                aria-describedby=\"editor-description\"\n                aria-label=\"main canvas\"\n              />\n            </div>\n            <div\n              role=\"status\"\n              id=\"editor-description\"\n              className=\"editor-description sr-only\"\n              aria-live=\"polite\">\n              {statusText + ' ' + descriptionText}\n            </div>\n          </div>\n        </div>\n        {[isCalendar, isMultiPageStandardProduct].some(fn => fn.call()) &&\n          this.renderPagination('d-flex d-lg-none')}\n        {!this.inPreview() && this.renderTools()}\n      </div>\n    );\n  }\n\n  renderUpsellButton() {\n    if (!window.wkData.builder_upsell_product) return null;\n    // Viewport is currently only defined in the Desktop builder, not the mobile app builder\n    if (!(this.props.viewport && this.props.viewport.isDesktop)) return null;\n\n    return (\n      <button\n        className=\"upsell-button btn btn-link d-flex flex-column align-items-center p-0\"\n        onClick={() => this.handleUpsellButtonOpen()}>\n        <div\n          className=\"rounded-circle\"\n          style={{\n            backgroundImage: `url(${window.wkData.builder_upsell_product.button_icon})`,\n          }}></div>\n        <i className=\"fas fa-reply ml-auto\" />\n        {window.wkData.builder_upsell_product.button_text}\n      </button>\n    );\n  }\n\n  renderEnvelopeAddressForm() {\n    return (\n      <AddressModal\n        key=\"address-modal\"\n        ref=\"address\"\n        onDone={this.closeEnvelopeAddressForm}\n      />\n    );\n  }\n\n  renderPagination() {\n    // Stub\n  }\n\n  renderAddRemovePages() {\n    // Stub\n  }\n\n  renderTools() {\n    // Stub\n  }\n\n  showEnvelopeAddressForm() {\n    this.refs.address.open();\n  }\n\n  closeEnvelopeAddressForm() {\n    this.forceUpdate();\n    this.refs.address.close();\n  }\n\n  renderChevron(rel) {\n    const prismItem = usePrismItemStore.getState().prismItem;\n\n    if (!window.activeView || !prismItem || !prismItem.product) return;\n\n    // Define spreads and spreadIndex as instance variables\n    // Note these will not trigger a re-render as they are not set by setState()\n    if (!this.spreads || prismItem.pages.length !== prismItem.pageCount)\n      this.spreads = new PageSpreads(prismItem).list();\n\n    if (!this.spreadIndex && this.spreads) this.spreadIndex = 0;\n\n    if (rel === 'next') {\n      const nextSpread = this.spreads[this.spreadIndex + 1];\n      return (\n        <Chevron\n          rel=\"next\"\n          label={`page ${(nextSpread || {}).title}`}\n          disabled={this.state.saving || !nextSpread}\n          onClick={nextSpread && this.navigateToNextSpread}\n        />\n      );\n    }\n\n    if (rel === 'previous') {\n      const prevSpread = this.spreads[this.spreadIndex - 1];\n      return (\n        <Chevron\n          rel=\"previous\"\n          label={`page ${(prevSpread || {}).title || 'disabled'}`}\n          disabled={this.state.saving || !prevSpread}\n          onClick={prevSpread && this.navigateToPreviousSpread}\n        />\n      );\n    }\n  }\n\n  ariaDescription() {\n    const slot = useSlotStore.getState().slot;\n\n    const focusedSlot = useFocusedSlotStore.getState().focusedSlot;\n\n    const { slotEvent } = this.state;\n\n    const label =\n      !!window.activeView && !!window.activeView.title\n        ? Number(window.activeView.title)\n          ? `Edit Page ${window.activeView.title}.`\n          : `Edit ${window.activeView.title}.`\n        : 'No slot selected.';\n\n    if (\n      focusedSlot &&\n      window.activeView.slots &&\n      slotEvent === slotEvents.focus\n    ) {\n      return this.getFocusDescription(focusedSlot);\n    }\n\n    if (slot && window.activeView.slots) {\n      const prop = slot.isImage ? 'isImage' : 'isText',\n        index =\n          window.activeView.slots\n            .filter(item => item[prop] === slot[prop])\n            .indexOf(slot) + 1;\n\n      if (slot.isImage) {\n        if (PrismViewCanvas.slotHasUserData(slot)) {\n          return {\n            statusText: `You have selected photo slot ${index} - This slot has an image. ${\n              slot.lowDpi ? 'Image used is low quality' : ''\n            }`,\n            descriptionText:\n              'Use the arrow keys to pan your image, plus/minus to zoom and R to rotate.',\n          };\n        }\n\n        return {\n          statusText: `You have selected photo slot ${index} - This slot does not have an image`,\n          descriptionText: 'Use the image selector to find or upload a photo.',\n        };\n      }\n\n      if (slot.isText) {\n        if (PrismViewCanvas.slotHasUserData(slot)) {\n          return {\n            statusText: `You have selected text slot ${index}.`,\n            descriptionText: `Currently reads: '${slot.string}.'`,\n          };\n        }\n\n        return {\n          statusText: `You have selected text slot ${index}.`,\n          descriptionText: 'Currently it is empty.',\n        };\n      }\n    }\n\n    return {\n      statusText: label,\n      descriptionText: 'Click or use a number to select a slot.',\n    };\n  }\n\n  getFocusDescription(focusedSlot) {\n    const prop = focusedSlot.isImage ? 'isImage' : 'isText',\n      index =\n        window.activeView.slots\n          .filter(item => item[prop] === focusedSlot[prop])\n          .indexOf(focusedSlot) + 1;\n\n    return {\n      statusText: `${\n        focusedSlot.isImage ? `Photo` : `Text`\n      } slot ${index} has focus.`,\n      descriptionText: 'Use the enter key to activate.',\n    };\n  }\n\n  navigateToPreviousSpread(e) {\n    e.preventDefault();\n\n    if (this.isMobile) {\n      // Return here as we don't want to update the spreadIndex\n      if (\n        isAlbum() &&\n        this.props.visiblePage === 'right' &&\n        this.state.spread.title !== '1'\n      ) {\n        return this.changeVisiblePage('left');\n      }\n    }\n\n    this.changeVisiblePage('right');\n    this.spreadIndex -= 1;\n\n    builderDispatch.dispatch({\n      type: WebUI.DO_SHOW_SPREAD,\n      spread: this.spreads[this.spreadIndex],\n    });\n  }\n\n  navigateToNextSpread(e) {\n    e.preventDefault();\n\n    if (this.isMobile) {\n      // Return here as we don't want to update the spreadIndex\n      if (isAlbum() && this.props.visiblePage === 'left') {\n        return this.changeVisiblePage('right');\n      }\n    }\n\n    // Cover +1 is a weird case as the first page is blank\n    if (this.state.spread?.title !== 'Cover') {\n      this.changeVisiblePage('left');\n    }\n\n    this.spreadIndex += 1;\n\n    builderDispatch.dispatch({\n      type: WebUI.DO_SHOW_SPREAD,\n      spread: this.spreads[this.spreadIndex],\n    });\n  }\n\n  activateSelectable(spread) {\n    // Many of photobooks inticacies are handled by this method\n    const updateSelectableAndTitle = (side, toBeUpdated) => {\n      const prismItem = usePrismItemStore.getState().prismItem;\n\n      if (spread[side] && spread[side].page) {\n        const {\n          [side]: { page },\n        } = spread;\n\n        this[toBeUpdated].selectable = !!page;\n\n        if (!isNaN(page.section)) {\n          const { sections } = prismItem.product;\n          this[toBeUpdated].selectable =\n            sections[page.section] && !sections[page.section].fixed;\n        }\n\n        // Pull title from prismItem if it contains \"-\" for single page spreads\n        let title =\n          prismItem.pages[this.spreadIndex] &&\n          prismItem.pages[this.spreadIndex].name;\n        if ((title && !title.includes('-')) || !title) title = page.title;\n        if (spread.title === 'Cover') title = spread.title;\n\n        // Remove 'Page' if exists\n        if (typeof title === 'string') title = title.replace('Page ', '');\n\n        this[toBeUpdated].title = title;\n      } else {\n        this[toBeUpdated].selectable = false;\n        this[toBeUpdated].title = undefined;\n      }\n    };\n\n    updateSelectableAndTitle('left', 'view');\n    updateSelectableAndTitle('right', 'viewRight');\n    this.selectAnActiveView();\n  }\n\n  selectAnActiveView() {\n    // Selects an active view, prioritising the left view\n    // This is used when one of the views is un-selectable\n    if (!activeView.selectable) {\n      if (this.view.selectable) {\n        this.view.activateView();\n      } else if (this.viewRight.selectable || this.viewRight.pageIndex === 0) {\n        //this.viewRight.pageIndex === 0 indicates cover\n        this.viewRight.activateView();\n      }\n    }\n  }\n\n  showSaving() {\n    $(this.refs.saving).show();\n  }\n\n  hideSaving() {\n    if (this.hideSavingTimeout) {\n      clearTimeout(this.hideSavingTimeout);\n    }\n    this.hideSavingTimeout = setTimeout(() => {\n      $(this.refs.saving).fadeOut();\n    }, 500);\n  }\n\n  getZoom() {\n    return this.state.selected ? this.state.selected.zoomFactor : 0;\n  }\n\n  handleWrapperClick = e => {\n    if (activeView.selected && activeView.selected.slotState === 'editing') {\n      e.stopPropagation();\n    }\n  };\n\n  handleSlotChanged(slot) {\n    if (slot && slot.isInactiveState()) return;\n\n    this.setState({ slot, slotEvent: slotEvents.changed });\n  }\n\n  handleZoom(value) {\n    value = parseFloat(value);\n\n    const slot = this.state.selected;\n    slot.zoomFactor = value;\n    slot.view.zoomBy(0);\n    stashFns.zoomChangeDelegator(stashFns.getImgSlotRef(slot), value);\n\n    this.setState({\n      selected: slot,\n    });\n  }\n\n  clearBG(e) {\n    if (\n      e.target.className.indexOf('canvas-surround') !== -1 &&\n      $('.canvas-wrapper').is(':visible')\n    ) {\n      // Selecting a slot can cause tools to appear under the current mouse pointer location.\n      // When that happens a click is triggered on the parent element, which should\n      // be ignored, because it's really a click on the canvas and has already been processed.\n      // So we manually check for intersection and return early.\n      if (!activeView.overlaps(e.clientX, e.clientY)) {\n        activeView.deselectAll();\n      }\n    }\n\n    this.forceUpdate();\n  }\n\n  isSelected(name) {\n    if (this.inPreview()) {\n      return false;\n    }\n\n    return (\n      this[name] && this[name].selectable && this[name] === window.activeView\n    );\n  }\n\n  navigateToPage = (pageIndex, dateIdentifier) => {\n    // Update spreadIndex\n    const { spread } = this.state;\n    this.spreadIndex = pageIndex;\n\n    if (spread.customPageId) {\n      activeView = {\n        pageIndex: spread.pages()[0],\n        customPage: true,\n        can_undo() {\n          return false;\n        },\n        can_redo() {\n          return false;\n        },\n        selectSlotById() {\n          return true;\n        },\n        overlaps() {\n          return false;\n        },\n      };\n\n      this.view.selectable = false;\n      this.viewRight.selectable = false;\n      this.view.hideCanvas();\n      this.view.show();\n\n      this.dispatchWebUI(spread);\n      return;\n    }\n\n    if (spread.left && spread.right) {\n      this.updateViewsData(spread, dateIdentifier);\n\n      this.view.show();\n      this.viewRight.show();\n\n      this.activateSelectable(spread);\n\n      if (this.view.selectable && this.view.pageIndex === pageIndex) {\n        this.view.activateView();\n      } else if (\n        this.viewRight.selectable &&\n        this.viewRight.pageIndex === pageIndex\n      ) {\n        this.viewRight.activateView();\n      } else {\n        this.selectAnActiveView();\n      }\n    } else {\n      // end if (spread.left && spread.right)\n      const pgData = ([spread.left, spread.right].find(\n        side => side && side.page\n      ) || {})['page'];\n      if (!pgData) return;\n\n      usePrismItemStore\n        .getState()\n        .pageWithTemplate(pgData.index)\n        .then(({ page }) => {\n          if (dateIdentifier) page.dateIdentifier = dateIdentifier;\n          this.view.setData(page);\n          this.view.show();\n          window.activeView = this.viewRight; // a hack to ensure PageThumbs are selected when navigating\n          this.view.activateView();\n          this.viewRight.hide();\n\n          this.setState(({ double: prevDouble }) => {\n            if (prevDouble) {\n              return { double: false };\n            }\n          });\n        });\n    }\n\n    this.dispatchWebUI(spread);\n    this.activateSelectable(spread);\n  };\n\n  inPreview() {\n    return (this.state || {}).mode === 'preview-mode';\n  }\n\n  customPageId() {\n    return this.state.customPage && this.state.customPage.id;\n  }\n\n  dispatchWebUI(spread) {\n    builderDispatch.delayedDispatch({\n      type: WebUI.SHOWING_SPREAD,\n      spread: spread,\n    });\n\n    builderDispatch.delayedDispatch({\n      type: WebUI.PAGE_NAV,\n      index: spread.pages()[0],\n      pageIndex: this.spreadIndex,\n    });\n  }\n\n  updateViewsData(spread, dateIdentifier) {\n    if (!spread) return;\n\n    // Update spreadIndex\n    this.spreadIndex = spread && spread.spread;\n\n    if (spread.left && spread.right) {\n      if (has(spread.left, 'page.valid')) {\n        usePrismItemStore.getState().getPage(spread.left.page.index, page => {\n          if (dateIdentifier) page.dateIdentifier = dateIdentifier;\n          this.view.setData(page, spread.left.hint, dateIdentifier);\n          if (!has(spread.right, 'page.valid')) {\n            this.viewRight.setData(spread.blankData(page), spread.right.hint);\n          }\n        });\n      }\n\n      if (has(spread.right, 'page.valid')) {\n        usePrismItemStore.getState().getPage(spread.right.page.index, page => {\n          if (dateIdentifier) page.dateIdentifier = dateIdentifier;\n          this.viewRight.setData(page, spread.right.hint);\n          if (!has(spread.left, 'page.valid')) {\n            // set left synthetic\n            this.view.setData(spread.blankData(page), spread.left.hint);\n          }\n        });\n      }\n\n      this.setState(\n        () => {\n          return { double: true };\n        },\n        () => {\n          this.dispatchWebUI(spread);\n        }\n      );\n    } else {\n      const pgData = [spread.left, spread.right].find(\n        side => side && side.page\n      )['page'];\n      usePrismItemStore.getState().getPage(pgData.index, page => {\n        this.view.setData(page);\n        this.view.show();\n        window.activeView = this.viewRight; // a hack to ensure PageThumbs are selected when navigating\n        this.view.activateView();\n        this.viewRight.hide();\n\n        this.setState(\n          () => {\n            return { double: false };\n          },\n          () => {\n            this.dispatchWebUI(spread);\n          }\n        );\n      });\n    }\n  }\n\n  changeVisiblePage(page) {\n    builderDispatch.delayedDispatch({\n      type: WebUI.CHANGE_VISIBLE_PAGE,\n      page,\n    });\n  }\n\n  handleUpsellButtonOpen() {\n    builderDispatch.delayedDispatch({\n      type: WebUI.SHOWING_UPSELL_MODAL,\n    });\n  }\n}\n\n// React 16\n// PrismView.contextType = AppType;\nPrismView.contextTypes = AppType.Provider.childContextTypes;\n\nreactMixin(PrismView.prototype, RefreshOnEvents);\nreactMixin(PrismView.prototype, TrackPreviewMode);\n\nexport default PrismView;\n","// Import Libraries\nimport React from 'react';\nimport PropTypes from 'prop-types';\n// Import JS Modules\nimport { PrismUI } from '../../../../_utils/ui';\nimport PrismViewCanvas from '../../../prism/prism-view-canvas';\nimport IU from '../../../../_utils/img/img-utils';\nimport { TOP_TOOL_HEIGHT, BASE_TOOL_WIDTH, BASE_TOOL_HEIGHT } from './constants';\n// Import JSX Modules\nimport MananaSlider from '../../../../_utils/manana-slider';\nimport { EventEmitter } from 'wk-event-emitter';\n\nconst PAD = 10;\n\n// --------------------------------------------------------------------\n\nconst ImageSlotToolSimple = ({ slot }) => {\n  if (!slot.editable) {\n    return null;\n  }\n  if (!PrismViewCanvas.slotHasUserData(slot)) {\n    return null;\n  }\n\n  const style = (() => {\n    const { x1: leftSide, x2: rightSide, y1: topSide, y2: bottomSide } = slot.view.slotRegion(slot);\n\n    if (rightSide - leftSide > (2 * BASE_TOOL_WIDTH) && bottomSide - topSide > (2 * (TOP_TOOL_HEIGHT + BASE_TOOL_HEIGHT))) {\n      const right = innerWidth - rightSide + PAD;\n      return {\n        above: {\n          top: topSide + PAD,\n          right\n        },\n        below: {\n          bottom: innerHeight - bottomSide + PAD,\n          right\n        }\n      };\n    }\n\n    const right = innerWidth - rightSide;\n    const left = (right > innerWidth - 2 * (BASE_TOOL_WIDTH + PAD)) ? 0 : 'auto';\n\n    return {\n      above: {\n        top: topSide - PAD - TOP_TOOL_HEIGHT,\n        right\n      },\n      below: {\n        bottom: innerHeight - bottomSide - PAD - BASE_TOOL_HEIGHT,\n        left,\n        right\n      }\n    };\n  })();\n\n  return (\n    <div className=\"slot-tools-simple image-slot\">\n      <div className=\"tools-above position-fixed\" style={style.above}>\n        <button\n          aria-label=\"Delete photo\"\n          className=\"btn btn-dark\"\n          onClick={handleRemoveClick}>\n          <i className=\"far fa-trash-alt\" />\n          <span>Delete</span>\n        </button>\n      </div>\n\n      <div className=\"tools-below position-fixed d-flex align-items-center\" style={style.below}>\n        <div className=\"d-none slot-tools-simple-zoom\">\n          <MananaSlider\n            className=\"form-control form-control-lg form-control-range\"\n            label=\"Crop or zoom\"\n            max={IU.MAX_ZOOM}\n            min={IU.MIN_ZOOM}\n            step=\"0.01\"\n            value={slot.zoomFactor || IU.DEF_ZOOM}\n            handleChange={handleZoom} />\n        </div>\n\n        <button\n          aria-label=\"Rotate photo 90 degrees\"\n          className=\"btn btn-dark\"\n          onClick={handleRotateClick}>\n          <i className=\"fas fa-sync\" />\n          <span>Rotate</span>\n        </button>\n        <button\n          aria-label=\"Enhance photo\"\n          className=\"btn btn-dark slot-tools-simple-open-el2\"\n          onClick={handleLaunchEditLevel2}>\n          <i className=\"far fa-edit\" />\n          <span>Edit</span>\n        </button>\n      </div>\n    </div>\n  );\n\n  function handleZoom(value) {\n    slot.view.setZoom(value);\n  }\n\n  function handleRotateClick() {\n    slot.view.rotate(-IU.RIGHT_ANGLE);\n  }\n\n  function handleLaunchEditLevel2() {\n    EventEmitter.emit(PrismUI.OPEN_EDIT_MODAL, {\n      view: slot.view,\n      slot,\n    });\n  }\n\n  function handleRemoveClick() {\n    slot.setProperties({\n      x: null,\n      y: null,\n      zoom: null\n    });\n\n    slot.view.removeImageFromSlot(slot.id);\n  }\n};\n\nImageSlotToolSimple.propTypes = {\n  slot: PropTypes.object.isRequired\n};\n\n// --------------------------------------------------------------------\n\nexport default ImageSlotToolSimple;\n","export const imgLoaded = function (img) {\n  return img && img.complete && img.width > 0;\n};\n\nexport const imgLoading = function (img) {\n  return img && img.src && (!img.complete);\n};\n\nexport const imgFailed = function (img) {\n  return (!img) || (img && img.complete && img.width == 0);\n};\n\nexport class ImageWatcher {\n  constructor(img, callback) {\n    this.img = img;\n    if (callback) {\n      this.watch(callback);\n    }\n  }\n\n  watch(callback) {\n    if (this.watcher) this.unwatch();\n    this.watcher = callback;\n    this.img.addEventListener('load', this.watcher, true);\n    this.img.addEventListener('error', this.watcher, true);\n    if (imgLoaded(this.img) || imgFailed(this.img)) {\n      window.setTimeout(() => {\n        callback(`setTimeout on ${this.img.src}${[imgLoaded(this.img), imgFailed(this.img)].join(',')}`);\n      }, 50);\n    }\n  }\n\n  unwatch() {\n    this.img.removeEventListener('load', this.watcher, true);\n    this.img.removeEventListener('error', this.watcher, true);\n    this.watcher = undefined;\n  }\n}\n","// Import Libraries\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport SpinnerCover from '../../_utils/spinner-cover';\nimport {\n  ImageWatcher,\n  imgLoading,\n  imgLoaded,\n  imgFailed,\n} from './image-watcher';\n\nvar easing = {\n  linear(x, t, b, c, d) {\n    return b + c * x;\n  },\n  def: 'easeOutQuad',\n  swing(x, t, b, c, d) {\n    // alert($.easing.default);\n    return easing[easing.def](x, t, b, c, d);\n  },\n  easeInQuad(x, t, b, c, d) {\n    return c * (t /= d) * t + b;\n  },\n  easeOutQuad(x, t, b, c, d) {\n    return -c * (t /= d) * (t - 2) + b;\n  },\n  easeInOutQuad(x, t, b, c, d) {\n    if ((t /= d / 2) < 1) return (c / 2) * t * t + b;\n    return (-c / 2) * (--t * (t - 2) - 1) + b;\n  },\n  easeInCubic(x, t, b, c, d) {\n    return c * (t /= d) * t * t + b;\n  },\n  easeOutCubic(x, t, b, c, d) {\n    return c * ((t = t / d - 1) * t * t + 1) + b;\n  },\n  easeInOutCubic(x, t, b, c, d) {\n    if ((t /= d / 2) < 1) return (c / 2) * t * t * t + b;\n    return (c / 2) * ((t -= 2) * t * t + 2) + b;\n  },\n  easeInQuart(x, t, b, c, d) {\n    return c * (t /= d) * t * t * t + b;\n  },\n  easeOutQuart(x, t, b, c, d) {\n    return -c * ((t = t / d - 1) * t * t * t - 1) + b;\n  },\n  easeInOutQuart(x, t, b, c, d) {\n    if ((t /= d / 2) < 1) return (c / 2) * t * t * t * t + b;\n    return (-c / 2) * ((t -= 2) * t * t * t - 2) + b;\n  },\n  easeInQuint(x, t, b, c, d) {\n    return c * (t /= d) * t * t * t * t + b;\n  },\n  easeOutQuint(x, t, b, c, d) {\n    return c * ((t = t / d - 1) * t * t * t * t + 1) + b;\n  },\n  easeInOutQuint(x, t, b, c, d) {\n    if ((t /= d / 2) < 1) return (c / 2) * t * t * t * t * t + b;\n    return (c / 2) * ((t -= 2) * t * t * t * t + 2) + b;\n  },\n  easeInSine(x, t, b, c, d) {\n    return -c * Math.cos((t / d) * (Math.PI / 2)) + c + b;\n  },\n  easeOutSine(x, t, b, c, d) {\n    return c * Math.sin((t / d) * (Math.PI / 2)) + b;\n  },\n  easeInOutSine(x, t, b, c, d) {\n    return (-c / 2) * (Math.cos((Math.PI * t) / d) - 1) + b;\n  },\n  easeInExpo(x, t, b, c, d) {\n    return t == 0 ? b : c * Math.pow(2, 10 * (t / d - 1)) + b;\n  },\n  easeOutExpo(x, t, b, c, d) {\n    return t == d ? b + c : c * (-Math.pow(2, (-10 * t) / d) + 1) + b;\n  },\n  easeInOutExpo(x, t, b, c, d) {\n    if (t == 0) return b;\n    if (t == d) return b + c;\n    if ((t /= d / 2) < 1) return (c / 2) * Math.pow(2, 10 * (t - 1)) + b;\n    return (c / 2) * (-Math.pow(2, -10 * --t) + 2) + b;\n  },\n  easeInCirc(x, t, b, c, d) {\n    return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n  },\n  easeOutCirc(x, t, b, c, d) {\n    return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n  },\n  easeInOutCirc(x, t, b, c, d) {\n    if ((t /= d / 2) < 1) return (-c / 2) * (Math.sqrt(1 - t * t) - 1) + b;\n    return (c / 2) * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n  },\n  easeInElastic(x, t, b, c, d) {\n    let s = 1.70158;\n    let p = 0;\n    let a = c;\n    if (t == 0) return b;\n    if ((t /= d) == 1) return b + c;\n    if (!p) p = d * 0.3;\n    if (a < Math.abs(c)) {\n      a = c;\n      s = p / 4;\n    } else {\n      s = (p / (2 * Math.PI)) * Math.asin(c / a);\n    }\n    return (\n      -(\n        a *\n        Math.pow(2, 10 * (t -= 1)) *\n        Math.sin(((t * d - s) * (2 * Math.PI)) / p)\n      ) + b\n    );\n  },\n  easeOutElastic(x, t, b, c, d) {\n    let s = 1.70158;\n    let p = 0;\n    let a = c;\n    if (t == 0) return b;\n    if ((t /= d) == 1) return b + c;\n    if (!p) p = d * 0.3;\n    if (a < Math.abs(c)) {\n      a = c;\n      s = p / 4;\n    } else {\n      s = (p / (2 * Math.PI)) * Math.asin(c / a);\n    }\n    return (\n      a * Math.pow(2, -10 * t) * Math.sin(((t * d - s) * (2 * Math.PI)) / p) +\n      c +\n      b\n    );\n  },\n  easeInOutElastic(x, t, b, c, d) {\n    let s = 1.70158;\n    let p = 0;\n    let a = c;\n    if (t == 0) return b;\n    if ((t /= d / 2) == 2) return b + c;\n    if (!p) p = d * (0.3 * 1.5);\n    if (a < Math.abs(c)) {\n      a = c;\n      s = p / 4;\n    } else {\n      s = (p / (2 * Math.PI)) * Math.asin(c / a);\n    }\n    if (t < 1)\n      return (\n        -0.5 *\n          (a *\n            Math.pow(2, 10 * (t -= 1)) *\n            Math.sin(((t * d - s) * (2 * Math.PI)) / p)) +\n        b\n      );\n    return (\n      a *\n        Math.pow(2, -10 * (t -= 1)) *\n        Math.sin(((t * d - s) * (2 * Math.PI)) / p) *\n        0.5 +\n      c +\n      b\n    );\n  },\n  easeInBack(x, t, b, c, d, s) {\n    if (s == undefined) s = 1.70158;\n    return c * (t /= d) * t * ((s + 1) * t - s) + b;\n  },\n  easeOutBack(x, t, b, c, d, s) {\n    if (s == undefined) s = 1.70158;\n    return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n  },\n  easeInOutBack(x, t, b, c, d, s) {\n    if (s == undefined) s = 1.70158;\n    if ((t /= d / 2) < 1)\n      return (c / 2) * (t * t * (((s *= 1.525) + 1) * t - s)) + b;\n    return (c / 2) * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2) + b;\n  },\n  easeInBounce(x, t, b, c, d) {\n    return c - easing.easeOutBounce(x, d - t, 0, c, d) + b;\n  },\n  easeOutBounce(x, t, b, c, d) {\n    if ((t /= d) < 1 / 2.75) return c * (7.5625 * t * t) + b;\n    if (t < 2 / 2.75) return c * (7.5625 * (t -= 1.5 / 2.75) * t + 0.75) + b;\n    if (t < 2.5 / 2.75)\n      return c * (7.5625 * (t -= 2.25 / 2.75) * t + 0.9375) + b;\n\n    return c * (7.5625 * (t -= 2.625 / 2.75) * t + 0.984375) + b;\n  },\n  easeInOutBounce(x, t, b, c, d) {\n    if (t < d / 2) return easing.easeInBounce(x, t * 2, 0, c, d) * 0.5 + b;\n    return easing.easeOutBounce(x, t * 2 - d, 0, c, d) * 0.5 + c * 0.5 + b;\n  },\n};\n\nexport const DEFAULT_TRANSITION = 1000 * 0.7;\nconst MODE_TRANSITION = 'transition';\nconst MODE_ORIG_LOADING = 'orig-loading';\nconst MODE_ORIG = 'orig';\nconst MODE_IMG_FAILED = 'failed';\nconst MODE_IMG = 'img';\n\nclass CanvasImage extends React.Component {\n  constructor(props) {\n    super(props);\n    this.state = {\n      width: props.width || 1440,\n      height: props.height || 1080,\n      started: 0,\n      mode: MODE_ORIG,\n    };\n\n    this.watches = {};\n  }\n\n  render() {\n    // extract img property\n    const {\n      img,\n      orig,\n      background,\n      width,\n      height,\n      setBelongsToCanvasImage,\n      ...copyOfProps\n    } = this.props;\n\n    if (imgLoading(this.orig) || imgLoading(this.img)) {\n      return (\n        <div className=\"canvas-image-container\">\n          <SpinnerCover spinning>\n            <canvas\n              ref=\"canvas\"\n              width={this.state.width}\n              height={this.state.height}\n              {...copyOfProps}\n            />\n          </SpinnerCover>\n        </div>\n      );\n    }\n    return (\n      <div>\n        <canvas\n          ref=\"canvas\"\n          width={this.state.width}\n          height={this.state.height}\n          {...copyOfProps}\n        />\n        <span className=\"hover-icon fa-stack fa-2x text-black-50\">\n          <i className=\"fas fa-square fa-stack-2x\" />\n          <i className=\"fas fa-pencil-alt fa-stack-1x fa-inverse\" />\n        </span>\n      </div>\n    );\n  }\n\n  componentDidMount() {\n    const { setBelongsToCanvasImage } = this.props;\n    this.resizeTo(this.orig);\n    this.watch('img');\n    this.watch('orig');\n    this.checkMode();\n    setBelongsToCanvasImage && setBelongsToCanvasImage();\n  }\n\n  componentWillUnmount() {\n    this.unwatch('orig');\n    this.unwatch('img');\n    this.cancelDraw();\n  }\n\n  componentDidUpdate(prevProps) {\n    if (prevProps.img !== this.props.img) {\n      imgLoading(this.orig)\n        ? this.updateMode(MODE_ORIG_LOADING)\n        : this.updateMode(MODE_ORIG);\n      this.watch('img');\n      this.checkMode();\n    }\n    if (prevProps.orig !== this.props.orig) {\n      this.watch('orig');\n      this.checkMode();\n    }\n  }\n\n  updateMode(mode, callback) {\n    this.setState({ mode }, () => {\n      if (callback) {\n        callback();\n      }\n    });\n  }\n\n  resizeTo(img) {\n    if (!imgLoaded(img)) return;\n\n    if (img.width === this.state.width && img.height === this.state.height)\n      return;\n    this.setState({\n      width: img.width,\n      height: img.height,\n    });\n  }\n\n  watch(property) {\n    this.unwatch(property);\n\n    const image = this[property] || this.props[property];\n    const loadedState = {};\n    loadedState[property] = true;\n\n    if (!image) return;\n\n    if (typeof image === 'string') {\n      const imgObj = new Image();\n      imgObj.crossOrigin = 'anonymous';\n      imgObj.src = image;\n      this[property] = imgObj;\n    } else {\n      this[property] = image;\n    }\n\n    this.watches[property] = new ImageWatcher(this[property], why =>\n      this.setState(loadedState, () =>\n        this.checkMode([this[property].src, why])\n      )\n    );\n  }\n\n  unwatch(property) {\n    const unloadedState = {};\n    unloadedState[property] = false;\n\n    this.watches[property] && this.watches[property].unwatch();\n    delete this.watches[property];\n    delete this[property];\n    this.setState(unloadedState);\n  }\n\n  checkMode(why) {\n    switch (this.state.mode) {\n      case MODE_ORIG_LOADING:\n        if (imgLoaded(this.orig)) {\n          this.updateMode(MODE_ORIG, () => {\n            this.resizeTo(this.orig);\n          });\n        }\n        break;\n      case MODE_ORIG:\n        if (imgFailed(this.img)) {\n          this.updateMode(MODE_IMG_FAILED, () => {\n            if (imgLoaded(this.orig)) {\n              this.resizeTo(this.orig);\n            }\n          });\n        } else if (imgLoaded(this.img)) {\n          this.setState(\n            {\n              mode: MODE_TRANSITION,\n              started: this.now(),\n              width: this.img.width,\n              height: this.img.height,\n            },\n            () => this.draw()\n          );\n        }\n        break;\n      case MODE_TRANSITION:\n        if (this.elapsed > this.animationTime) {\n          this.updateMode(MODE_IMG, () => {\n            this.setState({ started: 0 });\n          });\n        }\n        break;\n      case MODE_IMG_FAILED:\n        break;\n    }\n    this.draw();\n  }\n\n  getContext() {\n    return ReactDOM.findDOMNode(this.refs.canvas).getContext('2d');\n  }\n\n  queueDraw() {\n    this.reqId = this.reqId || window.requestAnimationFrame(() => this.draw());\n  }\n\n  cancelDraw() {\n    this.cancelled = true;\n    if (this.reqId) window.cancelAnimationFrame(this.reqId);\n    this.reqId = null;\n  }\n\n  draw() {\n    const ctx = this.getContext();\n    const { img } = this;\n    const { orig } = this;\n\n    if (this.props.background === 'transparent') {\n      ctx.clearRect(0, 0, this.state.width, this.state.height);\n    } else {\n      ctx.fillStyle = this.props.background || '#f7f7f7';\n      ctx.fillRect(0, 0, this.state.width, this.state.height);\n    }\n\n    this.reqId = null;\n    switch (this.state.mode) {\n      case MODE_TRANSITION:\n        this.drawTransition(ctx, img, orig);\n        break;\n      case MODE_IMG:\n        this.drawImg(ctx, img, 1);\n        break;\n      case MODE_ORIG_LOADING:\n      case MODE_ORIG:\n      case MODE_IMG_FAILED:\n      default:\n        this.drawImg(ctx, orig, 1);\n        break;\n    }\n  }\n\n  drawTransition(ctx, img, orig) {\n    // val/max, val, start, end, max\n    const time = this.elapsed;\n    const max = this.animationTime;\n    const origAlpha = 1 - easing.easeOutCubic(time / max, time, 0, 1.0, max);\n    const imgAlpha = easing.easeInQuad(time / max, time, 0, 1.0, max);\n    if (time === null) return;\n\n    if (time < max) {\n      this.drawImg(ctx, orig, origAlpha);\n      this.queueDraw();\n    } else {\n      this.updateMode(MODE_IMG);\n    }\n\n    this.drawImg(ctx, img, imgAlpha);\n  }\n\n  drawImg(ctx, img, alpha) {\n    if (!imgLoaded(img)) {\n      return;\n    }\n\n    const s1 = this.state.width / img.width;\n    const s2 = this.state.height / img.height;\n    const s3 = s1 < s2 ? s1 : s2;\n    const s = s3 > 1 ? 1 : s3;\n    ctx.save();\n\n    ctx.translate(Math.floor(this.state.width / 2), 0);\n    ctx.scale(s3, s3);\n    ctx.translate(-Math.floor(img.width / 2), 0);\n    ctx.globalAlpha = alpha;\n    ctx.drawImage(img, 0, 0);\n    ctx.restore();\n  }\n\n  now() {\n    return new Date().getTime();\n  }\n\n  get elapsed() {\n    if (this.state.started) {\n      return this.now() - this.state.started;\n    }\n    return null;\n  }\n\n  get animationTime() {\n    return this.props.max || DEFAULT_TRANSITION;\n  }\n}\n\nexport default CanvasImage;\n","'use strict';\n\n// Import Libraries\nimport React     from 'react';\n// Import JS Modules\nimport { builderDispatch, WebUI, PrismUI } from '../../_utils/ui';\nimport { getViewport } from '../../_utils/hoc/with-viewport-size';\n\n// --------------------------------------------------------------------\n\nclass ChicletsBase extends React.Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      disabled: false\n    };\n  }\n\n  componentDidMount() {\n    this.loadItems();\n\n    this.dispatchToken = builderDispatch.register(payload => {\n      switch (payload.type) {\n        case PrismUI.SAVE_DONE:\n          this.loadItems();\n          break;\n        case WebUI.UPLOAD_ERROR:\n        case WebUI.UPLOAD_BEGUN:\n        case WebUI.UPLOAD_DONE:\n          this.setState({\n            disabled: false\n          });\n          break;\n        case WebUI.HIDE_CUSTOM_PAGE:\n          this.handleItemClick(getViewport().isMobile ? \"photos\" : \"design\");\n          break;\n      }\n    });\n  }\n\n  componentWillUnmount() {\n    builderDispatch.unregister(this.dispatchToken);\n  }\n\n  handleItemClick(option) {\n    if (typeof this.props.onClicked === 'function') {\n      activeView.deselectAll && activeView.deselectAll();\n      this.props.onClicked(option);\n    }\n  }\n}\n\n// --------------------------------------------------------------------\n\nexport default ChicletsBase;\n","import { usePrismItemStore } from 'stores/usePrismItemStore';\n\nclass HideUsedPhotos {\n  static get() {\n    return sessionStorage.getItem(`hideUsedPhotos:${usePrismItemStore.getState().prismItem.id}`) === 'true';\n  }\n\n  static set(value) {\n    sessionStorage.setItem(`hideUsedPhotos:${usePrismItemStore.getState().prismItem.id}`, `${value}`);\n  }\n}\n\nexport default HideUsedPhotos;\n","'use strict';\n\n// Import Libraries\nimport React from 'react';\n// Import JS Modules\nimport fetchImage from '../../../_utils/fetch-image';\nimport IU from '../../../_utils/img/img-utils';\nimport stashFns from '../../misc/stash-fns';\nimport genericHelpers from '../../../_utils/generic-helpers';\nimport HideUsedPhotos from '../../utils/hide-used-photos';\nimport sendToGoogleAnalytics from '../../desktop/slot-tools/send-to-google-analytics';\nimport { ThumbnailStore, prismAction } from '../../utils/stores';\nimport { autofillOnImageUploadNormal } from '../../utils/autofill';\nimport { WebUI, PrismUI, builderDispatch } from '../../../_utils/ui';\nimport { isMultiPageStandardProduct } from '../../trays/tray-determiner';\nimport { fireAddPhotos } from '../../desktop/lib/add-photos-interface';\nimport { usePrismItemStore } from 'stores/usePrismItemStore';\n\nconst urlMunge = IU.imgHelpers.urlMunge;\n\n// --------------------------------------------------------------------\nclass PhotosTrayBase extends React.PureComponent {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      pending: false,\n      removed: [],\n    };\n\n    this.handleSaveDone = genericHelpers.debounce(this.handleSaveDone);\n  }\n\n  componentDidMount() {\n    this.dispatchToken = builderDispatch.register(payload => {\n      switch (payload.type) {\n        case WebUI.UPLOAD_BEGUN:\n          this.handleUploadBegun(payload);\n          break;\n        case WebUI.UPLOAD_PROGRESS:\n          this.handleUploadProgress(payload);\n          builderDispatch.delayedDispatch({\n            type: PrismUI.IMAGES_UPDATED\n          });\n          break;\n        case WebUI.UPLOAD_DONE:\n          this.handleUploadDone();\n          break;\n        case PrismUI.SAVE_DONE:\n          this.handleSaveDone();\n          break;\n      }\n    });\n  }\n\n  componentWillUnmount() {\n    builderDispatch.unregister(this.dispatchToken);\n  }\n\n  getThumbnails() {\n    const images = (() => {\n      const removed = this.state.removed.reduce((memo, id) => {\n        memo[id] = true;\n        return memo;\n      }, {});\n\n      return ThumbnailStore.list().filter(image => !removed[image.id]);\n    })();\n\n    return {\n      $thumbnails: images.map(this.renderThumbnail),\n      empty: images.length === 0\n    };\n  }\n\n  handleUploadDone() {\n    this.setState({ pending: false });\n  }\n\n  shouldAutofill = () => {\n    if (isMultiPageStandardProduct() && this.hasSingleImageSlot()) return false;\n  }\n\n  hasSingleImageSlot = () => {\n    if (!window.activeView)  {\n      return false;\n    }\n\n    let count = 0;\n\n    window.activeView.slots.forEach(slot => {\n      if (slot.isImage) {\n        count++;\n      }\n    });\n\n    return count === 1;\n  }\n\n  handleAddClick = (imageId, url) => {\n    if (!window.activeView) {\n      return;\n    }\n    const slotId = (() => {\n      if (window.activeView && activeView.selected && activeView.selected.acceptsImage({ allowOptionalBackground: true })) {\n        return activeView.selected.id;\n      }\n\n      return activeView.findFirstAvailableImageSlot();\n    })();\n\n    const imgSlotRef = stashFns.getImgSlotRef({ id: slotId, imgId: imageId });\n    const data = stashFns.getAllImageStateValues(imgSlotRef, { image: imageId });\n    const img = fetchImage(urlMunge(url), 'use-credentials');\n\n    activeView.setImageById(slotId, img, data);\n    activeView.do_save();\n\n    builderDispatch.dispatch({\n      type: WebUI.PHOTO_TRAY_IMAGE_CLICKED\n    });\n  }\n\n  handleRemoveClick = (imageId) => {\n    this.setState(prevState => {\n      return {\n        removed: prevState.removed.concat(imageId)\n      }\n    }, () => {\n      prismAction.deleteImage(imageId).done(() => {\n        ThumbnailStore.remove(imageId);\n        // State needs to be forced as ThumbnailStore is bound to\n        // the window and not flux/react state.\n        this.forceUpdate();\n      });\n    });\n  };\n\n  handleUploadBegun({ number_of_files }) {\n    this.setState(() => {\n      return {\n        pending: true,\n        progress: {\n          current: 1,\n          total: number_of_files,\n        },\n      };\n    });\n  };\n\n  handleUploadProgress() {\n    this.setState(prevState => {\n      const { progress: prevProgress } = prevState;\n      const nextProgress = {\n        ...prevProgress,\n        current: prevProgress?.current + 1,\n      };\n\n      if (nextProgress?.current <= nextProgress.total) {\n        return {\n          progress: nextProgress,\n        };\n      }\n\n      return {};\n    });\n  }\n\n  handleHideUsedPhotos = () => {\n    const callback = () => {\n      HideUsedPhotos.set(this.state.filterUsed);\n    };\n\n    this.setState(({ filterUsed: prevFilterUsed }) => {\n      return {\n        filterUsed: !prevFilterUsed,\n      };\n    }, callback);\n  };\n\n\n  handleAutofillClick = () => {\n    this.setState({\n      showAutofillModal: true,\n    });\n    sendToGoogleAnalytics('photos-tray', 'autoFill-click')\n  };\n\n  handleAutofillClose = () => {\n    this.setState({\n      showAutofillModal: false,\n    });\n  };\n\n  handlePhotoLoaderClick = () => {\n    sendToGoogleAnalytics('photos-tray','add-photos')\n    fireAddPhotos();\n  };\n\n  handleUploadClosed() {\n    if (this.addPhotosButtonRef) {\n      this.addPhotosButtonRef.focus();\n    }\n  }\n\n  clearErrors = () => {\n    this.setState({\n      pending: false,\n      progress: null,\n    });\n    usePrismItemStore.setState(() => ({\n      failedImagesUploaded: []\n    }));\n  }\n\n  handleSaveDone = () => {\n    this.forceUpdate();\n  };\n}\n\nexport default PhotosTrayBase;\n","// Import Libraries\nimport React from 'react';\n// Import JS Modules\nimport { builderDispatch } from './ui';\nimport genericHelpers      from './generic-helpers';\n\n// -----------------------------------------------------------\n// refreshOnEvents\n// -----------------------------------------------------------\nfunction getDisplayName(Component) {\n  return Component.displayName || Component.name || 'Component';\n}\n\nconst refreshOnEvents = (events, options = {}) => WrappedComponent => (\n  class RefreshOnEvents extends React.Component {\n    static displayName =\n      `RefreshOnEvents(${getDisplayName(WrappedComponent)})`;\n\n\n    constructor(props) {\n      super(props);\n\n      this.handleRefresh = genericHelpers.debounce(this.handleRefresh);\n    }\n\n    componentDidMount() {\n      this.dispatchToken = builderDispatch.register(({ type }) => {\n        if (events.indexOf(type) !== -1) {\n          this.handleRefresh();\n        }\n      });\n    }\n\n    componentWillUnmount() {\n      builderDispatch.unregister(this.dispatchToken);\n    }\n\n    render() {\n      let props = this.props;\n      if (options.key) { props = {key: options.key(), ...this.props}; }\n      return <WrappedComponent {...props} />;\n    }\n\n    handleRefresh = () => {\n      this.forceUpdate();\n    }\n  }\n);\n\nexport default refreshOnEvents;\n","import React from 'react';\n\nconst FavouritesTrayItemPreview = ({image}) => {\n  return (\n    <div className=\"favourites-tray-item-preview\">\n      <img\n        src={image}\n        className=\"favourites-tray-item-preview-image\"\n        alt=\"Favourites Tray Item Preview\"\n        />\n    </div>\n  );\n}\n\nexport default FavouritesTrayItemPreview;\n","import React from 'react';\n\nconst FavouritesTrayItemPreviewDesktop = ({image, handleClick}) => {\n  return (\n    <div className=\"favourites-tray-item-preview-desktop-overlay\">\n      <div className=\"favourites-tray-item-preview-desktop\">\n        <img src={image} className=\"favourites-tray-item-preview-image-desktop\" alt=\"favourites preview\"/>\n        <button\n          className=\"btn btn-link btn-close float-right\"\n          aria-label=\"Close\"\n          autoFocus\n          onClick={handleClick}>\n          <i className=\"skinny-icon close\"/>\n        </button>\n      </div>\n    </div>\n  );\n}\n\nexport default FavouritesTrayItemPreviewDesktop;\n","import React, { Component } from 'react';\n\n// Import JS Modules\n\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport FavouritesTrayItemPreview from \"../common/trays/favourites-tray-item-preview\";\nimport FavouritesTrayItemPreviewDesktop from  \"../common/trays/favourites-tray-item-preview-desktop\";\nimport { getViewport } from \"../../_utils/hoc/with-viewport-size\";\n\nconst DRAG_ITEM = 'drag-item';\nconst DRAG_ITEM_HEIGHT = 60;\nconst DRAG_ITEM_WIDTH = 92;\nlet previewTimeout;\n\nconst PreviewIconButton = ( { handleClick } ) => {\n  return (\n        <span className=\"btn-zoom position-relative\" onClick={handleClick} >\n          <i className=\"skinny-icon zoom-in\" />\n        </span>\n  );\n}\n\nclass DragItem extends Component {\n  static propTypes = {\n    children: PropTypes.element.isRequired,\n    className: PropTypes.string,\n    onDragStart: PropTypes.func,\n    onDrop: PropTypes.func,\n    mobileTouchEvent: PropTypes.func,\n    image: PropTypes.string,\n    showPreviewIconButton: PropTypes.bool\n  };\n\n  constructor() {\n    super();\n    this.state = {};\n  }\n\n  render() {\n    return (\n      <div ref={drag => this.drag = drag} onContextMenu={this.showContextMenu}\n        className={classNames('draggable-item d-inline-block', this.props.className)}\n        draggable\n        onDragStart={this.handleDragStart}\n        onDragEnd={this.handleDragEnd}\n        onTouchStart={this.handleTouchStart}\n        onTouchMove={this.handleTouchMove}\n        onTouchEnd={this.handleTouchEnd}\n        onMouseEnter={this.handleMouseEnter}\n        onMouseLeave={this.handleMouseLeave}\n        onClick={this.handleClick}>\n        {this.props.children}\n        {this.state.showItemPreview && <FavouritesTrayItemPreview image={this.props.image} />}\n        {\n          this.state.showItemPreviewDesktop &&\n            <FavouritesTrayItemPreviewDesktop\n                image={this.props.image}\n                handleClick={this.showItemPreviewDesktop}\n            />\n        }\n        {\n          this.showPreviewIconButton()\n            && <PreviewIconButton\n                handleClick={this.showItemPreviewDesktop}\n            />\n        }\n      </div>\n    );\n  }\n\n  get dragItem() {\n    return document.getElementById(DRAG_ITEM);\n  }\n\n  get childItem() {\n    return this.drag.children[0];\n  }\n\n  showContextMenu = (e) => {\n    if (getViewport().isMobile) {\n      e.preventDefault();\n      e.stopPropagation();\n      return false;\n    }\n  }\n\n  showPreviewIconButton = () => {\n    const { showPreviewIconButton } = this.props;\n    if (getViewport().isMobile) return false;\n\n    return showPreviewIconButton;\n  }\n\n  handleClick = () => {\n    if (this.state.showItemPreview) {\n      return this.handleTouch();\n    }\n    if (this.state.showItemPreviewDesktop) {\n      return this.setState({ showItemPreviewDesktop: false })\n    }\n    this.childItem.click();\n  };\n\n  handleMouseEnter = () => {\n    this.childItem.classList.add('hover');\n  };\n\n  handleMouseLeave = () => {\n    this.childItem.classList.remove('hover');\n  };\n\n  handleDragStart = event => {\n    const dataStr = this.childItem.dataset.dragPayload;\n    const payload = JSON.parse(dataStr);\n\n    event.dataTransfer.effectAllowed = 'copy';\n    event.dataTransfer.setData('text', dataStr || '');\n    Object.keys(payload).forEach((key) => {\n      event.dataTransfer.setData(key, JSON.stringify(payload[key]));\n    });\n  }\n\n  handleDragEnd = () => {\n  };\n\n  handleTouchStart = () => {\n    this.previewTouchEvent();\n\n    const dragItem = document.createElement('div');\n    dragItem.id = DRAG_ITEM;\n    document.body.appendChild(dragItem);\n\n    this.backgroundImage = (this.backgroundImage || (() => {\n      return `url(${this.childItem.dataset.dragImg})`;\n    })());\n\n    setTimeout(this.makeVisible, 500);\n  };\n\n  previewTouchEvent = () => {\n    if (!getViewport().isMobile || !this.props.image) return false;\n    let modalShowing = this.state.showItemPreview;\n\n    previewTimeout = setTimeout(() => {\n       this.setState({ showItemPreview: true });\n       if (modalShowing) this.setState({ showItemPreview: false });\n    }, 500);\n  }\n\n  handleTouch() {\n    this.setState({ showItemPreview: false });\n  }\n\n  handleTouchMove = event => {\n    this.clearPreviewTimeout();\n    const dragItem = this.dragItem;\n    const trayHeight = $('aside.chiclets-and-tray')[0].clientHeight;\n    const scrollTray = $('div.button-ribbon > div.buttons.d-flex.w-100')[0];\n    const { clientX, clientY } = event.touches[0];\n\n    dragItem.style.left = (clientX - DRAG_ITEM_WIDTH) + 'px';\n    dragItem.style.top = (clientY - DRAG_ITEM_HEIGHT) + 'px';\n    dragItem.style.backgroundImage = this.backgroundImage;\n\n    if (clientY < window.innerHeight - trayHeight) {\n      scrollTray.classList.add('drag-start');\n    }\n\n    const view = this.getActiveView(clientX, clientY);\n    $(view).trigger('dragover', event);\n  };\n\n  handleTouchEnd = event => {\n    this.clearPreviewTimeout();\n    const dragItem = this.dragItem;\n    const scrollTray = $('div.button-ribbon > div.buttons.d-flex.w-100')[0];\n    this.triggerCanvasEvent(event);\n    dragItem.parentElement.removeChild(dragItem);\n    scrollTray.classList.remove('drag-start');\n\n    const { clientX, clientY } = event.changedTouches[0];\n    const element = document.elementFromPoint(clientX, clientY);\n\n    // Don't trigger the drop event if the drag item has\n    // not left the tray\n    if (element && element.closest('.chiclets-and-tray')) return;\n\n    this.props.onDrop && this.props.onDrop();\n  };\n\n  clearPreviewTimeout = () => {\n    if (previewTimeout) {\n      clearTimeout(previewTimeout);\n      previewTimeout = null;\n    }\n    if (this.state.showItemPreview) {\n      this.setState({ showItemPreview: false });\n    }\n  }\n\n  getActiveView = (x, y) => {\n    // Get the element at the drag coordinates\n    const element = document.elementFromPoint(x, y);\n\n    return element && element.classList.contains('prism-viewport-canvas')\n      ? element\n      : null;\n  }\n\n  makeVisible = () => {\n    const dragItem = this.dragItem;\n    if (!dragItem) return;\n    dragItem.classList.add('visible');\n  };\n\n  triggerCanvasEvent = event => {\n    $(activeView.el).trigger('drop', event);\n  };\n\n  showItemPreviewDesktop = (e) => {\n    e.stopPropagation();\n\n    if (this.state.showItemPreviewDesktop) {\n      return this.setState({ showItemPreviewDesktop: false })\n    }\n\n    this.setItemPreviewDesktopPosition(e.clientY, e.clientX);\n    this.setState({ showItemPreviewDesktop: true })\n  }\n\n  setItemPreviewDesktopPosition = (top, left) => {\n    const offsetTop = 80;\n    const offsetLeft = 40;\n    const element = document.documentElement;\n\n    element.style.setProperty('--favourites-tray-item-preview-left', (left+offsetLeft) + \"px\");\n    element.style.setProperty('--favourites-tray-item-preview-top', (top-offsetTop) + \"px\");\n  }\n}\n\nexport default DragItem;\n","import React      from 'react';\nimport classNames from 'classnames';\n\n const spinner = (props) => (\n  <div className=\"spinner-backdrop\">\n    <i className={ classNames(\"accent-text fas fa-circle-notch fa-spin\", props.classes) } />\n  </div>\n);\n\n export default spinner;","'use strict';\n\n// Import Libraries\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport classNames from 'classnames';\n// Import JS Modules\nimport { getFoldersBySection } from '../../trays/favourites-tray-helpers';\nimport { hasEdgesTray } from '../../trays/tray-determiner';\nimport TemplateStore from '../../templates/template-store';\nimport templateInterrogator from '../../misc/template-interrogator';\nimport IU from '../../../_utils/img/img-utils';\nimport { usePrismItemStore } from 'stores/usePrismItemStore';\nimport { useTabTray } from 'stores/useTabTray';\nimport { useTemplateSelectStore } from 'stores/useTemplateStore';\n// Import JSX Modules\nimport DragItem from '../../utils/drag-item';\nimport Spinner from '../../utils/spinner';\nimport isCard from '../../utils/is-card';\nimport { isAlbum } from '../../trays/tray-determiner';\n\nimport sendToGoogleAnalytics from '../../desktop/slot-tools/send-to-google-analytics';\n\nconst urlMunge = IU.imgHelpers.urlMunge;\n\nconst layoutFilter = {\n  left: 'right',\n  right: 'left',\n};\n\n// --------------------------------------------------------------------\n\nclass LayoutTemplateItem extends React.PureComponent {\n  state = {};\n\n  componentDidMount() {\n    this._isMounted = true;\n    if (this.props.onMounted) {\n      this.props.onMounted(this);\n    } else if (this.props.autoLoad) {\n      this.show();\n    }\n  }\n\n  componentWillUnmount() {\n    this._isMounted = false;\n  }\n\n  render() {\n    const { loaded } = this.state;\n    const {\n      id,\n      name,\n      autoFocus,\n      label,\n      selected,\n      draggable = true,\n    } = this.props;\n\n    if (!loaded) {\n      return (\n        <button\n          className=\"btn btn-link btn-thumbnail\"\n          aria-label={label}\n          aria-pressed={selected}\n          autoFocus={autoFocus}\n          onClick={this.handleClick}>\n          <Spinner />\n        </button>\n      );\n    }\n\n    const orientation = this.orientation;\n    const src = this.src;\n\n    const $button = (\n      <button\n        aria-label={label}\n        aria-pressed={selected}\n        className={classNames(\n          'btn btn-link btn-thumbnail flex-shrink-0 rounded-0',\n          orientation,\n          { selected: selected }\n        )}\n        data-click-event={`layout:${id}`}\n        data-drag-img={src}\n        data-drag-payload={JSON.stringify({ layoutId: id, orientation })}\n        onClick={this.handleClick}>\n        <img\n          alt={name}\n          className={classNames('img-fluid', {\n            'template-selected-modal': this.props.selectedTemplateEasyBooks,\n          })}\n          src={src}\n        />\n      </button>\n    );\n\n    if (!draggable) {\n      return $button;\n    }\n\n    return (\n      <DragItem className={classNames(orientation)} onDrop={this.handleClick}>\n        {$button}\n      </DragItem>\n    );\n  }\n\n  get src() {\n    let { src } = this.props;\n\n    src = src.replace('/prismlayouts', '/prismthumbs');\n    return urlMunge(src);\n  }\n\n  get orientation() {\n    const { tags } = this.props;\n    return templateInterrogator.orientationByTags(tags);\n  }\n\n  handleClick = async () => {\n    if (this.props.onClick) {\n      this.props.onClick(this.props.id);\n    }\n\n    sendToGoogleAnalytics('layouts', `${this.props.label}`);\n\n    useTabTray.getState().updateShowPhotosTray(true);\n\n    useTemplateSelectStore.getState().updateTemplateSelectStore({\n      templateID: this.props.id,\n      orientation: this.orientation,\n    });\n  };\n\n  show = () => {\n    const image = new Image();\n    image.crossOrigin = 'use-credentials';\n    image.onload = () => {\n      this._isMounted &&\n        this.setState({\n          loaded: true,\n        });\n    };\n    image.src = this.src;\n  };\n}\n\n// --------------------------------------------------------------------\n\n// this is actually for design templates but it's called layouts\nclass LayoutsTrayBase extends React.Component {\n  constructor(props) {\n    super(props);\n  }\n\n  UNSAFE_componentWillMount() {\n    this._observing = [];\n\n    const observerOptions = {\n      root: ReactDOM.findDOMNode(this),\n      rootMargin: '0px 50px 50px 0px',\n    };\n    this._observer = new IntersectionObserver(\n      this.handleItemHovedIntoView,\n      observerOptions\n    );\n  }\n\n  componentWillUnmount() {\n    this._observer.disconnect();\n  }\n\n  get foldersBySection() {\n    return getFoldersBySection(this.templateGroups, hasEdgesTray());\n  }\n\n  get templateGroups() {\n    try {\n      const templateGroups = TemplateStore.list() || [];\n\n      const prismItem = usePrismItemStore.getState().prismItem;\n\n      if (isCard())\n        return templateInterrogator.filterTemplatesForThoseWithMultipleOrientations(\n          templateGroups\n        );\n      if (isAlbum() && prismItem.pages?.[activeView.pageIndex]?.['page-is']) {\n        const oppositeSide =\n          layoutFilter[prismItem.pages[activeView.pageIndex]['page-is']];\n\n        return templateInterrogator.filterTemplates(templateGroups, {\n          side: oppositeSide,\n        });\n      }\n\n      return templateGroups;\n    } catch (error) {\n      console.error(error);\n      return [];\n    }\n  }\n\n  handleItemMounted = item => {\n    const element = ReactDOM.findDOMNode(item);\n\n    this._observing.push({ item, element });\n    this._observer.observe(element);\n  };\n\n  handleItemHovedIntoView = entries => {\n    entries = entries.filter(entry => entry.isIntersecting);\n    let i = 0;\n\n    while (i < this._observing.length) {\n      const observee = this._observing[i];\n\n      if (entries.some(entry => entry.target == observee.element)) {\n        observee.item.show();\n\n        this._observer.unobserve(observee.element);\n        this._observing.splice(i, 1);\n      } else {\n        i++;\n      }\n    }\n  };\n}\n\n// --------------------------------------------------------------------\n\nexport { LayoutTemplateItem, LayoutsTrayBase };\n","// Import Libraries\nimport React from 'react';\n\n// Import JS Modules\nimport { findProductByFilters, fireTransform } from '../utils/category-info';\nimport { builderDispatch, PrismUI } from '../../_utils/ui';\nimport QuantityPricingTools         from '../quantity/quantity-pricing-tools';\nimport PrismBuilderReloader         from './prism-builder-reloader';\n\n// -----------------------------------------------------------\n\nconst OptionTrayMixin = WrappedComponent => (\n  class OptionLoader extends React.Component {\n    constructor(props) {\n      super(props);\n\n      this.state = {\n        filter: {}\n      };\n    }\n\n    componentDidMount() {\n      this.loadData();\n\n      this.dispatchToken = builderDispatch.register(payload => {\n        switch (payload.type) {\n          case PrismUI.ITEM_LOADED:\n            this.loadData();\n            break;\n        }\n      });\n    }\n\n    componentWillUnmount() {\n      builderDispatch.unregister(this.dispatchToken);\n    }\n\n    render() {\n      return <WrappedComponent ref={ ref => this.wrappedComponent = ref }\n                               {...this.props}\n                               filter={ this.state.filter }\n                               onFireTransform={this.fireTransform} />;\n    }\n\n    loadData() {\n      this.wrappedComponent.currentProductFilterInfo().\n        then(({ data, product }) => {\n          const { name: filterName } = this.props,\n                filter = Object.assign({}, data.filters.find(f => f.title == filterName)),\n                productPrice = getProductPrice(product);\n\n          // we only need to do this the filter that's pertinent to this tray\n          (filter.options || []).forEach(option => {\n            // these attributes have been added to the object\n            // and they'll remain stuck to it unless we shear them off\n            ['selected', 'enabled', 'priceDifference'].forEach(key => delete option[key]);\n\n            // augment each filter option with 'selected'\n            // if it's applicable to the current product.\n            option.selected = option.title == product.filters[filter.title];\n\n            // augment each filter option with 'enabled'\n            // if the option can be used in order choose another product.\n            const currentFilters = Object.assign({}, product.filters);\n            currentFilters[filterName] = option.title;\n\n            const matchingProduct = findProductByFilters(data.products, currentFilters);\n            if (matchingProduct) {\n              option.enabled = true;\n              option.priceDifference = getProductPrice(matchingProduct) - productPrice;\n            }\n          });\n\n          this.setState({\n            filter\n          });\n        });\n\n      function getProductPrice(product) {\n        return (new QuantityPricingTools(product)).getUnitPriceForQuantity();\n      }\n    }\n\n    fireTransform = async (value, transformAttempts=0) => {\n      const { name: filterName } = this.props;\n\n      const page = window.activeView.customPage ? window.prismViews.page : window.activeView;\n      await page.historyStack.takeSnapshot();\n\n      this.wrappedComponent.currentProductFilterInfo().\n        then(({ data, product: currentProduct }) => {\n          const targetFilters = {...currentProduct.filters, [filterName]: value},\n                targetProduct = findProductByFilters(data.products, targetFilters);\n\n          if (targetProduct && currentProduct.id != targetProduct.id) {\n            this.showModal();\n\n            fireTransform(targetProduct.id).\n              then(data => {\n                PrismBuilderReloader.start(data, false).\n                  finally(() => {\n                    this.hideModal();\n                    builderDispatch.delayedDispatch({\n                      type: PrismUI.PRODUCT_CHANGED\n                    });\n                  });\n              }).\n              catch(() => {\n                if (++transformAttempts < 3) {\n                  setTimeout(() => this.fireTransform(value, transformAttempts), 500);\n                  return;\n                }\n\n                this.hideModal();\n              });\n          }\n        });\n    }\n\n    showModal(action = 'show') {\n      builderDispatch.delayedDispatch({\n        type: PrismUI.MODAL_MESSAGE,\n        action: action\n      });\n    }\n\n    hideModal() {\n      this.showModal('hide');\n    }\n  }\n);\n\n// -----------------------------------------------------------\n\nexport default OptionTrayMixin;\n","// Import Libraries\nimport React from 'react';\n// Import JS Modules\nimport filterPropertyTitleToUpperCase from '../../../../_utils/product-filter-property-title-to-uppercase';\n\n// --------------------------------------------------------------------\n\nfunction titleClean(s) {\n  const regex = /\\\"/g\n\n  return s.replace(regex, '');\n}\n\nfunction wrapParenthesesWithSpan(s) {\n  const regex = /\\([^)]*\\)/g;\n\n  const matches = s.match(regex);\n  if (matches) {\n    s = <span>{s.replace(regex, '')}<small>{matches[0]}</small></span>;\n  }\n\n  return s;\n}\n\nconst Title = ({ children: title }) => (\n  <div className='option-title'>\n    {wrapParenthesesWithSpan(titleClean(filterPropertyTitleToUpperCase(title)))}\n  </div>\n);\n\n// --------------------------------------------------------------------\n\nexport default Title;\n","'use strict';\n\n// Import Libraries\nimport React from 'react';\nimport classNames from 'classnames';\n// Import JSX Modules\nimport Currency from '../../../../_utils/tools/currency';\n\n// --------------------------------------------------------------------\n\nconst PriceDifference = ({children}) => {\n  const difference = parseFloat(children);\n\n  if (difference) {\n    const differenceIsHigher = difference > 0;\n\n    return (\n      <span className={ classNames('price-difference', {'price-difference-higher': differenceIsHigher, 'price-difference-lower': !differenceIsHigher}) }>\n        { differenceIsHigher ? '+' : '-'}{Currency.format(Math.abs(difference))} ea.\n      </span>\n    );\n  }\n\n  return null;\n};\n\n// --------------------------------------------------------------------\n\nexport default PriceDifference;\n","// Import Libraries\nimport React     from 'react';\nimport classNames from 'classnames';\n\n// Import JS Modules\nimport { findVariable }   from '../../trays/tray-determiner';\nimport IU         from '../../../_utils/img/img-utils';\nimport { PrismUI,\n         builderDispatch }        from '../../../_utils/ui';\n// Import JSX Modules\nimport Title      from './options/title';\nimport sendToGoogleAnalytics from '../../desktop/slot-tools/send-to-google-analytics';\n\nconst urlMunge = IU.imgHelpers.urlMunge;\n\n// --------------------------------------------------------------------\n\nconst Variable = ({name, asset: src, value, selected, variableName, onClick}) => {\n  const handleClick = (() => {\n    if (!selected) {\n      return () => {\n        sendToGoogleAnalytics(`options-${variableName}`,`${value}`);\n        onClick(value);\n      };\n    }\n  })();\n\n  src = src && urlMunge(src);\n\n  return (\n    <button className={ classNames('btn btn-link flex-shrink-0 btn-variable btn-text', {active: selected}) }\n            title={ name }\n            data-click-event={ `option:${ name }` }\n            onClick={ handleClick }>\n      <img src={ src }\n           className={ classNames('img-fluid', {'d-none': !src}) } />\n      <div className='option-text'>\n        <Title>{ name }</Title>\n      </div>\n    </button>\n  );\n};\n\n// --------------------------------------------------------------------\n\nclass VariableTrayBase extends React.Component {\n  constructor(props) {\n    super(props);\n\n    this.handleItemClick = this.handleItemClick.bind(this);\n  }\n\n  componentDidMount() {\n    this.dispatchToken = builderDispatch.register(payload => {\n      switch (payload.type) {\n        case PrismUI.ITEM_LOADED:\n          this.forceUpdate();\n          break;\n      }\n    });\n  }\n\n  componentWillUnmount() {\n    builderDispatch.unregister(this.dispatchToken);\n  }\n\n  componentDidUpdate() {\n    delete this._data;\n  }\n\n  get data() {\n    return this._data || (this._data = findVariable(this.props.name) || {});\n  }\n\n  renderOption() {\n    const selected = wkData.values[this.data.id];\n\n    return function(option) {\n      return <Variable key={option.name}\n                      { ...option }\n                      variableName={ this.props.name }\n                      selected={ option.value == selected }\n                      onClick={ this.handleItemClick } />;\n    };\n  }\n\n  handleItemClick(value) {\n    const option = this.data.options.find(o => o.value == value);\n\n    wkData.values[this.data.id] = value;\n\n    builderDispatch.dispatch({\n      type: PrismUI.OPTION_SELECTED,\n      variable: this.data,\n      option: option\n    });\n\n    if (window.activeView) {\n      window.activeView.queueRedraw();\n    }\n\n    this.forceUpdate();\n\n    const formData = new FormData();\n    formData.append(`values[${ this.data.id }]`, value);\n    fetch(wkData.write_url, {\n      method: 'POST',\n      body: formData,\n      credentials: 'same-origin'\n    }).\n      then(response => {\n        if (response.ok) {\n          activeView.do_save();\n        }\n      });\n  }\n}\n\n// --------------------------------------------------------------------\n\nexport default VariableTrayBase;\n","// Import Libraries\nimport React     from 'react';\nimport classNames from 'classnames';\n\n// Import JS Modules\nimport TemplateStore from '../../templates/template-store';\nimport { useTemplateSelectStore } from 'stores/useTemplateStore';\nimport { WebUI,\n         builderDispatch } from '../../../_utils/ui';\n// Import JSX Modules\nimport Title from './options/title';\n\n// --------------------------------------------------------------------\n\nconst Wrap = ({title, wrap: value, selected, onClick}) => {\n  const handleClick = (() => {\n    if (!selected) {\n      return () => {\n        onClick(value);\n      };\n    }\n  })();\n\n  return (\n    <button className={ classNames('btn btn-link flex-shrink-0 btn-option', {active: selected}) }\n            title={ title }\n            data-click-event={ `wrap:${ title }` }\n            onClick={ handleClick }>\n      <div className='option-text'>\n        <Title>{ title }</Title>\n      </div>\n    </button>\n  );\n};\n\n// --------------------------------------------------------------------\n\nclass WrapsTrayBase extends React.Component {\n  constructor(props) {\n    super(props);\n\n    this.handleItemClick = this.handleItemClick.bind(this);\n  }\n\n  componentDidMount() {\n    this.dispatchToken = builderDispatch.register(payload => {\n      switch (payload.type) {\n        case WebUI.TEMPLATE_CHANGED:\n          this.forceUpdate();\n          break;\n      }\n    });\n  }\n\n  componentWillUnmount() {\n    builderDispatch.unregister(this.dispatchToken);\n  }\n\n  get data() {\n    return TemplateStore.wraps();\n  }\n\n  renderOption() {\n    const selected = (activeView && TemplateStore.currentWrap(activeView.template?.id) || {}).wrap;\n\n    return function(option) {\n      return (\n        <Wrap \n          key={option.wrap}\n          { ...option }\n          selected={ option.wrap === selected }\n          onClick={ this.handleItemClick } \n        />\n      );\n    }\n  }\n\n  handleItemClick(value) {\n    const newTemplate = TemplateStore.templateForWrap(value, activeView.template.id);\n\n    if (newTemplate) {\n      useTemplateSelectStore.getState().updateTemplateSelectStore({ \n        templateID: newTemplate\n      });\n    }\n  }\n}\n\n// --------------------------------------------------------------------\n\nexport default WrapsTrayBase;\n","'use strict';\n\n// Import Libraries\nimport React from 'react';\nimport classNames                  from 'classnames';\n// Import JS Modules\nimport translate                   from '../../_utils/tools/translate';\nimport { PrismUI, builderDispatch } from '../../_utils/ui';\nimport sendToGoogleAnalytics from '../../_prism-builder/desktop/slot-tools/send-to-google-analytics';\n\n// --------------------------------------------------------------------\n\nconst MobileAddToCartButton = ({className}) => {\n  return (\n    <button className={classNames('btn btn-primary add-to-cart', className)}\n            data-click-event=\"add-to-cart\"\n            data-test=\"add-to-cart-mobile\"\n            onClick={ handleClick }>\n      { wkData.in_cart ? 'Done' : `Add to ${translate('Cart')}` }\n    </button>\n  );\n\n  function handleClick() {\n    sendToGoogleAnalytics('Mobile','addToCart')\n\n    builderDispatch.dispatch({\n      type: PrismUI.EVENT_ADD_TO_CART\n    });\n  }\n};\n\n// --------------------------------------------------------------------\n\nexport default MobileAddToCartButton;\n","const reduxImpl = (reducer, initial) => (set, _get, api) => {\n  api.dispatch = (action) => {\n    set((state) => reducer(state, action), false, action);\n    return action;\n  };\n  api.dispatchFromDevtools = true;\n  return { dispatch: (...a) => api.dispatch(...a), ...initial };\n};\nconst redux = reduxImpl;\n\nconst trackedConnections = /* @__PURE__ */ new Map();\nconst getTrackedConnectionState = (name) => {\n  const api = trackedConnections.get(name);\n  if (!api)\n    return {};\n  return Object.fromEntries(\n    Object.entries(api.stores).map(([key, api2]) => [key, api2.getState()])\n  );\n};\nconst extractConnectionInformation = (store, extensionConnector, options) => {\n  if (store === void 0) {\n    return {\n      type: \"untracked\",\n      connection: extensionConnector.connect(options)\n    };\n  }\n  const existingConnection = trackedConnections.get(options.name);\n  if (existingConnection) {\n    return { type: \"tracked\", store, ...existingConnection };\n  }\n  const newConnection = {\n    connection: extensionConnector.connect(options),\n    stores: {}\n  };\n  trackedConnections.set(options.name, newConnection);\n  return { type: \"tracked\", store, ...newConnection };\n};\nconst devtoolsImpl = (fn, devtoolsOptions = {}) => (set, get, api) => {\n  const { enabled, anonymousActionType, store, ...options } = devtoolsOptions;\n  let extensionConnector;\n  try {\n    extensionConnector = (enabled != null ? enabled : (import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") && window.__REDUX_DEVTOOLS_EXTENSION__;\n  } catch (e) {\n  }\n  if (!extensionConnector) {\n    if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\" && enabled) {\n      console.warn(\n        \"[zustand devtools middleware] Please install/enable Redux devtools extension\"\n      );\n    }\n    return fn(set, get, api);\n  }\n  const { connection, ...connectionInformation } = extractConnectionInformation(store, extensionConnector, options);\n  let isRecording = true;\n  api.setState = (state, replace, nameOrAction) => {\n    const r = set(state, replace);\n    if (!isRecording)\n      return r;\n    const action = nameOrAction === void 0 ? { type: anonymousActionType || \"anonymous\" } : typeof nameOrAction === \"string\" ? { type: nameOrAction } : nameOrAction;\n    if (store === void 0) {\n      connection == null ? void 0 : connection.send(action, get());\n      return r;\n    }\n    connection == null ? void 0 : connection.send(\n      {\n        ...action,\n        type: `${store}/${action.type}`\n      },\n      {\n        ...getTrackedConnectionState(options.name),\n        [store]: api.getState()\n      }\n    );\n    return r;\n  };\n  const setStateFromDevtools = (...a) => {\n    const originalIsRecording = isRecording;\n    isRecording = false;\n    set(...a);\n    isRecording = originalIsRecording;\n  };\n  const initialState = fn(api.setState, get, api);\n  if (connectionInformation.type === \"untracked\") {\n    connection == null ? void 0 : connection.init(initialState);\n  } else {\n    connectionInformation.stores[connectionInformation.store] = api;\n    connection == null ? void 0 : connection.init(\n      Object.fromEntries(\n        Object.entries(connectionInformation.stores).map(([key, store2]) => [\n          key,\n          key === connectionInformation.store ? initialState : store2.getState()\n        ])\n      )\n    );\n  }\n  if (api.dispatchFromDevtools && typeof api.dispatch === \"function\") {\n    let didWarnAboutReservedActionType = false;\n    const originalDispatch = api.dispatch;\n    api.dispatch = (...a) => {\n      if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\" && a[0].type === \"__setState\" && !didWarnAboutReservedActionType) {\n        console.warn(\n          '[zustand devtools middleware] \"__setState\" action type is reserved to set state from the devtools. Avoid using it.'\n        );\n        didWarnAboutReservedActionType = true;\n      }\n      originalDispatch(...a);\n    };\n  }\n  connection.subscribe((message) => {\n    var _a;\n    switch (message.type) {\n      case \"ACTION\":\n        if (typeof message.payload !== \"string\") {\n          console.error(\n            \"[zustand devtools middleware] Unsupported action format\"\n          );\n          return;\n        }\n        return parseJsonThen(\n          message.payload,\n          (action) => {\n            if (action.type === \"__setState\") {\n              if (store === void 0) {\n                setStateFromDevtools(action.state);\n                return;\n              }\n              if (Object.keys(action.state).length !== 1) {\n                console.error(\n                  `\n                    [zustand devtools middleware] Unsupported __setState action format. \n                    When using 'store' option in devtools(), the 'state' should have only one key, which is a value of 'store' that was passed in devtools(),\n                    and value of this only key should be a state object. Example: { \"type\": \"__setState\", \"state\": { \"abc123Store\": { \"foo\": \"bar\" } } }\n                    `\n                );\n              }\n              const stateFromDevtools = action.state[store];\n              if (stateFromDevtools === void 0 || stateFromDevtools === null) {\n                return;\n              }\n              if (JSON.stringify(api.getState()) !== JSON.stringify(stateFromDevtools)) {\n                setStateFromDevtools(stateFromDevtools);\n              }\n              return;\n            }\n            if (!api.dispatchFromDevtools)\n              return;\n            if (typeof api.dispatch !== \"function\")\n              return;\n            api.dispatch(action);\n          }\n        );\n      case \"DISPATCH\":\n        switch (message.payload.type) {\n          case \"RESET\":\n            setStateFromDevtools(initialState);\n            if (store === void 0) {\n              return connection == null ? void 0 : connection.init(api.getState());\n            }\n            return connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));\n          case \"COMMIT\":\n            if (store === void 0) {\n              connection == null ? void 0 : connection.init(api.getState());\n              return;\n            }\n            return connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));\n          case \"ROLLBACK\":\n            return parseJsonThen(message.state, (state) => {\n              if (store === void 0) {\n                setStateFromDevtools(state);\n                connection == null ? void 0 : connection.init(api.getState());\n                return;\n              }\n              setStateFromDevtools(state[store]);\n              connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));\n            });\n          case \"JUMP_TO_STATE\":\n          case \"JUMP_TO_ACTION\":\n            return parseJsonThen(message.state, (state) => {\n              if (store === void 0) {\n                setStateFromDevtools(state);\n                return;\n              }\n              if (JSON.stringify(api.getState()) !== JSON.stringify(state[store])) {\n                setStateFromDevtools(state[store]);\n              }\n            });\n          case \"IMPORT_STATE\": {\n            const { nextLiftedState } = message.payload;\n            const lastComputedState = (_a = nextLiftedState.computedStates.slice(-1)[0]) == null ? void 0 : _a.state;\n            if (!lastComputedState)\n              return;\n            if (store === void 0) {\n              setStateFromDevtools(lastComputedState);\n            } else {\n              setStateFromDevtools(lastComputedState[store]);\n            }\n            connection == null ? void 0 : connection.send(\n              null,\n              // FIXME no-any\n              nextLiftedState\n            );\n            return;\n          }\n          case \"PAUSE_RECORDING\":\n            return isRecording = !isRecording;\n        }\n        return;\n    }\n  });\n  return initialState;\n};\nconst devtools = devtoolsImpl;\nconst parseJsonThen = (stringified, f) => {\n  let parsed;\n  try {\n    parsed = JSON.parse(stringified);\n  } catch (e) {\n    console.error(\n      \"[zustand devtools middleware] Could not parse the received json\",\n      e\n    );\n  }\n  if (parsed !== void 0)\n    f(parsed);\n};\n\nconst subscribeWithSelectorImpl = (fn) => (set, get, api) => {\n  const origSubscribe = api.subscribe;\n  api.subscribe = (selector, optListener, options) => {\n    let listener = selector;\n    if (optListener) {\n      const equalityFn = (options == null ? void 0 : options.equalityFn) || Object.is;\n      let currentSlice = selector(api.getState());\n      listener = (state) => {\n        const nextSlice = selector(state);\n        if (!equalityFn(currentSlice, nextSlice)) {\n          const previousSlice = currentSlice;\n          optListener(currentSlice = nextSlice, previousSlice);\n        }\n      };\n      if (options == null ? void 0 : options.fireImmediately) {\n        optListener(currentSlice, currentSlice);\n      }\n    }\n    return origSubscribe(listener);\n  };\n  const initialState = fn(set, get, api);\n  return initialState;\n};\nconst subscribeWithSelector = subscribeWithSelectorImpl;\n\nconst combine = (initialState, create) => (...a) => Object.assign({}, initialState, create(...a));\n\nfunction createJSONStorage(getStorage, options) {\n  let storage;\n  try {\n    storage = getStorage();\n  } catch (e) {\n    return;\n  }\n  const persistStorage = {\n    getItem: (name) => {\n      var _a;\n      const parse = (str2) => {\n        if (str2 === null) {\n          return null;\n        }\n        return JSON.parse(str2, options == null ? void 0 : options.reviver);\n      };\n      const str = (_a = storage.getItem(name)) != null ? _a : null;\n      if (str instanceof Promise) {\n        return str.then(parse);\n      }\n      return parse(str);\n    },\n    setItem: (name, newValue) => storage.setItem(\n      name,\n      JSON.stringify(newValue, options == null ? void 0 : options.replacer)\n    ),\n    removeItem: (name) => storage.removeItem(name)\n  };\n  return persistStorage;\n}\nconst toThenable = (fn) => (input) => {\n  try {\n    const result = fn(input);\n    if (result instanceof Promise) {\n      return result;\n    }\n    return {\n      then(onFulfilled) {\n        return toThenable(onFulfilled)(result);\n      },\n      catch(_onRejected) {\n        return this;\n      }\n    };\n  } catch (e) {\n    return {\n      then(_onFulfilled) {\n        return this;\n      },\n      catch(onRejected) {\n        return toThenable(onRejected)(e);\n      }\n    };\n  }\n};\nconst oldImpl = (config, baseOptions) => (set, get, api) => {\n  let options = {\n    getStorage: () => localStorage,\n    serialize: JSON.stringify,\n    deserialize: JSON.parse,\n    partialize: (state) => state,\n    version: 0,\n    merge: (persistedState, currentState) => ({\n      ...currentState,\n      ...persistedState\n    }),\n    ...baseOptions\n  };\n  let hasHydrated = false;\n  const hydrationListeners = /* @__PURE__ */ new Set();\n  const finishHydrationListeners = /* @__PURE__ */ new Set();\n  let storage;\n  try {\n    storage = options.getStorage();\n  } catch (e) {\n  }\n  if (!storage) {\n    return config(\n      (...args) => {\n        console.warn(\n          `[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`\n        );\n        set(...args);\n      },\n      get,\n      api\n    );\n  }\n  const thenableSerialize = toThenable(options.serialize);\n  const setItem = () => {\n    const state = options.partialize({ ...get() });\n    let errorInSync;\n    const thenable = thenableSerialize({ state, version: options.version }).then(\n      (serializedValue) => storage.setItem(options.name, serializedValue)\n    ).catch((e) => {\n      errorInSync = e;\n    });\n    if (errorInSync) {\n      throw errorInSync;\n    }\n    return thenable;\n  };\n  const savedSetState = api.setState;\n  api.setState = (state, replace) => {\n    savedSetState(state, replace);\n    void setItem();\n  };\n  const configResult = config(\n    (...args) => {\n      set(...args);\n      void setItem();\n    },\n    get,\n    api\n  );\n  let stateFromStorage;\n  const hydrate = () => {\n    var _a;\n    if (!storage)\n      return;\n    hasHydrated = false;\n    hydrationListeners.forEach((cb) => cb(get()));\n    const postRehydrationCallback = ((_a = options.onRehydrateStorage) == null ? void 0 : _a.call(options, get())) || void 0;\n    return toThenable(storage.getItem.bind(storage))(options.name).then((storageValue) => {\n      if (storageValue) {\n        return options.deserialize(storageValue);\n      }\n    }).then((deserializedStorageValue) => {\n      if (deserializedStorageValue) {\n        if (typeof deserializedStorageValue.version === \"number\" && deserializedStorageValue.version !== options.version) {\n          if (options.migrate) {\n            return options.migrate(\n              deserializedStorageValue.state,\n              deserializedStorageValue.version\n            );\n          }\n          console.error(\n            `State loaded from storage couldn't be migrated since no migrate function was provided`\n          );\n        } else {\n          return deserializedStorageValue.state;\n        }\n      }\n    }).then((migratedState) => {\n      var _a2;\n      stateFromStorage = options.merge(\n        migratedState,\n        (_a2 = get()) != null ? _a2 : configResult\n      );\n      set(stateFromStorage, true);\n      return setItem();\n    }).then(() => {\n      postRehydrationCallback == null ? void 0 : postRehydrationCallback(stateFromStorage, void 0);\n      hasHydrated = true;\n      finishHydrationListeners.forEach((cb) => cb(stateFromStorage));\n    }).catch((e) => {\n      postRehydrationCallback == null ? void 0 : postRehydrationCallback(void 0, e);\n    });\n  };\n  api.persist = {\n    setOptions: (newOptions) => {\n      options = {\n        ...options,\n        ...newOptions\n      };\n      if (newOptions.getStorage) {\n        storage = newOptions.getStorage();\n      }\n    },\n    clearStorage: () => {\n      storage == null ? void 0 : storage.removeItem(options.name);\n    },\n    getOptions: () => options,\n    rehydrate: () => hydrate(),\n    hasHydrated: () => hasHydrated,\n    onHydrate: (cb) => {\n      hydrationListeners.add(cb);\n      return () => {\n        hydrationListeners.delete(cb);\n      };\n    },\n    onFinishHydration: (cb) => {\n      finishHydrationListeners.add(cb);\n      return () => {\n        finishHydrationListeners.delete(cb);\n      };\n    }\n  };\n  hydrate();\n  return stateFromStorage || configResult;\n};\nconst newImpl = (config, baseOptions) => (set, get, api) => {\n  let options = {\n    storage: createJSONStorage(() => localStorage),\n    partialize: (state) => state,\n    version: 0,\n    merge: (persistedState, currentState) => ({\n      ...currentState,\n      ...persistedState\n    }),\n    ...baseOptions\n  };\n  let hasHydrated = false;\n  const hydrationListeners = /* @__PURE__ */ new Set();\n  const finishHydrationListeners = /* @__PURE__ */ new Set();\n  let storage = options.storage;\n  if (!storage) {\n    return config(\n      (...args) => {\n        console.warn(\n          `[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`\n        );\n        set(...args);\n      },\n      get,\n      api\n    );\n  }\n  const setItem = () => {\n    const state = options.partialize({ ...get() });\n    return storage.setItem(options.name, {\n      state,\n      version: options.version\n    });\n  };\n  const savedSetState = api.setState;\n  api.setState = (state, replace) => {\n    savedSetState(state, replace);\n    void setItem();\n  };\n  const configResult = config(\n    (...args) => {\n      set(...args);\n      void setItem();\n    },\n    get,\n    api\n  );\n  api.getInitialState = () => configResult;\n  let stateFromStorage;\n  const hydrate = () => {\n    var _a, _b;\n    if (!storage)\n      return;\n    hasHydrated = false;\n    hydrationListeners.forEach((cb) => {\n      var _a2;\n      return cb((_a2 = get()) != null ? _a2 : configResult);\n    });\n    const postRehydrationCallback = ((_b = options.onRehydrateStorage) == null ? void 0 : _b.call(options, (_a = get()) != null ? _a : configResult)) || void 0;\n    return toThenable(storage.getItem.bind(storage))(options.name).then((deserializedStorageValue) => {\n      if (deserializedStorageValue) {\n        if (typeof deserializedStorageValue.version === \"number\" && deserializedStorageValue.version !== options.version) {\n          if (options.migrate) {\n            return options.migrate(\n              deserializedStorageValue.state,\n              deserializedStorageValue.version\n            );\n          }\n          console.error(\n            `State loaded from storage couldn't be migrated since no migrate function was provided`\n          );\n        } else {\n          return deserializedStorageValue.state;\n        }\n      }\n    }).then((migratedState) => {\n      var _a2;\n      stateFromStorage = options.merge(\n        migratedState,\n        (_a2 = get()) != null ? _a2 : configResult\n      );\n      set(stateFromStorage, true);\n      return setItem();\n    }).then(() => {\n      postRehydrationCallback == null ? void 0 : postRehydrationCallback(stateFromStorage, void 0);\n      stateFromStorage = get();\n      hasHydrated = true;\n      finishHydrationListeners.forEach((cb) => cb(stateFromStorage));\n    }).catch((e) => {\n      postRehydrationCallback == null ? void 0 : postRehydrationCallback(void 0, e);\n    });\n  };\n  api.persist = {\n    setOptions: (newOptions) => {\n      options = {\n        ...options,\n        ...newOptions\n      };\n      if (newOptions.storage) {\n        storage = newOptions.storage;\n      }\n    },\n    clearStorage: () => {\n      storage == null ? void 0 : storage.removeItem(options.name);\n    },\n    getOptions: () => options,\n    rehydrate: () => hydrate(),\n    hasHydrated: () => hasHydrated,\n    onHydrate: (cb) => {\n      hydrationListeners.add(cb);\n      return () => {\n        hydrationListeners.delete(cb);\n      };\n    },\n    onFinishHydration: (cb) => {\n      finishHydrationListeners.add(cb);\n      return () => {\n        finishHydrationListeners.delete(cb);\n      };\n    }\n  };\n  if (!options.skipHydration) {\n    hydrate();\n  }\n  return stateFromStorage || configResult;\n};\nconst persistImpl = (config, baseOptions) => {\n  if (\"getStorage\" in baseOptions || \"serialize\" in baseOptions || \"deserialize\" in baseOptions) {\n    if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") {\n      console.warn(\n        \"[DEPRECATED] `getStorage`, `serialize` and `deserialize` options are deprecated. Use `storage` option instead.\"\n      );\n    }\n    return oldImpl(config, baseOptions);\n  }\n  return newImpl(config, baseOptions);\n};\nconst persist = persistImpl;\n\nexport { combine, createJSONStorage, devtools, persist, redux, subscribeWithSelector };\n","import { create } from 'zustand';\nimport { subscribeWithSelector } from 'zustand/middleware';\nimport {\n  WebUI,\n  PrismUI,\n  builderDispatch,\n} from '../../../customer_pages/_utils/ui';\n\nconst SUPPORTED_VIEW_MODES = ['edit', 'review', 'preview'];\n\nexport const usePageStore = create(\n  subscribeWithSelector((set, get) => ({\n    viewMode: 'edit',\n    openPreview: () => {\n      get().setViewMode('preview');\n      builderDispatch.delayedDispatch({ type: PrismUI.EVENT_PREVIEW });\n    },\n    closePreview: () => {\n      get().setViewMode('edit');\n      builderDispatch.delayedDispatch({ type: WebUI.ENTER_EDIT_MODE });\n      builderDispatch.delayedDispatch({ type: PrismUI.EVENT_EDIT });\n    },\n    setViewMode: mode => {\n      if (!SUPPORTED_VIEW_MODES.includes(mode)) return;\n\n      set({ viewMode: mode });\n    },\n  }))\n);\n","\n\n// Import Libraries\nimport React from 'react';\n// Import JS Modules\nimport { usePageStore } from 'stores/usePageStore';\nimport { PrismUI, builderDispatch } from '../../../_utils/ui';\nimport { usePrismItemStore } from 'stores/usePrismItemStore';\nimport genericHelpers from '../../../_utils/generic-helpers';\n// Import JSX Modules\n\n// --------------------------------------------------------------------\nclass AddToCartNoticeBase extends React.Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      viewMode: usePageStore.getState().viewMode\n    };\n  }\n\n  componentDidMount() {\n    this.dispatchToken = builderDispatch.register(payload => {\n      switch (payload.type) {\n        case PrismUI.EVENT_ADD_TO_CART:\n          this.handleAddToCartRequest();\n          break;\n      }\n    });\n\n    this.unSubscribePageStore = usePageStore.subscribe(\n      state => state.viewMode,\n      viewMode => {\n        this.setState({\n          viewMode,\n        });\n      }\n    );\n  }\n\n  componentWillUnmount() {\n    builderDispatch.unregister(this.dispatchToken);\n\n    this.unSubscribePageStore();\n  }\n\n  renderBody() {\n    const $warnings = (function* ({ emptyImageSlot, unchangedDefaultText, lowDpiImage, emptyPage, orientationMismatch }) {\n      const hidePreviewButton = wkData.three_dimensional_view.hide_preview_button;\n      \n      if (emptyImageSlot) {\n        yield (\n          <li className='d-flex' key=\"images\">\n            <i className=\"fas fa-exclamation-circle flex-shrink-0\" />\n            <p>One or more photo boxes are empty.</p>\n          </li>\n        );\n      }\n\n      if (emptyPage) {\n        yield (\n          <li className='d-flex' key=\"pages\">\n            <i className=\"fas fa-exclamation-circle flex-shrink-0\" />\n            <p>One or more pages have been left empty.</p>\n          </li>\n        );\n      }\n\n      if (unchangedDefaultText) {\n        yield (\n          <li className='d-flex' key=\"text\">\n            <i className=\"fas fa-exclamation-circle flex-shrink-0\" />\n            <p>Make sure all placeholder texts are updated.</p>\n          </li>\n        );\n      }\n\n      if (lowDpiImage) {\n        yield (\n          <li className='d-flex' key=\"low-dpi\">\n            <i className=\"fas fa-exclamation-circle flex-shrink-0\" />\n            <p>One or more low resolution images used. Consider changing the image or the layout.</p>\n          </li>\n        );\n      }\n\n      if (orientationMismatch) {\n        yield (\n          <li className='d-flex' key=\"text\">\n            <i className=\"fas fa-exclamation-circle flex-shrink-0\" />\n            {hidePreviewButton ? (\n              <p>Your image does not match the selected orientation. Adjust the orientation in the <strong>Layouts</strong> tab if required.</p>\n            ) : (\n              <p>Your image does not match the selected orientation. Check in Preview, or adjust the orientation in the <strong>Layouts</strong> tab.</p>\n            )}\n          </li>\n        );\n      }\n      \n      if (genericHelpers.isEmptyPrintedEnvelope()) {\n        yield (\n          <li className='d-flex' key=\"text\">\n            <i className=\"fas fa-exclamation-circle flex-shrink-0\" />\n            <p>A return address is required for printed envelopes.</p>\n          </li>\n        );\n      }\n    })(this.state);\n\n    return (\n      <ul className='list-unstyled'>\n        {Array.from($warnings)}\n      </ul>\n    );\n  }\n\n  close = () => {\n    this.setState(() => {\n      return {\n        emptyImageSlot: undefined,\n        unchangedDefaultText: undefined,\n        lowDpiImage: undefined,\n        emptyPage: undefined,\n        orientationMismatch: undefined,\n      };\n    });\n  }\n\n  get shouldShowWarning() {\n    const { emptyImageSlot, unchangedDefaultText, lowDpiImage, emptyPage, orientationMismatch } = this.state;\n\n    return [emptyImageSlot, unchangedDefaultText, lowDpiImage, emptyPage, orientationMismatch].some(Boolean);\n  }\n\n  handleAddToCartRequest = async () => {\n\n    await usePrismItemStore.getState().checkSlots().then(({\n      emptyImageSlot,\n      unchangedDefaultText,\n      lowDpiImage,\n      emptyPage,\n      orientationMismatch,\n    }) => {\n      if (![emptyImageSlot, unchangedDefaultText, lowDpiImage, emptyPage, orientationMismatch].some(Boolean)) {\n        this.addToCart();\n      }\n      this.setState(() => {\n        return {\n          emptyImageSlot,\n          unchangedDefaultText,\n          lowDpiImage,\n          emptyPage,\n          orientationMismatch,\n        };\n      });\n    });\n  }\n\n\n}\n\n// --------------------------------------------------------------------\n\nexport default AddToCartNoticeBase;\n","\n// Import JS Modules\nimport { WebUI, builderDispatch } from '../../_utils/ui';\nimport PrismBuilderCustomSections from '../misc/prism-builder-custom-sections';\nimport { usePrismItemStore } from 'stores/usePrismItemStore';\n\n// --------------------------------------------------------------------\n\nfunction cardPages() {\n  const pages = [];\n\n  const prismItem = usePrismItemStore.getState().prismItem;\n\n  prismItem.product.sections.forEach((section) => {\n    pages.push({\n      title: section.title.replace(/ \\d\\d\\d\\d/, '').replace(/ Top/, ''),\n    });\n  });\n\n  PrismBuilderCustomSections.all.forEach((section) => {\n    if (section.isEnabled()) {\n      pages.push({\n        title: section.title,\n        customPageId: section.id,\n      });\n    }\n  });\n\n  return pages;\n}\n\n// --------------------------------------------------------------------\n\nfunction cardNavLabel(title, orientation) {\n  if (orientation === 'portrait' && title === 'Inside Cover') {\n    return 'Left';\n  }\n  if (orientation === 'portrait' && title === 'Inside Facing') {\n    return 'Right';\n  }\n  if (orientation === 'landscape' && title === 'Inside Cover') {\n    return 'Top';\n  }\n  if (orientation === 'landscape' && title === 'Inside Facing') {\n    return 'Bottom';\n  }\n\n  return title;\n}\n\n// --------------------------------------------------------------------\n\nfunction selectPage(value) {\n  const page = cardPages()[value];\n  if (!page) {\n    return;\n  }\n\n  builderDispatch.dispatch({\n    type: WebUI.GOTO_PAGE,\n    page: value,\n    customPageId: page.customPageId,\n    explicit: true,\n  });\n\n  if (page.customPageId) {\n    builderDispatch.dispatch({\n      type: WebUI.SHOW_CUSTOM_PAGE,\n      customPageId: page.customPageId,\n      customPageIndex: value,\n    });\n  } else {\n    builderDispatch.dispatch({\n      type: WebUI.HIDE_CUSTOM_PAGE,\n    });\n  }\n}\n\n// --------------------------------------------------------------------\n\nexport {\n  cardPages,\n  cardNavLabel,\n  selectPage,\n};\n","var baseEach = require('./_baseEach');\n\n/**\n * The base implementation of `_.filter` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction baseFilter(collection, predicate) {\n  var result = [];\n  baseEach(collection, function(value, index, collection) {\n    if (predicate(value, index, collection)) {\n      result.push(value);\n    }\n  });\n  return result;\n}\n\nmodule.exports = baseFilter;\n","var arrayFilter = require('./_arrayFilter'),\n    baseFilter = require('./_baseFilter'),\n    baseIteratee = require('./_baseIteratee'),\n    isArray = require('./isArray');\n\n/**\n * Iterates over elements of `collection`, returning an array of all elements\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * **Note:** Unlike `_.remove`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.reject\n * @example\n *\n * var users = [\n *   { 'user': 'barney', 'age': 36, 'active': true },\n *   { 'user': 'fred',   'age': 40, 'active': false }\n * ];\n *\n * _.filter(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.filter(users, { 'age': 36, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.filter(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.filter(users, 'active');\n * // => objects for ['barney']\n *\n * // Combining several predicates using `_.overEvery` or `_.overSome`.\n * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));\n * // => objects for ['fred', 'barney']\n */\nfunction filter(collection, predicate) {\n  var func = isArray(collection) ? arrayFilter : baseFilter;\n  return func(collection, baseIteratee(predicate, 3));\n}\n\nmodule.exports = filter;\n","import { builderDispatch, PrismUI } from '../../_utils/ui';\nimport find from 'lodash/find';\nimport filter from 'lodash/filter';\n\nbuilderDispatch.register((payload) => {\n  switch (payload.type) {\n    case PrismUI.IMAGES_UPDATED:\n      recordNewUploads(payload.images, payload.album);\n      break;\n  }\n});\n\nfunction recordNewUploads(imageList, album) {\n  const newUploads = filter(imageList, (image) =>\n    // find images not already in our list\n    !find(wkData.images, (image_ref) => (image_ref.image_id == image.id || image_ref.md5 == image.md5))).map((image) =>\n    // translate output of prism to web-kiosk friendly format\n    ({\n      image_id: image.id,\n      md5: image.md5,\n      url: image.raw_url,\n      filename: image.name,\n    }));\n\n  const newUploadsNotFromAlbums = newUploads.filter((u) => !(window.uploadedToAlbumIds || []).includes(u.image_id));\n  if (newUploadsNotFromAlbums.length > 0) {\n    $.post(wkData.remember_url, { images: newUploadsNotFromAlbums, album });\n  }\n\n  wkData.images = (wkData.images || []).concat(newUploads);\n}\n","\nwkData.product.bleedWarning = {\n  showForAlbum() {\n    return ['album'].indexOf(wkData.product.type) > -1;\n  },\n  show() {\n    return this.showForAlbum() || wkData.missing_attributes || wkData.disabled_options_chosen;\n  },\n};\n","\n// Import JS Modules\nimport { builderDispatch, WebUI, PrismUI } from '../../_utils/ui';\nimport PageSpreads from '../edit-area/page-spreads';\nimport PrismBuilderCustomSections from '../misc/prism-builder-custom-sections';\nimport { usePrismItemStore } from 'stores/usePrismItemStore';\n\nbuilderDispatch.register((payload) => {\n  const prismItem = usePrismItemStore.getState().prismItem;\n  \n  const handleGoToPage = ({ customPageId, page }) => {\n    const spread = (() => {\n      if (customPageId) {\n        return PrismBuilderCustomSections.getById(customPageId).spread;\n      }\n\n      return (new PageSpreads(prismItem)).find(page);\n    })();\n\n    if (spread) {\n      builderDispatch.delayedDispatch({\n        type: WebUI.DO_SHOW_SPREAD,\n        spread,\n        pageIndex: page,\n      });\n    }\n  };\n\n  const handleOptionSelected = ({ variable }) => {\n    if (/cover/i.test(variable.name)) {\n      if (activeView.pageIndex !== 0) {\n        const spreads = (new PageSpreads(prismItem)).list();\n        builderDispatch.delayedDispatch({\n          type: WebUI.DO_SHOW_SPREAD,\n          spread: spreads[0],\n        });\n      }\n    }\n  };\n\n  switch (payload.type) {\n    case WebUI.GOTO_PAGE:\n      handleGoToPage(payload);\n      break;\n\n    case PrismUI.OPTION_SELECTED:\n      handleOptionSelected(payload);\n      break;\n  }\n});\n","\n// Import JS Modules\nimport { builderDispatch, WebUI, PrismUI } from '../../_utils/ui';\nimport PageSpreads from '../edit-area/page-spreads';\nimport { usePrismItemStore } from 'stores/usePrismItemStore';\n\n\nbuilderDispatch.register((payload) => {\n  if (window.debugFlux || window.location.hash == 'debug') console.log(payload);\n\n  // this is the initial load handler\n  window.requestAnimationFrame(() => {\n    if (payload.type === PrismUI.DO_ITEM_LOAD) {\n      document.title = wkData.product_title;\n\n      // Copy fields into prismItem\n      const { imageList, ...properties } = payload.data;\n      const { dateIdentifier } = payload;\n\n      // Assigning to new prism store\n      usePrismItemStore.getState().updatePrismItem(properties);\n\n      // set image list to new prism store\n      usePrismItemStore.getState().updateImageList(imageList);\n\n      // updating load active to new prism store\n      usePrismItemStore.getState().updateLoadActive(false);\n\n      prismViews.editable = true;\n\n      builderDispatch.dispatch({\n        type: WebUI.PAGES_CHANGED,\n        detail: 'stores.js#loadPrismItem',\n      });\n\n      let requestedIndex = -1;\n      if (location.hash.match(/#[0-9]+/)) {\n        requestedIndex = Number(location.hash.substring(1));\n      }\n\n      // Remove the lingering hash\n      window.history.replaceState({}, document.title, location.pathname + location.search);\n\n      const spreads = (new PageSpreads(usePrismItemStore.getState().prismItem)).list();\n      const spread = spreads[requestedIndex] || spreads.find((s) => s.includesPage(usePrismItemStore.getState().prismItem.currentPage)) || spreads[0];\n\n      builderDispatch.delayedDispatch({\n        type: WebUI.DO_SHOW_SPREAD,\n        spread,\n        dateIdentifier\n      });\n\n      // We only want to hide custom pages if the destination\n      // is the first spread. Otherwise you could navigate to\n      // a page and immediately get kicked back\n      if (requestedIndex === 0) {\n        builderDispatch.dispatch({\n          type: WebUI.HIDE_CUSTOM_PAGE,\n        });\n      }\n\n      usePrismItemStore.getState().updatePrismLoaded();\n    }\n  });\n});\n","// Import JS Modules\nimport { builderDispatch, WebUI, PrismUI } from '../../_utils/ui';\nimport { usePrismItemStore } from 'stores/usePrismItemStore';\n\nexport function globalPreviewLoader() {\n  builderDispatch.register(payload => {\n    switch (payload.type) {\n      case WebUI.ENTER_PREVIEW_MODE:\n        window.previewImage = null;\n        const img = new Image();\n        img.crossOrigin = 'Anonymous';\n        img.onload = function() {\n          window.previewImage = img;\n          builderDispatch.dispatch({\n            type: PrismUI.PREVIEW_2D_LOADED,\n            img,\n            pageIndex: 0,\n          });\n        };\n        img.onerror = function() {\n          window.previewImage = null;\n          builderDispatch.dispatch({\n            type: PrismUI.PREVIEW_2D_LOADED,\n            img: false,\n          });\n        };\n        img.src = previewURL();\n        builderDispatch.delayedDispatch({\n          type: PrismUI.PREVIEW_2D_LOADING,\n          img,\n          pageIndex: 0,\n        });\n        break;\n      case PrismUI.UNDO_CHANGED:\n        window.previewImage = null;\n        break;\n    }\n  });\n}\n\nexport const PREVIEW_RESOLUTION = [1440, 1080];\n\nexport const previewURL = function(\n  pageNumber = 0,\n  time = new Date().getTime()\n) {\n  const prismItem = usePrismItemStore.getState().prismItem;\n  let qs = '';\n  for (const key in wkData.values) {\n    if (wkData.values[key])\n      qs += `&vars[]=${encodeURIComponent(wkData.values[key])}`;\n  }\n  qs += `&vars[]=${encodeURIComponent(prismItem.theme)}`;\n  qs += `&vars[]=${encodeURIComponent(prismItem.design_code)}`;\n\n  const { host = 'http://localhost:3003', source = 'localhost' } =\n    window.hotrodSettings || {};\n\n  return `${host}/default/${source}/${prismItem.product.id}/${\n    prismItem.id\n  }?ts=${time + qs}`;\n};\n","\n// Import JS Modules\nimport {\n  builderDispatch, WebUI, UI_STATE, PrismUI,\n} from '../../_utils/ui';\nimport { usePrismItemStore } from 'stores/usePrismItemStore';\n\nlet album;\n\nbuilderDispatch.register((payload) => {\n  const prismItem = usePrismItemStore.getState().prismItem;\n\n  switch (payload.type) {\n    case WebUI.UPLOAD_BEGUN:\n      album = payload.album;\n      window.uploadedToAlbumIds || (window.uploadedToAlbumIds = []);\n\n      if (prismItem.imageList.length > 0) return;\n      if (usePrismItemStore.getState().usedImages().length > 0) return;\n      if (prismItem.design_code.indexOf('.collage') < 0) return;\n      if (prismItem.pageCount > 1) return;\n      if (UI_STATE.collageTemplateFitAndAutofill) return;\n\n      UI_STATE.collageTemplateFitAndAutofill = true;\n      usePrismItemStore.getState().pageWithTemplate(activeView.pageIndex)\n        .then((pageAndTemplate) => {\n          const orientations = ['is-portrait', 'is-landscape', 'is-square'];\n          const orientationTag = pageAndTemplate.template.tags.filter((a) => orientations.includes(a))[0];\n\n          usePrismItemStore.getState().selectTemplateToFitImages(payload.number_of_files, orientationTag);\n        });\n      break;\n\n    case WebUI.UPLOAD_PROGRESS:\n      if (payload.source == 'albums') {\n        window.uploadedToAlbumIds = window.uploadedToAlbumIds.concat(\n          (payload.data || []).map((i) => i.id)\n        );\n      }\n\n      usePrismItemStore.getState().refreshImages()\n        .then(() => {\n          if (prismItem.design_code.indexOf('.collage') < 0) return;\n          if (prismItem.pageCount > 1 && prismItem.theme.indexOf('card') < 0) return;\n\n          usePrismItemStore.getState().populateItemsImagesAfterUpload(payload.data);\n        })\n        .catch(() => { });\n      break;\n\n    case WebUI.UPLOAD_DONE:\n      const autoFillImageUponUpload = usePrismItemStore.getState().autoFillImageUponUpload;\n      usePrismItemStore.getState().refreshImages()\n        .then((data) => {\n          autoFillImageUponUpload();\n          builderDispatch.dispatch({\n            type: PrismUI.IMAGES_UPDATED,\n            images: data,\n            album,\n          });\n        })\n        .catch((e) => {\n          console.log(e);\n        });\n      break;\n  }\n});\n","// Import JS Modules\nimport { curry } from 'lodash';\nimport { builderDispatch, PrismUI } from '../../_utils/ui';\nimport { EventEmitter } from 'wk-event-emitter';\nimport { useSlotStore } from 'stores/useSlotStore';\n\n// events that should update the new zustand slot store\nconst SLOT_UPDATE_EVENTS = {\n  [PrismUI.SLOT_CHANGED]: true,\n  [PrismUI.SLOT_CLICK]: true,\n  [PrismUI.SLOT_MOVE]: false,\n};\n\n// events to be delayed\nconst SLOT_DELAYED_EVENTS = {\n  [PrismUI.SLOT_CHANGED]: true,\n};\n\nconst curriedEventHandler = curry((eventType, { view, slot }) => {\n  if (slot) {\n    if (SLOT_UPDATE_EVENTS[eventType]) {\n      useSlotStore.getState().updateSlot(slot);\n    }\n\n    if (SLOT_DELAYED_EVENTS[eventType]) {\n      builderDispatch.delayedDispatch({\n        type: eventType,\n        slot,\n        view,\n      });\n    } else {\n      builderDispatch.dispatch({\n        type: eventType,\n        slot,\n        view,\n      });\n    }\n  }\n});\n\nconst handleSlotChanged = curriedEventHandler(PrismUI.SLOT_CHANGED);\n\nconst handleSlotClicked = curriedEventHandler(PrismUI.SLOT_CLICK);\n\nconst handleSlotMoved = curriedEventHandler(PrismUI.SLOT_MOVED);\n\nEventEmitter.on('prism-edit-slot-changed', handleSlotChanged);\n\nEventEmitter.on('prism-edit-slot-click', handleSlotClicked);\n\nEventEmitter.on('prism-edit-slot-moved', handleSlotMoved);\n"],"names":["fontList","options","i","FontStore","font","fontName","usePrismItemStore","memo","group","sorter","a","b","isSafari","testPrivateMode","testFile","resolve","reject","request","e","safariPrivateMode","PageBase","React","props","builderDispatch","payload","PrismUI","isSafariPrivate","useGenStore","slot","view","onPhotosTrayShown","slotIsColour","trayName","TYPES","ThumbnailStore","name","prevName","ResizeObserverClass","entries","entry","error","canvasWidth","canvasHeight","canvas","maxHeight","maxWidth","showQuantityDropdown","transientUnitPrices","QuantityPricingTools","QuantityPricingToolsBase","product","productName","isCard","isAlbum","quantity","price","prismItem","previousValue","prices","from","PriceAndQuantityBase","collectionName","unitQuantity","unitPrice","cost","pluralize","labelData","Currency","parts","copies","variable","option","categoryInfoUrl","getCategoryInfo","cachedData","url","response","data","currentProductFilterInfo","platform","platformAvailabilityKey","currentProduct","filter","findProductByFilters","products","filters","fireTransform","targetProductId","customFilters","params","objToStr","x","returner","wrapIfFunction","thing","setNonEnumerable","target","key","value","defaultNonFunctionProperty","left","right","getTypeName","obj","assertObject","obj2","type","displayType","displayType2","mixins","smartMixinModule","rules","_opts","opts","source","mixin","rule","fn","leftIsFn","rightIsFn","obj1","result","k","res1","res2","_left","_right","require$$0","assign","require$$1","mixinProto","setDefaultProps","reactMixin","getDefaultProps","setInitialState","getInitialState","UNSAFE_componentWillMount","applyInitialState","instance","state","mixinClass","reactClass","prototypeMethods","staticProps","mergePropTypes","leftKey","rightKey","imgStateHash","localZoomFn","imgDefaults","stashFns","zoomFn","imgSlotRef","angle","gamma","zoom","toZoom","slotRefVals","PrismBuilderCustomSections","section","id","s","cardTopNavActive","chevronDirections","Chevron","rel","disabled","label","onClick","classNames","TextField","Component","nextProps","ReactDOM","AddressForm","PureComponent","address","streetAdd1","streetAdd2","city","zip","country","AddressModal","__publicField","empty","prismAction","field","isEmpty","_typeof","trimLeft","trimRight","tinycolor","color","rgb","inputToRGB","RsRGB","GsRGB","BsRGB","R","G","B","boundAlpha","hsv","rgbToHsv","h","v","hsl","rgbToHsl","l","allow3Char","rgbToHex","allow4Char","rgbaToHex","bound01","hexNames","secondColor","hex8String","rgbaToArgbHex","secondHex8String","gradientType","format","formatSet","formattedString","hasAlpha","needsAlphaFormat","args","_lighten","_brighten","_darken","_desaturate","_saturate","_greyscale","_spin","_analogous","_complement","_monochromatic","_splitcomplement","polyad","newColor","convertToPercentage","ok","stringInputToObject","isValidCSSUnit","rgbToRgb","hsvToRgb","hslToRgb","g","max","min","d","r","hue2rgb","p","q","t","f","mod","hex","pad2","convertDecimalToHex","color1","color2","amount","clamp01","hue","number","step","results","slices","part","ret","modification","rgb1","rgb2","rgba","c1","c2","wcag2","readability","wcag2Parms","out","validateWCAG2Parms","baseColor","colorList","bestColor","bestScore","includeFallbackColors","level","size","names","flip","o","flipped","n","isOnePointZero","processPercent","isPercentage","val","parseIntFromHex","c","convertHexToDecimal","matchers","CSS_INTEGER","CSS_NUMBER","CSS_UNIT","PERMISSIVE_MATCH3","PERMISSIVE_MATCH4","named","match","parms","Edge","edge","Box","Grid","box","compare","edges","existing","defaultSetup","element","modifiers","classes","modifier","defaultPositioner","defaultReset","style","Renderer","count","start","Snap","grid","center","width","top","middle","bottom","height","y","end","extent","fallback","position","offset","snapped","Snapster","boxes","printStackTrace","ex","guess","mode","context","functionName","callback","original","stack","lineRE","ANON","lines","len","location","fnName","curr","fnRE","maxStackSize","slice","arg","req","xmlhttp","XMLHttpFactories","reStack","reRef","frame","ref","m","file","lineno","charno","lineNo","charNo","reFunctionDeclaration","reFunctionExpression","reFunctionEvaluation","code","line","maxLines","commentPos","__slice","str","log","debug","wkLogger","PrismQuality","Point","that","point","origin","degrees","radians","sin","cos","other","w","relativeXY","coords","handler","opposite","centerPoints","diffAng","mousePoint","oppositePointRotated","handlerRotated","angleOppRotAndHandRot","centerPoint","oppositePointUnrotated","mousePointNormalised","aspectRatio","stripString","string","safeNumber","defaultValue","limit","isNumber","contextApplyMatrixInternalD","ctx","arrayToMatrixInternalD","arr","ctxApplyMatrix","meta","PlaceFiller","LoadingImage","BlankImage","BlankEmptyImage","imgComplete","img","TOP_TOOL_HEIGHT","BASE_TOOL_WIDTH","BASE_TOOL_HEIGHT","PAD","TOOL_HEIGHT","TOOL_WIDTH","Line","p1","p2","A","C","D","dot","len_sq","param","xx","yy","Polygon","points","closest","closestIndex","distance","index","p0","intersection","SlotBase","lx","ty","isClonedSlot","_ref","topMiddle","bottomMiddle","middleRight","middleLeft","bottomLeft","topRight","topLeft","bottomRight","minusControlPoint","plusControlPoint","minusControlPointSize","plusControlPointSize","middlePoints","pointX","pointY","cornerPoints","cur","dim","ix1","ix2","info","handleScale","PanHandle","dash","scale","region","xcoords","ycoords","min_x","min_y","max_x","max_y","genericHelpers","cx","cy","cw","ch","EventEmitter","setter","isSelected","px","py","boolean","highlight","centerX","centerY","rounded","rectangleCenterX","smallerScale","rectangleCenterY","handleStyle","startOffset","smallestScale","endOffset","middleOffset","newScale","padding","bottomMenu","topMenu","angleToUse","pivotX","pivotY","diffX","diffY","preDrag","mouseX","mouseY","lock","x1","x2","y1","y2","calculateAngle","newAngle","ext","editableArea","bounds","min_w","min_h","coeff_w","coeff_h","coeff","loose","rect","Rectangle","direction","startPoint","coord","endPoint","xBetweenFn","betweenFactory","yBetweenFn","MyMatrix","EditMode","imgHelpers","IU","urlMunge","MAX_ZOOM","MIN_ZOOM","ImageSlot","area","properties","slotData","layout","fetchImage","vars","ratio","clip_path","path","imgId","isCanvas","msg","colour_scheme","show_icon","iconImg","backgroundColour","textColour","fontSize","overlap","info_width","dpi_x","dpi_y","msgHeight","iconTextWidth","align","ih","iw","src_aspect","tgt_aspect","image","imgInfo","imgData","adjHeight","adjWidth","allowOptionalBackground","predicates","predicate","colour","_ref2","_ref3","_ref4","_ref5","_this","def_value","radiansAngle","xMod","yMod","dx","dy","stackable","photoData","dpiThreshold","DpiThreshold","isCalendarEventPhotoSlot","realScaleX","realScaleY","scaleX","scaleY","initialReference","centerCoord","slotCoordRotated","TextPreviewUrl","UrlBuilder","fontWeight","fontSlant","valign","renderer","stroke","templateId","pageIndex","fontColour","md5","validJSON","jsonString","parsedString","hasFoilText","adjustments","TextSlot","isCalendarEventTextSlot","changed","reason","time","cname","cookie","property","factor","baseHSL","replaceImageFillWithGradient","replaceImageFillWithWhiteAndThresholdAlpha","baseGetTag","isObjectLike","numberTag","isNumber_1","useSlotStore","create","set","slotIndex","useFocusedSlotStore","customSlots","getViewport","sendToGoogleAnalytics","sourceSlot","what","src","CustomColourHistory","length","uniq","customColourHistory","filledImageSlotConfirmation","confirmCallback","filledImageSlot","WebUI","PrismBuilderHistory","PrismBuilderReloader","clearBuilderHistory","loadPrismItem","themeStore","TemplateCache","editUrl","title","MAX_RETRY_SNAPSHOT","dispatchUndoAction","pointer","method","possibleDirections","otherView","historyStack","steps","stackStep","decodedStackStep","PrismJSON","json","dateIdentifier","prevent","identifier","withPush","dataResponse","snapshot","uniqueId","productId","currentStep","snapshotCode","theme","stepData","nextStepData","prismData","dataRestore","followingData","followingDataHasSnapshot","shouldJumpToNextSnapshot","lastStatePosition","root","factory","module","this","modules","installedModules","__webpack_require__","moduleId","exports","getter","object","__extends","extendStatics","__","ParchmentError","_super","message","attributes","tags","types","Scope","input","query","BlotClass","node","find","bubble","scope","register","Definitions","_i","Definition","tagName","tagNames","tag","Registry","Attributor","attrName","keyName","attributeBit","item","linked_list_1","shadow_1","ContainerBlot","domNode","child","makeBlot","err","criteria","_a","descendants","lengthLeft","def","blot","childBlot","refBlot","targetParent","refNode","inclusive","force","after","mutations","addedNodes","removedNodes","mutation","attributor_1","store_1","container_1","FormatBlot","formats","replacement","wrapper","LeafBlot","ShadowBlot","parent_1","parentBlot","refDomNode","class_1","style_1","AttributorStore","attribute","styles","attr","prefix","className","ClassAttributor","matches","camelize","rest","StyleAttributor","format_1","leaf_1","scroll_1","inline_1","block_1","embed_1","text_1","Parchment","LinkedList","nodes","next","curNode","length_1","startNode","curIndex","curLength","OBSERVER_CONFIG","MAX_OPTIMIZE_ITERATIONS","ScrollBlot","records","mark","markParent","optimize","remaining","grandChild","isEqual","prop","InlineBlot","BlockBlot","EmbedBlot","TextBlot","text","elem","_toggle","token","searchString","subjectString","lastIndex","list","thisArg","DIFF_DELETE","DIFF_INSERT","DIFF_EQUAL","diff_main","text1","text2","cursor_pos","commonlength","diff_commonPrefix","commonprefix","diff_commonSuffix","commonsuffix","diffs","diff_compute_","diff_cleanupMerge","fix_cursor","fix_emoji","longtext","shorttext","hm","diff_halfMatch_","text1_a","text1_b","text2_a","text2_b","mid_common","diffs_a","diffs_b","diff_bisect_","text1_length","text2_length","max_d","v_offset","v_length","v1","v2","delta","front","k1start","k1end","k2start","k2end","k1","k1_offset","k2_offset","diff_bisectSplit_","k2","text1a","text2a","text1b","text2b","diffsb","pointermin","pointermax","pointermid","pointerstart","pointerend","diff_halfMatchI_","seed","j","best_common","best_longtext_a","best_longtext_b","best_shorttext_a","best_shorttext_b","prefixLength","suffixLength","hm1","hm2","count_delete","count_insert","text_delete","text_insert","changes","diff","diff_1","cursor_normalize_diff","current_pos","next_pos","split_pos","d_left","d_right","norm","ndiffs","cursor_pointer","d_next","merge_tuples","suffix","compact","starts_with_pair_end","ends_with_pair_start","fixed_diffs","left_d","right_d","toStr","isArguments","isArgs","keysShim","has","isEnumerable","hasDontEnumBug","hasProtoEnumBug","dontEnums","equalsConstructorPrototype","ctor","excludedKeys","hasAutomationEqualityBug","equalsConstructorPrototypeIfNotBuggy","isObject","isFunction","isString","theKeys","skipProto","skipConstructor","implementation","origKeys","originalKeys","keysWorksWithArguments","objectKeys","shams","sym","symObj","symVal","syms","descriptor","hasSymbols","origSymbol","hasSymbolSham","ERROR_MESSAGE","funcType","bound","binder","boundLength","boundArgs","Empty","functionBind","bind","undefined","$SyntaxError","$Function","$TypeError","getEvalledConstructor","expressionSyntax","$gOPD","throwTypeError","ThrowTypeError","getProto","needsEval","TypedArray","INTRINSICS","errorProto","doEval","gen","LEGACY_ALIASES","hasOwn","require$$2","$concat","$spliceApply","$replace","$strSlice","$exec","rePropName","reEscapeChar","stringToPath","first","last","quote","subString","getBaseIntrinsic","allowMissing","intrinsicName","alias","getIntrinsic","intrinsicBaseName","intrinsic","intrinsicRealName","skipFurtherCaching","isOwn","desc","GetIntrinsic","$apply","$call","$reflectApply","$defineProperty","$max","originalFunction","func","applyBind","callBind","$indexOf","callBound","hasToStringTag","$toString","isStandardArguments","isLegacyArguments","supportsStandardArguments","hasPropertyDescriptors","hasPropertyDescriptors_1","keys","concat","origDefineProperty","supportsDescriptors","defineProperty","defineProperties","map","defineProperties_1","numberIsNaN","polyfill","getPolyfill","define","shim","require$$3","require$$4","objectIs","isRegexMarker","badStringifier","throwRegexMarker","gOPD","regexClass","isRegex","hasLastIndexDataProperty","functionsHaveNames","$bind","functionsHaveNames_1","functionsHaveConfigurableNames","$Object","calls","TypeErr","regex","proto","flagsBound","regexp_prototype_flags","getDay","tryDateObject","dateClass","isDateObject","is","flags","isDate","require$$5","getTime","deepEqual","actual","expected","objEquiv","isUndefinedOrNull","isBuffer","aIsRegex","bIsRegex","aIsBuffer","bIsBuffer","ka","kb","deepEqual_1","isArray","isPlainObject","hasOwnConstructor","hasIsPrototypeOf","setProperty","getProperty","extend","copy","copyIsArray","clone","deep","equal","lib","keepNull","priority","ops","Iterator","op","nextOp","opLength","retOp","NULL_CHARACTER","Delta","newOp","lastOp","passed","failed","initial","iter","thisIter","otherIter","firstOther","firstLeft","thisOp","otherOp","strings","prep","diffResult","component","newline","nextType","Break","parent","Inline","self","selfIndex","otherIndex","Text","NEWLINE_LENGTH","BlockEmbed","block","Block","leaf","bubbleFormats","head","Code","CodeBlock","frag","nextNewline","prevNewline","isolateLength","searchIndex","reverse","Cursor","selection","textNode","range","restoreText","_instanceof","nativeMap","nativeSet","nativePromise","circular","depth","prototype","includeNonEnumerable","allParents","allChildren","useBuffer","_clone","__getRegExpFlags","keyChild","valueChild","entryChild","attrs","symbols","symbol","allPropertyNames","propertyName","__objToStr","__isDate","__isArray","__isRegExp","re","ASCII","Editor","scroll","consumeNextNewline","scrollLength","normalizeDelta","DeltaOp","lengthRemaining","lineLength","codeIndex","codeLength","leaves","formatsArr","blots","combineFormats","embed","change","cursorIndex","oldDelta","textBlot","oldValue","CursorBlot","oldText","newText","combined","merged","Events","EE","once","events","event","exists","evt","available","ee","a1","a2","a3","a4","a5","listeners","listener","levels","namespace","ns","logger","newLevel","EVENTS","eventName","Emitter","Module","quill","Range","Selection","emitter","native","endNode","nativeRange","side","normalized","positions","indexes","contains","scrollingContainer","scrollBounds","oldRange","lastRange","descendant","Theme","moduleClass","Quill","overwrite","container","expandConfig","html","modify","contents","overload","enabled","scrollTop","containerBounds","focus","deleted","applied","userConfig","themeConfig","config","moduleConfig","shift","shiftRange","pos","Container","GUARD_TEXT","Embed","childNode","prevLength","isLine","Scroll","whitelist","newlineIndex","getLines","AlignAttribute","AlignStyle","ColorAttributor","ColorStyle","BackgroundStyle","DirectionAttribute","DirectionStyle","FontStyleAttributor","FontStyle","SizeStyle","DOM_KEY","CLIPBOARD_CONFIG","matchText","matchNewline","matchBreak","matchBlot","matchSpacing","matchAttributor","matchStyles","matchIndent","matchAlias","matchIgnore","ATTRIBUTE_ATTRIBUTORS","STYLE_ATTRIBUTORS","Clipboard","selector","matcher","elementMatchers","textMatchers","traverse","deltaEndsWith","paste","pair","applyFormat","computeStyle","endText","childrenDelta","indent","nodeHeight","replacer","collapse","History","dest","getLastChangeIndex","changeDelta","undoDelta","timestamp","endsWithNewlineChange","deleteLength","changeIndex","SHORTKEY","Keyboard","binding","normalize","handleEnter","handleBackspace","handleDelete","handleDeleteRange","which","bindings","leafStart","offsetStart","leafEnd","offsetEnd","prefixText","suffixText","curContext","makeFormatHandler","makeCodeBlockHandler","makeEmbedArrowHandler","shiftKey","where","prev","curFormats","prevFormats","nextLength","nextFormats","firstFormats","lastFormats","lineFormats","scrollIndex","baseLodash","_baseLodash","baseCreate","LodashWrapper","chainAll","_LodashWrapper","flatten","overRest","setToString","flatRest","_flatRest","WeakMap","metaMap","_metaMap","noop","getData","_getData","realNames","_realNames","objectProto","hasOwnProperty","getFuncName","array","otherFunc","_getFuncName","MAX_ARRAY_LENGTH","LazyWrapper","_LazyWrapper","copyArray","wrapperClone","_wrapperClone","lodash","wrapperLodash","isLaziable","funcName","_isLaziable","FUNC_ERROR_TEXT","WRAP_CURRY_FLAG","WRAP_PARTIAL_FLAG","WRAP_ARY_FLAG","WRAP_REARG_FLAG","createFlow","fromRight","funcs","prereq","_createFlow","flow","flow_1","basePropertyOf","_basePropertyOf","htmlEscapes","escapeHtmlChar","_escapeHtmlChar","toString","reUnescapedHtml","reHasUnescapedHtml","escape","_escape","htmlUnescapes","unescapeHtmlChar","_unescapeHtmlChar","reEscapedHtml","reHasEscapedHtml","unescape","_unescape","Toolbar","addControls","selected","isActive","addButton","groups","controls","control","addSelect","values","Bold","Italic","Underline","Strike","FontAttributor","sizeFromQuillToUser","quillSize","multiplier","sizeFromUserToQuill","userSize","setDefaultParagraphSize","pTag","elementNodes","largestFontSize","largestTextSize","tagFontSize","setParagraphFontSizes","pTags","el","textSizes","textSizesFromNodes","smallestTextSize","sizes","SizeAttributor","converted","lazyGoogleFont","fontID","link","toolbar","keyBindings","PangoToQuillResult","colors","fonts","fontSizes","QuillToPangoResult","QuillHelpers","applyFonts","applySizes","applyColors","mergeStyles","formatLineBreaks","styleAttributeFromPango","pangoAttribute","cssAttribute","transform","stripStyleAttributes","convertToSpans","formatWhiteSpace","removeCursorTag","removeEmptySpan","appendPangoAttributesFromStyle","transformed","useTabTray","bool","MOUSE_DOWN","MOUSE_MOVE","MOUSE_UP","toInteger","default_value","stopEvent","__indexOf","OPTIONAL_BG","cornerCursorSegments","segments","capitalizedDirection","_PrismViewCanvas","template","imageSlot","templateID","orientation","useTemplateSelectStore","templateData","shrinkage","offscreenWidth","offscreenHeight","shiftMod","syntheticEvent","_len","noSave","im","imageProps","slot_data","_fn","_j","_k","num_photo_slots","num_text_slots","photo_slots","text_slots","slot_id","_ref6","ez","overlay","ey","touch","touches","auto_redraw","minDim","theight","tpr","twidth","vpheight","vpr","vpwidth","extraResize","sv","rs","clientBaseFont","text1PosX","text1Height","text1PosY","text2PosX","text2Height","text2PosY","text_size","pattern","overlays","dragIsActive","allow","ignoreSelected","propName","curSelected","maxSlotSize","imageHeight","imageWidth","imageSizeRelation","adjustedImageHeight","adjustedImageWidth","imageSize","relativePointerPosition","photoId","wrapperDimensions","smallerSideSize","slotPosition","resizedCoords","xy1","xy2","nodeClass","currentAngle","rotate","cursors","accumulator","segment","cornersArray","clickedOnSlot","interactionMode","offsetX","offsetY","p3","p4","off","yo","xo","xy","imageSlots","select_slot","selectedSlot","editor","pango","previousIndex","oldIndex","fireEvent","templateInterrogator","each","zoomed","img_id","textSlot","found","clonePrefix","clones","slotIdx","borderState","ev","selectedID","slotId","content_type","restoreSelection","embellishment","imageId","slotsToEmpty","json_slot","setSlotImage","setSlotText","slotIsPredefined","stackableInit","stackableChecks","sanitiseTextSlot","hint","skipTemplateCache","slots","total","complete","setBlockedValue","action","saves","bMenu","extraHeight","yPoints","prevSlot","currentSlot","nextSlot","overriddenId","overriddenSlotIds","templateSlot","findIndex","slotsInPosition","aValue","bValue","PrismViewCanvas","AppTypeProvider","PropTypes","AppType","ChangeOrientationNotice","alertColour","Store","slotEvents","PrismView$1","spread","pgData","page","prevDouble","draw","offsetWidth","offsetHeight","centerWidth","centerHeight","canvasStyle","canvasStyleRight","statusText","descriptionText","$customPageHtml","EnvelopePage","visiblePage","isMultiPageStandardProduct","$3DPreview","$progressBar","isSquare","shouldDisplayOrientationNotice","hasLayoutsTray","isCalendar","PageSpreads","nextSpread","prevSpread","focusedSlot","slotEvent","updateSelectableAndTitle","toBeUpdated","sections","PrismView","RefreshOnEvents","TrackPreviewMode","ImageSlotToolSimple","leftSide","rightSide","topSide","bottomSide","handleRemoveClick","MananaSlider","handleZoom","handleRotateClick","handleLaunchEditLevel2","imgLoaded","imgLoading","imgFailed","ImageWatcher","easing","DEFAULT_TRANSITION","MODE_TRANSITION","MODE_ORIG_LOADING","MODE_ORIG","MODE_IMG_FAILED","MODE_IMG","CanvasImage","orig","background","setBelongsToCanvasImage","copyOfProps","SpinnerCover","prevProps","loadedState","imgObj","why","unloadedState","origAlpha","imgAlpha","alpha","s1","s2","s3","ChicletsBase","HideUsedPhotos","PhotosTrayBase","prevState","prevFilterUsed","fireAddPhotos","images","removed","number_of_files","prevProgress","nextProgress","getDisplayName","refreshOnEvents","WrappedComponent","FavouritesTrayItemPreview","FavouritesTrayItemPreviewDesktop","handleClick","DRAG_ITEM","DRAG_ITEM_HEIGHT","DRAG_ITEM_WIDTH","previewTimeout","PreviewIconButton","DragItem","showPreviewIconButton","dataStr","dragItem","modalShowing","trayHeight","scrollTray","clientX","clientY","drag","spinner","layoutFilter","LayoutTemplateItem","loaded","autoFocus","draggable","Spinner","$button","LayoutsTrayBase","observee","observerOptions","getFoldersBySection","hasEdgesTray","templateGroups","TemplateStore","_b","oppositeSide","OptionTrayMixin","transformAttempts","filterName","targetFilters","targetProduct","productPrice","getProductPrice","currentFilters","matchingProduct","titleClean","wrapParenthesesWithSpan","Title","filterPropertyTitleToUpperCase","PriceDifference","children","difference","differenceIsHigher","Variable","variableName","VariableTrayBase","findVariable","formData","Wrap","WrapsTrayBase","newTemplate","MobileAddToCartButton","translate","subscribeWithSelectorImpl","get","api","origSubscribe","optListener","equalityFn","currentSlice","nextSlice","previousSlice","subscribeWithSelector","SUPPORTED_VIEW_MODES","usePageStore","AddToCartNoticeBase","emptyImageSlot","unchangedDefaultText","lowDpiImage","emptyPage","orientationMismatch","viewMode","$warnings","hidePreviewButton","cardPages","pages","cardNavLabel","selectPage","baseEach","baseFilter","collection","_baseFilter","arrayFilter","baseIteratee","filter_1","recordNewUploads","imageList","album","newUploads","image_ref","newUploadsNotFromAlbums","u","handleGoToPage","customPageId","handleOptionSelected","spreads","requestedIndex","globalPreviewLoader","previewURL","PREVIEW_RESOLUTION","pageNumber","qs","host","UI_STATE","pageAndTemplate","orientations","orientationTag","autoFillImageUponUpload","SLOT_UPDATE_EVENTS","SLOT_DELAYED_EVENTS","curriedEventHandler","curry","eventType","handleSlotChanged","handleSlotClicked","handleSlotMoved"],"mappings":"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","x_google_ignoreList":[6,7,13,14,15,16,17,18,19,35,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,159,163,164]}