{
  "version": 3,
  "sources": ["/cdn/shop/t/175/assets/tee-popup-confirm-add-to-cart.js?caf_v=20261009-text-line-1"],
  "sourcesContent": ["/* Add-to-cart hand-off for the PDP \u2014 v3 (2026-10-04). Markup: snippets/tee-popup-confirm-add-to-cart.liquid.\n   TeeInBlue events: `teeinblue-event-before-cart-added` (validation passed, /cart/add.js about to post),\n   `teeinblue-event-after-cart-added` (line added; TeeInBlue still sends its cart-token request right after).\n   - Buy now: `globalThis.__tee_buy_now` (set on the Buy now click, cleared on every Add to cart click so a\n     failed Buy now attempt can never swallow a later Add to cart). The SDK routes to checkout itself; the\n     theme only shows a \"Taking you to secure checkout\u2026\" toast. Never opens the drawer or the sheet.\n   - Desktop (CAFMiniCartDrawer.canOpen()): CAFMiniCartDrawer.showAdding() as soon as the add starts (drawer\n     opens with its skeleton), then the unchanged 900 ms settle \u2192 fetchRefreshAndOpen() \u2192 /cart fallback.\n     Without showAdding() (older drawer) the flow is exactly the 2026-05-09 one.\n   - Phones (drawer can't open): stay on the page and open the \"Added to your cart\" sheet immediately\n     (skeleton while it loads \u2014 `.is-loading`, see caf-rd-pdp-personalize.css \u00A713), filled from /cart.js\n     after the same 900 ms settle; /cart.js failure \u2192 /cart (old behaviour) while the sheet is still open.\n   - Split test \"sheet\" (2026-10-12, window.CAFExperiments.arm('sheet') \u2014 snippets/caf-experiments.liquid):\n     a = that sheet as it is; b = checkout-first sheet (\"Checkout\" posts the cart form with name=\"checkout\"\n     like the drawer does, behind the same settle; \"View cart\"; \"Keep shopping\" link; full typed text; action\n     block pinned when the card must scroll); c = no sheet, phones go to the cart page after the settle (the\n     flow before v3). No CAFExperiments / anything unexpected \u2192 a.\n   - Offer line (all arms with a sheet): a cart whose shippable lines are all ornaments, and that three\n     ornaments would take over the free-shipping minimum, reads \"Add 2 more ornaments, any designs: 15% off\n     all three + free shipping\" with a \"1 of 3\" bar \u2014 see getBundleOffer(). Otherwise (also an ornament next\n     to any other product that ships) the plain free-shipping line, unchanged.\n   - Every shopper action dispatches `caf:added-sheet-action` { action, arm }\n     (assets/tracking-events-bridge.js reports it).\n   Public API (also used by app.js for the native AJAX form): window.CAFAddedSheet\n     { available(), open({ item, cart, settle }), close(), isOpen() }. */\n(() => {\n  if (window.CAFAddedSheet) return;\n\n  const doc = document;\n  const root = doc.documentElement;\n  const TEE_ATC_HANDOFF_DELAY_MS = 900;\n  const SHEET_ID = 'caf-added-sheet';\n  const TOAST_ID = 'caf-pdp-toast';\n  const OVERLAY_SOURCE = 'caf-added-sheet';\n  const ADD_FAILURE_TIMEOUT_MS = 20000;\n  const CHECKOUT_RECOVERY_MS = 10000;\n\n  const getCartUrl = () => {\n    const sheet = doc.getElementById(SHEET_ID);\n    if (sheet && sheet.dataset.cartUrl) return sheet.dataset.cartUrl;\n    const base = globalThis.Shopify?.routes?.root || '/';\n    return `${base.endsWith('/') ? base : `${base}/`}cart`;\n  };\n\n  const deferTeeAtcHandoff = (callback) => globalThis.setTimeout(callback, TEE_ATC_HANDOFF_DELAY_MS);\n\n  /* ------------------------------------------------------------------ split test \"sheet\" + events */\n\n  // 'a' today's sheet \u00B7 'b' checkout-first sheet \u00B7 'c' no sheet (cart page). Anything unexpected \u2192 'a'.\n  const getArm = () => {\n    try {\n      const arm = globalThis.CAFExperiments ? globalThis.CAFExperiments.arm('sheet') : 'a';\n      return arm === 'b' || arm === 'c' ? arm : 'a';\n    } catch (error) {\n      return 'a';\n    }\n  };\n\n  // One event per shopper action. Only a DOM event here: the tracking bridge listens and reports, nothing\n  // is awaited, and a failure can never hold back the sheet or a navigation.\n  const track = (action) => {\n    try {\n      doc.dispatchEvent(new CustomEvent('caf:added-sheet-action', { detail: { action, arm: getArm() } }));\n    } catch (error) {\n      // reporting only\n    }\n  };\n\n  /* ------------------------------------------------------------------ buy-now intent */\n\n  globalThis.__tee_buy_now = false;\n  doc.addEventListener('teeinblue-event-component-injected', () => {\n    globalThis.__tee_buy_now = false;\n  });\n\n  let lastTrigger = null;\n  doc.addEventListener(\n    'click',\n    (event) => {\n      const button = event.target instanceof Element && event.target.closest('#teeBuynowButton, #teeAtcButton, #preview-teeAtcButton');\n      if (!button) return;\n      globalThis.__tee_buy_now = button.id === 'teeBuynowButton';\n      lastTrigger = button.id === 'preview-teeAtcButton' ? doc.getElementById('teeAtcButton') : button;\n      if (!globalThis.__tee_buy_now && !drawerAvailable() && getArm() !== 'c') snapshotCart();\n    },\n    true,\n  );\n\n  /* ------------------------------------------------------------------ desktop drawer */\n\n  const getDrawer = () => globalThis.CAFMiniCartDrawer;\n\n  function drawerAvailable() {\n    const drawer = getDrawer();\n    if (!drawer || typeof drawer.fetchRefreshAndOpen !== 'function') return false;\n    return typeof drawer.canOpen !== 'function' || drawer.canOpen();\n  }\n\n  const showDrawerAdding = () => {\n    const drawer = getDrawer();\n    if (!drawer || typeof drawer.showAdding !== 'function') return false;\n    try {\n      return drawer.showAdding() !== false;\n    } catch (error) {\n      return false;\n    }\n  };\n\n  function openMiniCartAfterTeeAdd() {\n    const drawer = getDrawer();\n    if (!drawer || typeof drawer.fetchRefreshAndOpen !== 'function') return false;\n    if (typeof drawer.canOpen === 'function' && !drawer.canOpen()) return false;\n\n    drawer\n      .fetchRefreshAndOpen()\n      .then((opened) => {\n        if (!opened) globalThis.location.href = getCartUrl();\n      })\n      .catch(() => {\n        globalThis.location.href = getCartUrl();\n      });\n\n    return true;\n  }\n\n  // The add can still fail after `before-cart-added` (e.g. stock, network): TeeInBlue then renders\n  // `.tee-error` under the buttons. Close a drawer we opened early so the message is visible.\n  let failureObserver = null;\n  let failureTimer = 0;\n  let drawerOpenedEarly = false;\n\n  const stopFailureWatch = () => {\n    if (failureObserver) failureObserver.disconnect();\n    failureObserver = null;\n    globalThis.clearTimeout(failureTimer);\n  };\n\n  const onAddFailed = () => {\n    stopFailureWatch();\n    hideToast();\n    if (drawerOpenedEarly) {\n      drawerOpenedEarly = false;\n      const drawer = getDrawer();\n      if (drawer && typeof drawer.close === 'function') drawer.close();\n    }\n    doc.dispatchEvent(new CustomEvent('caf:pdp-add-failed'));\n  };\n\n  const watchForFailure = () => {\n    stopFailureWatch();\n    const actions = doc.getElementById('teeFormActions');\n    if (actions) {\n      // Only an error rendered AFTER the add started counts (a stale \"Some fields are required\" from an\n      // earlier attempt may still be in the DOM).\n      const existing = new Set(actions.querySelectorAll('.tee-form-responses .tee-error'));\n      failureObserver = new MutationObserver(() => {\n        const errors = Array.from(actions.querySelectorAll('.tee-form-responses .tee-error'));\n        if (errors.some((node) => !existing.has(node))) onAddFailed();\n      });\n      failureObserver.observe(actions, { childList: true, subtree: true });\n    }\n    failureTimer = globalThis.setTimeout(onAddFailed, ADD_FAILURE_TIMEOUT_MS);\n  };\n\n  /* ------------------------------------------------------------------ toast (buy now) */\n\n  let toastTimer = 0;\n  const showToast = (text) => {\n    const toast = doc.getElementById(TOAST_ID);\n    if (!toast) return;\n    const label = toast.querySelector('[data-caf-toast-text]');\n    if (label) label.textContent = text;\n    toast.hidden = false;\n    globalThis.clearTimeout(toastTimer);\n    toastTimer = globalThis.setTimeout(hideToast, 15000);\n  };\n\n  function hideToast() {\n    const toast = doc.getElementById(TOAST_ID);\n    if (toast) toast.hidden = true;\n    globalThis.clearTimeout(toastTimer);\n  }\n\n  globalThis.addEventListener('pagehide', hideToast);\n\n  /* ------------------------------------------------------------------ money + line helpers */\n\n  const getSheet = () => doc.getElementById(SHEET_ID);\n\n  const formatMoney = (cents) => {\n    const sheet = getSheet();\n    const format = (sheet && sheet.dataset.moneyFormat) || doc.body?.dataset?.moneyFormat || '${{amount}}';\n    if (globalThis.Shopify && typeof globalThis.Shopify.formatMoney === 'function') {\n      try {\n        return globalThis.Shopify.formatMoney(cents, format);\n      } catch (error) {\n        // fall through\n      }\n    }\n    return `$${(Number(cents || 0) / 100).toFixed(2)}`;\n  };\n\n  const isGiftCardLine = (item) => Boolean(item && item.gift_card);\n\n  const normalizeUrl = (value) => {\n    let url = String(value || '').trim();\n    if (!url) return '';\n    if ((url.startsWith('\"') && url.endsWith('\"')) || (url.startsWith(\"'\") && url.endsWith(\"'\"))) url = url.slice(1, -1);\n    url = url.replace(/\\\\\\//g, '/');\n    if (url.startsWith('//')) url = `${globalThis.location.protocol}${url}`;\n    return url;\n  };\n\n  // Same rule as sections/header.liquid `mini_cart_preview_url`: first property whose key mentions\n  // preview / image / mockup / thumbnail / render and whose value is a URL (TeeInBlue `_customization_image`).\n  const getPreviewUrl = (item) => {\n    const entries = Object.entries((item && item.properties) || {});\n    for (const [rawKey, rawValue] of entries) {\n      const key = String(rawKey || '').toLowerCase();\n      const value = String(rawValue || '').trim();\n      if (!value) continue;\n      if (!/(preview|image|mockup|thumbnail|render)/.test(key)) continue;\n      if (value.includes('http') || value.startsWith('//') || value.includes('data:image')) return normalizeUrl(value);\n    }\n    return '';\n  };\n\n  const sizedImage = (url, width) => {\n    if (!url) return '';\n    try {\n      const parsed = new URL(url, globalThis.location.origin);\n      if (/cdn\\.shopify\\.com|\\/cdn\\/shop\\//.test(parsed.href)) parsed.searchParams.set('width', String(width));\n      return parsed.href;\n    } catch (error) {\n      return url;\n    }\n  };\n\n  // Typed-text line \u2014 same rules as assets/mini-cart-drawer.js getLineText + snippets/cart-line-details.liquid\n  // (keep in sync): \"Enter \u2026\" shown, \"Choose \u2026\" hidden, other keys only with a text word and no choice word.\n  const TEXT_WORDS = ['name', 'date', 'year', 'message', 'text', 'quote', 'initial', 'wording', 'title', 'birthday'];\n  const CHOICE_WORDS = ['color', 'colour', 'font', 'tone', 'style', 'skin', 'hair'];\n  const getDetails = (item) => {\n    const values = [];\n    Object.entries((item && item.properties) || {}).forEach(([rawKey, rawValue]) => {\n      const key = String(rawKey ?? '').trim();\n      const value = String(rawValue ?? '').trim();\n      if (!key || !value || key.startsWith('_')) return;\n      const keyLower = key.toLowerCase();\n      if (keyLower.includes('customization') || keyLower.includes('preview')) return;\n      const valueLower = value.toLowerCase();\n      if (valueLower === 'on' || valueLower.startsWith('//') || valueLower.includes('://') || valueLower.includes('data:image') || valueLower.includes('/uploads/')) return;\n      const isText = keyLower.startsWith('enter ')\n        ? true\n        : !keyLower.startsWith('choose ') && TEXT_WORDS.some((word) => keyLower.includes(word)) && !CHOICE_WORDS.some((word) => keyLower.includes(word));\n      if (isText) values.push(value);\n    });\n    return values.length ? `Text: ${values.join(' \u00B7 ')}` : '';\n  };\n\n  const getVariantText = (item) => {\n    const options = Array.isArray(item && item.options_with_values) ? item.options_with_values : [];\n    const values = options\n      .map((option) => String(option.value || '').trim())\n      .filter((value) => value && !/^(n\\/a|default title)$/i.test(value));\n    if (values.length) return values.join(' \u00B7 ');\n    const title = String((item && item.variant_title) || '').trim();\n    return /^default title$/i.test(title) ? '' : title.split(' / ').filter((part) => !/^n\\/a$/i.test(part.trim())).join(' \u00B7 ');\n  };\n\n  /* ------------------------------------------------------------------ which line was just added */\n\n  let snapshot = null; // { at, lines: Map(key \u2192 quantity) }\n\n  const fetchCart = () =>\n    globalThis\n      .fetch((getSheet() && getSheet().dataset.cartJs) || `${getCartUrl()}.js`, { headers: { Accept: 'application/json' }, credentials: 'same-origin' })\n      .then((response) => {\n        if (!response.ok) throw new Error(`cart.js ${response.status}`);\n        return response.json();\n      });\n\n  function snapshotCart() {\n    if (!getSheet()) return;\n    const at = Date.now();\n    fetchCart()\n      .then((cart) => {\n        snapshot = { at, lines: new Map((cart.items || []).map((item) => [item.key, Number(item.quantity || 0)])) };\n      })\n      .catch(() => {\n        snapshot = null;\n      });\n  }\n\n  const pickAddedLine = (cart, hint) => {\n    const items = (cart && cart.items) || [];\n    if (!items.length) return null;\n    if (hint && hint.key) {\n      const byKey = items.find((item) => item.key === hint.key);\n      if (byKey) return byKey;\n    }\n    if (hint && hint.variant_id) {\n      const byVariant = items.find((item) => item.variant_id === hint.variant_id);\n      if (byVariant) return byVariant;\n    }\n    if (snapshot && Date.now() - snapshot.at < 120000) {\n      const changed = items.find((item) => !snapshot.lines.has(item.key) || Number(item.quantity || 0) > snapshot.lines.get(item.key));\n      if (changed) return changed;\n    }\n    const productId = Number((getSheet() && getSheet().dataset.productId) || 0);\n    return items.find((item) => Number(item.product_id) === productId) || items[0];\n  };\n\n  /* ------------------------------------------------------------------ \"Buy 3\" offer line */\n\n  // The offer is the PDP promo-banner rule (\"Buy 3 ornaments, 15% off\", a Shopify automatic discount). Its tag\n  // and its own description come from the theme settings (data-bundle-* on the sheet); the two numbers are\n  // read from that description \u2014 never written here. No \"Buy N\" and \"N%\" in it \u2192 no offer line.\n  const getBundleConfig = (sheet) => {\n    const data = sheet.dataset;\n    const tag = String(data.bundleTag || '').trim().toLowerCase();\n    const words = String(data.bundleOffer || '');\n    const min = Number((words.match(/\\bbuy\\s+(\\d+)\\b/i) || [])[1] || 0);\n    const percent = Number((words.match(/(\\d+(?:\\.\\d+)?)\\s*%/) || [])[1] || 0);\n    return { enabled: data.bundleEnabled === 'true' && Boolean(tag) && min >= 2 && percent > 0 && percent < 100, tag, min, percent };\n  };\n\n  // cart.js has no product tags. Known without a request: this page's product (Liquid) and the lines the\n  // drawer printed for the cart the page loaded with (data-bundle-match, same tag \u2014 read once, before any\n  // script repaints the drawer). Any other product \u2192 /products/<handle>.js once per page view, as in\n  // assets/mini-cart-drawer.js ensureBundleTags().\n  const bundleProducts = new Map(); // product id \u2192 counts for the offer\n  const bundleRequests = new Map();\n\n  const seedBundleProducts = () => {\n    const sheet = getSheet();\n    if (!sheet) return;\n    const config = getBundleConfig(sheet);\n    if (sheet.dataset.productId) bundleProducts.set(String(sheet.dataset.productId), sheet.dataset.bundleMatch === 'true');\n    doc.querySelectorAll('[data-cart-form=\"mini-cart\"]').forEach((form) => {\n      if (String(form.dataset.bundleTag || '').trim().toLowerCase() !== config.tag) return;\n      form.querySelectorAll('[data-cart-item][data-product-id]').forEach((line) => {\n        const { productId, bundleMatch } = line.dataset;\n        if (!bundleProducts.has(productId) && (bundleMatch === 'true' || bundleMatch === 'false')) bundleProducts.set(productId, bundleMatch === 'true');\n      });\n    });\n  };\n  seedBundleProducts();\n\n  // null when every line is known already (the usual case); else a promise for the missing lookups.\n  const lookUpBundleProducts = (sheet, cart) => {\n    const config = getBundleConfig(sheet);\n    if (!config.enabled) return null;\n    const base = globalThis.Shopify?.routes?.root || '/';\n    const pending = [];\n    ((cart && cart.items) || []).forEach((item) => {\n      const id = String(item.product_id || '');\n      if (!id || bundleProducts.has(id) || isGiftCardLine(item) || !item.handle) return;\n      if (!bundleRequests.has(id)) {\n        bundleRequests.set(\n          id,\n          globalThis\n            .fetch(`${base.endsWith('/') ? base : `${base}/`}products/${encodeURIComponent(item.handle)}.js`, { headers: { Accept: 'application/json' } })\n            .then((response) => (response.ok ? response.json() : null))\n            .then((product) => {\n              const tags = Array.isArray(product?.tags) ? product.tags : String(product?.tags || '').split(',');\n              bundleProducts.set(id, tags.some((tag) => String(tag).trim().toLowerCase() === config.tag));\n            })\n            .catch(() => {\n              bundleProducts.set(id, false);\n            }),\n        );\n      }\n      pending.push(bundleRequests.get(id));\n    });\n    return pending.length ? Promise.all(pending) : null;\n  };\n\n  // A discount code that is applied to the cart: the automatic rule does not combine with order codes, so the\n  // offer line must not promise it. Same test as the drawer (getComboState in mini-cart-drawer.js: applicable\n  // codes + code-type discount rows) and as the Liquid twins (cart.discount_applications of type\n  // discount_code). A code that is only saved for later (cart.js `applicable: false`, or the `discount_code`\n  // cookie of a /discount/CODE link before it applies) is invisible to Liquid, so it does not count here\n  // either \u2014 otherwise the sheet would say one thing and the cart page the other for the same cart.\n  const hasDiscountCode = (cart) => {\n    if ((Array.isArray(cart.discount_codes) ? cart.discount_codes : []).some((discount) => discount && discount.code && discount.applicable !== false)) return true;\n    const isCode = (application) => Boolean(application) && application.type === 'discount_code';\n    if ((cart.cart_level_discount_applications || []).some(isCode)) return true;\n    return (cart.items || []).some((item) => (item.line_level_discount_allocations || []).some((allocation) => isCode(allocation.discount_application)));\n  };\n\n  // Which line the cart gets \u2014 null = the plain free-shipping line. Owner rule 2026-10-12: the offer line only\n  // when the cart is under the free-shipping minimum, carries no discount code, holds at least one ornament,\n  // and `min` ornaments at the rule's price would clear the minimum on their own: lowest ornament unit price\n  // in the cart \u00D7 min \u00D7 (100 \u2212 percent) \u00F7 100, cents rounded down, \u2265 minimum. `done` only once the automatic\n  // discount really is on the ornaments and shipping really is free.\n  // Mixed carts keep the plain line: every line that ships must be an ornament. One ornament + a $24.99\n  // tumbler is $4.02 from free shipping \u2014 a nearer goal than two more ornaments. Gift cards and other lines\n  // that do not ship are left out of this test. The minimum is an amount in the shop currency, so a cart in\n  // another currency keeps the plain line (as the product-page card does, snippets/caf-pdp-banner.liquid).\n  // ONE rule, four places \u2014 keep them identical (scripts/tests/bundle-offer.test.cjs compares them):\n  // `offer_combo` in sections/cart-template.liquid, `mc_combo` in snippets/cart-drawer.liquid,\n  // getComboState() in assets/mini-cart-drawer.js, and here.\n  const getBundleOffer = (sheet, cart, physical, freeMin) => {\n    const config = getBundleConfig(sheet);\n    if (!config.enabled || hasDiscountCode(cart)) return null;\n    const shopCurrency = String(sheet.dataset.shopCurrency || '');\n    if (shopCurrency && cart.currency && cart.currency !== shopCurrency) return null;\n    let quantity = 0;\n    let cheapest = 0;\n    let applied = false;\n    let unknown = false;\n    let otherShips = false;\n    (cart.items || []).forEach((item) => {\n      if (isGiftCardLine(item)) return;\n      const match = bundleProducts.get(String(item.product_id));\n      if (match === undefined) unknown = true;\n      if (match !== true) {\n        if (item.requires_shipping !== false) otherShips = true;\n        return;\n      }\n      quantity += Number(item.quantity || 0);\n      const unit = Number(item.final_price ?? item.price ?? 0);\n      if (!cheapest || unit < cheapest) cheapest = unit;\n      const allocations = Array.isArray(item.line_level_discount_allocations) ? item.line_level_discount_allocations : item.discounts || [];\n      if (allocations.some((allocation) => Number(allocation.amount || 0) > 0)) applied = true; // never a code: see hasDiscountCode\n    });\n    if (unknown || otherShips || !quantity) return null;\n    if (quantity >= config.min) return applied && physical >= freeMin ? { done: true, percent: config.percent } : null;\n    if (physical >= freeMin) return null;\n    const afterRule = Math.floor(((100 - config.percent) * cheapest * config.min) / 100);\n    if (afterRule < freeMin) return null;\n    return { done: false, quantity, remaining: config.min - quantity, min: config.min, percent: config.percent };\n  };\n\n  /* ------------------------------------------------------------------ sheet rendering */\n\n  const setText = (node, text) => {\n    if (node) node.textContent = text;\n  };\n\n  // Guarded writes for the offer line (same value \u2192 no write).\n  const setAttr = (node, name, value) => {\n    if (!node) return;\n    if (value == null) {\n      if (node.hasAttribute(name)) node.removeAttribute(name);\n    } else if (node.getAttribute(name) !== value) {\n      node.setAttribute(name, value);\n    }\n  };\n\n  const setHtml = (node, html) => {\n    if (node && node.innerHTML !== html) node.innerHTML = html;\n  };\n\n  // TeeInBlue renders the design preview (`_customization_image`) a few seconds AFTER the add, so the URL can\n  // 404 at first: show the product photo meanwhile and swap in the preview once it loads (bounded retries).\n  let previewTimer = 0;\n  const showPreviewWhenReady = (img, url, fallback, attempt = 0) => {\n    globalThis.clearTimeout(previewTimer);\n    const probe = new Image();\n    probe.onload = () => {\n      // use the exact URL that loaded (an earlier 404 of the bare URL may be cached)\n      if (img.isConnected) img.setAttribute('src', probe.src);\n    };\n    probe.onerror = () => {\n      if (attempt < 6 && open) previewTimer = globalThis.setTimeout(() => showPreviewWhenReady(img, url, fallback, attempt + 1), 1500);\n    };\n    probe.src = attempt ? `${url}${url.includes('?') ? '&' : '?'}caf_r=${attempt}` : url;\n  };\n\n  const renderItem = (item) => {\n    const sheet = getSheet();\n    if (!sheet || !item) return;\n    const preview = getPreviewUrl(item);\n    const fallback = sizedImage(item.image || (item.featured_image && item.featured_image.url) || '', 240) || sheet.dataset.productImage;\n    const img = sheet.querySelector('[data-caf-sheet-img]');\n    if (img) {\n      img.setAttribute('alt', '');\n      if (fallback && img.getAttribute('src') !== fallback) img.setAttribute('src', fallback);\n      if (preview) showPreviewWhenReady(img, preview, fallback);\n    }\n\n    setText(sheet.querySelector('[data-caf-sheet-name]'), item.product_title || item.title || sheet.dataset.productTitle || '');\n    // Gift card: the variant title is the amount (\"$25.00\") and repeated the price right under it \u2014 say what it\n    // is instead, same words as the cart line (snippets/cart-drawer.liquid, sections/cart-template.liquid).\n    const variant = isGiftCardLine(item) ? 'Digital gift card \u00B7 sent by email' : getVariantText(item);\n    const meta = sheet.querySelector('[data-caf-sheet-meta]');\n    setText(meta, variant);\n    if (meta) meta.hidden = !variant;\n\n    const detailsNode = sheet.querySelector('[data-caf-sheet-details]');\n    const details = sheet.dataset.showDetails === 'false' ? '' : getDetails(item);\n    setText(detailsNode, details);\n    if (detailsNode) detailsNode.hidden = !details;\n\n    const now = Number(item.final_line_price ?? item.line_price ?? item.final_price ?? item.price ?? 0);\n    const was = Number(item.original_line_price ?? 0);\n    setText(sheet.querySelector('[data-caf-sheet-now]'), formatMoney(now));\n    const wasNode = sheet.querySelector('[data-caf-sheet-was]');\n    if (wasNode) {\n      wasNode.hidden = !(was > now);\n      setText(wasNode, was > now ? formatMoney(was) : '');\n    }\n    const qtyNode = sheet.querySelector('[data-caf-sheet-qty]');\n    const quantity = Number(item.quantity || 1);\n    if (qtyNode) {\n      qtyNode.hidden = quantity <= 1;\n      setText(qtyNode, quantity > 1 ? `Qty ${quantity}` : '');\n    }\n  };\n\n  const renderCart = (cart) => {\n    const sheet = getSheet();\n    if (!sheet || !cart) return;\n    const count = Number(cart.item_count || 0);\n    setText(sheet.querySelector('[data-caf-sheet-count]'), `Your cart: ${count} ${count === 1 ? 'item' : 'items'}`);\n    setText(sheet.querySelector('[data-caf-sheet-subtotal]'), formatMoney(cart.total_price));\n\n    lastCart = cart;\n    const pending = lookUpBundleProducts(sheet, cart);\n    if (!pending) {\n      renderShip(sheet, cart);\n      return;\n    }\n    // Rare: a line whose product the page does not know yet (added from a cross-sell). Look it up first so\n    // the line never says one thing and then another; after 2.5 s it is decided with what is known.\n    const ship = sheet.querySelector('[data-caf-sheet-ship]');\n    if (ship) ship.hidden = true;\n    let decided = false;\n    const decide = () => {\n      if (decided || !open || lastCart !== cart) return;\n      decided = true;\n      renderShip(sheet, cart);\n      updatePinned();\n    };\n    pending.then(decide);\n    globalThis.setTimeout(decide, 2500);\n  };\n\n  const ALL_WORDS = { 2: 'both', 3: 'all three', 4: 'all four', 5: 'all five', 6: 'all six' };\n\n  function renderShip(sheet, cart) {\n    // Free shipping: physical subtotal only \u2014 gift cards never count (owner decision; Shopify excludes\n    // them at checkout too). Same math as assets/mini-cart-drawer.js renderPerks().\n    const freeMin = Number(sheet.dataset.freeShippingMinimum || 0);\n    let giftTotal = 0;\n    let hasPhysical = false;\n    (cart.items || []).forEach((item) => {\n      if (isGiftCardLine(item)) giftTotal += Number(item.final_line_price || 0);\n      else hasPhysical = true;\n    });\n    const physical = Math.max(0, Number(cart.total_price || 0) - giftTotal);\n    const ship = sheet.querySelector('[data-caf-sheet-ship]');\n    if (!ship) return;\n    const show = freeMin > 0 && hasPhysical;\n    ship.hidden = !show;\n    if (!show) return;\n\n    const offer = getBundleOffer(sheet, cart, physical, freeMin);\n    const steps = Boolean(offer) && !offer.done; // \"1 of 3\" bar instead of the money bar\n    const remaining = freeMin - physical;\n    const unlocked = offer ? offer.done : remaining <= 0;\n    const percentage = unlocked ? 100 : Math.max(4, Math.min(100, Math.floor((physical / freeMin) * 100)));\n    ship.classList.toggle('is-unlocked', unlocked);\n\n    let line;\n    if (steps) {\n      const gain = `<span class=\"caf-added-sheet__ship-gain\">${offer.percent}% off ${ALL_WORDS[offer.min] || `all ${offer.min}`} + free shipping</span>`;\n      line = offer.remaining === 1 ? `Add <b>1 more ornament</b>: ${gain}` : `Add <b>${offer.remaining} more ornaments</b>, any designs: ${gain}`;\n    } else if (offer) {\n      // Two phrases. CSS draws the middle dot between them only while they share a row (caf-rd-pdp-personalize.css\n      // \u00A713 `.caf-added-sheet__ship-done`); on a phone they stack, like the same row on the cart page.\n      line = `<b class=\"caf-added-sheet__ship-done\"><span>${offer.percent}% off your ornaments applied</span> <span>Free shipping unlocked</span></b>`;\n    } else {\n      line = unlocked ? '<b>You\u2019ve unlocked free shipping</b>' : `Add <b>${formatMoney(remaining)}</b> more for free shipping`;\n    }\n    setHtml(ship.querySelector('[data-caf-sheet-ship-text]'), line);\n\n    const steppedOf = steps ? `${offer.quantity} of ${offer.min}` : '';\n    const bar = ship.querySelector('[role=\"progressbar\"]');\n    setAttr(bar, 'aria-label', steps ? `Ornaments toward ${offer.percent}% off and free shipping` : 'Progress to free shipping');\n    setAttr(bar, 'aria-valuemax', steps ? String(offer.min) : '100');\n    setAttr(bar, 'aria-valuenow', steps ? String(offer.quantity) : String(percentage));\n    setAttr(bar, 'aria-valuetext', steps ? steppedOf : null);\n    const fill = ship.querySelector('[data-caf-sheet-ship-fill]');\n    const width = steps ? `${Math.round((offer.quantity / offer.min) * 10000) / 100}%` : `${percentage}%`;\n    if (fill && fill.style.width !== width) fill.style.width = width;\n    const count = ship.querySelector('[data-caf-sheet-ship-count]');\n    if (count) {\n      if (count.textContent !== steppedOf) count.textContent = steppedOf;\n      if (count.hidden !== !steps) count.hidden = !steps;\n    }\n  }\n\n  const resetSheet = () => {\n    const sheet = getSheet();\n    if (!sheet) return;\n    const img = sheet.querySelector('[data-caf-sheet-img]');\n    if (img && sheet.dataset.productImage) img.setAttribute('src', sheet.dataset.productImage);\n    setText(sheet.querySelector('[data-caf-sheet-name]'), sheet.dataset.productTitle || '');\n    const meta = sheet.querySelector('[data-caf-sheet-meta]');\n    if (meta) {\n      meta.hidden = false;\n      meta.textContent = '\u00A0';\n    }\n    const details = sheet.querySelector('[data-caf-sheet-details]');\n    if (details) details.hidden = true;\n    setText(sheet.querySelector('[data-caf-sheet-now]'), '\u00A0');\n    const was = sheet.querySelector('[data-caf-sheet-was]');\n    if (was) was.hidden = true;\n    const qty = sheet.querySelector('[data-caf-sheet-qty]');\n    if (qty) qty.hidden = true;\n    setText(sheet.querySelector('[data-caf-sheet-count]'), '\u00A0');\n    setText(sheet.querySelector('[data-caf-sheet-subtotal]'), '\u00A0');\n    const ship = sheet.querySelector('[data-caf-sheet-ship]');\n    if (ship) ship.hidden = true;\n  };\n\n  /* ------------------------------------------------------------------ sheet open / close / focus */\n\n  let open = false;\n  let settled = true;\n  let settleWaiters = [];\n  let overlayAddedHere = false;\n  let returnFocus = null;\n  let closeTimer = 0;\n  let pendingGoTimer = 0;\n  let lastCart = null;\n  let cartWaiting = false; // a \"View cart\" tap is waiting for the settle\n  // \"Checkout\" (checkout-first sheet): idle \u2192 waiting (for the settle) \u2192 go (our own click) \u2192 sent.\n  let checkoutState = 'idle';\n  let checkoutTimer = 0;\n\n  const setOverlay = (on) => {\n    if (globalThis.CAFChromeOverlay && typeof globalThis.CAFChromeOverlay.set === 'function') {\n      globalThis.CAFChromeOverlay.set(OVERLAY_SOURCE, on);\n    } else if (on && !root.classList.contains('caf-overlay-open')) {\n      root.classList.add('caf-overlay-open');\n      overlayAddedHere = true;\n    } else if (!on && overlayAddedHere) {\n      root.classList.remove('caf-overlay-open');\n      overlayAddedHere = false;\n    }\n    root.classList.toggle('caf-added-sheet-open', on);\n  };\n\n  // Which button group the sheet shows. 'b' needs its group in the markup (the snippet prints it only while\n  // checkout may skip the cart page, like the drawer) \u2014 otherwise today's sheet. snippets/caf-experiments.liquid\n  // applies the same gate, so arm('sheet') is not 'b' then; this check only covers markup and script out of step.\n  const applyVariant = (sheet) => {\n    const variant = getArm() === 'b' && sheet.querySelector('[data-caf-sheet-actions=\"b\"]') ? 'b' : 'a';\n    if (sheet.dataset.variant === variant) return;\n    sheet.dataset.variant = variant;\n    sheet.classList.toggle('caf-added-sheet--checkout-first', variant === 'b');\n    sheet.querySelectorAll('[data-caf-sheet-actions]').forEach((group) => {\n      group.hidden = group.dataset.cafSheetActions !== variant;\n    });\n  };\n\n  // Checkout-first sheet: when the card + totals do not fit (in-app browsers, long typed text) the middle\n  // scrolls and the action block shows its edge. `.is-scroll` only paints (hairline + shadow), so the\n  // measurement cannot feed back into itself.\n  const updatePinned = () => {\n    const sheet = getSheet();\n    const panel = sheet && sheet.querySelector('.caf-added-sheet__panel');\n    const body = sheet && sheet.querySelector('[data-caf-sheet-body]');\n    if (!panel || !body) return;\n    const scrolls = sheet.dataset.variant === 'b' && body.scrollHeight > body.clientHeight + 1;\n    if (panel.classList.contains('is-scroll') !== scrolls) panel.classList.toggle('is-scroll', scrolls);\n  };\n\n  let pinnedFrame = 0;\n  globalThis.addEventListener('resize', () => {\n    if (!open) return;\n    globalThis.cancelAnimationFrame(pinnedFrame);\n    pinnedFrame = globalThis.requestAnimationFrame(updatePinned);\n  });\n\n  // Busy look of \"Checkout\". The button is never `disabled`: a disabled submitter drops name=\"checkout\" from\n  // the POST and Shopify would answer with the cart page (same rule as the drawer, mini-cart-drawer.js).\n  const setCheckoutBusy = (busy) => {\n    const sheet = getSheet();\n    const button = sheet && sheet.querySelector('[data-caf-sheet-checkout]');\n    if (!button) return;\n    const label = button.querySelector('[data-caf-sheet-checkout-label]');\n    if (label && !label.dataset.defaultLabel) label.dataset.defaultLabel = label.textContent.trim();\n    button.classList.toggle('is-busy', busy);\n    setAttr(button, 'aria-busy', busy ? 'true' : null);\n    setAttr(button, 'aria-disabled', busy ? 'true' : null);\n    if (label) label.textContent = busy ? 'Opening checkout\u2026' : label.dataset.defaultLabel || 'Checkout';\n    const spin = button.querySelector('.caf-spin');\n    if (busy && !spin) button.insertAdjacentHTML('afterbegin', '<span class=\"caf-spin\" aria-hidden=\"true\"></span>');\n    else if (!busy && spin) spin.remove();\n  };\n\n  // Also the recovery: still on the page a while after the tap (connection dropped, navigation blocked) \u2192\n  // the button works again.\n  const resetCheckout = () => {\n    globalThis.clearTimeout(checkoutTimer);\n    if (checkoutState === 'idle') return;\n    checkoutState = 'idle';\n    setCheckoutBusy(false);\n  };\n\n  const clearCartWaiting = () => {\n    cartWaiting = false;\n    const sheet = getSheet();\n    if (sheet) sheet.querySelectorAll('[data-caf-sheet-cart]').forEach((link) => link.removeAttribute('aria-busy'));\n  };\n\n  // Only one exit can wait for the settle \u2014 the last tap wins.\n  const clearWaitingExit = () => {\n    globalThis.clearTimeout(pendingGoTimer);\n    settleWaiters = [];\n    if (cartWaiting) clearCartWaiting();\n    if (checkoutState === 'waiting') resetCheckout();\n  };\n\n  // Back from the cart page or checkout through the back/forward cache: no button left spinning.\n  globalThis.addEventListener('pageshow', (event) => {\n    if (!event.persisted) return;\n    clearCartWaiting();\n    resetCheckout();\n  });\n\n  const markSettled = () => {\n    settled = true;\n    const waiters = settleWaiters;\n    settleWaiters = [];\n    waiters.forEach((resolve) => resolve());\n  };\n\n  const focusables = (panel) =>\n    Array.from(panel.querySelectorAll('a[href], button:not([disabled]), [tabindex]:not([tabindex=\"-1\"])')).filter(\n      (node) => node.getClientRects().length > 0,\n    );\n\n  const onKeydown = (event) => {\n    if (!open) return;\n    const sheet = getSheet();\n    const panel = sheet && sheet.querySelector('.caf-added-sheet__panel');\n    if (!panel) return;\n    if (event.key === 'Escape') {\n      event.preventDefault();\n      close('escape');\n      return;\n    }\n    if (event.key !== 'Tab') return;\n    const nodes = focusables(panel);\n    if (!nodes.length) return;\n    const first = nodes[0];\n    const last = nodes[nodes.length - 1];\n    if (event.shiftKey && (doc.activeElement === first || !panel.contains(doc.activeElement))) {\n      event.preventDefault();\n      last.focus();\n    } else if (!event.shiftKey && doc.activeElement === last) {\n      event.preventDefault();\n      first.focus();\n    }\n  };\n\n  const onSheetClick = (event) => {\n    if (!(event.target instanceof Element)) return;\n    const closer = event.target.closest('[data-caf-sheet-close]');\n    if (closer) {\n      event.preventDefault();\n      close(closer.getAttribute('data-caf-sheet-close'));\n      return;\n    }\n\n    const checkoutButton = event.target.closest('[data-caf-sheet-checkout]');\n    if (checkoutButton) {\n      if (checkoutState === 'go') {\n        // our own click once TeeInBlue has settled \u2192 the browser posts the form, name=\"checkout\" included\n        checkoutState = 'sent';\n        return;\n      }\n      if (checkoutState !== 'idle') {\n        event.preventDefault(); // already on its way \u2014 no second submit\n        return;\n      }\n      track('checkout');\n      if (!settled) clearWaitingExit();\n      setCheckoutBusy(true);\n      checkoutTimer = globalThis.setTimeout(resetCheckout, CHECKOUT_RECOVERY_MS);\n      if (settled) {\n        checkoutState = 'sent';\n        return;\n      }\n      // TeeInBlue's post-add cart-token request must finish before we leave the page (900 ms settle).\n      event.preventDefault();\n      checkoutState = 'waiting';\n      const go = () => {\n        globalThis.clearTimeout(pendingGoTimer);\n        if (!open || checkoutState !== 'waiting') return;\n        checkoutState = 'go';\n        checkoutButton.click();\n      };\n      settleWaiters.push(go);\n      pendingGoTimer = globalThis.setTimeout(go, 2500);\n      return;\n    }\n\n    const cartLink = event.target.closest('[data-caf-sheet-cart]');\n    if (!cartLink) return;\n    if (cartWaiting) {\n      event.preventDefault(); // second tap while the first waits for the settle\n      return;\n    }\n    track('view_cart');\n    if (settled) return;\n    // TeeInBlue's post-add cart-token request must finish before we leave the page (900 ms settle).\n    event.preventDefault();\n    clearWaitingExit();\n    cartWaiting = true;\n    cartLink.setAttribute('aria-busy', 'true');\n    const go = () => {\n      globalThis.clearTimeout(pendingGoTimer);\n      if (!open || !cartWaiting) return;\n      globalThis.location.href = cartLink.getAttribute('href') || getCartUrl();\n    };\n    settleWaiters.push(go);\n    pendingGoTimer = globalThis.setTimeout(go, 2500);\n  };\n\n  let bound = false;\n  const bindSheet = (sheet) => {\n    if (bound) return;\n    bound = true;\n    sheet.addEventListener('click', onSheetClick);\n    doc.addEventListener('keydown', onKeydown, true);\n  };\n\n  const openSheet = ({ item = null, cart = null, settle = 0 } = {}) => {\n    const sheet = getSheet();\n    if (!sheet) return false;\n    bindSheet(sheet);\n    globalThis.clearTimeout(closeTimer);\n\n    const wasOpen = open;\n    if (!open) {\n      const active = doc.activeElement;\n      returnFocus = active instanceof HTMLElement && active !== doc.body ? active : lastTrigger;\n    }\n    open = true;\n    resetSheet();\n    applyVariant(sheet);\n    clearWaitingExit();\n    clearCartWaiting();\n    resetCheckout();\n    sheet.classList.toggle('is-loading', !cart);\n    if (item) renderItem(item);\n    if (cart) {\n      renderItem(pickAddedLine(cart, item));\n      renderCart(cart);\n    }\n    settled = !(settle > 0);\n    if (settle > 0) globalThis.setTimeout(markSettled, settle);\n\n    sheet.hidden = false;\n    setOverlay(true);\n    const body = sheet.querySelector('[data-caf-sheet-body]');\n    if (body && body.scrollTop) body.scrollTop = 0;\n    updatePinned();\n    globalThis.requestAnimationFrame(() => {\n      sheet.classList.add('is-open');\n      const title = sheet.querySelector('#caf-added-sheet-title');\n      if (title) title.focus({ preventScroll: true });\n    });\n    if (!wasOpen) track('open');\n    return true;\n  };\n\n  const fill = (hint) =>\n    fetchCart().then((cart) => {\n      const sheet = getSheet();\n      if (sheet && open) {\n        renderItem(pickAddedLine(cart, hint));\n        renderCart(cart);\n        sheet.classList.remove('is-loading');\n        updatePinned();\n        markSettled();\n        // TeeInBlue blurs the page after its add; keep keyboard / screen-reader focus inside the dialog.\n        if (!sheet.contains(doc.activeElement)) {\n          const title = sheet.querySelector('#caf-added-sheet-title');\n          if (title) title.focus({ preventScroll: true });\n        }\n      }\n      // Keep the header badge (and the hidden drawer markup) in sync with the new cart \u2014 also when the shopper\n      // closed the sheet while it was still loading (it is on screen from the first moment, 2026-10-12).\n      try {\n        const drawer = getDrawer();\n        if (drawer && typeof drawer.refresh === 'function') drawer.refresh(cart);\n      } catch (error) {\n        // not fatal \u2014 the sheet already shows the right numbers\n      }\n      return cart;\n    });\n\n  // /cart.js failed: the cart page shows what the sheet could not \u2014 unless the shopper already closed the sheet.\n  const goToCartIfOpen = () => {\n    if (open) globalThis.location.href = getCartUrl();\n  };\n\n  const CLOSE_ACTIONS = { outside: 'close_outside', x: 'close_x', keep: 'keep_shopping', escape: 'close_escape' };\n\n  // reason = how the shopper closed it (the value of data-caf-sheet-close, or 'escape'); none for API calls.\n  function close(reason) {\n    const sheet = getSheet();\n    if (!sheet || !open) return;\n    open = false;\n    if (typeof reason === 'string' && CLOSE_ACTIONS[reason]) track(CLOSE_ACTIONS[reason]);\n    sheet.classList.remove('is-open');\n    setOverlay(false);\n    // Closing cancels a \"View cart\" / \"Checkout\" that was waiting for the settle.\n    clearWaitingExit();\n    resetCheckout();\n    settled = true;\n    closeTimer = globalThis.setTimeout(() => {\n      sheet.hidden = true;\n    }, 300);\n    const target = returnFocus && returnFocus.isConnected && returnFocus.getClientRects().length ? returnFocus : null;\n    returnFocus = null;\n    if (target) target.focus({ preventScroll: true });\n  }\n\n  /* ------------------------------------------------------------------ TeeInBlue events */\n\n  doc.addEventListener('teeinblue-event-before-cart-added', () => {\n    if (globalThis.__tee_buy_now) {\n      showToast('Taking you to secure checkout\u2026');\n      watchForFailure();\n      return;\n    }\n    if (drawerAvailable()) {\n      drawerOpenedEarly = showDrawerAdding();\n      if (drawerOpenedEarly) watchForFailure();\n    }\n  });\n\n  // After the Tee customizer confirms an add: desktop \u2192 CAF mini-cart drawer; phones \u2192 the sheet.\n  // Buy Now still bypasses this \u2014 the SDK takes care of routing to checkout.\n  doc.addEventListener('teeinblue-event-after-cart-added', () => {\n    stopFailureWatch();\n    if (globalThis.__tee_buy_now) {\n      globalThis.__tee_buy_now = false;\n      return;\n    }\n\n    if (drawerAvailable()) {\n      if (!drawerOpenedEarly) showDrawerAdding();\n      drawerOpenedEarly = false;\n      deferTeeAtcHandoff(() => {\n        if (!openMiniCartAfterTeeAdd()) globalThis.location.href = getCartUrl();\n      });\n      return;\n    }\n\n    // Split test arm \"c\": no sheet \u2014 the cart page after the settle, the phone flow before v3 (and what\n    // already happens when the sheet markup is missing).\n    const forward = getArm() === 'c';\n    if (forward) track('forward_cart');\n    if (forward || !openSheet({ settle: TEE_ATC_HANDOFF_DELAY_MS })) {\n      deferTeeAtcHandoff(() => {\n        globalThis.location.href = getCartUrl();\n      });\n      return;\n    }\n    deferTeeAtcHandoff(() => {\n      fill(null).catch(goToCartIfOpen);\n    });\n  });\n\n  window.CAFAddedSheet = {\n    available: () => Boolean(getSheet()),\n    // item = /cart/add.js line (native form), cart = /cart.js payload; without cart we fetch it.\n    open: (options = {}) => {\n      if (getArm() === 'c' && getSheet()) {\n        // Split test arm \"c\" \u2014 native form (app.js): same destination as the TeeInBlue path, no sheet.\n        track('forward_cart');\n        globalThis.setTimeout(() => {\n          globalThis.location.href = getCartUrl();\n        }, options.settle || 0);\n        return true;\n      }\n      const opened = openSheet({ item: options.item || null, cart: options.cart || null, settle: options.settle || 0 });\n      if (opened && !options.cart) fill(options.item || null).catch(goToCartIfOpen);\n      return opened;\n    },\n    close: () => close(),\n    isOpen: () => open,\n  };\n})();\n"],
  "mappings": "CAyBC,IAAM,CACL,GAAI,OAAO,cAAe,OAE1B,MAAM,IAAM,SACN,KAAO,IAAI,gBACX,yBAA2B,IAC3B,SAAW,kBACX,SAAW,gBACX,eAAiB,kBACjB,uBAAyB,IACzB,qBAAuB,IAEvB,WAAa,IAAM,CACvB,MAAM,MAAQ,IAAI,eAAe,QAAQ,EACzC,GAAI,OAAS,MAAM,QAAQ,QAAS,OAAO,MAAM,QAAQ,QACzD,MAAM,KAAO,WAAW,SAAS,QAAQ,MAAQ,IACjD,MAAO,GAAG,KAAK,SAAS,GAAG,EAAI,KAAO,GAAG,IAAI,GAAG,MAClD,EAEM,mBAAsB,UAAa,WAAW,WAAW,SAAU,wBAAwB,EAK3F,OAAS,IAAM,CACnB,GAAI,CACF,MAAM,IAAM,WAAW,eAAiB,WAAW,eAAe,IAAI,OAAO,EAAI,IACjF,OAAO,MAAQ,KAAO,MAAQ,IAAM,IAAM,GAC5C,MAAgB,CACd,MAAO,GACT,CACF,EAIM,MAAS,QAAW,CACxB,GAAI,CACF,IAAI,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,OAAQ,IAAK,OAAO,CAAE,CAAE,CAAC,CAAC,CACpG,MAAgB,CAEhB,CACF,EAIA,WAAW,cAAgB,GAC3B,IAAI,iBAAiB,qCAAsC,IAAM,CAC/D,WAAW,cAAgB,EAC7B,CAAC,EAED,IAAI,YAAc,KAClB,IAAI,iBACF,QACC,OAAU,CACT,MAAM,OAAS,MAAM,kBAAkB,SAAW,MAAM,OAAO,QAAQ,wDAAwD,EAC1H,SACL,WAAW,cAAgB,OAAO,KAAO,kBACzC,YAAc,OAAO,KAAO,uBAAyB,IAAI,eAAe,cAAc,EAAI,OACtF,CAAC,WAAW,eAAiB,CAAC,gBAAgB,GAAK,OAAO,IAAM,KAAK,aAAa,EACxF,EACA,EACF,EAIA,MAAM,UAAY,IAAM,WAAW,kBAEnC,SAAS,iBAAkB,CACzB,MAAM,OAAS,UAAU,EACzB,MAAI,CAAC,QAAU,OAAO,OAAO,qBAAwB,WAAmB,GACjE,OAAO,OAAO,SAAY,YAAc,OAAO,QAAQ,CAChE,CAEA,MAAM,iBAAmB,IAAM,CAC7B,MAAM,OAAS,UAAU,EACzB,GAAI,CAAC,QAAU,OAAO,OAAO,YAAe,WAAY,MAAO,GAC/D,GAAI,CACF,OAAO,OAAO,WAAW,IAAM,EACjC,MAAgB,CACd,MAAO,EACT,CACF,EAEA,SAAS,yBAA0B,CACjC,MAAM,OAAS,UAAU,EAEzB,MADI,CAAC,QAAU,OAAO,OAAO,qBAAwB,YACjD,OAAO,OAAO,SAAY,YAAc,CAAC,OAAO,QAAQ,EAAU,IAEtE,OACG,oBAAoB,EACpB,KAAM,QAAW,CACX,SAAQ,WAAW,SAAS,KAAO,WAAW,EACrD,CAAC,EACA,MAAM,IAAM,CACX,WAAW,SAAS,KAAO,WAAW,CACxC,CAAC,EAEI,GACT,CAIA,IAAI,gBAAkB,KAClB,aAAe,EACf,kBAAoB,GAExB,MAAM,iBAAmB,IAAM,CACzB,iBAAiB,gBAAgB,WAAW,EAChD,gBAAkB,KAClB,WAAW,aAAa,YAAY,CACtC,EAEM,YAAc,IAAM,CAGxB,GAFA,iBAAiB,EACjB,UAAU,EACN,kBAAmB,CACrB,kBAAoB,GACpB,MAAM,OAAS,UAAU,EACrB,QAAU,OAAO,OAAO,OAAU,YAAY,OAAO,MAAM,CACjE,CACA,IAAI,cAAc,IAAI,YAAY,oBAAoB,CAAC,CACzD,EAEM,gBAAkB,IAAM,CAC5B,iBAAiB,EACjB,MAAM,QAAU,IAAI,eAAe,gBAAgB,EACnD,GAAI,QAAS,CAGX,MAAM,SAAW,IAAI,IAAI,QAAQ,iBAAiB,gCAAgC,CAAC,EACnF,gBAAkB,IAAI,iBAAiB,IAAM,CAC5B,MAAM,KAAK,QAAQ,iBAAiB,gCAAgC,CAAC,EACzE,KAAM,MAAS,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,YAAY,CAC9D,CAAC,EACD,gBAAgB,QAAQ,QAAS,CAAE,UAAW,GAAM,QAAS,EAAK,CAAC,CACrE,CACA,aAAe,WAAW,WAAW,YAAa,sBAAsB,CAC1E,EAIA,IAAI,WAAa,EACjB,MAAM,UAAa,MAAS,CAC1B,MAAM,MAAQ,IAAI,eAAe,QAAQ,EACzC,GAAI,CAAC,MAAO,OACZ,MAAM,MAAQ,MAAM,cAAc,uBAAuB,EACrD,QAAO,MAAM,YAAc,MAC/B,MAAM,OAAS,GACf,WAAW,aAAa,UAAU,EAClC,WAAa,WAAW,WAAW,UAAW,IAAK,CACrD,EAEA,SAAS,WAAY,CACnB,MAAM,MAAQ,IAAI,eAAe,QAAQ,EACrC,QAAO,MAAM,OAAS,IAC1B,WAAW,aAAa,UAAU,CACpC,CAEA,WAAW,iBAAiB,WAAY,SAAS,EAIjD,MAAM,SAAW,IAAM,IAAI,eAAe,QAAQ,EAE5C,YAAe,OAAU,CAC7B,MAAM,MAAQ,SAAS,EACjB,OAAU,OAAS,MAAM,QAAQ,aAAgB,IAAI,MAAM,SAAS,aAAe,cACzF,GAAI,WAAW,SAAW,OAAO,WAAW,QAAQ,aAAgB,WAClE,GAAI,CACF,OAAO,WAAW,QAAQ,YAAY,MAAO,MAAM,CACrD,MAAgB,CAEhB,CAEF,MAAO,KAAK,OAAO,OAAS,CAAC,EAAI,KAAK,QAAQ,CAAC,CAAC,EAClD,EAEM,eAAkB,MAAS,GAAQ,MAAQ,KAAK,WAEhD,aAAgB,OAAU,CAC9B,IAAI,IAAM,OAAO,OAAS,EAAE,EAAE,KAAK,EACnC,OAAK,MACA,IAAI,WAAW,GAAG,GAAK,IAAI,SAAS,GAAG,GAAO,IAAI,WAAW,GAAG,GAAK,IAAI,SAAS,GAAG,KAAI,IAAM,IAAI,MAAM,EAAG,EAAE,GACnH,IAAM,IAAI,QAAQ,QAAS,GAAG,EAC1B,IAAI,WAAW,IAAI,IAAG,IAAM,GAAG,WAAW,SAAS,QAAQ,GAAG,GAAG,IAC9D,KAJU,EAKnB,EAIM,cAAiB,MAAS,CAC9B,MAAM,QAAU,OAAO,QAAS,MAAQ,KAAK,YAAe,CAAC,CAAC,EAC9D,SAAW,CAAC,OAAQ,QAAQ,IAAK,QAAS,CACxC,MAAM,IAAM,OAAO,QAAU,EAAE,EAAE,YAAY,EACvC,MAAQ,OAAO,UAAY,EAAE,EAAE,KAAK,EAC1C,GAAK,OACA,0CAA0C,KAAK,GAAG,IACnD,MAAM,SAAS,MAAM,GAAK,MAAM,WAAW,IAAI,GAAK,MAAM,SAAS,YAAY,GAAG,OAAO,aAAa,KAAK,CACjH,CACA,MAAO,EACT,EAEM,WAAa,CAAC,IAAK,QAAU,CACjC,GAAI,CAAC,IAAK,MAAO,GACjB,GAAI,CACF,MAAM,OAAS,IAAI,IAAI,IAAK,WAAW,SAAS,MAAM,EACtD,MAAI,kCAAkC,KAAK,OAAO,IAAI,GAAG,OAAO,aAAa,IAAI,QAAS,OAAO,KAAK,CAAC,EAChG,OAAO,IAChB,MAAgB,CACd,OAAO,GACT,CACF,EAIM,WAAa,CAAC,OAAQ,OAAQ,OAAQ,UAAW,OAAQ,QAAS,UAAW,UAAW,QAAS,UAAU,EAC3G,aAAe,CAAC,QAAS,SAAU,OAAQ,OAAQ,QAAS,OAAQ,MAAM,EAC1E,WAAc,MAAS,CAC3B,MAAM,OAAS,CAAC,EAChB,cAAO,QAAS,MAAQ,KAAK,YAAe,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,OAAQ,QAAQ,IAAM,CAC9E,MAAM,IAAM,OAAO,QAAU,EAAE,EAAE,KAAK,EAChC,MAAQ,OAAO,UAAY,EAAE,EAAE,KAAK,EAC1C,GAAI,CAAC,KAAO,CAAC,OAAS,IAAI,WAAW,GAAG,EAAG,OAC3C,MAAM,SAAW,IAAI,YAAY,EACjC,GAAI,SAAS,SAAS,eAAe,GAAK,SAAS,SAAS,SAAS,EAAG,OACxE,MAAM,WAAa,MAAM,YAAY,EACrC,GAAI,aAAe,MAAQ,WAAW,WAAW,IAAI,GAAK,WAAW,SAAS,KAAK,GAAK,WAAW,SAAS,YAAY,GAAK,WAAW,SAAS,WAAW,EAAG,QAChJ,SAAS,WAAW,QAAQ,GAEvC,CAAC,SAAS,WAAW,SAAS,GAAK,WAAW,KAAM,MAAS,SAAS,SAAS,IAAI,CAAC,GAAK,CAAC,aAAa,KAAM,MAAS,SAAS,SAAS,IAAI,CAAC,IACrI,OAAO,KAAK,KAAK,CAC/B,CAAC,EACM,OAAO,OAAS,SAAS,OAAO,KAAK,QAAK,CAAC,GAAK,EACzD,EAEM,eAAkB,MAAS,CAE/B,MAAM,QADU,MAAM,QAAQ,MAAQ,KAAK,mBAAmB,EAAI,KAAK,oBAAsB,CAAC,GAE3F,IAAK,QAAW,OAAO,OAAO,OAAS,EAAE,EAAE,KAAK,CAAC,EACjD,OAAQ,OAAU,OAAS,CAAC,0BAA0B,KAAK,KAAK,CAAC,EACpE,GAAI,OAAO,OAAQ,OAAO,OAAO,KAAK,QAAK,EAC3C,MAAM,MAAQ,OAAQ,MAAQ,KAAK,eAAkB,EAAE,EAAE,KAAK,EAC9D,MAAO,mBAAmB,KAAK,KAAK,EAAI,GAAK,MAAM,MAAM,KAAK,EAAE,OAAQ,MAAS,CAAC,UAAU,KAAK,KAAK,KAAK,CAAC,CAAC,EAAE,KAAK,QAAK,CAC3H,EAIA,IAAI,SAAW,KAEf,MAAM,UAAY,IAChB,WACG,MAAO,SAAS,GAAK,SAAS,EAAE,QAAQ,QAAW,GAAG,WAAW,CAAC,MAAO,CAAE,QAAS,CAAE,OAAQ,kBAAmB,EAAG,YAAa,aAAc,CAAC,EAChJ,KAAM,UAAa,CAClB,GAAI,CAAC,SAAS,GAAI,MAAM,IAAI,MAAM,WAAW,SAAS,MAAM,EAAE,EAC9D,OAAO,SAAS,KAAK,CACvB,CAAC,EAEL,SAAS,cAAe,CACtB,GAAI,CAAC,SAAS,EAAG,OACjB,MAAM,GAAK,KAAK,IAAI,EACpB,UAAU,EACP,KAAM,MAAS,CACd,SAAW,CAAE,GAAI,MAAO,IAAI,KAAK,KAAK,OAAS,CAAC,GAAG,IAAK,MAAS,CAAC,KAAK,IAAK,OAAO,KAAK,UAAY,CAAC,CAAC,CAAC,CAAC,CAAE,CAC5G,CAAC,EACA,MAAM,IAAM,CACX,SAAW,IACb,CAAC,CACL,CAEA,MAAM,cAAgB,CAAC,KAAM,OAAS,CACpC,MAAM,MAAS,MAAQ,KAAK,OAAU,CAAC,EACvC,GAAI,CAAC,MAAM,OAAQ,OAAO,KAC1B,GAAI,MAAQ,KAAK,IAAK,CACpB,MAAM,MAAQ,MAAM,KAAM,MAAS,KAAK,MAAQ,KAAK,GAAG,EACxD,GAAI,MAAO,OAAO,KACpB,CACA,GAAI,MAAQ,KAAK,WAAY,CAC3B,MAAM,UAAY,MAAM,KAAM,MAAS,KAAK,aAAe,KAAK,UAAU,EAC1E,GAAI,UAAW,OAAO,SACxB,CACA,GAAI,UAAY,KAAK,IAAI,EAAI,SAAS,GAAK,KAAQ,CACjD,MAAM,QAAU,MAAM,KAAM,MAAS,CAAC,SAAS,MAAM,IAAI,KAAK,GAAG,GAAK,OAAO,KAAK,UAAY,CAAC,EAAI,SAAS,MAAM,IAAI,KAAK,GAAG,CAAC,EAC/H,GAAI,QAAS,OAAO,OACtB,CACA,MAAM,UAAY,OAAQ,SAAS,GAAK,SAAS,EAAE,QAAQ,WAAc,CAAC,EAC1E,OAAO,MAAM,KAAM,MAAS,OAAO,KAAK,UAAU,IAAM,SAAS,GAAK,MAAM,CAAC,CAC/E,EAOM,gBAAmB,OAAU,CACjC,MAAM,KAAO,MAAM,QACb,IAAM,OAAO,KAAK,WAAa,EAAE,EAAE,KAAK,EAAE,YAAY,EACtD,MAAQ,OAAO,KAAK,aAAe,EAAE,EACrC,IAAM,QAAQ,MAAM,MAAM,kBAAkB,GAAK,CAAC,GAAG,CAAC,GAAK,CAAC,EAC5D,QAAU,QAAQ,MAAM,MAAM,qBAAqB,GAAK,CAAC,GAAG,CAAC,GAAK,CAAC,EACzE,MAAO,CAAE,QAAS,KAAK,gBAAkB,QAAU,EAAQ,KAAQ,KAAO,GAAK,QAAU,GAAK,QAAU,IAAK,IAAK,IAAK,OAAQ,CACjI,EAMM,eAAiB,IAAI,IACrB,eAAiB,IAAI,KAEA,IAAM,CAC/B,MAAM,MAAQ,SAAS,EACvB,GAAI,CAAC,MAAO,OACZ,MAAM,OAAS,gBAAgB,KAAK,EAChC,MAAM,QAAQ,WAAW,eAAe,IAAI,OAAO,MAAM,QAAQ,SAAS,EAAG,MAAM,QAAQ,cAAgB,MAAM,EACrH,IAAI,iBAAiB,8BAA8B,EAAE,QAAS,MAAS,CACjE,OAAO,KAAK,QAAQ,WAAa,EAAE,EAAE,KAAK,EAAE,YAAY,IAAM,OAAO,KACzE,KAAK,iBAAiB,mCAAmC,EAAE,QAAS,MAAS,CAC3E,KAAM,CAAE,UAAW,WAAY,EAAI,KAAK,QACpC,CAAC,eAAe,IAAI,SAAS,IAAM,cAAgB,QAAU,cAAgB,UAAU,eAAe,IAAI,UAAW,cAAgB,MAAM,CACjJ,CAAC,CACH,CAAC,CACH,GACmB,EAGnB,MAAM,qBAAuB,CAAC,MAAO,OAAS,CAC5C,MAAM,OAAS,gBAAgB,KAAK,EACpC,GAAI,CAAC,OAAO,QAAS,OAAO,KAC5B,MAAM,KAAO,WAAW,SAAS,QAAQ,MAAQ,IAC3C,QAAU,CAAC,EACjB,OAAE,MAAQ,KAAK,OAAU,CAAC,GAAG,QAAS,MAAS,CAC7C,MAAM,GAAK,OAAO,KAAK,YAAc,EAAE,EACnC,CAAC,IAAM,eAAe,IAAI,EAAE,GAAK,eAAe,IAAI,GAAK,CAAC,KAAK,SAC9D,eAAe,IAAI,EAAE,GACxB,eAAe,IACb,GACA,WACG,MAAM,GAAG,KAAK,SAAS,GAAG,EAAI,KAAO,GAAG,IAAI,GAAG,YAAY,mBAAmB,KAAK,MAAM,CAAC,MAAO,CAAE,QAAS,CAAE,OAAQ,kBAAmB,CAAE,CAAC,EAC5I,KAAM,UAAc,SAAS,GAAK,SAAS,KAAK,EAAI,IAAK,EACzD,KAAM,SAAY,CACjB,MAAM,KAAO,MAAM,QAAQ,SAAS,IAAI,EAAI,QAAQ,KAAO,OAAO,SAAS,MAAQ,EAAE,EAAE,MAAM,GAAG,EAChG,eAAe,IAAI,GAAI,KAAK,KAAM,KAAQ,OAAO,GAAG,EAAE,KAAK,EAAE,YAAY,IAAM,OAAO,GAAG,CAAC,CAC5F,CAAC,EACA,MAAM,IAAM,CACX,eAAe,IAAI,GAAI,EAAK,CAC9B,CAAC,CACL,EAEF,QAAQ,KAAK,eAAe,IAAI,EAAE,CAAC,EACrC,CAAC,EACM,QAAQ,OAAS,QAAQ,IAAI,OAAO,EAAI,IACjD,EAQM,gBAAmB,MAAS,CAChC,IAAK,MAAM,QAAQ,KAAK,cAAc,EAAI,KAAK,eAAiB,CAAC,GAAG,KAAM,UAAa,UAAY,SAAS,MAAQ,SAAS,aAAe,EAAK,EAAG,MAAO,GAC3J,MAAM,OAAU,aAAgB,EAAQ,aAAgB,YAAY,OAAS,gBAC7E,OAAK,KAAK,kCAAoC,CAAC,GAAG,KAAK,MAAM,EAAU,IAC/D,KAAK,OAAS,CAAC,GAAG,KAAM,OAAU,KAAK,iCAAmC,CAAC,GAAG,KAAM,YAAe,OAAO,WAAW,oBAAoB,CAAC,CAAC,CACrJ,EAcM,eAAiB,CAAC,MAAO,KAAM,SAAU,UAAY,CACzD,MAAM,OAAS,gBAAgB,KAAK,EACpC,GAAI,CAAC,OAAO,SAAW,gBAAgB,IAAI,EAAG,OAAO,KACrD,MAAM,aAAe,OAAO,MAAM,QAAQ,cAAgB,EAAE,EAC5D,GAAI,cAAgB,KAAK,UAAY,KAAK,WAAa,aAAc,OAAO,KAC5E,IAAI,SAAW,EACX,SAAW,EACX,QAAU,GACV,QAAU,GACV,WAAa,GAejB,OAdC,KAAK,OAAS,CAAC,GAAG,QAAS,MAAS,CACnC,GAAI,eAAe,IAAI,EAAG,OAC1B,MAAM,MAAQ,eAAe,IAAI,OAAO,KAAK,UAAU,CAAC,EAExD,GADI,QAAU,SAAW,QAAU,IAC/B,QAAU,GAAM,CACd,KAAK,oBAAsB,KAAO,WAAa,IACnD,MACF,CACA,UAAY,OAAO,KAAK,UAAY,CAAC,EACrC,MAAM,KAAO,OAAO,KAAK,aAAe,KAAK,OAAS,CAAC,GACnD,CAAC,UAAY,KAAO,YAAU,SAAW,OACzB,MAAM,QAAQ,KAAK,+BAA+B,EAAI,KAAK,gCAAkC,KAAK,WAAa,CAAC,GACpH,KAAM,YAAe,OAAO,WAAW,QAAU,CAAC,EAAI,CAAC,IAAG,QAAU,GACtF,CAAC,EACG,SAAW,YAAc,CAAC,SAAiB,KAC3C,UAAY,OAAO,IAAY,SAAW,UAAY,QAAU,CAAE,KAAM,GAAM,QAAS,OAAO,OAAQ,EAAI,KAC1G,UAAY,SACE,KAAK,OAAQ,IAAM,OAAO,SAAW,SAAW,OAAO,IAAO,GAAG,EACnE,QAAgB,KACzB,CAAE,KAAM,GAAO,SAAU,UAAW,OAAO,IAAM,SAAU,IAAK,OAAO,IAAK,QAAS,OAAO,OAAQ,CAC7G,EAIM,QAAU,CAAC,KAAM,OAAS,CAC1B,OAAM,KAAK,YAAc,KAC/B,EAGM,QAAU,CAAC,KAAM,KAAM,QAAU,CAChC,OACD,OAAS,KACP,KAAK,aAAa,IAAI,GAAG,KAAK,gBAAgB,IAAI,EAC7C,KAAK,aAAa,IAAI,IAAM,OACrC,KAAK,aAAa,KAAM,KAAK,EAEjC,EAEM,QAAU,CAAC,KAAM,OAAS,CAC1B,MAAQ,KAAK,YAAc,OAAM,KAAK,UAAY,KACxD,EAIA,IAAI,aAAe,EACnB,MAAM,qBAAuB,CAAC,IAAK,IAAK,SAAU,QAAU,IAAM,CAChE,WAAW,aAAa,YAAY,EACpC,MAAM,MAAQ,IAAI,MAClB,MAAM,OAAS,IAAM,CAEf,IAAI,aAAa,IAAI,aAAa,MAAO,MAAM,GAAG,CACxD,EACA,MAAM,QAAU,IAAM,CAChB,QAAU,GAAK,OAAM,aAAe,WAAW,WAAW,IAAM,qBAAqB,IAAK,IAAK,SAAU,QAAU,CAAC,EAAG,IAAI,EACjI,EACA,MAAM,IAAM,QAAU,GAAG,GAAG,GAAG,IAAI,SAAS,GAAG,EAAI,IAAM,GAAG,SAAS,OAAO,GAAK,GACnF,EAEM,WAAc,MAAS,CAC3B,MAAM,MAAQ,SAAS,EACvB,GAAI,CAAC,OAAS,CAAC,KAAM,OACrB,MAAM,QAAU,cAAc,IAAI,EAC5B,SAAW,WAAW,KAAK,OAAU,KAAK,gBAAkB,KAAK,eAAe,KAAQ,GAAI,GAAG,GAAK,MAAM,QAAQ,aAClH,IAAM,MAAM,cAAc,sBAAsB,EAClD,MACF,IAAI,aAAa,MAAO,EAAE,EACtB,UAAY,IAAI,aAAa,KAAK,IAAM,UAAU,IAAI,aAAa,MAAO,QAAQ,EAClF,SAAS,qBAAqB,IAAK,QAAS,QAAQ,GAG1D,QAAQ,MAAM,cAAc,uBAAuB,EAAG,KAAK,eAAiB,KAAK,OAAS,MAAM,QAAQ,cAAgB,EAAE,EAG1H,MAAM,QAAU,eAAe,IAAI,EAAI,uCAAsC,eAAe,IAAI,EAC1F,KAAO,MAAM,cAAc,uBAAuB,EACxD,QAAQ,KAAM,OAAO,EACjB,OAAM,KAAK,OAAS,CAAC,SAEzB,MAAM,YAAc,MAAM,cAAc,0BAA0B,EAC5D,QAAU,MAAM,QAAQ,cAAgB,QAAU,GAAK,WAAW,IAAI,EAC5E,QAAQ,YAAa,OAAO,EACxB,cAAa,YAAY,OAAS,CAAC,SAEvC,MAAM,IAAM,OAAO,KAAK,kBAAoB,KAAK,YAAc,KAAK,aAAe,KAAK,OAAS,CAAC,EAC5F,IAAM,OAAO,KAAK,qBAAuB,CAAC,EAChD,QAAQ,MAAM,cAAc,sBAAsB,EAAG,YAAY,GAAG,CAAC,EACrE,MAAM,QAAU,MAAM,cAAc,sBAAsB,EACtD,UACF,QAAQ,OAAS,EAAE,IAAM,KACzB,QAAQ,QAAS,IAAM,IAAM,YAAY,GAAG,EAAI,EAAE,GAEpD,MAAM,QAAU,MAAM,cAAc,sBAAsB,EACpD,SAAW,OAAO,KAAK,UAAY,CAAC,EACtC,UACF,QAAQ,OAAS,UAAY,EAC7B,QAAQ,QAAS,SAAW,EAAI,OAAO,QAAQ,GAAK,EAAE,EAE1D,EAEM,WAAc,MAAS,CAC3B,MAAM,MAAQ,SAAS,EACvB,GAAI,CAAC,OAAS,CAAC,KAAM,OACrB,MAAM,MAAQ,OAAO,KAAK,YAAc,CAAC,EACzC,QAAQ,MAAM,cAAc,wBAAwB,EAAG,cAAc,KAAK,IAAI,QAAU,EAAI,OAAS,OAAO,EAAE,EAC9G,QAAQ,MAAM,cAAc,2BAA2B,EAAG,YAAY,KAAK,WAAW,CAAC,EAEvF,SAAW,KACX,MAAM,QAAU,qBAAqB,MAAO,IAAI,EAChD,GAAI,CAAC,QAAS,CACZ,WAAW,MAAO,IAAI,EACtB,MACF,CAGA,MAAM,KAAO,MAAM,cAAc,uBAAuB,EACpD,OAAM,KAAK,OAAS,IACxB,IAAI,QAAU,GACd,MAAM,OAAS,IAAM,CACf,SAAW,CAAC,MAAQ,WAAa,OACrC,QAAU,GACV,WAAW,MAAO,IAAI,EACtB,aAAa,EACf,EACA,QAAQ,KAAK,MAAM,EACnB,WAAW,WAAW,OAAQ,IAAI,CACpC,EAEM,UAAY,CAAE,EAAG,OAAQ,EAAG,YAAa,EAAG,WAAY,EAAG,WAAY,EAAG,SAAU,EAE1F,SAAS,WAAW,MAAO,KAAM,CAG/B,MAAM,QAAU,OAAO,MAAM,QAAQ,qBAAuB,CAAC,EAC7D,IAAI,UAAY,EACZ,YAAc,IACjB,KAAK,OAAS,CAAC,GAAG,QAAS,MAAS,CAC/B,eAAe,IAAI,EAAG,WAAa,OAAO,KAAK,kBAAoB,CAAC,EACnE,YAAc,EACrB,CAAC,EACD,MAAM,SAAW,KAAK,IAAI,EAAG,OAAO,KAAK,aAAe,CAAC,EAAI,SAAS,EAChE,KAAO,MAAM,cAAc,uBAAuB,EACxD,GAAI,CAAC,KAAM,OACX,MAAM,KAAO,QAAU,GAAK,YAE5B,GADA,KAAK,OAAS,CAAC,KACX,CAAC,KAAM,OAEX,MAAM,MAAQ,eAAe,MAAO,KAAM,SAAU,OAAO,EACrD,MAAQ,EAAQ,OAAU,CAAC,MAAM,KACjC,UAAY,QAAU,SACtB,SAAW,MAAQ,MAAM,KAAO,WAAa,EAC7C,WAAa,SAAW,IAAM,KAAK,IAAI,EAAG,KAAK,IAAI,IAAK,KAAK,MAAO,SAAW,QAAW,GAAG,CAAC,CAAC,EACrG,KAAK,UAAU,OAAO,cAAe,QAAQ,EAE7C,IAAI,KACJ,GAAI,MAAO,CACT,MAAM,KAAO,4CAA4C,MAAM,OAAO,SAAS,UAAU,MAAM,GAAG,GAAK,OAAO,MAAM,GAAG,EAAE,0BACzH,KAAO,MAAM,YAAc,EAAI,+BAA+B,IAAI,GAAK,UAAU,MAAM,SAAS,qCAAqC,IAAI,EAC3I,MAAW,MAGT,KAAO,+CAA+C,MAAM,OAAO,8EAEnE,KAAO,SAAW,4CAAyC,UAAU,YAAY,SAAS,CAAC,8BAE7F,QAAQ,KAAK,cAAc,4BAA4B,EAAG,IAAI,EAE9D,MAAM,UAAY,MAAQ,GAAG,MAAM,QAAQ,OAAO,MAAM,GAAG,GAAK,GAC1D,IAAM,KAAK,cAAc,sBAAsB,EACrD,QAAQ,IAAK,aAAc,MAAQ,oBAAoB,MAAM,OAAO,0BAA4B,2BAA2B,EAC3H,QAAQ,IAAK,gBAAiB,MAAQ,OAAO,MAAM,GAAG,EAAI,KAAK,EAC/D,QAAQ,IAAK,gBAAyB,OAAR,MAAe,MAAM,SAAmB,UAAX,CAAsB,EACjF,QAAQ,IAAK,iBAAkB,MAAQ,UAAY,IAAI,EACvD,MAAMA,MAAO,KAAK,cAAc,4BAA4B,EACtD,MAAQ,MAAQ,GAAG,KAAK,MAAO,MAAM,SAAW,MAAM,IAAO,GAAK,EAAI,GAAG,IAAM,GAAG,UAAU,IAC9FA,OAAQA,MAAK,MAAM,QAAU,QAAOA,MAAK,MAAM,MAAQ,OAC3D,MAAM,MAAQ,KAAK,cAAc,6BAA6B,EAC1D,QACE,MAAM,cAAgB,YAAW,MAAM,YAAc,WACrD,MAAM,SAAW,CAAC,QAAO,MAAM,OAAS,CAAC,OAEjD,CAEA,MAAM,WAAa,IAAM,CACvB,MAAM,MAAQ,SAAS,EACvB,GAAI,CAAC,MAAO,OACZ,MAAM,IAAM,MAAM,cAAc,sBAAsB,EAClD,KAAO,MAAM,QAAQ,cAAc,IAAI,aAAa,MAAO,MAAM,QAAQ,YAAY,EACzF,QAAQ,MAAM,cAAc,uBAAuB,EAAG,MAAM,QAAQ,cAAgB,EAAE,EACtF,MAAM,KAAO,MAAM,cAAc,uBAAuB,EACpD,OACF,KAAK,OAAS,GACd,KAAK,YAAc,QAErB,MAAM,QAAU,MAAM,cAAc,0BAA0B,EAC1D,UAAS,QAAQ,OAAS,IAC9B,QAAQ,MAAM,cAAc,sBAAsB,EAAG,MAAG,EACxD,MAAM,IAAM,MAAM,cAAc,sBAAsB,EAClD,MAAK,IAAI,OAAS,IACtB,MAAM,IAAM,MAAM,cAAc,sBAAsB,EAClD,MAAK,IAAI,OAAS,IACtB,QAAQ,MAAM,cAAc,wBAAwB,EAAG,MAAG,EAC1D,QAAQ,MAAM,cAAc,2BAA2B,EAAG,MAAG,EAC7D,MAAM,KAAO,MAAM,cAAc,uBAAuB,EACpD,OAAM,KAAK,OAAS,GAC1B,EAIA,IAAI,KAAO,GACP,QAAU,GACV,cAAgB,CAAC,EACjB,iBAAmB,GACnB,YAAc,KACd,WAAa,EACb,eAAiB,EACjB,SAAW,KACX,YAAc,GAEd,cAAgB,OAChB,cAAgB,EAEpB,MAAM,WAAc,IAAO,CACrB,WAAW,kBAAoB,OAAO,WAAW,iBAAiB,KAAQ,WAC5E,WAAW,iBAAiB,IAAI,eAAgB,EAAE,EACzC,IAAM,CAAC,KAAK,UAAU,SAAS,kBAAkB,GAC1D,KAAK,UAAU,IAAI,kBAAkB,EACrC,iBAAmB,IACV,CAAC,IAAM,mBAChB,KAAK,UAAU,OAAO,kBAAkB,EACxC,iBAAmB,IAErB,KAAK,UAAU,OAAO,uBAAwB,EAAE,CAClD,EAKM,aAAgB,OAAU,CAC9B,MAAM,QAAU,OAAO,IAAM,KAAO,MAAM,cAAc,8BAA8B,EAAI,IAAM,IAC5F,MAAM,QAAQ,UAAY,UAC9B,MAAM,QAAQ,QAAU,QACxB,MAAM,UAAU,OAAO,kCAAmC,UAAY,GAAG,EACzE,MAAM,iBAAiB,0BAA0B,EAAE,QAAS,OAAU,CACpE,MAAM,OAAS,MAAM,QAAQ,kBAAoB,OACnD,CAAC,EACH,EAKM,aAAe,IAAM,CACzB,MAAM,MAAQ,SAAS,EACjB,MAAQ,OAAS,MAAM,cAAc,yBAAyB,EAC9D,KAAO,OAAS,MAAM,cAAc,uBAAuB,EACjE,GAAI,CAAC,OAAS,CAAC,KAAM,OACrB,MAAM,QAAU,MAAM,QAAQ,UAAY,KAAO,KAAK,aAAe,KAAK,aAAe,EACrF,MAAM,UAAU,SAAS,WAAW,IAAM,SAAS,MAAM,UAAU,OAAO,YAAa,OAAO,CACpG,EAEA,IAAI,YAAc,EAClB,WAAW,iBAAiB,SAAU,IAAM,CACrC,OACL,WAAW,qBAAqB,WAAW,EAC3C,YAAc,WAAW,sBAAsB,YAAY,EAC7D,CAAC,EAID,MAAM,gBAAmB,MAAS,CAChC,MAAM,MAAQ,SAAS,EACjB,OAAS,OAAS,MAAM,cAAc,2BAA2B,EACvE,GAAI,CAAC,OAAQ,OACb,MAAM,MAAQ,OAAO,cAAc,iCAAiC,EAChE,OAAS,CAAC,MAAM,QAAQ,eAAc,MAAM,QAAQ,aAAe,MAAM,YAAY,KAAK,GAC9F,OAAO,UAAU,OAAO,UAAW,IAAI,EACvC,QAAQ,OAAQ,YAAa,KAAO,OAAS,IAAI,EACjD,QAAQ,OAAQ,gBAAiB,KAAO,OAAS,IAAI,EACjD,QAAO,MAAM,YAAc,KAAO,yBAAsB,MAAM,QAAQ,cAAgB,YAC1F,MAAM,KAAO,OAAO,cAAc,WAAW,EACzC,MAAQ,CAAC,KAAM,OAAO,mBAAmB,aAAc,mDAAmD,EACrG,CAAC,MAAQ,MAAM,KAAK,OAAO,CACtC,EAIM,cAAgB,IAAM,CAC1B,WAAW,aAAa,aAAa,EACjC,gBAAkB,SACtB,cAAgB,OAChB,gBAAgB,EAAK,EACvB,EAEM,iBAAmB,IAAM,CAC7B,YAAc,GACd,MAAM,MAAQ,SAAS,EACnB,OAAO,MAAM,iBAAiB,uBAAuB,EAAE,QAAS,MAAS,KAAK,gBAAgB,WAAW,CAAC,CAChH,EAGM,iBAAmB,IAAM,CAC7B,WAAW,aAAa,cAAc,EACtC,cAAgB,CAAC,EACb,aAAa,iBAAiB,EAC9B,gBAAkB,WAAW,cAAc,CACjD,EAGA,WAAW,iBAAiB,WAAa,OAAU,CAC5C,MAAM,YACX,iBAAiB,EACjB,cAAc,EAChB,CAAC,EAED,MAAM,YAAc,IAAM,CACxB,QAAU,GACV,MAAM,QAAU,cAChB,cAAgB,CAAC,EACjB,QAAQ,QAAS,SAAY,QAAQ,CAAC,CACxC,EAEM,WAAc,OAClB,MAAM,KAAK,MAAM,iBAAiB,kEAAkE,CAAC,EAAE,OACpG,MAAS,KAAK,eAAe,EAAE,OAAS,CAC3C,EAEI,UAAa,OAAU,CAC3B,GAAI,CAAC,KAAM,OACX,MAAM,MAAQ,SAAS,EACjB,MAAQ,OAAS,MAAM,cAAc,yBAAyB,EACpE,GAAI,CAAC,MAAO,OACZ,GAAI,MAAM,MAAQ,SAAU,CAC1B,MAAM,eAAe,EACrB,MAAM,QAAQ,EACd,MACF,CACA,GAAI,MAAM,MAAQ,MAAO,OACzB,MAAM,MAAQ,WAAW,KAAK,EAC9B,GAAI,CAAC,MAAM,OAAQ,OACnB,MAAM,MAAQ,MAAM,CAAC,EACf,KAAO,MAAM,MAAM,OAAS,CAAC,EAC/B,MAAM,WAAa,IAAI,gBAAkB,OAAS,CAAC,MAAM,SAAS,IAAI,aAAa,IACrF,MAAM,eAAe,EACrB,KAAK,MAAM,GACF,CAAC,MAAM,UAAY,IAAI,gBAAkB,OAClD,MAAM,eAAe,EACrB,MAAM,MAAM,EAEhB,EAEM,aAAgB,OAAU,CAC9B,GAAI,EAAE,MAAM,kBAAkB,SAAU,OACxC,MAAM,OAAS,MAAM,OAAO,QAAQ,wBAAwB,EAC5D,GAAI,OAAQ,CACV,MAAM,eAAe,EACrB,MAAM,OAAO,aAAa,sBAAsB,CAAC,EACjD,MACF,CAEA,MAAM,eAAiB,MAAM,OAAO,QAAQ,2BAA2B,EACvE,GAAI,eAAgB,CAClB,GAAI,gBAAkB,KAAM,CAE1B,cAAgB,OAChB,MACF,CACA,GAAI,gBAAkB,OAAQ,CAC5B,MAAM,eAAe,EACrB,MACF,CAKA,GAJA,MAAM,UAAU,EACX,SAAS,iBAAiB,EAC/B,gBAAgB,EAAI,EACpB,cAAgB,WAAW,WAAW,cAAe,oBAAoB,EACrE,QAAS,CACX,cAAgB,OAChB,MACF,CAEA,MAAM,eAAe,EACrB,cAAgB,UAChB,MAAMC,IAAK,IAAM,CACf,WAAW,aAAa,cAAc,EAClC,GAAC,MAAQ,gBAAkB,aAC/B,cAAgB,KAChB,eAAe,MAAM,EACvB,EACA,cAAc,KAAKA,GAAE,EACrB,eAAiB,WAAW,WAAWA,IAAI,IAAI,EAC/C,MACF,CAEA,MAAM,SAAW,MAAM,OAAO,QAAQ,uBAAuB,EAC7D,GAAI,CAAC,SAAU,OACf,GAAI,YAAa,CACf,MAAM,eAAe,EACrB,MACF,CAEA,GADA,MAAM,WAAW,EACb,QAAS,OAEb,MAAM,eAAe,EACrB,iBAAiB,EACjB,YAAc,GACd,SAAS,aAAa,YAAa,MAAM,EACzC,MAAM,GAAK,IAAM,CACf,WAAW,aAAa,cAAc,EAClC,GAAC,MAAQ,CAAC,eACd,WAAW,SAAS,KAAO,SAAS,aAAa,MAAM,GAAK,WAAW,EACzE,EACA,cAAc,KAAK,EAAE,EACrB,eAAiB,WAAW,WAAW,GAAI,IAAI,CACjD,EAEA,IAAI,MAAQ,GACZ,MAAM,UAAa,OAAU,CACvB,QACJ,MAAQ,GACR,MAAM,iBAAiB,QAAS,YAAY,EAC5C,IAAI,iBAAiB,UAAW,UAAW,EAAI,EACjD,EAEM,UAAY,CAAC,CAAE,KAAO,KAAM,KAAO,KAAM,OAAS,CAAE,EAAI,CAAC,IAAM,CACnE,MAAM,MAAQ,SAAS,EACvB,GAAI,CAAC,MAAO,MAAO,GACnB,UAAU,KAAK,EACf,WAAW,aAAa,UAAU,EAElC,MAAM,QAAU,KAChB,GAAI,CAAC,KAAM,CACT,MAAM,OAAS,IAAI,cACnB,YAAc,kBAAkB,aAAe,SAAW,IAAI,KAAO,OAAS,WAChF,CACA,KAAO,GACP,WAAW,EACX,aAAa,KAAK,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,MAAM,UAAU,OAAO,aAAc,CAAC,IAAI,EACtC,MAAM,WAAW,IAAI,EACrB,OACF,WAAW,cAAc,KAAM,IAAI,CAAC,EACpC,WAAW,IAAI,GAEjB,QAAU,EAAE,OAAS,GACjB,OAAS,GAAG,WAAW,WAAW,YAAa,MAAM,EAEzD,MAAM,OAAS,GACf,WAAW,EAAI,EACf,MAAM,KAAO,MAAM,cAAc,uBAAuB,EACxD,OAAI,MAAQ,KAAK,YAAW,KAAK,UAAY,GAC7C,aAAa,EACb,WAAW,sBAAsB,IAAM,CACrC,MAAM,UAAU,IAAI,SAAS,EAC7B,MAAM,MAAQ,MAAM,cAAc,wBAAwB,EACtD,OAAO,MAAM,MAAM,CAAE,cAAe,EAAK,CAAC,CAChD,CAAC,EACI,SAAS,MAAM,MAAM,EACnB,EACT,EAEM,KAAQ,MACZ,UAAU,EAAE,KAAM,MAAS,CACzB,MAAM,MAAQ,SAAS,EACvB,GAAI,OAAS,OACX,WAAW,cAAc,KAAM,IAAI,CAAC,EACpC,WAAW,IAAI,EACf,MAAM,UAAU,OAAO,YAAY,EACnC,aAAa,EACb,YAAY,EAER,CAAC,MAAM,SAAS,IAAI,aAAa,GAAG,CACtC,MAAM,MAAQ,MAAM,cAAc,wBAAwB,EACtD,OAAO,MAAM,MAAM,CAAE,cAAe,EAAK,CAAC,CAChD,CAIF,GAAI,CACF,MAAM,OAAS,UAAU,EACrB,QAAU,OAAO,OAAO,SAAY,YAAY,OAAO,QAAQ,IAAI,CACzE,MAAgB,CAEhB,CACA,OAAO,IACT,CAAC,EAGG,eAAiB,IAAM,CACvB,OAAM,WAAW,SAAS,KAAO,WAAW,EAClD,EAEM,cAAgB,CAAE,QAAS,gBAAiB,EAAG,UAAW,KAAM,gBAAiB,OAAQ,cAAe,EAG9G,SAAS,MAAM,OAAQ,CACrB,MAAM,MAAQ,SAAS,EACvB,GAAI,CAAC,OAAS,CAAC,KAAM,OACrB,KAAO,GACH,OAAO,QAAW,UAAY,cAAc,MAAM,GAAG,MAAM,cAAc,MAAM,CAAC,EACpF,MAAM,UAAU,OAAO,SAAS,EAChC,WAAW,EAAK,EAEhB,iBAAiB,EACjB,cAAc,EACd,QAAU,GACV,WAAa,WAAW,WAAW,IAAM,CACvC,MAAM,OAAS,EACjB,EAAG,GAAG,EACN,MAAM,OAAS,aAAe,YAAY,aAAe,YAAY,eAAe,EAAE,OAAS,YAAc,KAC7G,YAAc,KACV,QAAQ,OAAO,MAAM,CAAE,cAAe,EAAK,CAAC,CAClD,CAIA,IAAI,iBAAiB,oCAAqC,IAAM,CAC9D,GAAI,WAAW,cAAe,CAC5B,UAAU,qCAAgC,EAC1C,gBAAgB,EAChB,MACF,CACI,gBAAgB,IAClB,kBAAoB,iBAAiB,EACjC,mBAAmB,gBAAgB,EAE3C,CAAC,EAID,IAAI,iBAAiB,mCAAoC,IAAM,CAE7D,GADA,iBAAiB,EACb,WAAW,cAAe,CAC5B,WAAW,cAAgB,GAC3B,MACF,CAEA,GAAI,gBAAgB,EAAG,CAChB,mBAAmB,iBAAiB,EACzC,kBAAoB,GACpB,mBAAmB,IAAM,CAClB,wBAAwB,IAAG,WAAW,SAAS,KAAO,WAAW,EACxE,CAAC,EACD,MACF,CAIA,MAAM,QAAU,OAAO,IAAM,IAE7B,GADI,SAAS,MAAM,cAAc,EAC7B,SAAW,CAAC,UAAU,CAAE,OAAQ,wBAAyB,CAAC,EAAG,CAC/D,mBAAmB,IAAM,CACvB,WAAW,SAAS,KAAO,WAAW,CACxC,CAAC,EACD,MACF,CACA,mBAAmB,IAAM,CACvB,KAAK,IAAI,EAAE,MAAM,cAAc,CACjC,CAAC,CACH,CAAC,EAED,OAAO,cAAgB,CACrB,UAAW,IAAM,EAAQ,SAAS,EAElC,KAAM,CAAC,QAAU,CAAC,IAAM,CACtB,GAAI,OAAO,IAAM,KAAO,SAAS,EAE/B,aAAM,cAAc,EACpB,WAAW,WAAW,IAAM,CAC1B,WAAW,SAAS,KAAO,WAAW,CACxC,EAAG,QAAQ,QAAU,CAAC,EACf,GAET,MAAM,OAAS,UAAU,CAAE,KAAM,QAAQ,MAAQ,KAAM,KAAM,QAAQ,MAAQ,KAAM,OAAQ,QAAQ,QAAU,CAAE,CAAC,EAChH,OAAI,QAAU,CAAC,QAAQ,MAAM,KAAK,QAAQ,MAAQ,IAAI,EAAE,MAAM,cAAc,EACrE,MACT,EACA,MAAO,IAAM,MAAM,EACnB,OAAQ,IAAM,IAChB,CACF,GAAG",
  "names": ["fill", "go"]
}
