{
  "version": 3,
  "sources": ["/cdn/shop/t/83/assets/laley-recharge-bridge.js?lly=laley-custom-20260908-illustrations-v848"],
  "sourcesContent": ["/* Recharge remains the selling-plan provider. Laley owns the only visible\n   post-add subscription offer through the shared overlay system. */\n(() => {\n  if (window.__laleyRechargeBridge) return;\n  window.__laleyRechargeBridge = true;\n\n  const isProduct = document.body.classList.contains('template-product')\n    || /\\/products\\//.test(window.location.pathname);\n  if (!isProduct) return;\n\n  const root = document.querySelector('[data-laley-subscription-upgrade-modal]');\n  if (!root) return;\n\n  const sheet = root.querySelector('.laley-subscription-upgrade__sheet');\n  const imageWrap = root.querySelector('[data-laley-subscribe-media]');\n  const image = root.querySelector('[data-laley-subscribe-image]');\n  const title = root.querySelector('[data-laley-subscribe-title]');\n  const variant = root.querySelector('[data-laley-subscribe-variant]');\n  const frequency = root.querySelector('[data-laley-subscribe-frequency]');\n  const savingPercent = root.querySelector('[data-laley-subscribe-saving-percent]');\n  const savingAmount = root.querySelector('[data-laley-subscribe-saving-amount]');\n  const totalSavingAmount = root.querySelector('[data-laley-subscribe-total-saving]');\n  const quantityCopy = root.querySelector('[data-laley-subscribe-quantity-copy]');\n  const compare = root.querySelector('[data-laley-subscribe-compare]');\n  const price = root.querySelector('[data-laley-subscribe-price]');\n  const saving = root.querySelector('[data-laley-subscribe-saving]');\n  const confirm = root.querySelector('[data-laley-subscribe-confirm]');\n  const message = root.querySelector('[data-laley-subscribe-message]');\n  const SHIPPING_SAVING = 7900;\n  const CLOSE_DURATION = 320;\n  let pending = null;\n  let closeTimer = 0;\n  let fallbackTimer = 0;\n  let scrollLockOwned = false;\n\n  const formatMoney = (cents) => `${new Intl.NumberFormat('nb-NO', {\n    maximumFractionDigits: 0,\n  }).format(Math.round(Number(cents || 0) / 100))} kr`;\n\n  const selectedVariantLabel = (section) => {\n    const selected = section?.querySelector(\n      '[data-pdp-color-group] [data-pdp-selected-value], '\n      + '[data-pdp-color-group] .pdp-clean__selected-value, '\n      + '[data-pdp-color-group] [data-pdp-selected-option]'\n    );\n    if (selected?.textContent?.trim()) return selected.textContent.trim();\n    const active = section?.querySelector(\n      '[data-pdp-color-group] [aria-pressed=\"true\"], '\n      + '[data-pdp-color-group] .is-selected'\n    );\n    return active?.textContent?.trim() || '';\n  };\n\n  const productImage = (section) => {\n    const selected = section?.querySelector(\n      '.pdp-clean__swatch.is-selected img, '\n      + '.pdp-clean__option.is-selected img, '\n      + '[data-pdp-color-group] [aria-pressed=\"true\"] img'\n    );\n    const fallback = section?.querySelector(\n      '.pdp-clean__product-chip img, .pdp-clean__media img, .pdp-clean__gallery img'\n    );\n    const node = selected || fallback;\n    return node ? (node.currentSrc || node.src || '') : '';\n  };\n\n  const subscriptionPackshot = (section, variantLabel) => {\n    const key = String(variantLabel || '')\n      .normalize('NFD')\n      .replace(/[\\u0300-\\u036f]/g, '')\n      .toLowerCase()\n      .replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');\n    return (key && section?.getAttribute(`data-pdp-subscription-packshot-${key}`))\n      || productImage(section);\n  };\n\n  const isMouthTapeSection = (section) => Boolean(section) && (\n    section.dataset.pdpProductKind === 'mouth-tape'\n    || section.classList.contains('pdp-clean--mouth-tape')\n    || section.querySelector('[data-pdp-mouth-tape-picker]')\n  );\n\n  const captureOffer = (button) => {\n    const section = button?.closest('[data-pdp-section]');\n    if (!isMouthTapeSection(section)) return null;\n\n    const onetime = section.querySelector('[data-pdp-onetime-radio]');\n    const subscription = section.querySelector('[data-pdp-subscription-radio]');\n    if (!onetime?.checked || !subscription) return null;\n\n    const form = section.querySelector('[data-pdp-form], form[action*=\"/cart/add\"]');\n    const variantId = form?.querySelector('[name=\"id\"]')?.value\n      || section.dataset.pdpCurrentVariantId\n      || '';\n    const planSelect = section.querySelector('[data-pdp-plan-select]');\n    const selectedPlan = planSelect?.selectedOptions?.[0];\n    const sellingPlanId = selectedPlan?.value\n      || subscription.dataset.planId\n      || subscription.value\n      || '';\n    if (!variantId || !sellingPlanId) return null;\n\n    const oneTimePrice = Number(onetime.dataset.planPrice || 0);\n    const subscriptionPrice = Number(\n      selectedPlan?.dataset.planPrice\n      || subscription.dataset.planPrice\n      || 0\n    );\n    const savingPercent = Number(selectedPlan?.dataset.planSavingsPct)\n      || (oneTimePrice > 0\n        ? Math.max(0, Math.round((1 - (subscriptionPrice / oneTimePrice)) * 100))\n        : 0);\n\n    const selectedVariant = selectedVariantLabel(section);\n\n    return {\n      section,\n      trigger: button,\n      variantId: String(variantId),\n      sellingPlanId: String(sellingPlanId),\n      title: section.querySelector('.pdp-clean__title')?.textContent?.trim() || 'Produkt',\n      variant: selectedVariant,\n      image: subscriptionPackshot(section, selectedVariant),\n      frequency: selectedPlan?.dataset.planLabel\n        || selectedPlan?.textContent?.trim()\n        || section.querySelector('[data-pdp-plan-label]')?.textContent?.trim()\n        || 'Levering hver 30. dag',\n      oneTimePrice,\n      subscriptionPrice,\n      savingPercent,\n      quantity: 1,\n      lineKey: '',\n      opened: false,\n      preparing: false,\n      startedAt: Date.now(),\n    };\n  };\n\n  const findOnetimeLine = (cart, offer) => {\n    const items = cart?.items || [];\n    const exact = items.find((item) => (\n      offer.lineKey\n      && item.key === offer.lineKey\n      && String(item.variant_id) === String(offer.variantId)\n      && !item.selling_plan_allocation\n    ));\n    return exact || items.find((item) => (\n      String(item.variant_id) === String(offer.variantId)\n      && !item.selling_plan_allocation\n    ));\n  };\n\n  const setMessage = (text = '') => {\n    if (!message) return;\n    message.textContent = text;\n    message.hidden = !text;\n  };\n\n  const savingTotal = (offer) => Math.max(\n    0,\n    (Number(offer?.oneTimePrice || 0) - Number(offer?.subscriptionPrice || 0))\n      * Math.max(1, Number(offer?.quantity || 1))\n  );\n\n  const offerTotalSaving = (offer) => savingTotal(offer) + SHIPPING_SAVING;\n\n  const confirmLabel = (offer) => (\n    offerTotalSaving(offer) > SHIPPING_SAVING\n      ? `Abonner og spar ${formatMoney(offerTotalSaving(offer))}`\n      : (confirm?.dataset.defaultLabel || 'Abonner og spar')\n  );\n\n  const updateQuantity = (nextQuantity) => {\n    if (!pending) return;\n    pending.quantity = Math.max(1, Number(nextQuantity) || 1);\n    if (quantityCopy) quantityCopy.textContent = `${pending.quantity} stk`;\n    if (savingAmount) savingAmount.textContent = formatMoney(savingTotal(pending));\n    if (totalSavingAmount) totalSavingAmount.textContent = formatMoney(offerTotalSaving(pending));\n    if (compare) compare.textContent = formatMoney(pending.oneTimePrice * pending.quantity);\n    if (price) price.textContent = formatMoney(pending.subscriptionPrice * pending.quantity);\n    if (confirm) confirm.textContent = confirmLabel(pending);\n  };\n\n  const populate = (offer) => {\n    if (title) title.textContent = offer.title;\n    if (variant) {\n      variant.textContent = offer.variant;\n      variant.hidden = !offer.variant;\n    }\n    if (frequency) frequency.textContent = offer.frequency;\n    if (savingPercent) {\n      savingPercent.textContent = offer.savingPercent > 0 ? `${offer.savingPercent} %` : '';\n      savingPercent.hidden = offer.savingPercent <= 0;\n    }\n    if (saving) {\n      saving.textContent = offer.savingPercent > 0 ? `Spar ${offer.savingPercent} %` : '';\n      saving.hidden = offer.savingPercent <= 0;\n    }\n    if (image && imageWrap) {\n      if (offer.image) {\n        image.src = offer.image;\n        image.alt = offer.title;\n        imageWrap.hidden = false;\n      } else {\n        image.removeAttribute('src');\n        image.alt = '';\n        imageWrap.hidden = true;\n      }\n    }\n    updateQuantity(offer.quantity);\n    setMessage();\n    if (confirm) {\n      confirm.disabled = false;\n      confirm.removeAttribute('aria-busy');\n      confirm.textContent = confirmLabel(offer);\n    }\n  };\n\n  const lockScroll = () => {\n    if (scrollLockOwned) return;\n    scrollLockOwned = true;\n    document.dispatchEvent(new CustomEvent('theme:scroll:lock', {\n      bubbles: true,\n      detail: root,\n    }));\n  };\n\n  const unlockScroll = () => {\n    if (!scrollLockOwned) return;\n    scrollLockOwned = false;\n    document.dispatchEvent(new CustomEvent('theme:scroll:unlock', { bubbles: true }));\n  };\n\n  const closeCartDrawer = () => {\n    const drawer = document.querySelector(\n      'cart-drawer.is-open, #cart-drawer.is-open, .drawer--cart.is-open'\n    );\n    if (!drawer) return;\n    const close = drawer.querySelector(\n      '[data-cart-drawer-close], [data-drawer-close], .drawer__close'\n    );\n    if (close instanceof HTMLElement) {\n      close.click();\n      return;\n    }\n    drawer.classList.remove('is-open', 'active', 'animate');\n  };\n\n  const openModal = (offer) => {\n    if (!offer || offer.opened) return;\n    offer.opened = true;\n    populate(offer);\n    window.clearTimeout(closeTimer);\n    root.classList.remove('is-closing');\n    root.hidden = false;\n    root.setAttribute('aria-hidden', 'false');\n    window.LaleyOverlaySystem?.captureTrigger?.(offer.trigger);\n    /* Cart refresh listeners may open the normal drawer synchronously from the\n       same success event. Close it before the browser paints: one intent, one\n       surface. Repeat on the next frame for legacy delayed listeners. */\n    closeCartDrawer();\n    lockScroll();\n    window.requestAnimationFrame(() => {\n      closeCartDrawer();\n      root.classList.add('is-open');\n      window.requestAnimationFrame(() => {\n        closeCartDrawer();\n        root.querySelector('button[data-laley-subscribe-close]')?.focus({ preventScroll: true });\n      });\n    });\n  };\n\n  const openCartDrawer = () => {\n    const bag = document.querySelector(\n      '.laley-hv2__action--cart, a[href=\"/cart\"][aria-label], '\n      + '[data-cart-toggle], [aria-controls=\"cart-drawer\"], [aria-controls=\"CartDrawer\"]'\n    );\n    if (bag instanceof HTMLElement) bag.click();\n  };\n\n  const closeModal = ({ continueToCart = false, clearOffer = true } = {}) => {\n    window.clearTimeout(closeTimer);\n    root.classList.remove('is-open');\n    root.classList.add('is-closing');\n    root.setAttribute('aria-hidden', 'true');\n    unlockScroll();\n    closeTimer = window.setTimeout(() => {\n      root.hidden = true;\n      root.classList.remove('is-closing');\n      if (continueToCart) openCartDrawer();\n    }, CLOSE_DURATION);\n    if (clearOffer) pending = null;\n  };\n\n  const fetchCart = () => fetch('/cart.js', {\n    headers: { Accept: 'application/json' },\n  }).then((response) => {\n    if (!response.ok) throw new Error('cart fetch failed');\n    return response.json();\n  });\n\n  const dispatchCart = (cart, item = null) => {\n    const detail = {\n      cart,\n      item,\n      cartCount: Number(cart?.item_count) || 0,\n    };\n    [\n      'cart:refresh',\n      'cart:updated',\n      'cart:change',\n      'theme:cart:change',\n      'theme:cart:updated',\n    ].forEach((name) => {\n      document.dispatchEvent(new CustomEvent(name, { bubbles: true, detail }));\n    });\n  };\n\n  const prepareFromCart = async (cart) => {\n    if (!pending || pending.opened || pending.preparing) return;\n    pending.preparing = true;\n    try {\n      const currentCart = cart?.items ? cart : await fetchCart();\n      const line = findOnetimeLine(currentCart, pending);\n      if (!line?.key) return;\n      pending.lineKey = line.key;\n      pending.quantity = Math.max(1, Number(line.quantity) || 1);\n      pending.title = line.product_title || pending.title;\n      pending.variant = line.variant_title && line.variant_title !== 'Default Title'\n        ? line.variant_title\n        : pending.variant;\n      /* The PDP supplies a clean, shade-specific subscription packshot.\n         Cart line images are editorial variant photos and must only be a\n         fallback, otherwise the offer becomes an image inside an image. */\n      pending.image = pending.image || line.image;\n      openModal(pending);\n    } catch (_) {\n      /* The one-time purchase remains safely in the cart if hydration fails. */\n    } finally {\n      if (pending) pending.preparing = false;\n    }\n  };\n\n  const convertToSubscription = async () => {\n    if (!pending?.lineKey || !pending.sellingPlanId || confirm?.disabled) return;\n    const offer = pending;\n    if (confirm) {\n      confirm.disabled = true;\n      confirm.setAttribute('aria-busy', 'true');\n      confirm.textContent = 'Oppdaterer \u2026';\n    }\n    setMessage();\n\n    try {\n      /* Read the cart at the moment of confirmation. Discounts, cart\n         transforms and drawer refreshes can all replace a Shopify line key\n         after the offer opened. A fresh key also makes this operation safe\n         alongside the campaign's read-only cart snapshot updates. */\n      const currentCart = await fetchCart();\n      const currentLine = findOnetimeLine(currentCart, offer);\n      if (!currentLine?.key) throw new Error('onetime line missing');\n      const lineIndex = (currentCart?.items || []).findIndex((item) => item.key === currentLine.key);\n      if (lineIndex < 0) throw new Error('onetime line position missing');\n\n      const quantity = Math.max(1, Number(currentLine.quantity) || 1);\n      const changeResponse = await fetch('/cart/change.js', {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n        body: JSON.stringify({\n          // Shopify krever linjeposisjon n\u00E5r selling_plan endres. N\u00F8kkel/variant\n          // er ellers gyldig for antall, men avvises i denne operasjonen.\n          line: lineIndex + 1,\n          quantity,\n          selling_plan: Number(offer.sellingPlanId),\n        }),\n      });\n      if (!changeResponse.ok) throw new Error('subscription change failed');\n\n      /* Shopify changes the purchase option atomically. There is never a\n         temporary duplicate line to roll back, and an existing subscription\n         for the same variant is merged without losing its quantity. */\n      const cart = await changeResponse.json();\n      const changedItem = (cart?.items || []).find((item) => (\n        String(item.variant_id) === String(offer.variantId)\n        && String(item.selling_plan_allocation?.selling_plan?.id || '')\n          === String(offer.sellingPlanId)\n      ));\n      if (!changedItem) throw new Error('subscription change not confirmed');\n\n      pending = null;\n      dispatchCart(cart, changedItem);\n      closeModal({ continueToCart: true, clearOffer: false });\n    } catch (_) {\n      setMessage('Kunne ikke bytte akkurat n\u00E5. Engangskj\u00F8pet ligger fortsatt trygt i handlekurven.');\n      if (confirm) {\n        confirm.disabled = false;\n        confirm.removeAttribute('aria-busy');\n        confirm.textContent = confirmLabel(offer);\n      }\n    }\n  };\n\n  const handleCartSuccess = (event) => {\n    if (!pending || pending.opened) return;\n    const cart = event?.detail?.cart;\n    const item = event?.detail?.item;\n    if (item?.variant_id && String(item.variant_id) !== pending.variantId) return;\n    window.clearTimeout(fallbackTimer);\n    prepareFromCart(cart);\n  };\n\n  document.addEventListener('click', (event) => {\n    const target = event.target?.nodeType === 1 ? event.target : event.target?.parentElement;\n    const atc = target?.closest?.('[data-pdp-atc]');\n    if (atc) {\n      pending = captureOffer(atc);\n      window.clearTimeout(fallbackTimer);\n      if (pending) {\n        fallbackTimer = window.setTimeout(() => prepareFromCart(), 4000);\n      }\n      return;\n    }\n\n    if (!root.contains(target)) return;\n    if (target.closest('[data-laley-subscribe-close]')) {\n      event.preventDefault();\n      closeModal();\n      return;\n    }\n    if (target.closest('[data-laley-subscribe-continue]')) {\n      event.preventDefault();\n      closeModal({ continueToCart: true });\n      return;\n    }\n    if (target.closest('[data-laley-subscribe-confirm]')) {\n      convertToSubscription();\n    }\n  }, true);\n\n  root.addEventListener('laley-overlay:request-close', () => closeModal());\n  root.addEventListener('keydown', (event) => {\n    if (event.key !== 'Tab' || !root.classList.contains('is-open')) return;\n    const focusable = Array.from(root.querySelectorAll(\n      'button:not(:disabled), a[href], input:not(:disabled), select:not(:disabled), [tabindex]:not([tabindex=\"-1\"])'\n    )).filter((element) => element.getClientRects().length > 0);\n    if (!focusable.length) {\n      event.preventDefault();\n      sheet?.focus({ preventScroll: true });\n      return;\n    }\n    const first = focusable[0];\n    const last = focusable[focusable.length - 1];\n    if (event.shiftKey && document.activeElement === first) {\n      event.preventDefault();\n      last.focus({ preventScroll: true });\n    } else if (!event.shiftKey && document.activeElement === last) {\n      event.preventDefault();\n      first.focus({ preventScroll: true });\n    }\n  });\n\n  [\n    'cart:updated',\n    'cart:change',\n    'theme:cart:change',\n    'theme:cart:updated',\n    'theme:product:added',\n  ].forEach((name) => document.addEventListener(name, handleCartSuccess));\n\n  window.LaleySubscriptionUpgrade = {\n    ownsCartHandoff: () => Boolean(pending),\n    close: closeModal,\n  };\n})();\n"],
  "mappings": "CAEC,IAAM,CAML,GALI,OAAO,wBACX,OAAO,sBAAwB,GAI3B,EAFc,SAAS,KAAK,UAAU,SAAS,kBAAkB,GAChE,eAAe,KAAK,OAAO,SAAS,QAAQ,IACjC,OAEhB,MAAM,KAAO,SAAS,cAAc,yCAAyC,EAC7E,GAAI,CAAC,KAAM,OAEX,MAAM,MAAQ,KAAK,cAAc,oCAAoC,EAC/D,UAAY,KAAK,cAAc,8BAA8B,EAC7D,MAAQ,KAAK,cAAc,8BAA8B,EACzD,MAAQ,KAAK,cAAc,8BAA8B,EACzD,QAAU,KAAK,cAAc,gCAAgC,EAC7D,UAAY,KAAK,cAAc,kCAAkC,EACjE,cAAgB,KAAK,cAAc,uCAAuC,EAC1E,aAAe,KAAK,cAAc,sCAAsC,EACxE,kBAAoB,KAAK,cAAc,qCAAqC,EAC5E,aAAe,KAAK,cAAc,sCAAsC,EACxE,QAAU,KAAK,cAAc,gCAAgC,EAC7D,MAAQ,KAAK,cAAc,8BAA8B,EACzD,OAAS,KAAK,cAAc,+BAA+B,EAC3D,QAAU,KAAK,cAAc,gCAAgC,EAC7D,QAAU,KAAK,cAAc,gCAAgC,EAC7D,gBAAkB,KAClB,eAAiB,IACvB,IAAI,QAAU,KACV,WAAa,EACb,cAAgB,EAChB,gBAAkB,GAEtB,MAAM,YAAe,OAAU,GAAG,IAAI,KAAK,aAAa,QAAS,CAC/D,sBAAuB,CACzB,CAAC,EAAE,OAAO,KAAK,MAAM,OAAO,OAAS,CAAC,EAAI,GAAG,CAAC,CAAC,MAEzC,qBAAwB,SAAY,CACxC,MAAM,SAAW,SAAS,cACxB,wJAGF,EACA,OAAI,UAAU,aAAa,KAAK,EAAU,SAAS,YAAY,KAAK,EACrD,SAAS,cACtB,mFAEF,GACe,aAAa,KAAK,GAAK,EACxC,EAEM,aAAgB,SAAY,CAChC,MAAM,SAAW,SAAS,cACxB,0HAGF,EACM,SAAW,SAAS,cACxB,8EACF,EACM,KAAO,UAAY,SACzB,OAAO,OAAQ,KAAK,YAAc,KAAK,MAAO,EAChD,EAEM,qBAAuB,CAAC,QAAS,eAAiB,CACtD,MAAM,IAAM,OAAO,cAAgB,EAAE,EAClC,UAAU,KAAK,EACf,QAAQ,mBAAoB,EAAE,EAC9B,YAAY,EACZ,QAAQ,cAAe,GAAG,EAAE,QAAQ,SAAU,EAAE,EACnD,OAAQ,KAAO,SAAS,aAAa,kCAAkC,GAAG,EAAE,GACvE,aAAa,OAAO,CAC3B,EAEM,mBAAsB,SAAY,EAAQ,UAC9C,QAAQ,QAAQ,iBAAmB,cAChC,QAAQ,UAAU,SAAS,uBAAuB,GAClD,QAAQ,cAAc,8BAA8B,GAGnD,aAAgB,QAAW,CAC/B,MAAM,QAAU,QAAQ,QAAQ,oBAAoB,EACpD,GAAI,CAAC,mBAAmB,OAAO,EAAG,OAAO,KAEzC,MAAM,QAAU,QAAQ,cAAc,0BAA0B,EAC1D,aAAe,QAAQ,cAAc,+BAA+B,EAC1E,GAAI,CAAC,SAAS,SAAW,CAAC,aAAc,OAAO,KAG/C,MAAM,UADO,QAAQ,cAAc,4CAA4C,GACvD,cAAc,aAAa,GAAG,OACjD,QAAQ,QAAQ,qBAChB,GAEC,aADa,QAAQ,cAAc,wBAAwB,GAChC,kBAAkB,CAAC,EAC9C,cAAgB,cAAc,OAC/B,aAAa,QAAQ,QACrB,aAAa,OACb,GACL,GAAI,CAAC,WAAa,CAAC,cAAe,OAAO,KAEzC,MAAM,aAAe,OAAO,QAAQ,QAAQ,WAAa,CAAC,EACpD,kBAAoB,OACxB,cAAc,QAAQ,WACnB,aAAa,QAAQ,WACrB,CACL,EACMA,eAAgB,OAAO,cAAc,QAAQ,cAAc,IAC3D,aAAe,EACf,KAAK,IAAI,EAAG,KAAK,OAAO,EAAK,kBAAoB,cAAiB,GAAG,CAAC,EACtE,GAEA,gBAAkB,qBAAqB,OAAO,EAEpD,MAAO,CACL,QACA,QAAS,OACT,UAAW,OAAO,SAAS,EAC3B,cAAe,OAAO,aAAa,EACnC,MAAO,QAAQ,cAAc,mBAAmB,GAAG,aAAa,KAAK,GAAK,UAC1E,QAAS,gBACT,MAAO,qBAAqB,QAAS,eAAe,EACpD,UAAW,cAAc,QAAQ,WAC5B,cAAc,aAAa,KAAK,GAChC,QAAQ,cAAc,uBAAuB,GAAG,aAAa,KAAK,GAClE,wBACL,aACA,kBACA,cAAAA,eACA,SAAU,EACV,QAAS,GACT,OAAQ,GACR,UAAW,GACX,UAAW,KAAK,IAAI,CACtB,CACF,EAEM,gBAAkB,CAAC,KAAM,QAAU,CACvC,MAAM,MAAQ,MAAM,OAAS,CAAC,EAO9B,OANc,MAAM,KAAM,MACxB,MAAM,SACH,KAAK,MAAQ,MAAM,SACnB,OAAO,KAAK,UAAU,IAAM,OAAO,MAAM,SAAS,GAClD,CAAC,KAAK,uBACV,GACe,MAAM,KAAM,MAC1B,OAAO,KAAK,UAAU,IAAM,OAAO,MAAM,SAAS,GAC/C,CAAC,KAAK,uBACV,CACH,EAEM,WAAa,CAAC,KAAO,KAAO,CAC3B,UACL,QAAQ,YAAc,KACtB,QAAQ,OAAS,CAAC,KACpB,EAEM,YAAe,OAAU,KAAK,IAClC,GACC,OAAO,OAAO,cAAgB,CAAC,EAAI,OAAO,OAAO,mBAAqB,CAAC,GACpE,KAAK,IAAI,EAAG,OAAO,OAAO,UAAY,CAAC,CAAC,CAC9C,EAEM,iBAAoB,OAAU,YAAY,KAAK,EAAI,gBAEnD,aAAgB,OACpB,iBAAiB,KAAK,EAAI,gBACtB,mBAAmB,YAAY,iBAAiB,KAAK,CAAC,CAAC,GACtD,SAAS,QAAQ,cAAgB,kBAGlC,eAAkB,cAAiB,CAClC,UACL,QAAQ,SAAW,KAAK,IAAI,EAAG,OAAO,YAAY,GAAK,CAAC,EACpD,eAAc,aAAa,YAAc,GAAG,QAAQ,QAAQ,QAC5D,eAAc,aAAa,YAAc,YAAY,YAAY,OAAO,CAAC,GACzE,oBAAmB,kBAAkB,YAAc,YAAY,iBAAiB,OAAO,CAAC,GACxF,UAAS,QAAQ,YAAc,YAAY,QAAQ,aAAe,QAAQ,QAAQ,GAClF,QAAO,MAAM,YAAc,YAAY,QAAQ,kBAAoB,QAAQ,QAAQ,GACnF,UAAS,QAAQ,YAAc,aAAa,OAAO,GACzD,EAEM,SAAY,OAAU,CACtB,QAAO,MAAM,YAAc,MAAM,OACjC,UACF,QAAQ,YAAc,MAAM,QAC5B,QAAQ,OAAS,CAAC,MAAM,SAEtB,YAAW,UAAU,YAAc,MAAM,WACzC,gBACF,cAAc,YAAc,MAAM,cAAgB,EAAI,GAAG,MAAM,aAAa,KAAO,GACnF,cAAc,OAAS,MAAM,eAAiB,GAE5C,SACF,OAAO,YAAc,MAAM,cAAgB,EAAI,QAAQ,MAAM,aAAa,KAAO,GACjF,OAAO,OAAS,MAAM,eAAiB,GAErC,OAAS,YACP,MAAM,OACR,MAAM,IAAM,MAAM,MAClB,MAAM,IAAM,MAAM,MAClB,UAAU,OAAS,KAEnB,MAAM,gBAAgB,KAAK,EAC3B,MAAM,IAAM,GACZ,UAAU,OAAS,KAGvB,eAAe,MAAM,QAAQ,EAC7B,WAAW,EACP,UACF,QAAQ,SAAW,GACnB,QAAQ,gBAAgB,WAAW,EACnC,QAAQ,YAAc,aAAa,KAAK,EAE5C,EAEM,WAAa,IAAM,CACnB,kBACJ,gBAAkB,GAClB,SAAS,cAAc,IAAI,YAAY,oBAAqB,CAC1D,QAAS,GACT,OAAQ,IACV,CAAC,CAAC,EACJ,EAEM,aAAe,IAAM,CACpB,kBACL,gBAAkB,GAClB,SAAS,cAAc,IAAI,YAAY,sBAAuB,CAAE,QAAS,EAAK,CAAC,CAAC,EAClF,EAEM,gBAAkB,IAAM,CAC5B,MAAM,OAAS,SAAS,cACtB,kEACF,EACA,GAAI,CAAC,OAAQ,OACb,MAAM,MAAQ,OAAO,cACnB,+DACF,EACA,GAAI,iBAAiB,YAAa,CAChC,MAAM,MAAM,EACZ,MACF,CACA,OAAO,UAAU,OAAO,UAAW,SAAU,SAAS,CACxD,EAEM,UAAa,OAAU,CACvB,CAAC,OAAS,MAAM,SACpB,MAAM,OAAS,GACf,SAAS,KAAK,EACd,OAAO,aAAa,UAAU,EAC9B,KAAK,UAAU,OAAO,YAAY,EAClC,KAAK,OAAS,GACd,KAAK,aAAa,cAAe,OAAO,EACxC,OAAO,oBAAoB,iBAAiB,MAAM,OAAO,EAIzD,gBAAgB,EAChB,WAAW,EACX,OAAO,sBAAsB,IAAM,CACjC,gBAAgB,EAChB,KAAK,UAAU,IAAI,SAAS,EAC5B,OAAO,sBAAsB,IAAM,CACjC,gBAAgB,EAChB,KAAK,cAAc,oCAAoC,GAAG,MAAM,CAAE,cAAe,EAAK,CAAC,CACzF,CAAC,CACH,CAAC,EACH,EAEM,eAAiB,IAAM,CAC3B,MAAM,IAAM,SAAS,cACnB,wIAEF,EACI,eAAe,aAAa,IAAI,MAAM,CAC5C,EAEM,WAAa,CAAC,CAAE,eAAiB,GAAO,WAAa,EAAK,EAAI,CAAC,IAAM,CACzE,OAAO,aAAa,UAAU,EAC9B,KAAK,UAAU,OAAO,SAAS,EAC/B,KAAK,UAAU,IAAI,YAAY,EAC/B,KAAK,aAAa,cAAe,MAAM,EACvC,aAAa,EACb,WAAa,OAAO,WAAW,IAAM,CACnC,KAAK,OAAS,GACd,KAAK,UAAU,OAAO,YAAY,EAC9B,gBAAgB,eAAe,CACrC,EAAG,cAAc,EACb,aAAY,QAAU,KAC5B,EAEM,UAAY,IAAM,MAAM,WAAY,CACxC,QAAS,CAAE,OAAQ,kBAAmB,CACxC,CAAC,EAAE,KAAM,UAAa,CACpB,GAAI,CAAC,SAAS,GAAI,MAAM,IAAI,MAAM,mBAAmB,EACrD,OAAO,SAAS,KAAK,CACvB,CAAC,EAEK,aAAe,CAAC,KAAM,KAAO,OAAS,CAC1C,MAAM,OAAS,CACb,KACA,KACA,UAAW,OAAO,MAAM,UAAU,GAAK,CACzC,EACA,CACE,eACA,eACA,cACA,oBACA,oBACF,EAAE,QAAS,MAAS,CAClB,SAAS,cAAc,IAAI,YAAY,KAAM,CAAE,QAAS,GAAM,MAAO,CAAC,CAAC,CACzE,CAAC,CACH,EAEM,gBAAkB,MAAO,MAAS,CACtC,GAAI,GAAC,SAAW,QAAQ,QAAU,QAAQ,WAC1C,SAAQ,UAAY,GACpB,GAAI,CACF,MAAM,YAAc,MAAM,MAAQ,KAAO,MAAM,UAAU,EACnD,KAAO,gBAAgB,YAAa,OAAO,EACjD,GAAI,CAAC,MAAM,IAAK,OAChB,QAAQ,QAAU,KAAK,IACvB,QAAQ,SAAW,KAAK,IAAI,EAAG,OAAO,KAAK,QAAQ,GAAK,CAAC,EACzD,QAAQ,MAAQ,KAAK,eAAiB,QAAQ,MAC9C,QAAQ,QAAU,KAAK,eAAiB,KAAK,gBAAkB,gBAC3D,KAAK,cACL,QAAQ,QAIZ,QAAQ,MAAQ,QAAQ,OAAS,KAAK,MACtC,UAAU,OAAO,CACnB,MAAY,CAEZ,QAAE,CACI,UAAS,QAAQ,UAAY,GACnC,EACF,EAEM,sBAAwB,SAAY,CACxC,GAAI,CAAC,SAAS,SAAW,CAAC,QAAQ,eAAiB,SAAS,SAAU,OACtE,MAAM,MAAQ,QACV,UACF,QAAQ,SAAW,GACnB,QAAQ,aAAa,YAAa,MAAM,EACxC,QAAQ,YAAc,qBAExB,WAAW,EAEX,GAAI,CAKF,MAAM,YAAc,MAAM,UAAU,EAC9B,YAAc,gBAAgB,YAAa,KAAK,EACtD,GAAI,CAAC,aAAa,IAAK,MAAM,IAAI,MAAM,sBAAsB,EAC7D,MAAM,WAAa,aAAa,OAAS,CAAC,GAAG,UAAW,MAAS,KAAK,MAAQ,YAAY,GAAG,EAC7F,GAAI,UAAY,EAAG,MAAM,IAAI,MAAM,+BAA+B,EAElE,MAAM,SAAW,KAAK,IAAI,EAAG,OAAO,YAAY,QAAQ,GAAK,CAAC,EACxD,eAAiB,MAAM,MAAM,kBAAmB,CACpD,OAAQ,OACR,QAAS,CAAE,eAAgB,mBAAoB,OAAQ,kBAAmB,EAC1E,KAAM,KAAK,UAAU,CAGnB,KAAM,UAAY,EAClB,SACA,aAAc,OAAO,MAAM,aAAa,CAC1C,CAAC,CACH,CAAC,EACD,GAAI,CAAC,eAAe,GAAI,MAAM,IAAI,MAAM,4BAA4B,EAKpE,MAAM,KAAO,MAAM,eAAe,KAAK,EACjC,aAAe,MAAM,OAAS,CAAC,GAAG,KAAM,MAC5C,OAAO,KAAK,UAAU,IAAM,OAAO,MAAM,SAAS,GAC/C,OAAO,KAAK,yBAAyB,cAAc,IAAM,EAAE,IACxD,OAAO,MAAM,aAAa,CACjC,EACD,GAAI,CAAC,YAAa,MAAM,IAAI,MAAM,mCAAmC,EAErE,QAAU,KACV,aAAa,KAAM,WAAW,EAC9B,WAAW,CAAE,eAAgB,GAAM,WAAY,EAAM,CAAC,CACxD,MAAY,CACV,WAAW,wFAAkF,EACzF,UACF,QAAQ,SAAW,GACnB,QAAQ,gBAAgB,WAAW,EACnC,QAAQ,YAAc,aAAa,KAAK,EAE5C,CACF,EAEM,kBAAqB,OAAU,CACnC,GAAI,CAAC,SAAW,QAAQ,OAAQ,OAChC,MAAM,KAAO,OAAO,QAAQ,KACtB,KAAO,OAAO,QAAQ,KACxB,MAAM,YAAc,OAAO,KAAK,UAAU,IAAM,QAAQ,YAC5D,OAAO,aAAa,aAAa,EACjC,gBAAgB,IAAI,EACtB,EAEA,SAAS,iBAAiB,QAAU,OAAU,CAC5C,MAAM,OAAS,MAAM,QAAQ,WAAa,EAAI,MAAM,OAAS,MAAM,QAAQ,cACrE,IAAM,QAAQ,UAAU,gBAAgB,EAC9C,GAAI,IAAK,CACP,QAAU,aAAa,GAAG,EAC1B,OAAO,aAAa,aAAa,EAC7B,UACF,cAAgB,OAAO,WAAW,IAAM,gBAAgB,EAAG,GAAI,GAEjE,MACF,CAEA,GAAK,KAAK,SAAS,MAAM,EACzB,IAAI,OAAO,QAAQ,8BAA8B,EAAG,CAClD,MAAM,eAAe,EACrB,WAAW,EACX,MACF,CACA,GAAI,OAAO,QAAQ,iCAAiC,EAAG,CACrD,MAAM,eAAe,EACrB,WAAW,CAAE,eAAgB,EAAK,CAAC,EACnC,MACF,CACI,OAAO,QAAQ,gCAAgC,GACjD,sBAAsB,EAE1B,EAAG,EAAI,EAEP,KAAK,iBAAiB,8BAA+B,IAAM,WAAW,CAAC,EACvE,KAAK,iBAAiB,UAAY,OAAU,CAC1C,GAAI,MAAM,MAAQ,OAAS,CAAC,KAAK,UAAU,SAAS,SAAS,EAAG,OAChE,MAAM,UAAY,MAAM,KAAK,KAAK,iBAChC,8GACF,CAAC,EAAE,OAAQ,SAAY,QAAQ,eAAe,EAAE,OAAS,CAAC,EAC1D,GAAI,CAAC,UAAU,OAAQ,CACrB,MAAM,eAAe,EACrB,OAAO,MAAM,CAAE,cAAe,EAAK,CAAC,EACpC,MACF,CACA,MAAM,MAAQ,UAAU,CAAC,EACnB,KAAO,UAAU,UAAU,OAAS,CAAC,EACvC,MAAM,UAAY,SAAS,gBAAkB,OAC/C,MAAM,eAAe,EACrB,KAAK,MAAM,CAAE,cAAe,EAAK,CAAC,GACzB,CAAC,MAAM,UAAY,SAAS,gBAAkB,OACvD,MAAM,eAAe,EACrB,MAAM,MAAM,CAAE,cAAe,EAAK,CAAC,EAEvC,CAAC,EAED,CACE,eACA,cACA,oBACA,qBACA,qBACF,EAAE,QAAS,MAAS,SAAS,iBAAiB,KAAM,iBAAiB,CAAC,EAEtE,OAAO,yBAA2B,CAChC,gBAAiB,IAAM,EAAQ,QAC/B,MAAO,UACT,CACF,GAAG",
  "names": ["savingPercent"]
}
