{
  "version": 3,
  "sources": ["/cdn/shop/t/39/assets/fizzy-pdp-hero.js?buy-once=20260911"],
  "sourcesContent": ["// FizzyIQ \u2014 PDP hero + buy box interactions\n// Ported from 02 PDP FizzyFocus v3.html. Self-initializes on DOMContentLoaded.\n(function () {\n  function init() {\n    var hero = document.getElementById('pdpHero');\n    if (!hero) return;\n\n    // Read the inert JSON once the deferred section script initializes.\n    // An absent/invalid payload clears any stale editor state and fails closed.\n    var stickPayload = document.getElementById('fizzy-pdp-stick');\n    window.__fizzyPdpStick = null;\n    if (stickPayload) {\n      try { window.__fizzyPdpStick = JSON.parse(stickPayload.textContent); }\n      catch (error) { console.error('[FizzyIQ] stick pack data unavailable'); }\n    }\n\n    // The real vendor iframe is present at parse time. Its ready handshake\n    // must work on preview URLs too, independently of the lower reviews widget.\n    (function initFrontrowBadge() {\n      var frame = hero.querySelector('#iframe-frontrow-quant');\n      if (!frame || frame.dataset.fizzyBound === 'true') return;\n      frame.dataset.fizzyBound = 'true';\n      var origin = 'https://app.thefrontrowhealth.com';\n      var loader = document.querySelector('script[data-fizzy-quant-loader]');\n      frame.dataset.frontrowState = 'loading';\n      function ready() {\n        // The frame owns the ready handshake. Do not gate this on the parent\n        // loader: a third-party storage/tracking error must not prevent the\n        // genuine badge document from initializing.\n        if (frame.isConnected && frame.contentWindow) {\n          frame.contentWindow.postMessage({ name: 'PARENT_READY' }, origin);\n        }\n      }\n      function onMessage(event) {\n        if (event.origin !== origin || event.source !== frame.contentWindow) return;\n        var data = event.data;\n        var name = typeof data === 'string' ? data : data && data.name;\n        if (name === 'QUANT_REQUEST_READY_STATUS') ready();\n        if (name === 'RESIZE_HEIGHT' && data && Number.isFinite(data.value) && data.value >= 20 && data.value <= 1000) {\n          frame.dataset.frontrowState = 'ready';\n          frame.style.height = data.value + 'px';\n          frame.style.display = 'block';\n        }\n      }\n      function onVendorLoad() {\n        loader.dataset.ready = 'true';\n        ready();\n      }\n      window.addEventListener('message', onMessage);\n      frame.addEventListener('load', ready);\n      if (!loader) {\n        loader = document.createElement('script');\n        loader.dataset.fizzyQuantLoader = 'true';\n        loader.src = origin + '/api/widgets/script?id=3096';\n        loader.defer = true;\n        loader.addEventListener('load', onVendorLoad, { once: true });\n        document.head.appendChild(loader);\n      } else if (loader.dataset.ready === 'true') {\n        ready();\n      } else {\n        loader.addEventListener('load', onVendorLoad, { once: true });\n      }\n    })();\n\n    // Keep the mobile header opaque only while it crosses the light purchase area.\n    var purchaseSurface = hero.querySelector('.pdp-purchase-surface');\n    var purchaseHeader = document.querySelector('.gh');\n    if (purchaseSurface && purchaseHeader) {\n      var purchaseMobile = window.matchMedia('(max-width: 820px)');\n      var purchaseFrame = 0;\n      function updatePurchaseHeader() {\n        purchaseFrame = 0;\n        var active = false;\n        if (purchaseMobile.matches && purchaseSurface.isConnected) {\n          var bounds = purchaseSurface.getBoundingClientRect();\n          var headerEdge = purchaseHeader.getBoundingClientRect().bottom;\n          active = bounds.top <= headerEdge && bounds.bottom > headerEdge;\n        }\n        document.body.classList.toggle('pdp-purchase-header', active);\n      }\n      function schedulePurchaseHeader() {\n        if (!purchaseFrame) purchaseFrame = requestAnimationFrame(updatePurchaseHeader);\n      }\n      window.addEventListener('scroll', schedulePurchaseHeader, { passive: true });\n      window.addEventListener('resize', schedulePurchaseHeader, { passive: true });\n      window.addEventListener('pageshow', schedulePurchaseHeader);\n      window.addEventListener('load', schedulePurchaseHeader);\n      purchaseMobile.addEventListener('change', schedulePurchaseHeader);\n      if ('ResizeObserver' in window) {\n        var purchaseResize = new ResizeObserver(schedulePurchaseHeader);\n        purchaseResize.observe(hero);\n        purchaseResize.observe(purchaseSurface);\n        purchaseResize.observe(purchaseHeader);\n      }\n      updatePurchaseHeader();\n    }\n\n    // \u2500\u2500 flavor catalog (label + short taste note) \u2500\u2500\n    var FLAV = {\n      bc: { name: 'Berry Cherry',        taste: 'Mixed berries with a tart cherry finish \u2014 bold, balanced, not too sweet.' },\n      sl: { name: 'Strawberry Lemonade', taste: 'Fresh strawberry meets bright lemonade \u2014 the sweet-tart classic kids ask for by name.' },\n      wm: { name: 'Watermelon',          taste: 'Crisp, lightly sweet watermelon \u2014 clean and naturally refreshing.' },\n      ob: { name: 'Orange Creamsicle',   taste: 'Bright orange citrus with a creamy finish \u2014 like a fizzy creamsicle, minus the sugar.' }\n    };\n\n    // Per-flavor hero videos (updated 2026-05-15 \u2014 compressed visualizer set).\n    var FLAVOR_VIDEO = {\n      bc: 'https://cdn.shopify.com/videos/c/o/v/6ea3ab5db29b47cda1308e50040a3e58.mp4',\n      sl: 'https://cdn.shopify.com/videos/c/o/v/8deb1650bf26476da5779c9a39acc01d.mp4',\n      wm: 'https://cdn.shopify.com/videos/c/o/v/d6004e1f825b4308b60f18c25b6c9b82.mp4',\n      ob: 'https://cdn.shopify.com/videos/c/o/v/ba8aa019128042e39419f1f364ac66e7.mp4'\n    };\n\n    // Per-flavor \"drink with benefits\" stills shown as carousel slide 1.\n    // The image swaps when the user previews a different flavor; the\n    // overlay icons + labels are static HTML (see fizzy-pdp-hero.liquid).\n    // Updated 2026-05-19 with refreshed Group_* art. Mapping confirmed\n    // by Sam: 725=BC, 731=SL, 732=WM, 730=OB.\n    var DRINK_BENEFITS_IMG = {\n      // Refreshed JPGs 2026-05-28 (v=1780002433) \u2014 same Group_* mapping\n      // (bc=725, sl=731, wm=732, ob=730), now in JPG format.\n      bc: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/pdphero_keybenefits_newgray_berrycherry.jpg?v=1781239796&width=1440',\n      sl: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/pdphero_keybenefits_newgray_strawberrylemonade.jpg?v=1781239793&width=1440',\n      wm: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/pdphero_keybenefits_newgray_watermelon.jpg?v=1781239799&width=1440',\n      ob: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/pdphero_keybenefits_newgray_orangecreamsicle.jpg?v=1781239797&width=1440'\n    };\n    // Slide 4 \u2014 flavor-aware deep-color drink backdrop for the\n    // \"Clinically Studied Ingredient Benefits\" composition. Cards +\n    // copy are HTML overlays in fizzy-pdp-hero.liquid; only the\n    // background image swaps src per flavor.\n    var CLINICAL_BG_IMG = {\n      bc: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/berry2.png?v=1779059040&width=900',\n      sl: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/strawberry2.png?v=1779059034&width=900',\n      wm: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/watermelon2.png?v=1779059031&width=900',\n      ob: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/orange2.png?v=1779059037&width=900'\n    };\n    // Slide 7 \u2014 flavor-aware \"what's included\" composition on a\n    // hardcoded paper-cream background (set inline in the section\n    // markup). No HTML overlay \u2014 pure image swap per flavor.\n    var INCLUDED_IMG = {\n      // Refreshed JPGs 2026-05-28 (v=1780002435/6). 2026-05-30: BC\n      // reverted from hero_testimonial.jpg back to berrycherry3.jpg\n      // per Sam \u2014 the testimonial composition moved up to slide\n      // data-i=\"8\" for ALL flavors (no flavor-swap on that slide),\n      // and this slot is now the unified *3.jpg pouch composition.\n      bc: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/FizzyIQ_Rebranded_Berry_Cherry.jpg?v=1781237491&width=1440',\n      sl: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/FizzyIQ_Strawberry_Lemonade.jpg?v=1781237491&width=1440',\n      wm: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/FizzyIQ_Credibility_Watermelon.jpg?v=1781237491&width=1440',\n      ob: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/FizzyIQ_Rebranded_Image.jpg?v=1781237491&width=1440'\n    };\n    // Slide \u2014 flavor-aware lifestyle image. Each flavor gets its\n    // own kitchen-scene lifestyle photo tinted to the flavor's brand\n    // color. Swapped by applyFlavorLifestyleImage below; the thumb\n    // at #lifestyleThumbImg mirrors the main image. Added 2026-05-22.\n    var FLAVOR_LIFESTYLE_IMG = {\n      // Refreshed 2026-05-28 (v=1780002436) to the new \"Simple steps.\n      // Big Results.\" 4-image strip per flavor. Filenames are GUID-\n      // suffixed in Shopify Files to avoid collision with the legacy\n      // berry.jpg / strawberry.jpg / watermelon.jpg / orange.jpg.\n      bc: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/FizzyIQ_How_to_Use_Berry_Cherry.jpg?v=1781237491&width=1440',\n      sl: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/FizzyIQ_How_to_Use_Strawberry_Lemonade.jpg?v=1781237491&width=1440',\n      wm: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/How_to_Use_New_Gray_Watermelon.jpg?v=1781237491&width=1440',\n      ob: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/FizzyIQ_How_to_Use_Orange_Creamsicle.jpg?v=1781237491&width=1440'\n    };\n    // Slide \u2014 second flavor-aware lifestyle image. Inserted as the\n    // 3rd carousel slide (data-i=\"2\") on 2026-05-26 to give each\n    // flavor a second lifestyle showcase. Swapped by\n    // applyFlavorLifestyle2Image; thumb mirrored via #lifestyleThumbImg2.\n    // Oct 31, 2026: the clean-label tiles and the Supplement Facts panels are theme assets now (re-lettered:\n    // tested below 5 ppm gluten, no artificial dyes; daggers in place of the missing-glyph boxes). The section\n    // writes their four URLs as data-ground-*; the CDN maps below stay as the fallback.\n    var FLAVOR_LIFESTYLE2_IMG = groundMap(document.getElementById('lifestyleImg2')) || {\n      // Refreshed 2026-05-28 (v=1780005532-56) \u2014 new \"All of the good\n      // stuff. None of the bad.\" flavor photography. Filenames are\n      // GUID-suffixed in Shopify Files to avoid collision with the\n      // legacy berry2.jpg / strawberry2.jpg / etc.\n      bc: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/FizzyIQ_Trust_Badges_Berry_Cherry.jpg?v=1781237491&width=1440',\n      sl: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/FizzyIQ_Trust_Badges_Strawberry.jpg?v=1781237492&width=1440',\n      wm: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/FizzyIQ_Trust_Badges_Watermelon.jpg?v=1781237491&width=1440',\n      ob: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/FizzyIQ_Trust_Badges_New_Gray_Orange.jpg?v=1781237491&width=1440'\n    };\n    // Slide 9 \u2014 flavor-aware Supplement Facts panel. Each variant\n    // has its own SFP rendered as a flat image (added 2026-05-19).\n    // Mapping confirmed by Sam: 18=SL, 21=BC, 19=OB, 16=WM.\n    var SFP_IMG = groundMap(document.getElementById('sfpImg')) || {\n      bc: 'https://cdn.shopify.com/s/files/1/0756/5194/0663/files/berrycherrySFP.jpg?v=1781291696&width=1440',\n      sl: 'https://cdn.shopify.com/s/files/1/0756/5194/0663/files/strawberrySFP.jpg?v=1781291700&width=1440',\n      wm: 'https://cdn.shopify.com/s/files/1/0756/5194/0663/files/watermelonSFP.jpg?v=1781291698&width=1440',\n      ob: 'https://cdn.shopify.com/s/files/1/0756/5194/0663/files/orangeSFP.jpg?v=1781291702&width=1440'\n    };\n\n    // Flavor grounds (Sam 2026-09-21): the gallery stills drawn on the flat\n    // grey ground have one version per flavor on that flavor's light ground,\n    // served as theme assets. Liquid writes the four URLs onto each <img> as\n    // data-ground-bc/sl/wm/ob; this reads them back as a flavor -> URL map.\n    function groundMap(el) {\n      if (!el || !el.dataset || !el.dataset.groundBc) return null;\n      var abs = function (u) { try { return new URL(u, window.location.href).href; } catch (e) { return u; } };\n      var d = el.dataset;\n      return { bc: abs(d.groundBc), sl: abs(d.groundSl), wm: abs(d.groundWm), ob: abs(d.groundOb) };\n    }\n\n    // \u2500\u2500 plan + pricing config \u2500\u2500\n    // Pricing is sourced from the product's live variant metadata (admin =\n    // single source of truth), injected as window.__fizzyPdpPrices by the\n    // section liquid. Values arrive in cents; compare-at drives \"was\" + save%.\n    var PLAN_MONTHS = { '1m': 1, '2m': 2, '3m': 3 };\n    function money(amount, decimals) {\n      if (typeof amount !== 'number' || !isFinite(amount)) return 'Unavailable';\n      return new Intl.NumberFormat(document.documentElement.lang || 'en-US', {\n        style: 'currency', currency: window.__fizzyPdpCurrency || 'USD',\n        minimumFractionDigits: decimals === true || amount % 1 ? 2 : 0,\n        maximumFractionDigits: 2\n      }).format(amount);\n    }\n    function unavailablePrice() {\n      return { price: null, was: 0, save_amt: 0, save_pct: 0, available: false };\n    }\n    function priceFromCents(cents, compare, available) {\n      if (!Number.isFinite(Number(cents)) || Number(cents) <= 0 || available === false) return unavailablePrice();\n      var price = Number(cents) / 100;\n      var was = Number(compare) > Number(cents) ? Number(compare) / 100 : 0;\n      return { price: price, was: was, save_amt: was ? was - price : 0,\n        save_pct: was ? Math.round((was - price) / was * 100) : 0, available: true };\n    }\n    function priceFor(age, plan) {\n      var tbl = window.__fizzyPdpPrices || {};\n      var src = tbl[age] && tbl[age][plan];\n      return src ? priceFromCents(src.price, src.was, src.available) : unavailablePrice();\n    }\n    var PLAN_LABELS = { '1m': 'Monthly', '2m': '2-month', '3m': '3-month', '15d': 'Every 15 days' };\n    // Long-form plan strings written to cart line-item properties.\n    // Hoisted to module scope so both the ATC handler and the sticky\n    // ATC sync (syncStickyAtc) can read from one source of truth.\n    // 2026-05-30: 2-month restored alongside Monthly + 3-month.\n    var PLAN_PROPERTY = {\n      '1m': 'Monthly Delivery',\n      '2m': '2-month Delivery',\n      '3m': '3-month Delivery',\n      '15d': 'Every 15 days'\n    };\n\n    var state = {\n      plan: '1m',\n      format: 'pouch',\n      // Every 15 days card: delivery cadence for the 15-day box (Sam 2026-10-27). 30 only once the plan id is set.\n      cad15: 15,\n      /* Single age selection \u2014 8\u201313 (1 serving/day) or 14+ (2/day, the\n         adult dose). Simplified back from the household picker on\n         2026-06-03 per Sam. */\n      age: window.__fizzyPdpInitialAge === '14+' ? '14+' : '8-13',\n      // Flavors are chosen explicitly; the product preview never fills the box.\n      qty: { bc: 0, sl: 0, wm: 0, ob: 0 }\n    };\n    /* Bundle price for the selected age + plan (from live variant metadata).\n       Box mode: the price matrix is empty (Classic Box variants are titled by\n       size, not by age/plan strings), so read the size variant's price. */\n    // Travel packs (Sam 2026-10-26): a format choice on the Monthly and 3-month\n    // cards. One Skio static box product per age x plan, each with one size variant\n    // and one selling plan. Pouch behavior is unchanged while state.format = 'pouch'.\n    function stickData() { return window.__fizzyPdpStick || {}; }\n    function isStickPlan(plan) {\n      var p = plan || state.plan;\n      return state.format === 'travel' && (p === '1m' || p === '3m' || p === '15d') && !!stickData().enabled;\n    }\n    function stickEntry(plan) {\n      var products = stickData().products || {};\n      return products[state.age + '|' + (plan || state.plan)] || null;\n    }\n    // Every 15 days (travel packs only): 15 packs for 8-13, 30 for 14+.\n    function stickSize(plan) { var p = plan || state.plan; return (state.age === '14+' ? 60 : 30) * (p === '3m' ? 3 : p === '15d' ? 0.5 : 1); }\n    // 15-day box, delivered every 30 days (Sam 2026-10-27): same product, variant and prices,\n    // a second Skio selling plan. Off until its plan id is set in the section settings.\n    function cad30Id() { var m = stickData().cadence30 || {}, id = String(m[state.age] || '').trim(); return /^[1-9]\\d*$/.test(id) ? id : null; }\n    function cad30Ready() {\n      var id = cad30Id(), v = id && stickVariant('15d');\n      return !!(v && (v.selling_plan_allocations || []).some(function (a) { return String(a.selling_plan_id) === id; }));\n    }\n    function cad30On(plan) { return (plan || state.plan) === '15d' && state.cad15 === 30 && cad30Ready(); }\n    function fifteenLabel() { return cad30On('15d') ? 'Every 30 days' : 'Every 15 days'; }\n    function stickDays(plan) { var p = plan || state.plan; return p === '3m' ? 90 : p === '15d' ? (cad30On(p) ? 30 : 15) : 30; }\n    function stickVariant(plan) {\n      var entry = stickEntry(plan), size = stickSize(plan);\n      if (!entry || !Array.isArray(entry.variants)) return null;\n      return entry.variants.find(function (v) { return String(v.option1).trim() === String(size); }) || null;\n    }\n    // Per-variant plan lookup: each travel-pack variant carries one allocation.\n    // Plan names repeat across products (\"Every 30 Days\"), so never match by name alone.\n    function stickAllocation(plan) {\n      var variant = stickVariant(plan), list = (variant && variant.selling_plan_allocations) || [];\n      var p = plan || state.plan, c30 = p === '15d' ? cad30Id() : null;\n      if (c30 && cad30On(p)) return list.find(function (a) { return String(a.selling_plan_id) === c30; }) || null;\n      if (c30) list = list.filter(function (a) { return String(a.selling_plan_id) !== c30; });\n      if (list.length === 1) return list[0];\n      var names = (stickEntry(plan) || {}).plans || {}, days = stickDays(plan);\n      return list.find(function (a) { return new RegExp('(^|\\\\D)' + days + '\\\\s+days?(?![a-z])', 'i').test(names[a.selling_plan_id] || ''); }) || null;\n    }\n    function stickPlanId(plan) { var a = stickAllocation(plan); return a && /^[1-9]\\d*$/.test(String(a.selling_plan_id)) ? a.selling_plan_id : null; }\n    function stickChildFor(f) {\n      var map = stickData().childMap || {};\n      var names = {bc:'berrycherry',sl:'strawberrylemonade',wm:'watermelon',ob:'orangecreamsicle'};\n      for (var name in map) {\n        if (name.toLowerCase().replace(/[^a-z0-9]/g, '') !== names[f]) continue;\n        var value = map[name], id = value && typeof value === 'object' ? value.id : value;\n        if (!/^[1-9]\\d*$/.test(String(id))) return null;\n        return {id:id,option:name};\n      }\n      return null;\n    }\n    function stickPrice(plan) {\n      var variant = stickVariant(plan), allocation = stickAllocation(plan);\n      if (!variant || !allocation || !stickPlanId(plan) || !['bc','sl','wm','ob'].every(stickChildFor)) return unavailablePrice();\n      // Save compares the first box with this travel pack's own renewal price (the variant price).\n      var p = priceFromCents(allocation.price, variant.price, variant.available);\n      var adj = allocation.price_adjustments || [];\n      var later = adj.find(function (a) { return Number(a.position) === 2; });\n      if (p.available) p.renewal = later && Number(later.price) > 0 ? Number(later.price) / 100 : Number(variant.price) / 100;\n      return p;\n    }\n    // Step = size / 10; the 15-day boxes (15 and 30 packs) use 3.\n    function quantityStep() { return isStickPlan() ? (state.plan === '15d' ? 3 : stickSize() / 10) : 1; }\n    function formatAvailable(format, plan) {\n      var previous = state.format;\n      state.format = format;\n      var ok = tierPrice(plan).available;\n      state.format = previous;\n      return ok;\n    }\n    // Default travel-pack mix: 10 equal steps spread across the four flavors.\n    function mixEvenly() {\n      resetFlavorCounts();\n      if (!isStickPlan() || !stickPrice().available) return;\n      // Extra steps go to the first flavors when the size doesn't split evenly.\n      var step = quantityStep(), groups = Math.floor(stickSize() / step);\n      while (groups-- > 0) {\n        var choices = ['bc','sl','wm','ob'].filter(canAddFlavor).sort(function (a, b) { return state.qty[a] - state.qty[b]; });\n        if (!choices.length) break;\n        state.qty[choices[0]] += step;\n      }\n    }\n    function stickStock(f) {\n      var stock = stickData().childStock, child = stickChildFor(f);\n      if (!child) return 0;\n      if (!stock) return Infinity;\n      for (var name in stock) {\n        if (name.toLowerCase().replace(/[^a-z0-9]/g, '') === child.option.toLowerCase().replace(/[^a-z0-9]/g, '')) {\n          var value = Number(stock[name]);\n          return Number.isFinite(value) ? Math.max(0, value) : 0;\n        }\n      }\n      return Infinity;\n    }\n    function exactSelection() {\n      var req = required();\n      return req > 0 && selectedCount() === req && ['bc','sl','wm','ob'].every(function (f) {\n        var q = state.qty[f];\n        return Number.isInteger(q) && q >= 0 && (!isStickPlan() || q % quantityStep() === 0) &&\n          (!q || (flavorAvail(f) && q <= flavorStock(f)));\n      });\n    }\n    function resetFlavorCounts() { ['bc','sl','wm','ob'].forEach(function (f) { state.qty[f] = 0; }); }\n    // Berry Cherry default (Sam 2026-10-26): pouch and travel packs open with the\n    // whole box on Berry Cherry. Shoppers can still change it with the steppers.\n    // If Berry Cherry can't fill the box (stock), travel packs spread the rest evenly.\n    var DEFAULT_FLAVOR = 'bc';\n    var pouchFlavorsTouched = false;\n    // True while a travel box holds the page's own exact-fit mix (default or Mix evenly), so the\n    // helper says it is ready to add instead of asking the shopper to remove packs (Sam 2026-10-27).\n    var stickMixReady = false, stickMixEven = false;\n    function applyDefaultFlavors() {\n      resetFlavorCounts();\n      pouchFlavorsTouched = false;\n      stickMixReady = true; stickMixEven = false;\n      if (!tierPrice(state.plan).available) return;\n      if (isStickPlan() && !stickPrice().available) return;\n      var step = quantityStep(), guard = 400;\n      while (guard-- > 0 && canAddFlavor(DEFAULT_FLAVOR)) state.qty[DEFAULT_FLAVOR] += step;\n      if (!isStickPlan()) return;\n      while (guard-- > 0 && selectedCount() < required()) {\n        var choices = ['bc','sl','wm','ob'].filter(canAddFlavor).sort(function (a, b) { return state.qty[a] - state.qty[b]; });\n        if (!choices.length) break;\n        state.qty[choices[0]] += step;\n      }\n    }\n    // Travel packs open on Every 15 days (Sam 2026-10-26) when that box resolves.\n    var TRAVEL_DEFAULT_PLAN = '15d';\n\n    function boxPlanIdFor(age, plan) {\n      var days = PLAN_MONTHS[plan] * 30;\n      if (!days) return null;\n      var map = boxDataFor(age).planMap;\n      for (var name in map) {\n        if (new RegExp('(^|\\\\D)' + days + '(?!\\\\d)').test(name)) return map[name];\n      }\n      return null;\n    }\n    function regularTierPrice(plan) {\n      if (isStickPlan(plan)) return stickPrice(plan);\n      if (!window.__fizzyPdpChildMap) return priceFor(state.age, plan);\n      var months = PLAN_MONTHS[plan];\n      var planId = boxPlanIdFor(state.age, plan);\n      if (!months || !planId) return unavailablePrice();\n      var size = months * (state.age === '14+' ? 2 : 1);\n      var list = boxDataFor(state.age).variants;\n      for (var i = 0; i < list.length; i++) {\n        var variant = list[i];\n        if (String(variant.option1).trim() !== String(size)) continue;\n        var cents = variant.price;\n        var allocations = variant.selling_plan_allocations || [];\n        var allocation = allocations.find(function (item) { return String(item.selling_plan_id) === String(planId); });\n        if (allocations.length && !allocation) return unavailablePrice();\n        if (allocation) cents = allocation.price;\n        // Intro pricing (Skio set price): strike the regular subscription price (variant price).\n        var p = priceFromCents(cents, allocation ? variant.price : variant.compare_at_price, variant.available);\n        var adj = allocation && allocation.price_adjustments;\n        if (p.available && adj && adj.length > 1 && Number(adj[1].price) > 0) p.renewal = Number(adj[1].price) / 100;\n        return p;\n      }\n      return unavailablePrice();\n    }\n    // Mirrors the automatic subscription discount; Shopify calculates checkout totals.\n    function octoberOfferActive() {\n      return false; // October 20%-every-box offer ended at the Oct 23 intro-pricing launch.\n    }\n    function tierPrice(plan) {\n      var p = regularTierPrice(plan);\n      if (!p.available || !octoberOfferActive()) return p;\n      var discounted = Math.round(p.price * 80) / 100;\n      if (isStickPlan(plan)) {\n        // Shopify's product discount truncates the discount to whole cents.\n        // Subtract that amount instead of rounding the final discounted price.\n        var cents = Math.round(p.price * 100);\n        discounted = (cents - Math.floor(cents * 20 / 100)) / 100;\n      }\n      return {price: discounted, was: p.price, save_amt: p.price - discounted, save_pct: 20, available: true};\n    }\n    function subscriptionRenewalText(plan) {\n      var regular = regularTierPrice(plan), offer = tierPrice(plan);\n      if (!regular.available || !offer.available) return 'Plan unavailable.';\n      var days = isStickPlan(plan) ? stickDays(plan) : (PLAN_MONTHS[plan] || 1) * 30;\n      return octoberOfferActive()\n        ? money(offer.price) + ' every ' + days + ' days.'\n        : regular.renewal && regular.renewal !== regular.price\n          ? money(regular.price) + ' first box, then ' + money(regular.renewal) + ' every ' + days + ' days.'\n          : money(regular.price) + ' every ' + days + ' days.';\n    }\n    function stickRenewalText() { return isStickPlan() ? subscriptionRenewalText(state.plan) : ''; }\n    function stickPlanLabel() { return (state.plan === '15d' ? fifteenLabel() : PLAN_LABELS[state.plan] || '') + ' \u00B7 ' + stickSize() + ' travel packs'; }\n    /* Cart line-item label for the chosen age. */\n    // Buy once (Sam 2026-10-26): 8\u201313 sells the one-time-only $69 pouch; 14+ unchanged.\n    var ONCE_813_PRICE = 69;\n    var ONCE_813_IDS = { bc: 53412895129911, sl: 53412895162679, wm: 53412895195447, ob: 53412895228215 };\n    // 14+ buy once unchanged from pre-Oct-26: 1 Pouch Unit child variant at $80; 14+ plan cards strike the subscription list price.\n    var ONCE_14_PRICE = 80;\n    function onceUnitFor(age) { return age === '14+' ? ONCE_14_PRICE : ONCE_813_PRICE; }\n    function ageLabel() { return state.age === '14+' ? 'Ages 14+' : 'Ages 8\u201313'; }\n    // Static Box mode (Skio): the child pouch product's variants, emitted by the\n    // section when box_child_product is set. Keys are the child's option strings;\n    // self-contained normalizer so 'Water Melon' and 'Watermelon' both resolve.\n    function boxChildFor(f) {\n      var cm = window.__fizzyPdpChildMap;\n      if (!cm) return null;\n      var names = { bc: 'berrycherry', sl: 'strawberrylemonade', wm: 'watermelon', ob: 'orangecreamsicle' };\n      var want = names[f];\n      for (var k in cm) {\n        if (String(k).toLowerCase().replace(/[^a-z0-9+]/g, '') === want) {\n          // Flat map (option string \u2192 variant id). Flat is required: nested JSON\n          // ends in '}}', which Shopify rejects as Liquid syntax in template\n          // settings. Object values still accepted for forward-compat.\n          var v = cm[k];\n          return (v && typeof v === 'object') ? v : { id: v, option: k };\n        }\n      }\n      return null;\n    }\n    // Resolve by age, independently of which product route rendered this page.\n    // Never substitute another age's variants or selling plans when data is absent.\n    function boxDataFor(age) {\n      var data = (window.__fizzyPdpBoxes || {})[age] || {};\n      return { variants: Array.isArray(data.variants) ? data.variants : [], planMap: data.planMap || {} };\n    }\n    // A flavor is in stock for the current age + plan if its bundle variant is\n    // available. Shopify computes that from the child SKU, so this reflects true\n    // stock. Fail open (treat as available) if the map is missing. Frontend only.\n    function flavorAvail(f, plan) {\n      if (isStickPlan(plan)) return !!stickChildFor(f) && stickStock(f) >= quantityStep();\n      // Box mode: the box parent has no flavor axis, so stock lives on the\n      // child pouch variant itself. The child product is unpublished, so the\n      // section bridges its availability through the box product's\n      // fizzy.child_stock metafield (__fizzyPdpChildStock, keyed by the same\n      // option strings as the child map). Absent metafield = fail open.\n      if (window.__fizzyPdpChildMap) {\n        var c = boxChildFor(f);\n        if (!c) return true;\n        var st = window.__fizzyPdpChildStock;\n        if (st) {\n          var norm = function (s) { return String(s).toLowerCase().replace(/[^a-z0-9+]/g, ''); };\n          for (var sk in st) {\n            if (norm(sk) === norm(c.option)) return Number(st[sk]) > 0;\n          }\n        }\n        return c.available !== false;\n      }\n      var m = window.__fizzyPdpAvail, byAge = m && m[state.age], byPlan = byAge && byAge[typeof plan === 'string' ? plan : state.plan];\n      if (!byPlan) return true;\n      return byPlan[f] !== false;\n    }\n    // Remaining child stock for a flavor (box mode). The bundle builder caps\n    // each flavor's quantity at this number \u2014 1 unit left means at most 1 in\n    // the box. Infinity when the stock bridge is absent (fail open) or in\n    // legacy mode (parent variants gate availability wholesale there).\n    function flavorStock(f, plan) {\n      if (isStickPlan(plan)) return Math.floor(stickStock(f) / quantityStep()) * quantityStep();\n      if (!window.__fizzyPdpChildMap || !window.__fizzyPdpChildStock) return Infinity;\n      var c = boxChildFor(f);\n      if (!c) return Infinity;\n      var norm = function (s) { return String(s).toLowerCase().replace(/[^a-z0-9+]/g, ''); };\n      for (var sk in window.__fizzyPdpChildStock) {\n        if (norm(sk) === norm(c.option)) {\n          var n = Number(window.__fizzyPdpChildStock[sk]);\n          return isNaN(n) ? Infinity : Math.max(0, n);\n        }\n      }\n      return Infinity;\n    }\n\n    var fields = hero.querySelectorAll('.flavor-field');\n    var eyebrowFlavor = document.getElementById('eyebrowFlavor');\n    var flavorNote = document.getElementById('flavorNote');\n    var heroSlide = document.getElementById('heroSlide');\n    var heroThumb = document.getElementById('heroThumb');\n    // Flavor switcher \u2014 4 colored dots + shared name label, anchored\n    // to the bottom-right of the visualizer (.pdp-flavor-overlay).\n    var previewPills = document.querySelectorAll('.pdp-flavor-overlay .pfo-dot');\n    var pfoName = document.getElementById('pfoName');\n    var current = 'bc';\n    // Ensure body carries the initial flavor class so the trust ticker\n    // (and any other body.flavor-* selectors) tint correctly on first paint.\n    document.body.classList.add('flavor-bc');\n    var animating = false;\n\n    // \u2500\u2500 flavor crossfade \u2500\u2500\n    // Helper: mirror the selected flavor class onto <body> so siblings of\n    // the hero (e.g. the trust ticker section below) can react to it.\n    function setBodyFlavor(f) {\n      var body = document.body;\n      body.classList.remove('flavor-bc', 'flavor-sl', 'flavor-wm', 'flavor-ob');\n      body.classList.add('flavor-' + f);\n    }\n\n    // \"Tastes like\" copy lives inside the .pdp-flavor-overlay pill at the\n    // top of the buy box (under the H1). The pill stacks the flavor name\n    // and the description on two lines. setTagline(f) is called from\n    // swapTo so the line tracks the active flavor without us having to\n    // wire a second source of truth. Source text comes from each .opt's\n    // data-desc attribute in the flavor picker.\n    var pfoTaste = document.getElementById('pfoTaste');\n    function setTagline(f) {\n      if (!pfoTaste) return;\n      var src = document.querySelector('.flavor-picker .opt[data-f=\"' + f + '\"]');\n      if (!src) return;\n      var desc = src.getAttribute('data-desc') || '';\n      if (pfoTaste.textContent === desc) return;\n      // Match the .pfo-name crossfade so the two lines feel like one\n      // unit when the flavor changes. The 280ms aligns to the CSS\n      // transition duration so the text swap lands exactly at opacity 0.\n      pfoTaste.classList.add('fading');\n      setTimeout(function () {\n        pfoTaste.textContent = desc;\n        pfoTaste.classList.remove('fading');\n      }, 280);\n    }\n\n    var settleTimer = 0;\n    function swapTo(f) {\n      /* No `animating` gate (Sam 2026-08-31: \"a bit of a delay when I try to\n         toggle through flavors\") \u2014 it silently dropped every tap inside the\n         previous swap's 950ms crossfade. Swaps are interruptible now; the\n         settle timer below is coalesced so only the last swap's tail runs. */\n      if (f === current) return;\n      // `current = f` runs at the TOP of the body now (was at the very\n      // end). Any downstream helper that reads `current` (syncStickyAtc,\n      // setTagline, etc.) needs the new flavor \u2014 having the assignment\n      // at the bottom meant those reads were always one tick behind,\n      // which left the sticky bar's active dot stuck on the previous\n      // flavor on every swap.\n      current = f;\n      hero.classList.add('transitioning');\n      // Body flavor class flips at the START so the ticker bg transition\n      // runs in parallel with the hero crossfade rather than after it.\n      setBodyFlavor(f);\n      // The optimized surfaces transition their own colors immediately; they\n      // must not wait for the legacy background crossfade to finish.\n      if (hero.classList.contains('pdp-purchase-optimized')) {\n        hero.classList.remove('flavor-bc', 'flavor-sl', 'flavor-wm', 'flavor-ob');\n        hero.classList.add('flavor-' + f);\n      }\n      // Sync the \"Tastes like\" line under the flavor grid to the new flavor.\n      setTagline(f);\n      // Layered crossfade on .flavor-field \u2014 the smooth 900ms transition.\n      // (Direct .pdp-hero.flavor-* class is updated at end of transition so\n      // there's no instant background \"jump\" before the fade completes.)\n      fields.forEach(function (el) { el.classList.toggle('active', el.dataset.f === f); });\n      if (eyebrowFlavor) {\n        eyebrowFlavor.classList.add('fading');\n        setTimeout(function () {\n          eyebrowFlavor.textContent = FLAV[f].name;\n          eyebrowFlavor.classList.remove('fading');\n        }, 300);\n      }\n      if (pfoName) {\n        // Swap at 280ms to match the .pfo-name CSS transition \u2014 the text\n        // changes exactly when opacity reaches 0, then fades + lifts back\n        // into place. Same timing used for .pfo-taste below.\n        pfoName.classList.add('fading');\n        setTimeout(function () {\n          pfoName.textContent = FLAV[f].name;\n          pfoName.classList.remove('fading');\n        }, 280);\n      }\n      if (flavorNote) {\n        flavorNote.classList.add('fading');\n        setTimeout(function () {\n          flavorNote.textContent = FLAV[f].taste;\n          flavorNote.classList.remove('fading');\n        }, 300);\n      }\n      if (heroSlide) heroSlide.dataset.f = f;\n      // (thumb image swap moved into applyFlavorVideo \u2014 no more inline\n      // gradient bg here since the thumb now always shows a pouch PNG.)\n      // sync the flavor-preview pills (under the title) to the new flavor\n      if (previewPills && previewPills.length) {\n        previewPills.forEach(function (p) { p.classList.toggle('active', p.dataset.f === f); });\n      }\n      applyFlavorVideo(f);\n      applyFlavorDrinkImage(f);\n      applyFlavorLifestyle2Image(f);\n      applyFlavorLifestyleImage(f);\n      applyFlavorClinicalImage(f);\n      applyFlavorIncludedImage(f);\n      applyFlavorSfpImage(f);\n      applyFlavorGround(f);\n      // Update the sticky-bar pouch thumb to the new active flavor.\n      // (Plan label + ATC text don't change on flavor swap, only the\n      // thumb \u2014 but syncStickyAtc handles all three idempotently.)\n      if (typeof syncStickyAtc === 'function') syncStickyAtc();\n      if (settleTimer) clearTimeout(settleTimer);\n      settleTimer = setTimeout(function () {\n        // After the crossfade completes, sync the direct .pdp-hero flavor\n        // class so the underlying background matches for the next interaction.\n        hero.classList.remove('flavor-bc', 'flavor-sl', 'flavor-wm', 'flavor-ob');\n        hero.classList.add('flavor-' + f);\n        hero.classList.remove('transitioning');\n        animating = false;\n      }, 950);\n      // (current = f was hoisted to the top of this function \u2014 see comment there.)\n    }\n\n    // \u2500\u2500 hero video state \u2500\u2500\n    var heroVideo = document.getElementById('heroVideo');\n    var heroVideoToggle = document.getElementById('heroVideoToggle');\n    var heroSlide = document.getElementById('heroSlide');\n    var userPausedHero = true;\n\n    // Product-image poster: the flavor's pouch shows under the hero video while\n    // that video loads / swaps, so sifting through flavors never shows a blank\n    // frame (Sam 2026-06-16). The cover-fit video fades in over it on .video-ready.\n    function setHeroPoster(f) {\n      var poster = document.getElementById('heroPoster');\n      if (!poster) return;\n      var pouch = document.querySelector('.flavor-picker .opt[data-f=\"' + f + '\"] .opt-pouch');\n      // Gallery posters need the original resolution; picker/thumb images stay small.\n      var heroImages = isStickPlan() && stickData().heroImages;\n      var source = (heroImages && heroImages[f]) || (pouch && pouch.src);\n      if (source && poster.getAttribute('src') !== source) poster.src = source;\n      if (FLAV[f]) poster.alt = 'FizzyFocus ' + FLAV[f].name + (isStickPlan() ? ' travel pack' : ' pouch');\n    }\n    function setHeroThumb(f) {\n      var thumbImg = document.getElementById('heroThumbImg');\n      var pouch = document.querySelector('.flavor-picker .opt[data-f=\"' + f + '\"] .opt-pouch');\n      if (thumbImg && pouch && thumbImg.src !== pouch.src) thumbImg.src = pouch.src;\n    }\n    function attachHeroReady(videoEl) {\n      if (!videoEl || !heroSlide) return;\n      // Reveal on every playback, including resume after showing the pouch.\n      var reveal = function () {\n        if (videoEl !== heroVideo || videoEl.paused) return;\n        heroSlide.classList.add('video-ready');\n      };\n      videoEl.addEventListener('playing', reveal);\n      if (!videoEl.paused && videoEl.readyState >= 2) reveal();\n    }\n    if (heroVideo) attachHeroReady(heroVideo);\n\n    function syncHeroToggleUI() {\n      if (!heroVideoToggle || !heroVideo) return;\n      var paused = heroVideo.paused;\n      if (paused && heroSlide) heroSlide.classList.remove('video-ready');\n      heroVideoToggle.classList.toggle('paused', paused);\n      heroVideoToggle.setAttribute('aria-label', paused ? 'Play video' : 'Pause video');\n    }\n    if (heroVideoToggle && heroVideo) {\n      heroVideoToggle.addEventListener('click', function (e) {\n        e.stopPropagation();\n        if (heroVideo.paused) {\n          userPausedHero = false;\n          heroVideo.play().catch(function () {});\n        } else {\n          userPausedHero = true;\n          heroVideo.pause();\n        }\n        syncHeroToggleUI();\n      });\n      heroVideo.addEventListener('play', syncHeroToggleUI);\n      heroVideo.addEventListener('pause', syncHeroToggleUI);\n    }\n\n    // \u2500\u2500 per-flavor video swap (with fade-out \u2192 swap \u2192 fade-in) \u2500\u2500\n    // Removing .has-video fades the current video to opacity 0 over 600ms.\n    // We swap src mid-fade and let .has-video re-add to fade in the new one.\n    // Swap the carousel slide 1 \"drink benefits\" image AND its matching\n    // thumbnail to the version for the currently-previewed flavor.\n    // Decoded async + opacity-faded so swaps are clean even on slower\n    // connections.\n    var drinkBenefitsImg = document.getElementById('drinkBenefitsImg');\n    var drinkBenefitsThumbImg = document.getElementById('drinkBenefitsThumbImg');\n    function applyFlavorDrinkImage(f) {\n      if (!DRINK_BENEFITS_IMG[f]) return;\n      var nextSrc = DRINK_BENEFITS_IMG[f];\n      // Thumb uses the same source \u2014 Shopify CDN width param could be\n      // smaller for the thumbnail but the browser caches the larger one\n      // anyway, so use the same URL.\n      if (drinkBenefitsThumbImg) drinkBenefitsThumbImg.src = nextSrc;\n      if (!drinkBenefitsImg) return;\n      if (drinkBenefitsImg.src === nextSrc) return;\n      var pre = new Image();\n      pre.onload = function () {\n        drinkBenefitsImg.style.opacity = '0';\n        requestAnimationFrame(function () {\n          drinkBenefitsImg.src = nextSrc;\n          requestAnimationFrame(function () {\n            drinkBenefitsImg.style.opacity = '';\n          });\n        });\n      };\n      pre.src = nextSrc;\n    }\n\n    // Slide \u2014 flavor-aware lifestyle image. Same swap strategy as\n    // applyFlavorDrinkImage above: preload the next src, fade the\n    // current <img> to 0, swap src, fade back. Thumb at\n    // #lifestyleThumbImg mirrors the main slide's source so the row\n    // beneath the carousel updates in lockstep.\n    var lifestyleImg = document.getElementById('lifestyleImg');\n    var lifestyleThumbImg = document.getElementById('lifestyleThumbImg');\n    FLAVOR_LIFESTYLE_IMG = groundMap(lifestyleImg) || FLAVOR_LIFESTYLE_IMG;\n    function applyFlavorLifestyleImage(f) {\n      if (!FLAVOR_LIFESTYLE_IMG[f]) return;\n      var nextSrc = FLAVOR_LIFESTYLE_IMG[f];\n      if (lifestyleThumbImg) lifestyleThumbImg.src = nextSrc;\n      if (!lifestyleImg) return;\n      if (lifestyleImg.src === nextSrc) return;\n      var pre = new Image();\n      pre.onload = function () {\n        if (current !== f) return; // a later preview won; don't show this late image\n        lifestyleImg.style.opacity = '0';\n        requestAnimationFrame(function () {\n          lifestyleImg.src = nextSrc;\n          requestAnimationFrame(function () {\n            lifestyleImg.style.opacity = '';\n          });\n        });\n      };\n      pre.src = nextSrc;\n    }\n\n    // Slide \u2014 second flavor-aware lifestyle image. Identical swap\n    // pattern to applyFlavorLifestyleImage; separate handles so the two\n    // lifestyle slides update independently on flavor change.\n    var lifestyleImg2 = document.getElementById('lifestyleImg2');\n    var lifestyleThumbImg2 = document.getElementById('lifestyleThumbImg2');\n    function applyFlavorLifestyle2Image(f) {\n      if (!FLAVOR_LIFESTYLE2_IMG[f]) return;\n      var nextSrc = FLAVOR_LIFESTYLE2_IMG[f];\n      if (lifestyleThumbImg2) lifestyleThumbImg2.src = nextSrc;\n      if (!lifestyleImg2) return;\n      if (lifestyleImg2.src === nextSrc) return;\n      var pre = new Image();\n      pre.onload = function () {\n        if (current !== f) return; // a later preview won; don't show this late image\n        lifestyleImg2.style.opacity = '0';\n        requestAnimationFrame(function () {\n          lifestyleImg2.src = nextSrc;\n          requestAnimationFrame(function () {\n            lifestyleImg2.style.opacity = '';\n          });\n        });\n      };\n      pre.src = nextSrc;\n    }\n\n    // Slide 5 \u2014 flavor-aware clinical-benefits backdrop. Same swap\n    // strategy as applyFlavorDrinkImage above: preload the next src,\n    // fade the current <img> to 0, swap src, fade back. Background\n    // image is the only thing that changes between flavors \u2014 the\n    // title and frosted cards are static HTML overlays.\n    var clinicalBgImg = document.getElementById('clinicalBgImg');\n    var clinicalThumbImg = document.getElementById('clinicalThumbImg');\n    function applyFlavorClinicalImage(f) {\n      if (!CLINICAL_BG_IMG[f]) return;\n      var nextSrc = CLINICAL_BG_IMG[f];\n      if (clinicalThumbImg) clinicalThumbImg.src = nextSrc;\n      if (!clinicalBgImg) return;\n      if (clinicalBgImg.src === nextSrc) return;\n      var pre = new Image();\n      pre.onload = function () {\n        clinicalBgImg.style.opacity = '0';\n        requestAnimationFrame(function () {\n          clinicalBgImg.src = nextSrc;\n          requestAnimationFrame(function () {\n            clinicalBgImg.style.opacity = '';\n          });\n        });\n      };\n      pre.src = nextSrc;\n    }\n\n    // Slide 7 \u2014 flavor-aware \"what's included\" image. Same preload-\n    // then-fade-swap strategy as slides 1 + 4 above. Background of\n    // the slide itself is paper-cream (hardcoded inline in the\n    // section markup); only the product shot swaps per flavor.\n    var includedImg = document.getElementById('includedImg');\n    var includedThumbImg = document.getElementById('includedThumbImg');\n    INCLUDED_IMG = groundMap(includedImg) || INCLUDED_IMG;\n    function applyFlavorIncludedImage(f) {\n      if (!INCLUDED_IMG[f]) return;\n      var nextSrc = INCLUDED_IMG[f];\n      if (includedThumbImg) includedThumbImg.src = nextSrc;\n      if (!includedImg) return;\n      if (includedImg.src === nextSrc) return;\n      var pre = new Image();\n      pre.onload = function () {\n        if (current !== f) return; // a later preview won; don't show this late image\n        includedImg.style.opacity = '0';\n        requestAnimationFrame(function () {\n          includedImg.src = nextSrc;\n          requestAnimationFrame(function () {\n            includedImg.style.opacity = '';\n          });\n        });\n      };\n      pre.src = nextSrc;\n    }\n\n    // Slide 8 \u2014 flavor-aware Supplement Facts image. Same preload-\n    // then-fade-swap pattern as the included slide above.\n    var sfpImg = document.getElementById('sfpImg');\n    var sfpThumbImg = document.getElementById('sfpThumbImg');\n    function applyFlavorSfpImage(f) {\n      if (!SFP_IMG[f]) return;\n      var nextSrc = SFP_IMG[f];\n      if (sfpThumbImg) sfpThumbImg.src = nextSrc;\n      if (!sfpImg) return;\n      if (sfpImg.src === nextSrc) return;\n      var pre = new Image();\n      pre.onload = function () {\n        if (current !== f) return; // a later preview won; don't show this late image\n        sfpImg.style.opacity = '0';\n        requestAnimationFrame(function () {\n          sfpImg.src = nextSrc;\n          requestAnimationFrame(function () {\n            sfpImg.style.opacity = '';\n          });\n        });\n      };\n      pre.src = nextSrc;\n    }\n\n    // Stills with no flavor artwork of their own (benefits, stimulant\n    // comparison, nutrient forms) swap only their ground. Slides preload the\n    // next file first so the swap never shows a blank frame; thumbnails swap\n    // straight away. A late preload for a flavor no longer previewed is ignored.\n    var groundImgs = Array.prototype.slice.call(document.querySelectorAll('img[data-flavor-ground]'));\n    function applyFlavorGround(f) {\n      groundImgs.forEach(function (img) {\n        var map = groundMap(img);\n        var nextSrc = map && map[f];\n        if (!nextSrc || img.src === nextSrc) return;\n        if (img.closest('.pdp-thumbs')) { img.src = nextSrc; return; }\n        var pre = new Image();\n        pre.onload = function () { if (current === f) img.src = nextSrc; };\n        pre.src = nextSrc;\n      });\n    }\n\n    function applyFlavorVideo(f) {\n      if (!heroVideo || !heroSlide) return;\n      var stageEl = document.getElementById('pdpStage');\n      var src = FLAVOR_VIDEO[f];\n      setHeroPoster(f);\n\n      if (src) {\n        // Preserve the shopper\u2019s choice when the same flavor is already loaded.\n        if (heroVideo.dataset.src === src && heroSlide.classList.contains('has-video')) {\n          if (!userPausedHero && heroSlide.classList.contains('active')) {\n            heroVideo.play().catch(function () {});\n          } else { heroVideo.pause(); }\n          syncHeroToggleUI();\n          return;\n        }\n\n        // Replace the flavor video while preserving the shopper's playback\n        // choice. The matching pouch stays visible until the new video plays.\n        var oldVideo = heroVideo;\n        oldVideo.pause();\n        var newVideo = document.createElement('video');\n        newVideo.id = 'heroVideo';\n        newVideo.src = src;\n        newVideo.dataset.src = src;\n        newVideo.muted = true;\n        newVideo.loop = true;\n        newVideo.playsInline = true;\n        newVideo.preload = 'none';\n        newVideo.autoplay = false;\n        newVideo.addEventListener('play', syncHeroToggleUI);\n        newVideo.addEventListener('pause', syncHeroToggleUI);\n        oldVideo.parentNode.replaceChild(newVideo, oldVideo);\n        heroVideo = newVideo;\n        // Reveal only when this flavor starts playing, not while it buffers.\n        if (heroSlide) heroSlide.classList.remove('video-ready');\n        attachHeroReady(newVideo);\n        if (!userPausedHero && heroSlide.classList.contains('active')) {\n          heroVideo.play().catch(function () { syncHeroToggleUI(); });\n        }\n        if (!heroSlide.classList.contains('has-video')) {\n          heroSlide.classList.add('has-video');\n        }\n        if (stageEl && heroSlide.classList.contains('active')) {\n          stageEl.classList.add('show-video-toggle');\n        }\n        syncHeroToggleUI();\n      } else {\n        // No video for this flavor \u2014 pause and revert to fallback image\n        heroSlide.classList.remove('has-video');\n        if (stageEl) stageEl.classList.remove('show-video-toggle');\n        try { heroVideo.pause(); } catch (_) {}\n      }\n      // Thumbnail is now a static pouch <img> regardless of whether\n      // this flavor has a hero video \u2014 we no longer mirror the video\n      // into the thumb (which doubled the decoder workload). Pull the\n      // pouch URL straight from the matching flavor-picker tile so\n      // asset paths aren't duplicated in JS.\n      setHeroThumb(f);\n    }\n\n    // \u2500\u2500 gallery carousel (free scroll + thumb sync) \u2500\u2500\n    var stage = document.getElementById('pdpStage');\n    var track = document.getElementById('pdpTrack');\n    if (stage && track) {\n      var slides = track.querySelectorAll('.slide');\n      var thumbsEl = document.getElementById('pdpThumbs');\n      var thumbs = thumbsEl ? thumbsEl.querySelectorAll('.t') : [];\n      var counter = document.getElementById('pdpCounter');\n      var prevBtn = stage.querySelector('.arrow.prev');\n      var nextBtn = stage.querySelector('.arrow.next');\n      var slideIdx = 0;\n\n      function setActive(i) {\n        var total = slides.length;\n        slideIdx = Math.max(0, Math.min(total - 1, i));\n        thumbs.forEach(function (t, ix) {\n          t.classList.toggle('active', ix === slideIdx);\n          t.setAttribute('aria-pressed', ix === slideIdx ? 'true' : 'false');\n        });\n        slides.forEach(function (s, ix) { s.classList.toggle('active', ix === slideIdx); });\n        if (counter) counter.textContent = (slideIdx + 1) + ' / ' + total;\n\n        // play/pause hero video based on whether the product-video slide is active\n        if (heroVideo && heroSlide && heroSlide.classList.contains('has-video')) {\n          if (slides[slideIdx] === heroSlide) {\n            if (!userPausedHero) heroVideo.play().catch(function () {});\n          } else {\n            heroVideo.pause();\n          }\n        }\n        // show pause/play toggle only on hero slide when a video is loaded\n        stage.classList.toggle(\n          'show-video-toggle',\n          slides[slideIdx] === heroSlide && heroSlide && heroSlide.classList.contains('has-video')\n        );\n        // flavor preview pills are tied to the hero/product showcase slot \u2014\n        // hidden when the user has swiped to any marketing-still slide.\n        stage.classList.toggle('on-hero-slide', slides[slideIdx] === heroSlide);\n        // (Marketing-slide BC indigo lock removed \u2014 the section bg now\n        // stays in the active flavor color across all carousel slides.)\n        syncHeroToggleUI();\n\n        var activeThumb = thumbs[slideIdx];\n        var pointerDriven = window.matchMedia('(hover: hover) and (pointer: fine)').matches;\n        var keyboardInThumbs = thumbsEl && thumbsEl.contains(document.activeElement) && document.activeElement.matches(':focus-visible');\n        if (activeThumb && thumbsEl && (!pointerDriven || thumbsEl.matches(':hover') || keyboardInThumbs)) {\n          var tr = activeThumb.getBoundingClientRect();\n          var cr = thumbsEl.getBoundingClientRect();\n          /* Horizontal mode (default) \u2014 keep the active thumb in\n             view by adjusting scrollLeft. Vertical mode (\u22651500px)\n             does the same on scrollTop. Sam 2026-06-01: as the user\n             swipes the carousel, the strip auto-scrolls so the\n             active slide's indicator is always visible. */\n          var isVertical = getComputedStyle(thumbsEl).flexDirection === 'column';\n          if (isVertical) {\n            if (tr.top < cr.top) thumbsEl.scrollTop += tr.top - cr.top - 8;\n            else if (tr.bottom > cr.bottom) thumbsEl.scrollTop += tr.bottom - cr.bottom + 8;\n          } else {\n            if (tr.left < cr.left) thumbsEl.scrollLeft += tr.left - cr.left - 8;\n            else if (tr.right > cr.right) thumbsEl.scrollLeft += tr.right - cr.right + 8;\n          }\n        }\n      }\n\n      // Arrows, arrow keys and thumbnails set the slide at once, then scroll the\n      // track there. While that scroll is in flight the scroll handler must not\n      // re-derive the slide from the passing position, or .on-hero-slide (and\n      // the offer band keyed on it), the counter and the hero video flicker back\n      // and forth (2026-10-01). The guard clears when the track arrives, on\n      // scrollend, or after a fallback timeout that also re-syncs.\n      var navTarget = null;\n      var navTimer = null;\n      var reduceNav = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)');\n      function syncToTrack() {\n        var w = track.clientWidth;\n        if (w === 0) return;\n        var i = Math.round(track.scrollLeft / w);\n        if (i !== slideIdx) setActive(i);\n      }\n      function endNav() {\n        if (navTarget === null) return;\n        navTarget = null;\n        clearTimeout(navTimer);\n        // Re-sync only once the track rests on a slide; if it is still moving,\n        // the scroll handler takes over from here.\n        var w = track.clientWidth;\n        if (w > 0 && Math.abs(track.scrollLeft - Math.round(track.scrollLeft / w) * w) < 2) syncToTrack();\n      }\n      function goSlide(n) {\n        var total = slides.length;\n        var target = ((n % total) + total) % total;\n        navTarget = target;\n        clearTimeout(navTimer);\n        navTimer = setTimeout(endNav, 1500);\n        track.scrollTo({ left: target * track.clientWidth, behavior: reduceNav && reduceNav.matches ? 'auto' : 'smooth' });\n        setActive(target);\n      }\n\n      var scrollRaf = null;\n      track.addEventListener('scroll', function () {\n        if (scrollRaf) return;\n        scrollRaf = requestAnimationFrame(function () {\n          scrollRaf = null;\n          if (navTarget !== null) {\n            var w = track.clientWidth;\n            if (w > 0 && Math.round(track.scrollLeft / w) === navTarget && Math.abs(track.scrollLeft - navTarget * w) < 2) endNav();\n            return;\n          }\n          syncToTrack();\n        });\n      }, { passive: true });\n      track.addEventListener('scrollend', endNav);\n      // A drag takes over from any programmatic slide change.\n      track.addEventListener('pointerdown', function () { navTarget = null; clearTimeout(navTimer); });\n\n      if (thumbsEl) {\n        // Trackpad gestures may remain latched to their original scroll target\n        // after the pointer leaves. Never consume that wheel input in this rail.\n        thumbsEl.addEventListener('wheel', function (e) {\n          var rect = thumbsEl.getBoundingClientRect();\n          var inside = e.clientX >= rect.left && e.clientX < rect.right && e.clientY >= rect.top && e.clientY < rect.bottom;\n          if (!inside && e.cancelable) e.preventDefault();\n        }, { passive: false });\n        thumbsEl.addEventListener('click', function (e) {\n          var t = e.target.closest('.t');\n          if (!t || !thumbsEl.contains(t)) return;\n          var i = parseInt(t.dataset.i, 10);\n          if (Number.isFinite(i)) goSlide(i);\n        });\n      }\n\n      /* Vertical thumb strip (\u22651500px) \u2014 keep max-height locked to\n         the stage's actual rendered height so the strip never\n         extends past the carousel. Pure CSS can't read another\n         element's computed size, so a ResizeObserver handles it.\n         Sam 2026-06-01. */\n      /* Thumbnails are always a horizontal row below the gallery now\n         (vertical strip removed 2026-06-12) \u2014 clear any stale inline\n         max-height the old vertical-strip sync may have left behind. */\n      if (thumbsEl) thumbsEl.style.maxHeight = '';\n      if (prevBtn) prevBtn.addEventListener('click', function () { goSlide(slideIdx - 1); });\n      if (nextBtn) nextBtn.addEventListener('click', function () { goSlide(slideIdx + 1); });\n\n      stage.tabIndex = 0;\n      stage.addEventListener('keydown', function (e) {\n        if (e.key === 'ArrowLeft') { goSlide(slideIdx - 1); e.preventDefault(); }\n        if (e.key === 'ArrowRight') { goSlide(slideIdx + 1); e.preventDefault(); }\n      });\n\n      // drag-to-scroll on the main stage\n      var tD = null;\n      track.addEventListener('pointerdown', function (e) {\n        if (e.target.closest('.arrow')) return;\n        tD = { x: e.clientX, left: track.scrollLeft, moved: 0 };\n        track.setPointerCapture(e.pointerId);\n        track.classList.add('dragging');\n      });\n      track.addEventListener('pointermove', function (e) {\n        if (!tD) return;\n        var dx = e.clientX - tD.x;\n        tD.moved = Math.max(tD.moved, Math.abs(dx));\n        track.scrollLeft = tD.left - dx;\n      });\n      function endTD() {\n        if (!tD) return;\n        track.classList.remove('dragging');\n        var w = track.clientWidth;\n        if (w > 0) {\n          var i = Math.round(track.scrollLeft / w);\n          track.scrollTo({ left: i * w, behavior: 'smooth' });\n        }\n        tD = null;\n      }\n      track.addEventListener('pointerup', endTD);\n      track.addEventListener('pointercancel', endTD);\n\n      setActive(0);\n    }\n\n    // Initial flavor video \u2014 ensures JS state matches the DOM-rendered slide 0\n    applyFlavorVideo(current);\n\n    // \u2500\u2500 BUNDLE BUILDER \u2500\u2500\n    function required() {\n      if (isStickPlan()) return stickSize();\n      var months = PLAN_MONTHS[state.plan] || 1;\n      /* Pouches = months \u00D7 servings/day (8\u201313 = 1, 14+ = 2). */\n      var ageMult = state.age === '14+' ? 2 : 1;\n      return months * ageMult;\n    }\n    function selectedCount() {\n      return state.qty.bc + state.qty.sl + state.qty.wm + state.qty.ob;\n    }\n\n    // Quantity edits stay within the plan the shopper explicitly selected.\n    function canAddFlavor(f) {\n      var step = quantityStep();\n      return selectedCount() + step <= required() && tierPrice(state.plan).available &&\n        flavorAvail(f) && state.qty[f] + step <= flavorStock(f);\n    }\n    function quantityChanged() {\n      renderBundle();\n    }\n\n    // Re-render the tier card prices (.was, .price, .save) and the\n    // \"Buy once\" link price when state.age changes. Each .tier\n    // element has a data-plan attribute so we can look up the matching\n    // from live variant metadata. Called on initial render and on every age\n    // toggle (see age handler further down).\n    var optimizedPurchase = hero.classList.contains('pdp-purchase-optimized');\n    var purchaseBusy = false;\n\n    // Page-level format picker (Pouch / Travel packs) below the age picker.\n    function travelAvailable() {\n      return ['1m', '3m', '15d'].some(function (plan) { return formatAvailable('travel', plan); });\n    }\n    function renderFormatToggles() {\n      var travelOk = travelAvailable();\n      hero.querySelectorAll('.format-picker .opt[data-format]').forEach(function (opt) {\n        var on = opt.dataset.format === state.format;\n        opt.classList.toggle('selected', on);\n        opt.setAttribute('aria-checked', on ? 'true' : 'false');\n        opt.tabIndex = on ? 0 : -1;\n        opt.setAttribute('aria-disabled', opt.dataset.format === 'travel' && !travelOk ? 'true' : 'false');\n      });\n    }\n\n    function renderTierPrices() {\n      renderFormatToggles();\n      var offerActive = octoberOfferActive();\n      hero.classList.toggle('oct-active', offerActive);\n      /* Price + struck compare-at per tier, for the selected age. */\n      var tiers = document.querySelectorAll('.tier[data-plan]');\n      tiers.forEach(function (tier) {\n        var plan = tier.dataset.plan;\n        if (!plan) return;\n        var p = tierPrice(plan);\n        if (plan === '15d') {\n          // Travel-pack-only card: shown only while Travel packs is chosen and the box resolves.\n          var showFifteen = isStickPlan('15d') && p.available;\n          tier.hidden = !showFifteen;\n          // Travel order (Sam 2026-10-26): Every 15 days first, then Monthly and 3-month.\n          // Moved only while shown, so the pouch DOM order (and its spacing) is untouched.\n          var monthlyTier = tier.parentNode && tier.parentNode.querySelector('.tier[data-plan=\"1m\"]');\n          var quarterTier = tier.parentNode && tier.parentNode.querySelector('.tier[data-plan=\"3m\"]');\n          if (showFifteen && monthlyTier && tier.nextElementSibling !== monthlyTier) monthlyTier.parentNode.insertBefore(tier, monthlyTier);\n          else if (!showFifteen && quarterTier && quarterTier.nextElementSibling !== tier) quarterTier.parentNode.insertBefore(tier, quarterTier.nextSibling);\n          if (!showFifteen) { tier.setAttribute('aria-disabled', 'true'); return; }\n          // 15 / 30 days toggle: shown only when the 30-day plan id is set and on this age's box.\n          var cadWrap = tier.querySelector('[data-cad15]'), cadOk = cad30Ready();\n          if (cadWrap) {\n            cadWrap.hidden = !cadOk;\n            cadWrap.querySelectorAll('[data-cad]').forEach(function (b) {\n              var on = Number(b.dataset.cad) === (cad30On('15d') ? 30 : 15);\n              b.setAttribute('aria-pressed', on ? 'true' : 'false');\n              b.classList.toggle('is-on', on);\n            });\n          }\n          var fifteenName = tier.querySelector('.tname-label');\n          if (fifteenName) fifteenName.textContent = cadOk ? '15-day supply' : 'Every 15 days';\n        }\n        var offerBadge = tier.querySelector('.oct-price-badge');\n        if (offerBadge) offerBadge.hidden = !(p.available && p.was > p.price); // First-box price label on intro-priced pouch cards\n        var monthCount = PLAN_MONTHS[plan] || 1;\n        var pouchCount = monthCount * (state.age === '14+' ? 2 : 1);\n        var servingCount = isStickPlan(plan) ? stickSize(plan) : pouchCount * 30;\n        var serving = tier.querySelector('[data-serving-price]');\n        if (serving) {\n          var showServing = p.available && p.price > 0 && servingCount > 0;\n          serving.hidden = !showServing;\n          serving.style.display = showServing ? '' : 'none';\n          serving.textContent = showServing ? money(p.price / servingCount, true) + '/serving' : '';\n        }\n        var pouchesEl = tier.querySelector('[data-plan-pouches]');\n        if (pouchesEl) pouchesEl.textContent = isStickPlan(plan) ? stickSize(plan) + ' travel packs' : pouchCount + (pouchCount === 1 ? ' pouch' : ' pouches');\n        var wasEl = tier.querySelector('.was');\n        var priceEl = tier.querySelector('.price');\n        var saveEl = tier.querySelector('.save');\n        var chipEl = tier.querySelector('[data-save-chip]');\n        if (priceEl) priceEl.textContent = money(p.price);\n        tier.setAttribute('aria-disabled', p.available ? 'false' : 'true');\n        // Compare pouches with the same quantity bought once. This is display-only:\n        // p.was remains the regular subscription price for offer and renewal logic.\n        var onceUnit = onceUnitFor(state.age);\n        // Oct 31 (Sam: \"shouldn't we show the one time price for both\", \"it's inconsistent\"): every card strikes what the\n        // same amount costs bought once. Pouches: the age's buy-once pouch ($69 for 8-13, $80 for 14+) times the pouches.\n        // Travel packs: the pack size's own price, which is its one-time price (p.was; renewals are charged the same).\n        // Was: 14+ against the subscription list price (\"Regular price\"), travel packs against \"Renewal price\".\n        var COMPARE_TO_SUB_LIST = isStickPlan(plan);\n        var onceValue = COMPARE_TO_SUB_LIST ? p.was : Math.round(onceUnit * pouchCount * 100) / 100;\n        var showOnceValue = p.available && (COMPARE_TO_SUB_LIST || (Number.isFinite(onceUnit) && onceUnit > 0)) &&\n          Number.isFinite(onceValue) && onceValue > p.price;\n        var priceRail = tier.querySelector('.tier-price');\n        if (priceRail) priceRail.classList.toggle('has-once-value', !!(wasEl && showOnceValue));\n        if (wasEl) {\n          wasEl.classList.add('pdp-once-value');\n          wasEl.textContent = '';\n          if (showOnceValue) {\n            var onceLabel = document.createElement('span');\n            onceLabel.className = 'visually-hidden';\n            onceLabel.textContent = 'One-time price ';\n            var onceAmount = document.createElement('span');\n            onceAmount.className = 'pdp-once-value-amount';\n            onceAmount.textContent = money(onceValue);\n            wasEl.appendChild(onceLabel);\n            wasEl.appendChild(onceAmount);\n          }\n          wasEl.hidden = !showOnceValue;\n          wasEl.style.display = showOnceValue ? '' : 'none';\n        }\n        if (saveEl) saveEl.textContent = 'Save ' + money(p.save_amt) + ' \u00B7 ' + p.save_pct + '%';\n        if (chipEl) { chipEl.textContent = 'SAVE ' + p.save_pct + '%'; chipEl.style.display = p.save_pct ? '' : 'none'; }\n      });\n      document.querySelectorAll('[data-once-count]').forEach(function (el) {\n        el.textContent = '1 pouch';\n      });\n      document.querySelectorAll('[data-once-serving]').forEach(function (el) {\n        var once = onceUnitFor(state.age);\n        el.textContent = once > 0 ? ' \u00B7 ' + money(once / 30, true) + '/serving' : '';\n      });\n      var boPrice = document.querySelector('.buy-once-link .bo-price');\n      if (boPrice) {\n        if (window.__fizzyPdpChildMap) {\n          // Box mode buy-once sells the child pouch DIRECTLY (no box, no\n          // _pv). The one-pouch shortcut always shows the unit price.\n          // Unit price comes from the\n          // section's box_once_price setting via __fizzyPdpBoxOncePrice.\n          var boUnit = onceUnitFor(state.age);\n          boPrice.textContent = boUnit > 0 ? money(boUnit) : 'price at checkout';\n        } else {\n          var once = priceFor('8-13', 'once');\n          boPrice.textContent = money(once.price);\n        }\n      }\n    }\n    document.addEventListener('fizzy:october-expired', function() {\n      renderTierPrices();\n      renderBundle();\n      syncStickyAtc();\n    });\n    // Render once on init so the page matches state.age on first paint.\n    renderTierPrices();\n\n    // Deep-link: ?flavor=bc|sl|wm|ob pre-selects (previews) that flavor on load\n    // \u2014 used by the home \"Best Sellers\" Learn more links. Sam 2026-06-09.\n    (function () {\n      var fp = (new URLSearchParams(window.location.search)).get('flavor');\n      if (fp && /^(bc|sl|wm|ob)$/.test(fp) && fp !== current) { swapTo(fp); }\n    })();\n\n    var bundleCounter = document.getElementById('bundleCounter');\n    var bundleProgress = document.getElementById('bundleProgress');\n    var addBtn = document.getElementById('addToCartBtn');\n\n    // \u2500\u2500 Sticky ATC element refs + sync \u2500\u2500\n    // Sync mirrors three things from the main buy box onto the sticky\n    // bar: the ATC's text + disabled state, the active plan label,\n    // and the pouch thumbnail. Called from renderBundle (whenever\n    // bundle/plan state changes) and from swapTo (whenever the active\n    // flavor changes), so the sticky bar never falls out of sync.\n    var stickyAtc        = document.getElementById('stickyAtc');\n    var stickyAtcBtn     = document.getElementById('stickyAtcBtn');\n    var stickyAtcThumb   = document.getElementById('stickyAtcThumb');\n    var stickyAtcPlan    = document.getElementById('stickyAtcPlan');\n    var stickyPlanTimer = 0;\n    var stickyAtcPrice   = document.getElementById('stickyAtcPrice');\n    var stickyAtcWas     = document.getElementById('stickyAtcWas');\n    var stickyAtcFlavorName = document.getElementById('stickyAtcFlavorName');\n    var stickyAtcDots    = document.querySelectorAll('#stickyAtcFlavors .sa-dot');\n    // Sticky button is a single-state \"Buy now\" scroll shortcut on\n    // every viewport \u2014 it never mirrors the main ATC's validation\n    // state. Tapping it smooth-scrolls the user up to the buy box\n    // where they can configure flavor + plan and then commit via the\n    // real ATC. Keeps the sticky bar as a \"get me back to where I can\n    // buy\" affordance rather than a parallel commit path.\n    /* Which side of the buy box the reader is on: 'ahead' (buy box still below\n       the fold), 'past' (scrolled beyond it), or null (buy box on screen, bar\n       hidden). Declared out here because syncStickyAtc runs on every bundle and\n       flavour change and would otherwise stamp the wrong label back on.\n       Sam 2026-08-28. */\n    var stickyMode = null;\n\n    /* The button has never added to cart \u2014 it smooth-scrolls to the buy box.\n       That was tolerable when the bar only appeared after you had already\n       passed the real Add to Cart; now that it also greets you on the way\n       down, a button reading \"Add to Cart\" that silently scrolls is a lie.\n       Name the action in the ahead state. */\n    /* Lowest daily cost for the selected age, using the plan-card prices. */\n    function lowestPerDay() {\n      var best = null;\n      ['1m', '3m'].forEach(function (plan) {\n        var p = tierPrice(plan);\n        if (!p.available) return;\n        var per = p.price / (PLAN_MONTHS[plan] * 30);\n        if (!best || per < best.per) best = { per: per, plan: plan, price: p.price, days: PLAN_MONTHS[plan] * 30 };\n      });\n      return best;\n    }\n\n    function stickyLabelFor(mode) {\n      if (optimizedPurchase) {\n        if (purchaseBusy) return 'Adding\u2026';\n        var chosen = tierPrice(state.plan);\n        if (!chosen.available) return 'Choose a plan &rarr;';\n        var complete = selectedCount() === required() && required() > 0;\n        /* Hormozi P-052 (Oct 30): a one-tap add names what it adds (flavor and plan), e.g.\n           \"Add Berry Cherry \u00B7 Monthly \u00B7 $44.99\". Mixed boxes say \"Add 2 flavors\". Travel packs keep the plain label.\n           Label text only; the click still calls the same Add to cart. */\n        if (complete && !isStickPlan()) {\n          var pickedFlavors = ['bc', 'sl', 'wm', 'ob'].filter(function (f) { return state.qty[f] > 0; });\n          var what = pickedFlavors.length === 1 ? ((FLAV[pickedFlavors[0]] || {}).name || 'your box') : pickedFlavors.length + ' flavors';\n          return 'Add ' + what + ' \u00B7 ' + (PLAN_LABELS[state.plan] || '') + ' \u00B7 ' + money(chosen.price) + ' &rarr;';\n        }\n        return (complete ? 'Add to cart' : 'Choose flavors') + ' \u00B7 ' + money(chosen.price) + ' &rarr;';\n      }\n\n      var offer = lowestPerDay();\n      if (offer) return '<span>From ' + money(offer.per, true) + '/day &rarr;</span>';\n      return mode === 'ahead' ? 'Choose your plan &rarr;' : 'Select your plan &rarr;';\n    }\n\n    function renderPlanAvailability() {\n      var el = document.querySelector('[data-plan-notice]');\n      if (!el) return;\n      var available = tierPrice(state.plan).available;\n      el.hidden = available;\n      el.textContent = available ? '' : 'This plan is currently unavailable. Choose another age or plan.';\n    }\n\n    function syncStickyAtc() {\n      if (!stickyAtcBtn) return;\n      stickyAtcBtn.disabled = optimizedPurchase && purchaseBusy;\n      stickyAtcBtn.innerHTML = stickyLabelFor(stickyMode);\n      if (stickyAtcPlan) {\n        var planLabel = isStickPlan() ? stickPlanLabel() : PLAN_PROPERTY[state.plan] || PLAN_LABELS[state.plan] || '';\n        clearTimeout(stickyPlanTimer);\n        if (stickyAtcPlan.textContent !== planLabel) {\n          stickyAtcPlan.classList.add('fading');\n          stickyPlanTimer = setTimeout(function () {\n            stickyAtcPlan.textContent = planLabel;\n            stickyAtcPlan.classList.remove('fading');\n          }, 180);\n        } else { stickyAtcPlan.classList.remove('fading'); }\n      }\n      /* Price + compare-at \u2014 sourced from priceFor() (live variant metadata) so\n         the sticky stays in lockstep with the active age tier. */\n      var p = tierPrice(state.plan);\n      if (p && stickyAtcPrice) stickyAtcPrice.textContent = money(p.price);\n      if (p && stickyAtcWas) { var stWas = p.was; if (window.__fizzyPdpChildMap && !isStickPlan() && state.age !== '14+' && (state.plan === '1m' || state.plan === '3m')) stWas = Math.round(onceUnitFor(state.age) * (state.plan === '3m' ? 3 : 1) * 100) / 100; stickyAtcWas.textContent = money(stWas); stickyAtcWas.hidden = !stWas; stickyAtcWas.style.display = stWas ? '' : 'none'; }\n      /* Active flavor name caption \u2014 pulled from the FLAV catalog so\n         it stays in sync with the previewed flavor (the source of\n         truth for the hero swap). */\n      if (stickyAtcFlavorName && FLAV[current]) {\n        stickyAtcFlavorName.textContent = FLAV[current].name;\n      }\n      if (stickyAtcThumb) {\n        var pouchEl = document.querySelector(\n          '.flavor-picker .opt[data-f=\"' + current + '\"] .opt-pouch'\n        );\n        if (pouchEl && stickyAtcThumb.src !== pouchEl.src) {\n          stickyAtcThumb.src = pouchEl.src;\n        }\n      }\n      // Mirror the active flavor onto the sticky's dot row so the\n      // paper ring follows whichever flavor is being previewed.\n      if (stickyAtcDots && stickyAtcDots.length) {\n        stickyAtcDots.forEach(function (d) {\n          d.classList.toggle('active', d.dataset.f === current);\n          /* The swatches carry no state for assistive tech otherwise \u2014 selection\n             was a class alone \u2014 and a sold-out swatch would swap the hero and\n             then silently skip the add. Both are announced now, and the\n             :disabled styling that already existed becomes reachable. */\n          /* `current`, not `f`. An earlier pass wrote `f` here, which does not\n             exist in this scope: syncStickyAtc() takes no argument. The\n             ReferenceError aborted init() partway \u2014 after the ATC and picker\n             handlers wired up but BEFORE the sticky-ATC mount, the member-gifts\n             modal and the accordion \u2014 so the sticky bar never appeared and\n             [data-mg-open] did nothing. Sam 2026-08-29. */\n          var on = d.getAttribute('data-f') === current;\n          d.setAttribute('aria-pressed', on ? 'true' : 'false');\n          var avail = typeof flavorAvail === 'function' ? flavorAvail(d.getAttribute('data-f')) : true;\n          /* Sold out still PREVIEWS (Sam 2026-08-31): the swatch swaps the\n             hero; only the add is blocked, by the click handler's own\n             flavorAvail guard. `disabled` killed the click entirely, which\n             dead-ended browsing whenever the whole lineup was out of stock. */\n          d.disabled = false;\n          d.classList.toggle('is-soldout', !avail);\n          var nm = (FLAV[d.getAttribute('data-f')] || {}).name || d.getAttribute('data-f');\n          d.setAttribute('aria-label', avail ? nm : nm + ', coming soon');\n      });\n      }\n    }\n\n    // Sticky swatches preview only; quantities belong to the picker steppers.\n    if (stickyAtcDots && stickyAtcDots.length) {\n      stickyAtcDots.forEach(function (dot) {\n        dot.addEventListener('click', function () {\n          var f = dot.dataset.f;\n          if (f) swapTo(f);\n        });\n      });\n    }\n\n    // All amounts come from the same live allocation resolver as Add to cart.\n    function renderPurchaseTerms() {\n      var p = tierPrice(state.plan);\n      var terms = hero.querySelector('[data-purchase-terms]');\n      var renewal = hero.querySelector('[data-purchase-renewal]');\n      var valid = p.available && p.price > 0;\n      if (terms) terms.hidden = !valid;\n      var drawn = valid && !isStickPlan() && renderPlanSummary();\n      if (renewal) renewal.textContent = valid && !isStickPlan() && !drawn ? subscriptionRenewalText(state.plan) : '';\n    }\n\n    // 2026-10-29 (GPT CRO audit F08/F22): the selected plan as a short receipt under Add to cart:\n    // what arrives (pouches, servings, days of supply at this age's daily serving), then first box and renewal.\n    // Same live allocation resolver as subscriptionRenewalText; returns false so the sentence stays as fallback.\n    function renderPlanSummary() {\n      var supplyEl = hero.querySelector('[data-plan-supply]');\n      var rowsEl = hero.querySelector('[data-plan-rows]');\n      if (!supplyEl || !rowsEl) return false;\n      var regular = regularTierPrice(state.plan), offer = tierPrice(state.plan);\n      if (!regular.available || !offer.available) return false;\n      var days = (PLAN_MONTHS[state.plan] || 1) * 30;\n      var pouches = required();\n      var servings = pouches * 30;\n      var supplyDays = Math.round(servings / (state.age === '14+' ? 2 : 1));\n      supplyEl.textContent = pouches + (pouches === 1 ? ' pouch' : ' pouches') + ' \u00B7 ' + servings + ' servings \u00B7 ' + supplyDays + '-day supply';\n      var rows = octoberOfferActive()\n        ? [['Every ' + days + ' days', money(offer.price)]]\n        : regular.renewal && regular.renewal !== regular.price\n          ? [['First box', money(regular.price)], ['Then every ' + days + ' days', money(regular.renewal)]]\n          : [['Every ' + days + ' days', money(regular.price)]];\n      rowsEl.textContent = '';\n      rows.forEach(function (r) {\n        var row = document.createElement('div');\n        var dt = document.createElement('dt'); dt.textContent = r[0];\n        var dd = document.createElement('dd'); dd.textContent = r[1];\n        row.appendChild(dt); row.appendChild(dd); rowsEl.appendChild(row);\n      });\n      return true;\n    }\n\n    function renderBundle() {\n      // Drop any flavor that's out of stock for the current age + plan before\n      // counting, so a sold-out flavor can't keep the bundle \"complete\" \u2014\n      // and clamp each flavor to its remaining child stock (1 left = max 1).\n      ['bc', 'sl', 'wm', 'ob'].forEach(function (f) {\n        if (state.qty[f] && !flavorAvail(f)) state.qty[f] = 0;\n        var cap = flavorStock(f);\n        if (state.qty[f] > cap) state.qty[f] = cap;\n      });\n      var req = required();\n      var cur = selectedCount();\n      var remaining = req - cur;\n      hero.classList.toggle('stick-mode', isStickPlan());\n      hero.dataset.purchasePlan = state.plan;\n      hero.dataset.stickDays = stickDays();\n      hero.dataset.stickQuantity = stickSize();\n      document.querySelectorAll('[data-stick-only]').forEach(function (el) { el.hidden = !isStickPlan(); });\n      document.querySelectorAll('[data-stick-target]').forEach(function (el) { el.textContent = stickSize() + ' travel packs'; });\n      document.querySelectorAll('[data-stick-step]').forEach(function (el) { el.textContent = quantityStep(); });\n      document.querySelectorAll('[data-stick-renewal]').forEach(function (el) { el.textContent = stickRenewalText(); });\n      document.querySelectorAll('.flavor-picker .opt-pouch').forEach(function (img) {\n        if (!img.dataset.pouchSrc) { img.dataset.pouchSrc = img.getAttribute('src'); img.dataset.pouchAlt = img.alt; }\n        var tile = img.closest('.opt'), f = tile && tile.dataset.f;\n        var source = isStickPlan() && stickData().images ? stickData().images[f] : img.dataset.pouchSrc;\n        if (source && img.getAttribute('src') !== source) img.src = source;\n        img.alt = isStickPlan() ? (FLAV[f] || {}).name + ' FizzyFocus travel pack' : img.dataset.pouchAlt;\n      });\n      // A plan switch changes the format even before another flavor is previewed.\n      setHeroPoster(current);\n      setHeroThumb(current);\n      // Phone-only helper (shown at 820px and below, where the + / \u2212 steppers are hidden). Round 2 audit\n      // R2-087 (2026-10-28): travel packs no longer say \"use +\" here, since phones show only Remove.\n      document.querySelectorAll('.flavor-help-mobile').forEach(function (help) {\n        help.textContent = isStickPlan() ? (cur === req && stickMixReady ? 'Your box is ready to add.' + (stickMixEven ? '' : ' Want a mix? Tap Mix evenly.') : cur === req ? 'Box full. Remove ' + quantityStep() + ' travel packs to make room for another flavor.' : 'Tap a flavor to add ' + quantityStep() + ' travel packs. Use Remove to take ' + quantityStep() + ' out.') : req === 1\n          ? 'Tap a flavor to choose or switch your pouch.'\n          : cur === req\n            ? (pouchFlavorsTouched ? 'Box full. Tap any flavor to preview it. Remove a pouch to make room.' : 'Your box is ready to add. Tap any flavor to preview it.')\n            : 'Tap a flavor to preview it and add a pouch. Use Remove to take one out.';\n      });\n\n      if (bundleCounter) {\n        bundleCounter.innerHTML = '<b>' + cur + '</b> of <b>' + req + '</b> ' + (isStickPlan() ? 'travel packs' : 'selected');\n        bundleCounter.classList.toggle('complete', cur === req && req > 0);\n      }\n\n      if (bundleProgress) {\n        var pct = req > 0 ? Math.min(1, cur / req) : 0;\n        var fillEl = bundleProgress.querySelector('.fill');\n        if (fillEl) {\n          // transform: scaleX is GPU-composited \u2014 no layout/paint per\n          // frame the way `width` would. Smooth on Safari even with\n          // the header's backdrop-filter and ticker marquee running.\n          fillEl.style.transform = 'scaleX(' + pct + ')';\n        }\n        bundleProgress.classList.toggle('complete', cur === req && req > 0);\n      }\n\n      document.querySelectorAll('.flavor-picker .opt').forEach(function (opt) {\n        var f = opt.dataset.f;\n        var q = state.qty[f];\n        var soldOut = !flavorAvail(f);\n        var stepper = opt.querySelector('.stepper');\n        // Qty count lives between the +/- buttons inside the stepper now\n        // (previously was a corner badge \u2014 moved inline for readability).\n        var qtyEl = opt.querySelector('.stepper .qty');\n        if (qtyEl) qtyEl.textContent = q;\n        var flavorName = (FLAV[f] || {}).name || f;\n        ['inc','dec'].forEach(function (action) {\n          var button = stepper.querySelector('.' + action);\n          button.setAttribute('aria-label', (action === 'inc' ? 'Add ' : 'Remove ') + (isStickPlan() ? quantityStep() + ' ' : '') + flavorName + (isStickPlan() ? ' travel packs' : ''));\n          var label = button.querySelector('.quantity-action');\n          if (label) label.textContent = (action === 'inc' ? ' Add' : ' Remove') + (isStickPlan() ? ' ' + quantityStep() : '');\n        });\n        stepper.querySelector('.dec').disabled = q <= 0;\n        var remove = opt.querySelector('.remove-btn');\n        if (remove) { remove.disabled = q <= 0; remove.setAttribute('aria-label', 'Remove ' + (isStickPlan() ? quantityStep() + ' ' : 'one ') + flavorName + (isStickPlan() ? ' travel packs' : '')); remove.textContent = isStickPlan() ? 'Remove ' + quantityStep() : 'Remove'; }\n        stepper.querySelector('.inc').disabled = !canAddFlavor(f);\n        opt.classList.toggle('soldout', soldOut);\n        /* Sold-out was drawn only by a ::after label. Generated content is not\n           reliably exposed to assistive tech and carries no accessible name, so\n           the state was visual-only. State it on the tile as well.\n           Sam 2026-08-29. */\n        opt.setAttribute('aria-disabled', soldOut ? 'true' : 'false');\n        var soName = (FLAV[f] || {}).name || f;\n        opt.setAttribute('aria-label', soldOut ? soName + ', coming soon' : soName + ', ' + q + (isStickPlan() ? ' travel packs in your box' : ' in your box'));\n        // Mobile-only corner badge mirrors the same count \u2014 it's\n        // hidden via .has-qty (opacity 0/1) so the badge fades in\n        // when the flavor enters the bundle and out when it leaves.\n        var badgeEl = opt.querySelector('.opt-badge');\n        if (badgeEl) badgeEl.textContent = q;\n        opt.classList.toggle('selected', q > 0);\n        opt.classList.toggle('has-qty', q > 0);\n      });\n\n      if (addBtn) {\n        var p = tierPrice(state.plan);\n        if (!p.available) {\n          addBtn.disabled = true;\n          addBtn.textContent = 'Plan unavailable';\n        } else if (req === 0) {\n          addBtn.disabled = true;\n          addBtn.textContent = 'Select a plan';\n        } else if (!exactSelection()) {\n          addBtn.disabled = true;\n          addBtn.textContent = isStickPlan() ? (remaining > 0 ? 'Choose ' + remaining + ' more travel packs' : 'Choose exactly ' + req + ' travel packs') : cur === 0 ? 'Choose your flavors' : remaining === 1\n            ? 'Add 1 more pouch to continue'\n            : 'Add ' + remaining + ' more pouches to continue';\n        } else {\n          addBtn.disabled = false;\n          addBtn.textContent = 'Add to cart \u00B7 ' + money(p.price);\n        }\n      }\n      if (purchaseBusy && addBtn) { addBtn.disabled = true; addBtn.textContent = 'Adding\u2026'; }\n      renderPurchaseTerms();\n      renderPlanAvailability();\n      // Mirror the latest ATC state to the sticky bar at the very end \u2014\n      // captures both the text/disabled changes above AND any state.plan\n      // change that came in via the tier click handler.\n      syncStickyAtc();\n    }\n\n    // Steppers change only the bundle quantity on every viewport.\n    document.querySelectorAll('.flavor-picker .stepper').forEach(function (st) {\n      var f = st.dataset.f;\n      st.querySelector('.inc').addEventListener('click', function (e) {\n        e.stopPropagation();\n        if (!canAddFlavor(f)) return;\n        state.qty[f] += quantityStep();\n        if (!isStickPlan()) pouchFlavorsTouched = true;\n        else stickMixReady = false;\n        quantityChanged();\n      });\n      st.querySelector('.dec').addEventListener('click', function (e) {\n        e.stopPropagation();\n        if (state.qty[f] <= 0) return;\n        state.qty[f] = Math.max(0, state.qty[f] - quantityStep());\n        if (!isStickPlan()) pouchFlavorsTouched = true;\n        else stickMixReady = false;\n        quantityChanged();\n      });\n    });\n\n    // Every card previews; a one-pouch plan switches directly to that flavor.\n    document.querySelectorAll('.flavor-picker .opt').forEach(function (o) {\n      o.addEventListener('click', function (e) {\n        if (e.target.closest('.stepper, .remove-btn')) return;\n        var f = o.dataset.f;\n        swapTo(f);\n        if (purchaseBusy) return;\n        if (required() === 1) {\n          if (!tierPrice(state.plan).available || !flavorAvail(f) || flavorStock(f) < 1) return;\n          Object.keys(state.qty).forEach(function (key) { state.qty[key] = key === f ? 1 : 0; });\n          if (!isStickPlan()) pouchFlavorsTouched = true;\n          quantityChanged();\n        } else if (window.matchMedia('(max-width: 820px)').matches && canAddFlavor(f)) {\n          state.qty[f] += quantityStep();\n          if (!isStickPlan()) pouchFlavorsTouched = true;\n          else stickMixReady = false;\n          quantityChanged();\n        }\n      });\n    });\n\n    // Mobile-only Remove button \u2014 single-action equivalent of the\n    // .stepper's [\u2212] button. Decrement by 1, no-op when already at 0.\n    // e.stopPropagation prevents the tile click from also firing\n    // (which would add 1 back via the handler above).\n    document.querySelectorAll('.flavor-picker .remove-btn').forEach(function (btn) {\n      btn.addEventListener('click', function (e) {\n        e.stopPropagation();\n        var f = btn.dataset.f;\n        if (state.qty[f] <= 0) return;\n        state.qty[f] = Math.max(0, state.qty[f] - quantityStep());\n        if (!isStickPlan()) pouchFlavorsTouched = true;\n        else stickMixReady = false;\n        quantityChanged();\n      });\n    });\n\n    // Flavor preview pills under the H1 \u2014 same preview behavior, no bundle impact.\n    previewPills.forEach(function (p) {\n      p.addEventListener('click', function () {\n        swapTo(p.dataset.f);\n      });\n    });\n\n    // Deep link: ?variant=wm / ?flavor=watermelon (mobile-menu flavor links)\n    // previews that flavor on load. Preview only \u2014 nothing added to the bundle.\n    (function () {\n      try {\n        var q = new URLSearchParams(window.location.search);\n        var raw = (q.get('flavor') || q.get('variant') || '').toLowerCase();\n        if (!raw) return;\n        var MAP = {\n          bc: 'bc', sl: 'sl', wm: 'wm', ob: 'ob',\n          'berry-cherry': 'bc', 'berrycherry': 'bc', 'berry': 'bc',\n          'strawberry-lemonade': 'sl', 'strawberrylemonade': 'sl', 'strawberry': 'sl',\n          'watermelon': 'wm', 'water-melon': 'wm',\n          'orange-creamsicle': 'ob', 'orangecreamsicle': 'ob', 'orange': 'ob'\n        };\n        var f = MAP[raw];\n        if (f) swapTo(f);\n      } catch (e) {}\n    })();\n\n    /* Keeps a radiogroup's ARIA and roving tabindex in step with the .selected\n       class, and gives it arrow-key operation. The age and plan pickers are\n       divs with click listeners; marking them up as radios without this would\n       announce a group nobody can move through. Added 2026-08-28. */\n    function wireRadioGroup(nodes, onPick) {\n      if (!nodes || !nodes.length) return;\n      var list = Array.prototype.slice.call(nodes);\n      function sync(chosen) {\n        list.forEach(function (n) {\n          var on = n === chosen;\n          n.setAttribute('aria-checked', on ? 'true' : 'false');\n          n.tabIndex = on ? 0 : -1;\n        });\n      }\n      list.forEach(function (n, i) {\n        n.addEventListener('keydown', function (e) {\n          var k = e.key, step = 0;\n          if (k === 'ArrowRight' || k === 'ArrowDown') step = 1;\n          else if (k === 'ArrowLeft' || k === 'ArrowUp') step = -1;\n          else if (k === ' ' || k === 'Enter') { e.preventDefault(); n.click(); return; }\n          else return;\n          e.preventDefault();\n          // Use the live DOM order: the 15-day card moves to the top in Travel packs.\n          var order = list.filter(function (x) { return !x.hidden; }).sort(function (a, b) {\n            return a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1;\n          });\n          if (!order.length) return;\n          var at = order.indexOf(n); if (at < 0) at = 0;\n          var next = order[(at + step + order.length) % order.length];\n          var visited = 0;\n          while (next.getAttribute('aria-disabled') === 'true' && visited++ < order.length) next = order[(order.indexOf(next) + step + order.length) % order.length];\n          if (next.getAttribute('aria-disabled') !== 'true') { next.focus(); next.click(); }\n        });\n      });\n      /* The click handlers already toggle .selected, so mirror from there\n         rather than duplicating the selection logic. */\n      list.forEach(function (n) {\n        n.addEventListener('click', function () { if (purchaseBusy || n.getAttribute('aria-disabled') === 'true') return; sync(n); if (onPick) onPick(n); });\n      });\n      sync(list.filter(function (n) { return n.classList.contains('selected'); })[0] || list[0]);\n    }\n\n    // Plan tier selection \u2014 just toggle .selected and update state.\n    var tiers = document.querySelectorAll('.tier');\n    function pickPlan(t) {\n      if (!tierPrice(t.dataset.plan).available || purchaseBusy) return;\n      var wasStick = isStickPlan();\n      tiers.forEach(function (x) { x.classList.toggle('selected', x === t); });\n      state.plan = t.dataset.plan;\n      if (isStickPlan() || wasStick || !pouchFlavorsTouched) applyDefaultFlavors();\n      trimToRequired();\n      renderTierPrices();\n      renderBundle();\n    }\n    tiers.forEach(function (t) {\n      t.addEventListener('click', function () { pickPlan(t); });\n    });\n\n    // Sample-pack button (inside the .pdp-flavor-overlay preview pill).\n    /* Sample-kit clicks are handled site-wide by initSampleKitTriggers() in\n       fizzy-header.js (Sam 2026-09-04) so every entry point behaves the same\n       and the anchor's navigation is cancelled. The per-element binding that\n       used to live here has been removed to avoid opening the form twice. */\n\n    /* \u2500\u2500 Age picker (single select) \u2500\u2500\n       8\u201313 or 14+ (the adult dose). Drives required() pouches + tier\n       pricing. Simplified back from the household picker 2026-06-03. */\n    /* Display only: 14+ takes 2 servings/day, so each plan covers the same\n       window with double the servings \u2014 show 60/120/180 instead of 30/60/90.\n       The shipping cadence (every 30/60/90 days) is unchanged. */\n    function renderServings() {\n      var mult = state.age === '14+' ? 2 : 1;\n      document.querySelectorAll('.tnote-srv').forEach(function (el) {\n        var base = parseInt(el.dataset.srv, 10) || 0;\n        el.textContent = base * mult;\n      });\n    }\n\n    var formatOpts = hero.querySelectorAll('.format-picker .opt[data-format]');\n    formatOpts.forEach(function (opt) {\n      opt.addEventListener('click', function () {\n        var format = opt.dataset.format === 'travel' ? 'travel' : 'pouch';\n        if (purchaseBusy || format === state.format) return;\n        if (format === 'travel' && !travelAvailable()) return;\n        var wasStick = isStickPlan();\n        state.format = format;\n        // Travel packs open on Every 15 days; pouch has no 15-day plan, so it falls back to Monthly.\n        if (format === 'travel' && tierPrice(TRAVEL_DEFAULT_PLAN).available) selectPlanNode(TRAVEL_DEFAULT_PLAN);\n        else if (format === 'pouch' && state.plan === '15d') selectPlanNode('1m');\n        else if (!tierPrice(state.plan).available) {\n          var fallback = ['1m', '3m', '15d'].find(function (plan) { return tierPrice(plan).available; });\n          if (fallback) selectPlanNode(fallback);\n        }\n        if (isStickPlan() || wasStick || !pouchFlavorsTouched) applyDefaultFlavors();\n        trimToRequired();\n        renderTierPrices();\n        renderBundle();\n      });\n    });\n    wireRadioGroup(formatOpts);\n    function selectPlanNode(plan) {\n      tiers.forEach(function (x) {\n        var on = x.dataset.plan === plan;\n        x.classList.toggle('selected', on);\n        x.setAttribute('aria-checked', on ? 'true' : 'false');\n        x.tabIndex = on ? 0 : -1;\n      });\n      state.plan = plan;\n    }\n\n    wireRadioGroup(document.querySelectorAll('.plans .tier'));\n    // 15 / 30 days toggle on the 15-day card. Kept out of the card's own click and key\n    // handlers so it never resets the flavor mix.\n    document.querySelectorAll('[data-cad15] [data-cad]').forEach(function (b) {\n      b.addEventListener('keydown', function (e) { e.stopPropagation(); });\n      b.addEventListener('click', function (e) {\n        e.stopPropagation();\n        if (purchaseBusy || !cad30Ready()) return;\n        state.cad15 = Number(b.dataset.cad) === 30 ? 30 : 15;\n        if (state.plan !== '15d') { var card = b.closest('.tier'); if (card) card.click(); }\n        renderTierPrices();\n        renderBundle();\n      });\n    });\n\n    var ageOpts = document.querySelectorAll('.age-picker:not(.format-picker) .opt');\n    ageOpts.forEach(function (a) {\n      a.addEventListener('click', function () {\n        if (purchaseBusy) return;\n        ageOpts.forEach(function (x) { x.classList.toggle('selected', x === a); });\n        state.age = a.dataset.age;\n        // In Travel packs, an age change goes back to the Every 15 days default.\n        if (state.format === 'travel' && tierPrice(TRAVEL_DEFAULT_PLAN).available) selectPlanNode(TRAVEL_DEFAULT_PLAN);\n        if (isStickPlan() || !pouchFlavorsTouched) applyDefaultFlavors();\n        renderServings();\n        renderTierPrices();\n        trimToRequired();\n        renderBundle();\n      });\n    });\n    wireRadioGroup(ageOpts);\n    renderServings();\n\n    function trimToRequired() {\n      var req = required();\n      var cur = selectedCount();\n      if (cur <= req) return;\n      var step = quantityStep();\n      while (cur > req) {\n        var order = ['bc', 'sl', 'wm', 'ob']\n          .filter(function (f) { return state.qty[f] >= step; })\n          .sort(function (a, b) { return isStickPlan() ? state.qty[b] - state.qty[a] : state.qty[a] - state.qty[b]; });\n        if (!order.length) break;\n        state.qty[order[0]] -= step;\n        cur -= step;\n      }\n    }\n\n    if (addBtn) {\n      // Plan \u2192 human-readable property string that lands in the cart drawer chip\n      // (PLAN_PROPERTY hoisted to module scope above so syncStickyAtc\n      // can read it too \u2014 see the top of init().)\n      // Long-form flavor name written to line-item properties (drawer reads\n      // this to pick the swatch + pouch image via FLAVOR_MAP).\n      var FLAVOR_NAME = {\n        bc: 'Berry Cherry',\n        sl: 'Strawberry Lemonade',\n        wm: 'Watermelon',\n        ob: 'Orange Creamsicle'\n      };\n      // Canonical option strings for resolving the parent bundle variant.\n      // Matching is whitespace/case-insensitive so the same code runs on the\n      // dev store (\"Watermelon\") and production (\"Water Melon\"); the Flavor 1..N\n      // line-item properties always use the STORE's exact option string, since\n      // the production bundle app matches on them.\n      var FLAVOR_OPTION = { bc: 'Berry Cherry', sl: 'Strawberry Lemonade', wm: 'Water Melon', ob: 'Orange Creamsicle' };\n      var QTY_OPTION = { '1m': '1 Month Supply', '2m': '2 Month Supply', '3m': '3 Month Supply', 'once': 'Try It Once' };\n      function normOpt(s) { return String(s == null ? '' : s).toLowerCase().replace(/[^a-z0-9+]/g, ''); }\n      function pdpVariant(flavorParam, age, plan) {\n        if (isStickPlan(plan)) return stickVariant(plan);\n        var list = window.__fizzyPdpVariants || [];\n        if (window.__fizzyPdpChildMap) {\n          // Skio Classic Box product: ONE option (\"Size\"), values \"1\"/\"2\"/\"3\"\u2026\n          // The variant is the pouch COUNT; age/plan only decide which count \u2014\n          // and the AGE decides which box product's variants to search (8-13 =\n          // rendered product, 14+ = the alt box emitted by the section).\n          var months = plan === 'once' ? 1 : parseInt(plan, 10) || 1;\n          var size = months * (age === '14+' ? 2 : 1);\n          var boxList = boxDataFor(age).variants;\n          for (var b = 0; b < boxList.length; b++) {\n            if (String(boxList[b].option1).trim() === String(size)) return boxList[b];\n          }\n          return null;\n        }\n        var a = normOpt(age === '14+' ? 'Ages 14+' : 'Ages 8-13');\n        var q = normOpt(QTY_OPTION[plan]);\n        for (var i = 0; i < list.length; i++) {\n          var v = list[i];\n          if (normOpt(v.option1) === normOpt(FLAVOR_OPTION[flavorParam]) && normOpt(v.option2) === a && normOpt(v.option3) === q) {\n            return v;\n          }\n        }\n        return null;\n      }\n      // Box mode: the selling plan must MATCH the chosen tier's frequency\n      // (1m\u219230 days, 2m\u219260, 3m\u219290) \u2014 Sam's rule 2026-08-15. The plan map is\n      // emitted by the section from the box product's selling plan groups.\n      function boxPlanFor(plan) {\n        if (isStickPlan(plan)) return stickPlanId(plan);\n        return boxPlanIdFor(state.age, plan);\n      }\n      function storeFlavorOption(flavorParam) {\n        if (isStickPlan()) { var stick = stickChildFor(flavorParam); return stick ? stick.option : null; }\n        // Box mode: the store-exact flavor string lives on the CHILD product's\n        // option (the parent has no flavor axis to read it from).\n        if (window.__fizzyPdpChildMap) {\n          var c = boxChildFor(flavorParam);\n          if (c) return c.option;\n        }\n        var list = window.__fizzyPdpVariants || [], want = normOpt(FLAVOR_OPTION[flavorParam]);\n        for (var i = 0; i < list.length; i++) { if (normOpt(list[i].option1) === want) return list[i].option1; }\n        return FLAVOR_OPTION[flavorParam];\n      }\n      // Skio Static Box cart contract: one _pv<child-variant-gid> property per\n      // chosen flavor, value = pouch count. Skio composes the box (and the $0\n      // child order lines) from these. Size correctness is OUR job \u2014 Skio does\n      // not validate at cart time (their support, 2026-08-14).\n      function applyBoxProperties(properties, counts) {\n        if (!window.__fizzyPdpChildMap && !isStickPlan()) return;\n        for (var f in counts) {\n          if (!counts[f]) continue;\n          var c = isStickPlan() ? stickChildFor(f) : boxChildFor(f);\n          if (c) properties['_pvgid://shopify/ProductVariant/' + c.id] = counts[f];\n        }\n      }\n      function sellingPlanOf(v) { var a = v && v.selling_plan_allocations; return (a && a.length) ? a[0].selling_plan_id : null; }\n\n      addBtn.addEventListener('click', function () {\n        if (addBtn.disabled || purchaseBusy) return;\n        if (!exactSelection() || !tierPrice(state.plan).available) { renderBundle(); return; }\n\n        // Bundle contract: ONE line = the parent variant for the primary flavor\n        // \u00D7 age \u00D7 plan, quantity 1, with Flavor 1..N properties (one per pouch\n        // slot) + Age Range + the Skio selling_plan from the variant's allocation.\n        // Matches the developer's fizzyiq-buy-box / live orders. The bundle app\n        // expands this into the $0 child component pouches server-side.\n        var units = [];\n        ['bc', 'sl', 'wm', 'ob'].forEach(function (f) { for (var i = 0; i < state.qty[f]; i++) units.push(f); });\n        if (!units.length) return;\n        var variant = pdpVariant(units[0], state.age, state.plan);\n        if (!variant) {\n          console.error('[FizzyIQ ATC] no variant for', units[0], state.age, state.plan);\n          return;\n        }\n        // Store-exact option strings (storeFlavorOption) so the same code runs on\n        // dev (\"Watermelon\") and prod (\"Water Melon\"). In box mode the variant\n        // option is the SIZE, so Age Range comes from the UI state instead.\n        var properties = {};\n        if (isStickPlan()) {\n          properties._offer = state.plan === '3m' ? 'stick-3m' : state.plan === '15d' ? (cad30On() ? 'stick-15d-30' : 'stick-15d') : 'stick-1m';\n          properties['Age Range'] = ageLabel();\n          properties['Bundle size'] = stickSize() + ' travel packs';\n          // One summary row instead of up to 180 \"Flavor N\" rows at checkout.\n          properties.Flavors = ['bc', 'sl', 'wm', 'ob'].filter(function (f) { return state.qty[f] > 0; })\n            .map(function (f) { return storeFlavorOption(f) + ' \u00D7' + state.qty[f]; }).join(' \u00B7 ');\n        } else {\n          properties['Age Range'] = window.__fizzyPdpChildMap ? ageLabel() : variant.option2;\n          units.forEach(function (f, i) { properties['Flavor ' + (i + 1)] = storeFlavorOption(f); });\n        }\n        applyBoxProperties(properties, state.qty);\n        var line = { id: variant.id, quantity: 1, properties: properties };\n        var sp = (window.__fizzyPdpChildMap || isStickPlan()) ? boxPlanFor(state.plan) : sellingPlanOf(variant);\n        if ((window.__fizzyPdpChildMap || isStickPlan()) && state.plan !== 'once' && !sp) {\n          // A subscription tier without its matching frequency plan must NEVER\n          // fall through to a one-time sale at the subscription price.\n          console.error('[FizzyIQ ATC] no selling plan for tier', state.plan, '\u2014 box product is missing that frequency');\n          addBtn.textContent = 'Plan unavailable. Try another.';\n          setTimeout(function () { renderBundle(); }, 2200);\n          return;\n        }\n        if (sp) line.selling_plan = sp;\n        // Public line-item property: Shopify displays this beneath the product\n        // at checkout. The automatic discount still owns billing and totals.\n        if (sp && state.plan !== 'once' && octoberOfferActive()) {\n          var regular = regularTierPrice(state.plan);\n          var offer = tierPrice(state.plan);\n          if (regular.available && offer.available) {\n            properties['October subscription offer'] = isStickPlan()\n              ? '20% off every order: $' + offer.price.toFixed(2) + ' each. Before tax.'\n              : '20% off every box: $' + offer.price.toFixed(2) + ' each. Before tax.';\n          }\n        }\n        if (sp && state.plan !== 'once') {\n          // Round 2 audit R2-044 (2026-10-28): kept as a hidden (underscore) property. A public one was\n          // frozen at add time, so a later price change left carts and checkout showing an old first-box\n          // price beside Shopify's own live schedule. Checkout states the schedule itself.\n          var intro = regularTierPrice(state.plan);\n          if (intro.available && intro.was > intro.price) properties['_Subscription offer'] = subscriptionRenewalText(state.plan);\n        }\n        var items = [line];\n\n        if (!items.length) return;\n\n        // Disable + busy state while the request is in flight\n        var prevText = addBtn.textContent;\n        addBtn.disabled = true;\n        addBtn.textContent = 'Adding\u2026';\n        purchaseBusy = true;\n        syncStickyAtc();\n\n        fetch('/cart/add.js', {\n          method: 'POST',\n          credentials: 'same-origin',\n          headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n          body: JSON.stringify({ items: items })\n        })\n          .then(function (r) {\n            if (!r.ok) return r.json().then(function (err) { throw err; });\n            return r.json();\n          })\n          .then(function (response) {\n            // Try to highlight the most recently added line in the drawer.\n            // /cart/add.js returns { items: [...] }; pick the last one's key.\n            var addedLines = (response && response.items) || [];\n            var highlightKey = addedLines.length\n              ? addedLines[addedLines.length - 1].key\n              : null;\n\n            if (window.FizzyCart && typeof window.FizzyCart.refresh === 'function') {\n              return window.FizzyCart.refresh(highlightKey).then(function () {\n                window.FizzyCart.open();\n                purchaseBusy = false;\n                addBtn.disabled = false;\n                renderBundle();\n              });\n            }\n            // Drawer not on this page \u2014 bounce to /cart as a fallback\n            window.location.href = '/cart';\n          })\n          .catch(function (err) {\n            console.error('[FizzyIQ ATC] add failed', err);\n            addBtn.textContent = (err && err.description) || 'Add failed. Try again.';\n            // Leave button disabled briefly so the error message is readable,\n            // then restore via renderBundle.\n            setTimeout(function () {\n              purchaseBusy = false;\n              addBtn.disabled = false;\n              renderBundle();\n            }, 2200);\n          });\n      });\n\n      // \u2500\u2500 Buy Once link \u2500\u2500\n      // A separate one-pouch purchase. The permalink preloads checkout with\n      // only the selected pouch, without a subscription or bundle expansion.\n      var buyOnceBtn = document.getElementById('buyOnceBtn');\n      var buyOncePopup = document.getElementById('buyOncePopup');\n      if (buyOnceBtn && buyOncePopup) {\n        var onceChoices = buyOncePopup.querySelectorAll('.buy-once-popup-flavor');\n        var onceError = buyOncePopup.querySelector('[data-buy-once-error]');\n        var onceBusy = false;\n        var onceLabel = buyOnceBtn.innerHTML;\n\n        var onceClose = buyOncePopup.querySelector('[data-buy-once-close]');\n        var oncePrice = buyOncePopup.querySelector('[data-buy-once-price]');\n        var oncePreviousOverflow;\n        function closeBuyOncePopup(restoreFocus) {\n          if (!buyOncePopup.open) return;\n          window.fizzyPopupMotion.dismiss(buyOncePopup, function () {\n            buyOncePopup.close();\n            if (restoreFocus) buyOnceBtn.focus({ preventScroll: true });\n          });\n        }\n        buyOncePopup.addEventListener('close', function () {\n          if (buyOncePopup.open) return;\n          buyOnceBtn.setAttribute('aria-expanded', 'false');\n          if (oncePreviousOverflow !== undefined) {\n            document.body.style.overflow = oncePreviousOverflow;\n            oncePreviousOverflow = undefined;\n          }\n        });\n        /* Subscription upsell (Sam 2026-10-09): the selected age's Monthly plan against the same\n           pouches bought one at a time, from the same live prices as the plan cards.\n           Round 2 audit R2-005 (2026-10-28): the Monthly plan has an intro first-box price, so the card\n           used to state the first-box price as the monthly one. When the plan's price adjustments\n           carry a different renewal, the card shows both as a two-row schedule (First box / Then\n           every 30 days, styled in sections/fizzy-pdp-hero.liquid) and the saving is labelled as the\n           first box's. Without a renewal price the original single sentence is kept. */\n        var onceUpsell = buyOncePopup.querySelector('[data-buy-once-upsell]');\n        function onceSchedRow(label, amount) {\n          var row = document.createElement('span');\n          row.className = 'bo-sched-row';\n          var key = document.createElement('span');\n          key.className = 'bo-sched-k';\n          key.textContent = label;\n          var val = document.createElement('span');\n          val.className = 'bo-sched-v';\n          val.textContent = money(amount);\n          // Read as \"First box: $44.99.\" by screen readers; the colon and stop stay visually hidden.\n          var colon = document.createElement('span'); colon.className = 'visually-hidden'; colon.textContent = ': ';\n          var stop = document.createElement('span'); stop.className = 'visually-hidden'; stop.textContent = '. ';\n          key.appendChild(colon); val.appendChild(stop);\n          row.appendChild(key); row.appendChild(val);\n          return row;\n        }\n        function fillOnceUpsell() {\n          if (!onceUpsell) return;\n          // Always the pouch Monthly plan (the kit comes only with a first pouch subscription).\n          var prevFormat = state.format; state.format = 'pouch';\n          var monthly = tierPrice('1m');\n          var regularMonthly = regularTierPrice('1m');\n          state.format = prevFormat;\n          var pouches = state.age === '14+' ? 2 : 1;\n          var unit = window.__fizzyPdpChildMap ? onceUnitFor(state.age) : priceFor('8-13', 'once').price;\n          var save = Math.floor(unit * pouches - monthly.price);\n          var ok = monthly.available && monthly.price > 0 && unit > 0 && save > 0;\n          onceUpsell.hidden = !ok;\n          if (!ok) return;\n          var renewal = !octoberOfferActive() && regularMonthly.available ? Number(regularMonthly.renewal) || 0 : 0;\n          var hasIntro = renewal > 0 && Math.abs(renewal - monthly.price) >= 0.005;\n          var count = pouches + (pouches === 1 ? ' pouch' : ' pouches');\n          var saveEl = onceUpsell.querySelector('[data-upsell-save]');\n          var bodyEl = onceUpsell.querySelector('[data-upsell-body]');\n          if (saveEl) saveEl.textContent = money(Math.round(save * 100) / 100) + (hasIntro ? ' on your first box' : '');\n          if (!bodyEl) return;\n          if (!hasIntro) {\n            bodyEl.textContent = count + ' every 30 days for ' + money(monthly.price) +\n              ', shipped free, plus samples of all 4 flavors in your first box unless you already have a Starter Kit. Renews until canceled; cancel any time.'; /* Hormozi X-007 */\n            return;\n          }\n          bodyEl.textContent = '';\n          var sched = document.createElement('span');\n          sched.className = 'bo-sched';\n          sched.appendChild(onceSchedRow('First box', monthly.price));\n          sched.appendChild(onceSchedRow('Then every 30 days', renewal));\n          var note = document.createElement('span');\n          note.className = 'bo-sched-note';\n          note.textContent = count + ' per box, shipped free. Your first box includes samples of all 4 flavors, unless you already have a Starter Kit. Renews until canceled; skip or cancel any time.'; /* Hormozi X-007 */\n          bodyEl.appendChild(sched);\n          bodyEl.appendChild(note);\n        }\n        var onceSubscribe = buyOncePopup.querySelector('[data-buy-once-subscribe]');\n        if (onceSubscribe) {\n          onceSubscribe.addEventListener('click', function () {\n            if (!buyOncePopup.open) return;\n            window.fizzyPopupMotion.dismiss(buyOncePopup, function () {\n              buyOncePopup.close();\n              // The upsell is the pouch Monthly plan: switch from Travel packs first.\n              if (state.format !== 'pouch') { var pouchOpt = Array.prototype.find.call(hero.querySelectorAll('.format-picker .opt[data-format=\"pouch\"]'), function (o) { return o.offsetParent !== null; }); if (pouchOpt) pouchOpt.click(); }\n              var monthlyTier = Array.prototype.find.call(document.querySelectorAll('.tier[data-plan=\"1m\"]'), function (t) { return t.offsetParent !== null; });\n              if (monthlyTier && !monthlyTier.classList.contains('selected')) monthlyTier.click();\n              var picker = document.getElementById('flavorPicker') || monthlyTier;\n              if (!picker) return;\n              picker.scrollIntoView({ behavior: window.matchMedia('(prefers-reduced-motion: reduce)').matches ? 'auto' : 'smooth', block: 'start' });\n              // Focus the first visible control in the picker; on phones none is focusable before a\n              // flavor is chosen, so fall back to the Monthly card that was just selected.\n              var control = Array.prototype.find.call(picker.querySelectorAll('button:not(:disabled), [tabindex=\"0\"]'), function (el) { return el.offsetParent !== null; }) || monthlyTier;\n              if (control) control.focus({ preventScroll: true });\n            });\n          });\n        }\n        function openBuyOncePopup() {\n          window.fizzyPopupMotion.reveal(buyOncePopup, function () {\n            if (onceError) { onceError.textContent = ''; onceError.hidden = true; }\n            fillOnceUpsell();\n            var price = buyOnceBtn.querySelector('.bo-price');\n            if (oncePrice && price) oncePrice.textContent = price.textContent;\n            oncePreviousOverflow = document.body.style.overflow;\n            document.body.style.overflow = 'hidden';\n            buyOncePopup.showModal();\n            buyOnceBtn.setAttribute('aria-expanded', 'true');\n            if (onceClose) onceClose.focus({ preventScroll: true });\n          });\n        }\n        buyOnceBtn.addEventListener('click', function (event) {\n          if (onceBusy || buyOnceBtn.disabled) return;\n          event.stopPropagation();\n          if (!buyOncePopup.open) openBuyOncePopup();\n          else closeBuyOncePopup(true);\n        });\n        if (onceClose) onceClose.addEventListener('click', function () { closeBuyOncePopup(true); });\n        // Native dialog contains focus. Only a click entirely outside its bounds\n        // dismisses it; dragging from a flavor row onto the backdrop does not.\n        var onceBackdropDown = false;\n        function outsideOnce(event) {\n          var rect = buyOncePopup.getBoundingClientRect();\n          return event.clientX < rect.left || event.clientX > rect.right || event.clientY < rect.top || event.clientY > rect.bottom;\n        }\n        buyOncePopup.addEventListener('pointerdown', function (event) { onceBackdropDown = outsideOnce(event); });\n        buyOncePopup.addEventListener('click', function (event) {\n          if (onceBackdropDown && outsideOnce(event)) closeBuyOncePopup(true);\n          onceBackdropDown = false;\n        });\n        buyOncePopup.addEventListener('cancel', function (event) {\n          event.preventDefault();\n          closeBuyOncePopup(true);\n        });\n        function resetOnceCheckout() {\n          onceBusy = false;\n          buyOnceBtn.disabled = false;\n          buyOnceBtn.innerHTML = onceLabel;\n          onceChoices.forEach(function (button) { button.disabled = false; });\n          closeBuyOncePopup(false);\n        }\n        window.addEventListener('pageshow', resetOnceCheckout);\n\n        /* Round 2 audit R2-045 (2026-10-28): a cart permalink (/cart/<id>:1) replaces the whole cart, so a\n           shopper with a subscription box in her cart lost it without notice when she tapped Buy once.\n           The permalink's one-step checkout is kept only when the cart is empty. Otherwise the pouch is\n           added beside what is already there and the cart drawer opens, so she sees every line before\n           checkout. An unreadable cart counts as not empty, so this path never clears a cart.\n           Resolves 'checkout' | 'drawer' | 'cart'; rejects with Shopify's error when the add fails.\n           Exposed as window.fizzyOneTimeCheckout for the 8\u201313 handler in fizzy-cro-2026-10-26.js. */\n        function oneTimeCheckout(id) {\n          var root = (window.Shopify && window.Shopify.routes && window.Shopify.routes.root) || '/';\n          return fetch(root + 'cart.js', { credentials: 'same-origin', headers: { 'Accept': 'application/json' } })\n            .then(function (r) { return r.ok ? r.json() : null; }, function () { return null; })\n            .then(function (cart) {\n              if (cart && Number(cart.item_count) === 0) {\n                window.location.assign(root + 'cart/' + id + ':1');\n                return 'checkout';\n              }\n              return fetch(root + 'cart/add.js', {\n                method: 'POST',\n                credentials: 'same-origin',\n                headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n                body: JSON.stringify({ items: [{ id: Number(id), quantity: 1 }] })\n              })\n                .then(function (r) {\n                  if (!r.ok) return r.json().then(function (err) { throw err; }, function () { throw new Error('Add failed'); });\n                  return r.json();\n                })\n                .then(function (response) {\n                  var added = (response && response.items) || [];\n                  var key = added.length ? added[added.length - 1].key : null;\n                  if (window.FizzyCart && typeof window.FizzyCart.refresh === 'function') {\n                    return window.FizzyCart.refresh(key).then(function () {\n                      window.FizzyCart.open();\n                      return 'drawer';\n                    });\n                  }\n                  window.location.href = root + 'cart';\n                  return 'cart';\n                });\n            });\n        }\n        window.fizzyOneTimeCheckout = oneTimeCheckout;\n\n        function checkoutOneTime(flavorKey) {\n          if (onceBusy) return;\n          // Missing child mappings must never fall back to a box parent.\n          // Legacy 8\u201313 Try It Once variants represent one pouch.\n          var isBox = !!window.__fizzyPdpChildMap;\n          var variant = (isBox && state.age !== '14+' && ONCE_813_IDS[flavorKey]) ? { id: ONCE_813_IDS[flavorKey] } : isBox ? boxChildFor(flavorKey) : pdpVariant(flavorKey, '8-13', 'once');\n          var id = variant && String(variant.id).replace(/^gid:\\/\\/shopify\\/ProductVariant\\//, '');\n          if (!variant || !/^[1-9]\\d*$/.test(id) || variant.available === false || (isBox && flavorStock(flavorKey, 'once') < 1)) {\n            if (onceError) {\n              onceError.textContent = 'This flavor is unavailable. Please choose another pouch.';\n              onceError.hidden = false;\n            }\n            return;\n          }\n          onceBusy = true;\n          onceLabel = buyOnceBtn.innerHTML;\n          buyOnceBtn.disabled = true;\n          buyOnceBtn.textContent = 'Opening checkout\u2026';\n          onceChoices.forEach(function (button) { button.disabled = true; });\n          closeBuyOncePopup(false);\n          oneTimeCheckout(id).then(function (route) {\n            if (route === 'drawer') resetOnceCheckout();\n          }, function (err) {\n            console.error('[FizzyIQ buy once] add failed', err);\n            buyOnceBtn.textContent = (err && err.description) || 'Could not add this pouch. Try again.';\n            setTimeout(resetOnceCheckout, 2200);\n          });\n        }\n        onceChoices.forEach(function (button) {\n          button.addEventListener('click', function () { checkoutOneTime(button.dataset.flavor); });\n        });\n      }\n      // \u2500\u2500 End buy-once flow \u2500\u2500\n    }\n\n    document.querySelectorAll('[data-stick-mix]').forEach(function (button) {\n      button.addEventListener('click', function () {\n        if (!isStickPlan() || purchaseBusy || !stickPrice().available) return;\n        mixEvenly();\n        stickMixReady = selectedCount() === required(); stickMixEven = true;\n        renderBundle();\n      });\n    });\n    // Deep link to Travel packs (falls back to Pouch if unavailable). Shopify answers any\n    // ?format= query with a 404, so the link is ?pack=travel or #format=travel.\n    try {\n      var formatQuery = new URLSearchParams(window.location.search);\n      var formatHash = new URLSearchParams(String(window.location.hash || '').replace(/^#/, ''));\n      var wantFormat = formatQuery.get('pack') || formatHash.get('format') || formatHash.get('pack') || '';\n      // Pouch is the default format (Sam 2026-10-27, 4:43 PM): no URL or variant param forces Travel packs.\n      // Only an explicit ?pack=travel or #format=travel opens on Travel packs; selectInitialPlan()\n      // falls back to Pouch when no travel box resolves.\n      if (/^travel(\\s*packs?)?$/i.test(wantFormat) && stickData().enabled) state.format = 'travel';\n    } catch (e) {}\n    // Select once on entry. Explicit available plan links take precedence;\n    // otherwise compare the actual upfront prices of current subscription tiers.\n    function selectInitialPlan() {\n      var choices = [];\n      hero.querySelectorAll('.tier[data-plan]').forEach(function (node) {\n        var plan = node.dataset.plan;\n        if (['1m', '3m', '15d'].indexOf(plan) === -1 || choices.some(function (choice) { return choice.plan === plan; })) return;\n        var offer = tierPrice(plan);\n        if (offer.available && Number.isFinite(offer.price) && offer.price > 0) {\n          choices.push({node: node, plan: plan, price: offer.price});\n        }\n      });\n      var requested = new URLSearchParams(window.location.search).get('plan');\n      var chosen = choices.find(function (choice) { return choice.plan === requested; });\n      // Travel packs default to Every 15 days (Sam 2026-10-26); pouch defaults to Monthly (Sam 2026-10-23).\n      if (!chosen && state.format === 'travel') chosen = choices.find(function (choice) { return choice.plan === TRAVEL_DEFAULT_PLAN; });\n      if (!chosen) chosen = choices.find(function (choice) { return choice.plan === '1m'; });\n      if (!chosen) {\n        chosen = choices.reduce(function (lowest, choice) {\n          return !lowest || choice.price < lowest.price ? choice : lowest;\n        }, null);\n      }\n      if (!chosen && state.format === 'travel') { state.format = 'pouch'; return selectInitialPlan(); }\n      // Select directly rather than chosen.node.click(): the synthetic click on every page load was\n      // recorded by MIDA as a visitor tap at 0,0 and inflated the plan-card counts (audit, Oct 28).\n      if (chosen) { pickPlan(chosen.node); selectPlanNode(chosen.plan); }\n    }\n    selectInitialPlan();\n    renderBundle();\n\n\n    // \u2500\u2500 Sticky ATC visibility \u2500\u2500\n    // Show the sticky bar once the main #addToCartBtn scrolls out of\n    // view; hide it again when the user scrolls back to the buy box.\n    // IntersectionObserver is GPU-cheap (no scroll handler running on\n    // every frame) and handles initial state correctly \u2014 on a tall\n    // mobile viewport where the ATC starts below the fold, the bar\n    // will slide in on first paint.\n    (function setupStickyAtc() {\n      if (!stickyAtc || !addBtn) return;\n      // Portal the sticky bar to <body> so it escapes the .pdp-hero\n      // stacking context (.pdp-hero uses isolation: isolate for its\n      // flavor-field crossfade; without this move, any later page\n      // section would render above the entire hero stacking context\n      // and hide the sticky bar). Only relocate if it's not already\n      // there \u2014 guards against re-runs in the section editor.\n      if (stickyAtc.parentNode !== document.body) {\n        document.body.appendChild(stickyAtc);\n      }\n      if (stickyAtcBtn) {\n        /* Sticky ATC click \u2014 smooth-scroll to the buy box on every\n           viewport. Reverted 2026-05-30 per Sam: the bar is a \"get\n           me back to where I can buy\" affordance, not a parallel\n           commit path. Target priority: .age-picker \u2192 .pdp-right \u2192\n           #flavorPicker (last resort, still inside the buy box).\n           scroll-margin-top on .age-picker (set in fizzy-dark.css)\n           keeps it clear of the fixed header. */\n        stickyAtcBtn.addEventListener('click', function () {\n          if (optimizedPurchase) {\n            if (purchaseBusy) return;\n            if (!addBtn.disabled) { addBtn.click(); return; }\n            var picker = tierPrice(state.plan).available ? document.getElementById('flavorPicker') : document.querySelector('.plans');\n            if (picker) {\n              picker.scrollIntoView({ behavior: window.matchMedia('(prefers-reduced-motion: reduce)').matches ? 'auto' : 'smooth', block: 'start' });\n              var control = picker.querySelector('button:not(:disabled), [role=\"radio\"][tabindex=\"0\"]');\n              if (control) control.focus({ preventScroll: true });\n            }\n            return;\n          }\n\n          var target = document.querySelector('.age-picker') ||\n                       document.querySelector('.pdp-right') ||\n                       document.getElementById('flavorPicker');\n          if (target) {\n            target.scrollIntoView({ behavior: 'smooth', block: 'start' });\n          }\n        });\n      }\n      if (!('IntersectionObserver' in window)) {\n        // Old browser fallback \u2014 just leave the sticky hidden. Users\n        // on these browsers can still ATC from the main buy box.\n        return;\n      }\n      /* Compute \"user has scrolled past the buy box\" directly from\n         the addBtn's bounding rect. This is the source of truth \u2014\n         IntersectionObserver fires it on threshold crossings, and a\n         scroll listener re-checks on every scroll so the state can't\n         get stuck after smooth-scrolls, widget reflows, or scroll\n         interruptions. Sam 2026-06-01: prior version observed only\n         IntersectionObserver crossings and the body class could end\n         up out of sync (sticky bar disappeared, header reappeared\n         after navigating to clinician reviews). */\n      /* The first control the buy box asks for. Once it is on screen the\n         shopper has arrived at the controls, and a bar telling them to go find\n         the plan picker is pointing at something they are already looking at. */\n      var agePicker = document.querySelector('.age-picker');\n\n      function evalStickyState() {\n        if (!addBtn) return;\n        var rect = addBtn.getBoundingClientRect();\n        var vh = window.innerHeight || document.documentElement.clientHeight;\n\n        /* Two ways for the buy box to be off screen, and the bar earns its\n           place in both. It used to show only on `bottom < 0` \u2014 scrolled past.\n           But the buy column sits well below the fold on phones and below the\n           gallery on desktop, so a reader coming down the page had no flavour\n           control and no route to the plan picker until they had already\n           reached it. `top > vh` covers that half.\n\n           No scroll guard: Sam wants it present from the top of the page, so\n           the CTA and the flavour swatches are there before the reader has\n           done anything. An earlier version held it back 240px to avoid\n           slamming in at load; the bar is the primary route to the buy box on\n           this layout, so being late is the worse failure. */\n        var past  = rect.bottom < 0;\n        var ahead = rect.top > vh;\n\n        /* 'ahead' ends when the AGE picker enters the viewport, not when the\n           add-to-cart button does (Sam 2026-08-29). Those are far apart: the\n           picker is the top of the buy box and the button is the bottom of it,\n           so on a phone the bar was still saying \"Choose your plan\" while the\n           shopper was already reading the plan tiers. Scrolling further turns\n           `past` true and the bar returns with the real add-to-cart label. */\n        if (!optimizedPurchase && ahead && agePicker) {\n          var ap = agePicker.getBoundingClientRect();\n          if (ap.top < vh) ahead = false;\n        }\n\n        var mode  = past ? 'past' : (ahead ? 'ahead' : null);\n        if (optimizedPurchase && window.matchMedia('(min-width: 1025px)').matches) mode = null;\n\n        if (mode !== stickyMode) {\n          stickyMode = mode;\n          if (stickyAtcBtn) stickyAtcBtn.innerHTML = stickyLabelFor(mode);\n          stickyAtc.setAttribute('data-sa-mode', mode || 'hidden');\n        }\n        stickyAtc.classList.toggle('visible', !!mode);\n        stickyAtc.setAttribute('aria-hidden', mode ? 'false' : 'true');\n        /* aria-hidden alone left five focusable controls in the tab order while\n           the bar was off screen: the hidden state is transform + opacity +\n           pointer-events, none of which removes an element from tab order. The\n           bar is portalled to <body>, so those were the last five tab stops on\n           the page \u2014 four swatches and a CTA that are invisible and, being\n           inside aria-hidden, silent to assistive tech (axe aria-hidden-focus).\n           inert takes them out of both. Sam 2026-08-28. */\n        if ('inert' in stickyAtc) stickyAtc.inert = !mode;\n        document.body.classList.toggle('sticky-atc-active', !!mode);\n      }\n\n      var observer = new IntersectionObserver(function () {\n        evalStickyState();\n      }, {\n        rootMargin: '0px',\n        threshold: 0\n      });\n      observer.observe(addBtn);\n      /* The age picker now decides half the state, so its crossings have to\n         wake the same evaluator. The rAF scroll fallback below covers the\n         cases where IO callbacks get stuck, as it already does for addBtn. */\n      if (agePicker) observer.observe(agePicker);\n\n      /* Scroll fallback \u2014 ensures state recovery when\n         IntersectionObserver crossings get missed or fire in\n         intermediate states. rAF-throttled so it's cheap. */\n      var stickyScrollRaf = null;\n      window.addEventListener('scroll', function () {\n        if (stickyScrollRaf) return;\n        stickyScrollRaf = requestAnimationFrame(function () {\n          stickyScrollRaf = null;\n          evalStickyState();\n        });\n      }, { passive: true });\n      /* scrollend (Chrome 114+, Firefox 109+, Safari 18.2+) fires\n         when scrolling stops \u2014 including after smooth-scroll-into-view\n         from the FR \"Read their reviews\" handler. Catches the final\n         state even when the rAF chain was interrupted by a fast\n         user scroll. Sam 2026-06-01. */\n      window.addEventListener('scrollend', evalStickyState);\n      window.addEventListener('resize', evalStickyState);\n      /* Expose for cross-section calls \u2014 the FR postMessage bridge\n         can call this after triggering a programmatic scroll so the\n         state is correct even if scrollend isn't supported in the\n         current browser. */\n      window.__fizzyEvalStickyState = evalStickyState;\n      evalStickyState();\n      // Prime the sticky's content with the initial state so the\n      // first appearance has the right plan + thumb already set.\n      syncStickyAtc();\n\n      /* Flavor-tint while the hero section is in view \u2014 when the\n         user is still on the hero (and a flavor that isn't BC is\n         selected), the sticky ATC adopts that flavor's deep color\n         so the bar reads as a continuation of the hero's flavor\n         field. Once the user scrolls past the hero, the bar\n         reverts to BC indigo. Sam 2026-06-01. */\n      if (hero) {\n        var heroTintObserver = new IntersectionObserver(function (entries) {\n          entries.forEach(function (entry) {\n            document.body.classList.toggle('sticky-atc-tinted', entry.isIntersecting);\n          });\n        }, {\n          rootMargin: '0px',\n          threshold: 0\n        });\n        heroTintObserver.observe(hero);\n      }\n\n      // \u2500\u2500 Bottom-of-page spacer \u2500\u2500\n      // The sticky bar permanently occupies a strip at the viewport\n      // bottom. Without a matching spacer, the footer's last lines\n      // (copyright, cert badges, etc.) stay covered no matter how\n      // far the user scrolls. Mark <body> with a class and set a\n      // CSS variable equal to the bar's measured height \u2014 the CSS\n      // rule in fizzy-dark.css uses that variable to extend the\n      // page just enough that the footer can scroll fully clear.\n      document.body.classList.add('has-sticky-atc');\n      function applyStickySpacer() {\n        if (!stickyAtc) return;\n        var h = stickyAtc.offsetHeight;\n        document.documentElement.style.setProperty('--sa-height', h + 'px');\n      }\n      applyStickySpacer();\n      // Re-measure on resize because the bar's height changes between\n      // the desktop layout and the narrow-mobile (sub-380px) one.\n      window.addEventListener('resize', applyStickySpacer);\n    })();\n\n    // \u2500\u2500 Free Member Gifts modal \u2500\u2500\n    // [data-mg-open] (the member-gifts card button) opens the modal;\n    // [data-mg-close] (X + backdrop) or ESC closes it. Body scroll\n    // locked while open. Sam: 2026-05-30.\n    (function setupMemberGiftsModal() {\n      var modal = document.getElementById('memberGiftsModal');\n      var openBtns = hero.querySelectorAll('[data-mg-open]');\n      var returnFocus = null;\n      if (!modal || !openBtns.length) return;\n\n      /* Force the modal to <body> root every init. Without this move\n         the modal lives inside .pdp-right, which has ancestors\n         (.pdp-stage / sticky sections / transformed slides) that\n         create their own stacking contexts and clip backdrop-filter.\n         Re-running appendChild on an already-correctly-placed node\n         is a cheap no-op, so we don't bother gating on parentNode. */\n      document.body.appendChild(modal);\n\n      function openModal(event) {\n        returnFocus = event.currentTarget;\n        window.fizzyPopupMotion.reveal(modal, function () {\n          modal.classList.add('open');\n          modal.setAttribute('aria-hidden', 'false');\n          document.body.style.overflow = 'hidden';\n          var closeBtn = modal.querySelector('.mg-close');\n          if (closeBtn) closeBtn.focus({ preventScroll: true });\n        });\n      }\n      function closeModal() {\n        window.fizzyPopupMotion.dismiss(modal, function () {\n          modal.classList.remove('open');\n          modal.setAttribute('aria-hidden', 'true');\n          document.body.style.overflow = '';\n          if (returnFocus && returnFocus.isConnected) returnFocus.focus({ preventScroll: true });\n        });\n      }\n\n      openBtns.forEach(function (button) { button.addEventListener('click', openModal); });\n      /* Close on:\n         1. Explicit [data-mg-close] (X button or backdrop)\n         2. Any click outside the dialog content card (mirrors COA / SFP\n            modal behavior \u2014 every popup on the site should support\n            click-outside-to-close). Sam: 2026-05-30. */\n      modal.addEventListener('click', function (e) {\n        if (e.target.closest('[data-mg-close]')) { closeModal(); return; }\n        var dialog = modal.querySelector('.mg-dialog');\n        if (dialog && !dialog.contains(e.target)) closeModal();\n      });\n      document.addEventListener('keydown', function (e) {\n        if (e.key === 'Escape' && modal.classList.contains('open')) closeModal();\n        if (e.key !== 'Tab' || modal.getAttribute('aria-hidden') !== 'false') return;\n\n        // Re-read visible controls so the tab loop follows dynamic modal content.\n        var focusable = Array.prototype.filter.call(modal.querySelectorAll(\n          'a[href], area[href], button, input, select, textarea, iframe, [tabindex], [contenteditable]'\n        ), function (element) {\n          return element.tabIndex >= 0 && !element.matches(':disabled') &&\n            !element.closest('[inert]') && element.getClientRects().length > 0 &&\n            window.getComputedStyle(element).visibility === 'visible';\n        });\n        if (!focusable.length) { e.preventDefault(); return; }\n        var first = focusable[0];\n        var last = focusable[focusable.length - 1];\n        var current = document.activeElement;\n        if (e.shiftKey && (current === first || focusable.indexOf(current) < 0)) {\n          e.preventDefault();\n          last.focus({ preventScroll: true });\n        } else if (!e.shiftKey && (current === last || focusable.indexOf(current) < 0)) {\n          e.preventDefault();\n          first.focus({ preventScroll: true });\n        }\n      });\n    })();\n\n    // \u2500\u2500 Info-accordion (one row open at a time) \u2500\u2500\n    // Native <details>/<summary> handles open/close on click; the shared\n    // fizzy-disclosure module animates it. The only JS here is the\n    // single-open behavior: opening a row closes any other open row \u2014\n    // routed through fizzyDisclosure.close so the outgoing row collapses\n    // rather than vanishing (yanking `open` skips the transition).\n    // Falls back to the old instant snap if that module is absent.\n    (function setupInfoAccordion() {\n      var rows = hero.querySelectorAll('.info-accordion .ia-row');\n      if (!rows.length) return;\n      rows.forEach(function (row) {\n        row.addEventListener('toggle', function () {\n          if (!row.hasAttribute('open')) return;\n          rows.forEach(function (other) {\n            if (other !== row && other.hasAttribute('open')) {\n              if (window.fizzyDisclosure) window.fizzyDisclosure.close(other);\n              else other.removeAttribute('open');\n            }\n          });\n        });\n      });\n    })();\n\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n})();\n\n/* Fullscreen product images. Keep native pinch zoom and a bounded image\n   window: only the current image and its neighbors get reading-size sources.\n   Rebuild on open for current flavor assets; release the images on close. */\n(function () {\n  'use strict';\n  var dlg = document.getElementById('pdpZoomLightbox');\n  if (!dlg) return;\n  var track = document.getElementById('pdpZoomTrack');\n  var dots = document.getElementById('pdpZoomThumbs');\n  var slides = [];\n  var activePos = -1;\n  var layoutWidth = 0;\n  var scrollFrame = 0;\n  var PZL_REDUCE = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n  function imageAtWidth(src, width) {\n    var url = new URL(src, document.baseURI);\n    if (url.hostname === 'cdn.shopify.com') url.searchParams.set('width', width);\n    return url.href;\n  }\n\n  function loadNearby(pos) {\n    /* Detach distant sources first so visiting the whole gallery never\n       leaves eleven large images attached to the dialog. */\n    slides.forEach(function (slide, i) {\n      if (Math.abs(i - pos) > 1) slide.img.removeAttribute('src');\n    });\n    slides.forEach(function (slide, i) {\n      if (Math.abs(i - pos) <= 1 && !slide.img.hasAttribute('src')) {\n        slide.img.src = slide.src;\n      }\n    });\n  }\n\n  function activate(pos) {\n    pos = Math.max(0, Math.min(pos, slides.length - 1));\n    if (pos === activePos) return;\n    activePos = pos;\n    loadNearby(pos);\n    slides.forEach(function (slide, i) {\n      slide.dot.classList.toggle('active', i === pos);\n      if (i === pos) slide.dot.setAttribute('aria-current', 'true');\n      else slide.dot.removeAttribute('aria-current');\n    });\n    var active = slides[pos].dot;\n    var target = active.offsetLeft - (dots.clientWidth - active.offsetWidth) / 2;\n    /* One update per selected image, not a new animation every scroll frame. */\n    dots.scrollTo({ left: target, behavior: 'auto' });\n  }\n\n  function select(pos, animate) {\n    var distance = Math.abs(pos - activePos);\n    activate(pos);\n    track.scrollTo({\n      left: activePos * track.clientWidth,\n      /* Jumping across the gallery should not decode every image en route. */\n      behavior: animate && distance === 1 && !PZL_REDUCE ? 'smooth' : 'auto'\n    });\n  }\n\n  function build() {\n    var readingWidth = Math.min(2400, Math.max(1600, document.documentElement.clientWidth * 2));\n    document.querySelectorAll('.pdp-stage .slide').forEach(function (slide) {\n      if (slide.querySelector('video')) return;\n      var source = slide.querySelector('img');\n      if (!source || !source.getAttribute('src')) return;\n      var cell = document.createElement('div');\n      cell.className = 'pzl-slide';\n      var img = document.createElement('img');\n      img.alt = source.getAttribute('alt') || '';\n      img.decoding = 'async';\n      cell.appendChild(img);\n      track.appendChild(cell);\n      var dot = document.createElement('button');\n      dot.type = 'button';\n      dot.className = 'pzl-thumb';\n      dot.setAttribute('aria-label', 'Image ' + (slides.length + 1) + ' of the carousel');\n      var thumb = document.createElement('img');\n      thumb.src = imageAtWidth(source.getAttribute('src'), 160);\n      thumb.alt = '';\n      thumb.width = 46;\n      thumb.height = 46;\n      thumb.decoding = 'async';\n      dot.appendChild(thumb);\n      var pos = slides.length;\n      dot.addEventListener('click', function () { select(pos, true); });\n      dots.appendChild(dot);\n      slides.push({\n        index: parseInt(slide.dataset.i, 10),\n        src: imageAtWidth(source.getAttribute('src'), readingWidth),\n        img: img,\n        dot: dot\n      });\n    });\n  }\n\n  track.addEventListener('scroll', function () {\n    if (!dlg.open || scrollFrame) return;\n    scrollFrame = requestAnimationFrame(function () {\n      scrollFrame = 0;\n      if (dlg.open && slides.length) {\n        activate(Math.round(track.scrollLeft / Math.max(track.clientWidth, 1)));\n      }\n    });\n  }, { passive: true });\n\n  /* Observe layout width only. Pinch changes the visual viewport, which must\n     not rebuild the gallery or re-center the image underneath the fingers. */\n  function preserveSlide() {\n    if (!dlg.open || activePos < 0 || track.clientWidth === layoutWidth) return;\n    layoutWidth = track.clientWidth;\n    track.scrollTo({ left: activePos * layoutWidth, behavior: 'auto' });\n  }\n  if ('ResizeObserver' in window) new ResizeObserver(preserveSlide).observe(track);\n  else window.addEventListener('resize', preserveSlide);\n\n  dlg.addEventListener('close', function () {\n    if (scrollFrame) cancelAnimationFrame(scrollFrame);\n    scrollFrame = 0;\n    slides.forEach(function (slide) { slide.img.removeAttribute('src'); });\n    track.replaceChildren();\n    dots.replaceChildren();\n    slides = [];\n    activePos = -1;\n  });\n\n  document.addEventListener('click', function (e) {\n    var t = e.target instanceof Element ? e.target : null;\n    if (!t) return;\n    if (t.closest('[data-pdp-zoom]')) {\n      if (dlg.open) return;\n      build();\n      if (!slides.length) return;\n      window.fizzyPopupMotion.open(dlg);\n      layoutWidth = track.clientWidth;\n      var counter = document.getElementById('pdpCounter');\n      var current = counter ? parseInt(counter.textContent, 10) - 1 : 0;\n      var pos = slides.findIndex(function (slide) { return slide.index === current; });\n      select(Math.max(pos, 0), false);\n      return;\n    }\n    if (t.closest('[data-pzl-close]') || t === dlg) window.fizzyPopupMotion.close(dlg);\n  });\n})();"],
  "mappings": "CAEC,UAAY,CACX,SAAS,MAAO,CACd,IAAI,KAAO,SAAS,eAAe,SAAS,EAC5C,GAAI,CAAC,KAAM,OAIX,IAAI,aAAe,SAAS,eAAe,iBAAiB,EAE5D,GADA,OAAO,gBAAkB,KACrB,aACF,GAAI,CAAE,OAAO,gBAAkB,KAAK,MAAM,aAAa,WAAW,CAAG,OAC9D,MAAO,CAAE,QAAQ,MAAM,uCAAuC,CAAG,EAKzE,UAA6B,CAC5B,IAAI,MAAQ,KAAK,cAAc,wBAAwB,EACvD,GAAI,CAAC,OAAS,MAAM,QAAQ,aAAe,OAAQ,OACnD,MAAM,QAAQ,WAAa,OAC3B,IAAI,OAAS,oCACT,OAAS,SAAS,cAAc,iCAAiC,EACrE,MAAM,QAAQ,cAAgB,UAC9B,SAAS,OAAQ,CAIX,MAAM,aAAe,MAAM,eAC7B,MAAM,cAAc,YAAY,CAAE,KAAM,cAAe,EAAG,MAAM,CAEpE,CACA,SAAS,UAAU,MAAO,CACxB,GAAI,QAAM,SAAW,QAAU,MAAM,SAAW,MAAM,eACtD,KAAI,KAAO,MAAM,KACb,KAAO,OAAO,MAAS,SAAW,KAAO,MAAQ,KAAK,KACtD,OAAS,8BAA8B,MAAM,EAC7C,OAAS,iBAAmB,MAAQ,OAAO,SAAS,KAAK,KAAK,GAAK,KAAK,OAAS,IAAM,KAAK,OAAS,MACvG,MAAM,QAAQ,cAAgB,QAC9B,MAAM,MAAM,OAAS,KAAK,MAAQ,KAClC,MAAM,MAAM,QAAU,SAE1B,CACA,SAAS,cAAe,CACtB,OAAO,QAAQ,MAAQ,OACvB,MAAM,CACR,CACA,OAAO,iBAAiB,UAAW,SAAS,EAC5C,MAAM,iBAAiB,OAAQ,KAAK,EAC/B,OAOM,OAAO,QAAQ,QAAU,OAClC,MAAM,EAEN,OAAO,iBAAiB,OAAQ,aAAc,CAAE,KAAM,EAAK,CAAC,GAT5D,OAAS,SAAS,cAAc,QAAQ,EACxC,OAAO,QAAQ,iBAAmB,OAClC,OAAO,IAAM,OAAS,8BACtB,OAAO,MAAQ,GACf,OAAO,iBAAiB,OAAQ,aAAc,CAAE,KAAM,EAAK,CAAC,EAC5D,SAAS,KAAK,YAAY,MAAM,EAMpC,GAAG,EAGH,IAAI,gBAAkB,KAAK,cAAc,uBAAuB,EAC5D,eAAiB,SAAS,cAAc,KAAK,EACjD,GAAI,iBAAmB,eAAgB,CAGrC,IAASA,sBAAT,UAAgC,CAC9B,cAAgB,EAChB,IAAI,OAAS,GACb,GAAI,eAAe,SAAW,gBAAgB,YAAa,CACzD,IAAI,OAAS,gBAAgB,sBAAsB,EAC/C,WAAa,eAAe,sBAAsB,EAAE,OACxD,OAAS,OAAO,KAAO,YAAc,OAAO,OAAS,UACvD,CACA,SAAS,KAAK,UAAU,OAAO,sBAAuB,MAAM,CAC9D,EACSC,wBAAT,UAAkC,CAC3B,gBAAe,cAAgB,sBAAsBD,qBAAoB,EAChF,EAZS,qBAAAA,sBAUA,uBAAAC,wBAZL,eAAiB,OAAO,WAAW,oBAAoB,EACvD,cAAgB,EAmBpB,GALA,OAAO,iBAAiB,SAAUA,wBAAwB,CAAE,QAAS,EAAK,CAAC,EAC3E,OAAO,iBAAiB,SAAUA,wBAAwB,CAAE,QAAS,EAAK,CAAC,EAC3E,OAAO,iBAAiB,WAAYA,uBAAsB,EAC1D,OAAO,iBAAiB,OAAQA,uBAAsB,EACtD,eAAe,iBAAiB,SAAUA,uBAAsB,EAC5D,mBAAoB,OAAQ,CAC9B,IAAI,eAAiB,IAAI,eAAeA,uBAAsB,EAC9D,eAAe,QAAQ,IAAI,EAC3B,eAAe,QAAQ,eAAe,EACtC,eAAe,QAAQ,cAAc,CACvC,CACAD,sBAAqB,CACvB,CAGA,IAAI,KAAO,CACT,GAAI,CAAE,KAAM,eAAuB,MAAO,+EAA2E,EACrH,GAAI,CAAE,KAAM,sBAAuB,MAAO,4FAAwF,EAClI,GAAI,CAAE,KAAM,aAAuB,MAAO,wEAAoE,EAC9G,GAAI,CAAE,KAAM,oBAAuB,MAAO,4FAAwF,CACpI,EAGI,aAAe,CACjB,GAAI,4EACJ,GAAI,4EACJ,GAAI,4EACJ,GAAI,2EACN,EAOI,mBAAqB,CAGvB,GAAI,6HACJ,GAAI,oIACJ,GAAI,4HACJ,GAAI,iIACN,EAKI,gBAAkB,CACpB,GAAI,2FACJ,GAAI,gGACJ,GAAI,gGACJ,GAAI,2FACN,EAII,aAAe,CAMjB,GAAI,oHACJ,GAAI,iHACJ,GAAI,oHACJ,GAAI,4GACN,EAKI,qBAAuB,CAKzB,GAAI,qHACJ,GAAI,4HACJ,GAAI,oHACJ,GAAI,yHACN,EAQI,sBAAwB,UAAU,SAAS,eAAe,eAAe,CAAC,GAAK,CAKjF,GAAI,uHACJ,GAAI,qHACJ,GAAI,qHACJ,GAAI,yHACN,EAII,QAAU,UAAU,SAAS,eAAe,QAAQ,CAAC,GAAK,CAC5D,GAAI,oGACJ,GAAI,mGACJ,GAAI,mGACJ,GAAI,8FACN,EAMA,SAAS,UAAU,GAAI,CACrB,GAAI,CAAC,IAAM,CAAC,GAAG,SAAW,CAAC,GAAG,QAAQ,SAAU,OAAO,KACvD,IAAI,IAAM,SAAU,EAAG,CAAE,GAAI,CAAE,OAAO,IAAI,IAAI,EAAG,OAAO,SAAS,IAAI,EAAE,IAAM,OAAS,EAAG,CAAE,OAAO,CAAG,CAAE,EACnG,EAAI,GAAG,QACX,MAAO,CAAE,GAAI,IAAI,EAAE,QAAQ,EAAG,GAAI,IAAI,EAAE,QAAQ,EAAG,GAAI,IAAI,EAAE,QAAQ,EAAG,GAAI,IAAI,EAAE,QAAQ,CAAE,CAC9F,CAMA,IAAI,YAAc,CAAE,KAAM,EAAG,KAAM,EAAG,KAAM,CAAE,EAC9C,SAAS,MAAM,OAAQ,SAAU,CAC/B,OAAI,OAAO,QAAW,UAAY,CAAC,SAAS,MAAM,EAAU,cACrD,IAAI,KAAK,aAAa,SAAS,gBAAgB,MAAQ,QAAS,CACrE,MAAO,WAAY,SAAU,OAAO,oBAAsB,MAC1D,sBAAuB,WAAa,IAAQ,OAAS,EAAI,EAAI,EAC7D,sBAAuB,CACzB,CAAC,EAAE,OAAO,MAAM,CAClB,CACA,SAAS,kBAAmB,CAC1B,MAAO,CAAE,MAAO,KAAM,IAAK,EAAG,SAAU,EAAG,SAAU,EAAG,UAAW,EAAM,CAC3E,CACA,SAAS,eAAe,MAAO,QAAS,UAAW,CACjD,GAAI,CAAC,OAAO,SAAS,OAAO,KAAK,CAAC,GAAK,OAAO,KAAK,GAAK,GAAK,YAAc,GAAO,OAAO,iBAAiB,EAC1G,IAAI,MAAQ,OAAO,KAAK,EAAI,IACxB,IAAM,OAAO,OAAO,EAAI,OAAO,KAAK,EAAI,OAAO,OAAO,EAAI,IAAM,EACpE,MAAO,CAAE,MAAO,MAAO,IAAK,IAAK,SAAU,IAAM,IAAM,MAAQ,EAC7D,SAAU,IAAM,KAAK,OAAO,IAAM,OAAS,IAAM,GAAG,EAAI,EAAG,UAAW,EAAK,CAC/E,CACA,SAAS,SAAS,IAAK,KAAM,CAC3B,IAAI,IAAM,OAAO,kBAAoB,CAAC,EAClC,IAAM,IAAI,GAAG,GAAK,IAAI,GAAG,EAAE,IAAI,EACnC,OAAO,IAAM,eAAe,IAAI,MAAO,IAAI,IAAK,IAAI,SAAS,EAAI,iBAAiB,CACpF,CACA,IAAI,YAAc,CAAE,KAAM,UAAW,KAAM,UAAW,KAAM,UAAW,MAAO,eAAgB,EAK1F,cAAgB,CAClB,KAAM,mBACN,KAAM,mBACN,KAAM,mBACN,MAAO,eACT,EAEI,MAAQ,CACV,KAAM,KACN,OAAQ,QAER,MAAO,GAIP,IAAK,OAAO,uBAAyB,MAAQ,MAAQ,OAErD,IAAK,CAAE,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,CAAE,CACpC,EAOA,SAAS,WAAY,CAAE,OAAO,OAAO,iBAAmB,CAAC,CAAG,CAC5D,SAAS,YAAY,KAAM,CACzB,IAAI,EAAI,MAAQ,MAAM,KACtB,OAAO,MAAM,SAAW,WAAa,IAAM,MAAQ,IAAM,MAAQ,IAAM,QAAU,CAAC,CAAC,UAAU,EAAE,OACjG,CACA,SAAS,WAAW,KAAM,CACxB,IAAI,SAAW,UAAU,EAAE,UAAY,CAAC,EACxC,OAAO,SAAS,MAAM,IAAM,KAAO,MAAQ,MAAM,KAAK,GAAK,IAC7D,CAEA,SAAS,UAAU,KAAM,CAAE,IAAI,EAAI,MAAQ,MAAM,KAAM,OAAQ,MAAM,MAAQ,MAAQ,GAAK,KAAO,IAAM,KAAO,EAAI,IAAM,MAAQ,GAAM,EAAI,CAG1I,SAAS,SAAU,CAAE,IAAI,EAAI,UAAU,EAAE,WAAa,CAAC,EAAG,GAAK,OAAO,EAAE,MAAM,GAAG,GAAK,EAAE,EAAE,KAAK,EAAG,MAAO,aAAa,KAAK,EAAE,EAAI,GAAK,IAAM,CAC5I,SAAS,YAAa,CACpB,IAAI,GAAK,QAAQ,EAAG,EAAI,IAAM,aAAa,KAAK,EAChD,MAAO,CAAC,EAAE,IAAM,EAAE,0BAA4B,CAAC,GAAG,KAAK,SAAU,EAAG,CAAE,OAAO,OAAO,EAAE,eAAe,IAAM,EAAI,CAAC,EAClH,CACA,SAAS,QAAQ,KAAM,CAAE,OAAQ,MAAQ,MAAM,QAAU,OAAS,MAAM,QAAU,IAAM,WAAW,CAAG,CACtG,SAAS,cAAe,CAAE,OAAO,QAAQ,KAAK,EAAI,gBAAkB,eAAiB,CACrF,SAAS,UAAU,KAAM,CAAE,IAAI,EAAI,MAAQ,MAAM,KAAM,OAAO,IAAM,KAAO,GAAK,IAAM,MAAS,QAAQ,CAAC,EAAI,GAAK,GAAM,EAAI,CAC3H,SAAS,aAAa,KAAM,CAC1B,IAAI,MAAQ,WAAW,IAAI,EAAG,KAAO,UAAU,IAAI,EACnD,MAAI,CAAC,OAAS,CAAC,MAAM,QAAQ,MAAM,QAAQ,EAAU,KAC9C,MAAM,SAAS,KAAK,SAAU,EAAG,CAAE,OAAO,OAAO,EAAE,OAAO,EAAE,KAAK,IAAM,OAAO,IAAI,CAAG,CAAC,GAAK,IACpG,CAGA,SAAS,gBAAgB,KAAM,CAC7B,IAAI,QAAU,aAAa,IAAI,EAAG,KAAQ,SAAW,QAAQ,0BAA6B,CAAC,EACvF,EAAI,MAAQ,MAAM,KAAM,IAAM,IAAM,MAAQ,QAAQ,EAAI,KAC5D,GAAI,KAAO,QAAQ,CAAC,EAAG,OAAO,KAAK,KAAK,SAAU,EAAG,CAAE,OAAO,OAAO,EAAE,eAAe,IAAM,GAAK,CAAC,GAAK,KAEvG,GADI,MAAK,KAAO,KAAK,OAAO,SAAU,EAAG,CAAE,OAAO,OAAO,EAAE,eAAe,IAAM,GAAK,CAAC,GAClF,KAAK,SAAW,EAAG,OAAO,KAAK,CAAC,EACpC,IAAI,OAAS,WAAW,IAAI,GAAK,CAAC,GAAG,OAAS,CAAC,EAAG,KAAO,UAAU,IAAI,EACvE,OAAO,KAAK,KAAK,SAAU,EAAG,CAAE,OAAO,IAAI,OAAO,UAAY,KAAO,qBAAsB,GAAG,EAAE,KAAK,MAAM,EAAE,eAAe,GAAK,EAAE,CAAG,CAAC,GAAK,IAC9I,CACA,SAAS,YAAY,KAAM,CAAE,IAAI,EAAI,gBAAgB,IAAI,EAAG,OAAO,GAAK,aAAa,KAAK,OAAO,EAAE,eAAe,CAAC,EAAI,EAAE,gBAAkB,IAAM,CACjJ,SAAS,cAAc,EAAG,CACxB,IAAI,IAAM,UAAU,EAAE,UAAY,CAAC,EAC/B,MAAQ,CAAC,GAAG,cAAc,GAAG,qBAAqB,GAAG,aAAa,GAAG,kBAAkB,EAC3F,QAAS,QAAQ,IACf,GAAI,KAAK,YAAY,EAAE,QAAQ,aAAc,EAAE,IAAM,MAAM,CAAC,EAC5D,KAAI,MAAQ,IAAI,IAAI,EAAG,GAAK,OAAS,OAAO,OAAU,SAAW,MAAM,GAAK,MAC5E,MAAK,aAAa,KAAK,OAAO,EAAE,CAAC,EAC1B,CAAC,GAAG,GAAG,OAAO,IAAI,EADkB,KAG7C,OAAO,IACT,CACA,SAAS,WAAW,KAAM,CACxB,IAAI,QAAU,aAAa,IAAI,EAAG,WAAa,gBAAgB,IAAI,EACnE,GAAI,CAAC,SAAW,CAAC,YAAc,CAAC,YAAY,IAAI,GAAK,CAAC,CAAC,KAAK,KAAK,KAAK,IAAI,EAAE,MAAM,aAAa,EAAG,OAAO,iBAAiB,EAE1H,IAAI,EAAI,eAAe,WAAW,MAAO,QAAQ,MAAO,QAAQ,SAAS,EACrE,IAAM,WAAW,mBAAqB,CAAC,EACvC,MAAQ,IAAI,KAAK,SAAU,EAAG,CAAE,OAAO,OAAO,EAAE,QAAQ,IAAM,CAAG,CAAC,EACtE,OAAI,EAAE,YAAW,EAAE,QAAU,OAAS,OAAO,MAAM,KAAK,EAAI,EAAI,OAAO,MAAM,KAAK,EAAI,IAAM,OAAO,QAAQ,KAAK,EAAI,KAC7G,CACT,CAEA,SAAS,cAAe,CAAE,OAAO,YAAY,EAAK,MAAM,OAAS,MAAQ,EAAI,UAAU,EAAI,GAAM,CAAG,CACpG,SAAS,gBAAgB,OAAQ,KAAM,CACrC,IAAI,SAAW,MAAM,OACrB,MAAM,OAAS,OACf,IAAI,GAAK,UAAU,IAAI,EAAE,UACzB,aAAM,OAAS,SACR,EACT,CAEA,SAAS,WAAY,CAEnB,GADA,kBAAkB,EACd,GAAC,YAAY,GAAK,CAAC,WAAW,EAAE,WAGpC,QADI,KAAO,aAAa,EAAG,OAAS,KAAK,MAAM,UAAU,EAAI,IAAI,EAC1D,UAAW,GAAG,CACnB,IAAI,QAAU,CAAC,KAAK,KAAK,KAAK,IAAI,EAAE,OAAO,YAAY,EAAE,KAAK,SAAU,EAAG,EAAG,CAAE,OAAO,MAAM,IAAI,CAAC,EAAI,MAAM,IAAI,CAAC,CAAG,CAAC,EACrH,GAAI,CAAC,QAAQ,OAAQ,MACrB,MAAM,IAAI,QAAQ,CAAC,CAAC,GAAK,IAC3B,CACF,CACA,SAAS,WAAW,EAAG,CACrB,IAAI,MAAQ,UAAU,EAAE,WAAY,MAAQ,cAAc,CAAC,EAC3D,GAAI,CAAC,MAAO,MAAO,GACnB,GAAI,CAAC,MAAO,MAAO,KACnB,QAAS,QAAQ,MACf,GAAI,KAAK,YAAY,EAAE,QAAQ,aAAc,EAAE,IAAM,MAAM,OAAO,YAAY,EAAE,QAAQ,aAAc,EAAE,EAAG,CACzG,IAAI,MAAQ,OAAO,MAAM,IAAI,CAAC,EAC9B,OAAO,OAAO,SAAS,KAAK,EAAI,KAAK,IAAI,EAAG,KAAK,EAAI,CACvD,CAEF,MAAO,IACT,CACA,SAAS,gBAAiB,CACxB,IAAI,IAAM,SAAS,EACnB,OAAO,IAAM,GAAK,cAAc,IAAM,KAAO,CAAC,KAAK,KAAK,KAAK,IAAI,EAAE,MAAM,SAAU,EAAG,CACpF,IAAI,EAAI,MAAM,IAAI,CAAC,EACnB,OAAO,OAAO,UAAU,CAAC,GAAK,GAAK,IAAM,CAAC,YAAY,GAAK,EAAI,aAAa,IAAM,KAC/E,CAAC,GAAM,YAAY,CAAC,GAAK,GAAK,YAAY,CAAC,EAChD,CAAC,CACH,CACA,SAAS,mBAAoB,CAAE,CAAC,KAAK,KAAK,KAAK,IAAI,EAAE,QAAQ,SAAU,EAAG,CAAE,MAAM,IAAI,CAAC,EAAI,CAAG,CAAC,CAAG,CAIlG,IAAI,eAAiB,KACjB,oBAAsB,GAGtB,cAAgB,GAAO,aAAe,GAC1C,SAAS,qBAAsB,CAI7B,GAHA,kBAAkB,EAClB,oBAAsB,GACtB,cAAgB,GAAM,aAAe,GACjC,EAAC,UAAU,MAAM,IAAI,EAAE,WACvB,cAAY,GAAK,CAAC,WAAW,EAAE,WAEnC,SADI,KAAO,aAAa,EAAG,MAAQ,IAC5B,SAAU,GAAK,aAAa,cAAc,GAAG,MAAM,IAAI,cAAc,GAAK,KACjF,GAAK,YAAY,EACjB,KAAO,SAAU,GAAK,cAAc,EAAI,SAAS,GAAG,CAClD,IAAI,QAAU,CAAC,KAAK,KAAK,KAAK,IAAI,EAAE,OAAO,YAAY,EAAE,KAAK,SAAU,EAAG,EAAG,CAAE,OAAO,MAAM,IAAI,CAAC,EAAI,MAAM,IAAI,CAAC,CAAG,CAAC,EACrH,GAAI,CAAC,QAAQ,OAAQ,MACrB,MAAM,IAAI,QAAQ,CAAC,CAAC,GAAK,IAC3B,EACF,CAEA,IAAI,oBAAsB,MAE1B,SAAS,aAAa,IAAK,KAAM,CAC/B,IAAI,KAAO,YAAY,IAAI,EAAI,GAC/B,GAAI,CAAC,KAAM,OAAO,KAClB,IAAI,IAAM,WAAW,GAAG,EAAE,QAC1B,QAAS,QAAQ,IACf,GAAI,IAAI,OAAO,UAAY,KAAO,SAAS,EAAE,KAAK,IAAI,EAAG,OAAO,IAAI,IAAI,EAE1E,OAAO,IACT,CACA,SAAS,iBAAiB,KAAM,CAC9B,GAAI,YAAY,IAAI,EAAG,OAAO,WAAW,IAAI,EAC7C,GAAI,CAAC,OAAO,mBAAoB,OAAO,SAAS,MAAM,IAAK,IAAI,EAC/D,IAAI,OAAS,YAAY,IAAI,EACzB,OAAS,aAAa,MAAM,IAAK,IAAI,EACzC,GAAI,CAAC,QAAU,CAAC,OAAQ,OAAO,iBAAiB,EAGhD,QAFI,KAAO,QAAU,MAAM,MAAQ,MAAQ,EAAI,GAC3C,KAAO,WAAW,MAAM,GAAG,EAAE,SACxB,EAAI,EAAG,EAAI,KAAK,OAAQ,IAAK,CACpC,IAAI,QAAU,KAAK,CAAC,EACpB,GAAI,OAAO,QAAQ,OAAO,EAAE,KAAK,IAAM,OAAO,IAAI,EAClD,KAAI,MAAQ,QAAQ,MAChB,YAAc,QAAQ,0BAA4B,CAAC,EACnD,WAAa,YAAY,KAAK,SAAU,KAAM,CAAE,OAAO,OAAO,KAAK,eAAe,IAAM,OAAO,MAAM,CAAG,CAAC,EAC7G,GAAI,YAAY,QAAU,CAAC,WAAY,OAAO,iBAAiB,EAC3D,aAAY,MAAQ,WAAW,OAEnC,IAAI,EAAI,eAAe,MAAO,WAAa,QAAQ,MAAQ,QAAQ,iBAAkB,QAAQ,SAAS,EAClG,IAAM,YAAc,WAAW,kBACnC,OAAI,EAAE,WAAa,KAAO,IAAI,OAAS,GAAK,OAAO,IAAI,CAAC,EAAE,KAAK,EAAI,IAAG,EAAE,QAAU,OAAO,IAAI,CAAC,EAAE,KAAK,EAAI,KAClG,EACT,CACA,OAAO,iBAAiB,CAC1B,CAEA,SAAS,oBAAqB,CAC5B,MAAO,EACT,CACA,SAAS,UAAU,KAAM,CACvB,IAAI,EAAI,iBAAiB,IAAI,EAC7B,GAAI,CAAC,EAAE,WAAa,CAAC,mBAAmB,EAAG,OAAO,EAClD,IAAI,WAAa,KAAK,MAAM,EAAE,MAAQ,EAAE,EAAI,IAC5C,GAAI,YAAY,IAAI,EAAG,CAGrB,IAAI,MAAQ,KAAK,MAAM,EAAE,MAAQ,GAAG,EACpC,YAAc,MAAQ,KAAK,MAAM,MAAQ,GAAK,GAAG,GAAK,GACxD,CACA,MAAO,CAAC,MAAO,WAAY,IAAK,EAAE,MAAO,SAAU,EAAE,MAAQ,WAAY,SAAU,GAAI,UAAW,EAAI,CACxG,CACA,SAAS,wBAAwB,KAAM,CACrC,IAAI,QAAU,iBAAiB,IAAI,EAAG,MAAQ,UAAU,IAAI,EAC5D,GAAI,CAAC,QAAQ,WAAa,CAAC,MAAM,UAAW,MAAO,oBACnD,IAAI,KAAO,YAAY,IAAI,EAAI,UAAU,IAAI,GAAK,YAAY,IAAI,GAAK,GAAK,GAC5E,OAAO,mBAAmB,EACtB,MAAM,MAAM,KAAK,EAAI,UAAY,KAAO,SACxC,QAAQ,SAAW,QAAQ,UAAY,QAAQ,MAC7C,MAAM,QAAQ,KAAK,EAAI,oBAAsB,MAAM,QAAQ,OAAO,EAAI,UAAY,KAAO,SACzF,MAAM,QAAQ,KAAK,EAAI,UAAY,KAAO,QAClD,CACA,SAAS,kBAAmB,CAAE,OAAO,YAAY,EAAI,wBAAwB,MAAM,IAAI,EAAI,EAAI,CAC/F,SAAS,gBAAiB,CAAE,OAAQ,MAAM,OAAS,MAAQ,aAAa,EAAI,YAAY,MAAM,IAAI,GAAK,IAAM,SAAQ,UAAU,EAAI,eAAiB,CAGpJ,IAAI,eAAiB,GACjB,aAAe,CAAE,GAAI,eAAgB,GAAI,eAAgB,GAAI,eAAgB,GAAI,cAAe,EAEhG,cAAgB,GACpB,SAAS,YAAY,IAAK,CAAE,OAAO,MAAQ,MAAQ,cAAgB,cAAgB,CACnF,SAAS,UAAW,CAAE,OAAO,MAAM,MAAQ,MAAQ,WAAa,gBAAa,CAI7E,SAAS,YAAY,EAAG,CACtB,IAAI,GAAK,OAAO,mBAChB,GAAI,CAAC,GAAI,OAAO,KAChB,IAAI,MAAQ,CAAE,GAAI,cAAe,GAAI,qBAAsB,GAAI,aAAc,GAAI,kBAAmB,EAChG,KAAO,MAAM,CAAC,EAClB,QAAS,KAAK,GACZ,GAAI,OAAO,CAAC,EAAE,YAAY,EAAE,QAAQ,cAAe,EAAE,IAAM,KAAM,CAI/D,IAAI,EAAI,GAAG,CAAC,EACZ,OAAQ,GAAK,OAAO,GAAM,SAAY,EAAI,CAAE,GAAI,EAAG,OAAQ,CAAE,CAC/D,CAEF,OAAO,IACT,CAGA,SAAS,WAAW,IAAK,CACvB,IAAI,MAAQ,OAAO,iBAAmB,CAAC,GAAG,GAAG,GAAK,CAAC,EACnD,MAAO,CAAE,SAAU,MAAM,QAAQ,KAAK,QAAQ,EAAI,KAAK,SAAW,CAAC,EAAG,QAAS,KAAK,SAAW,CAAC,CAAE,CACpG,CAIA,SAAS,YAAY,EAAG,KAAM,CAC5B,GAAI,YAAY,IAAI,EAAG,MAAO,CAAC,CAAC,cAAc,CAAC,GAAK,WAAW,CAAC,GAAK,aAAa,EAMlF,GAAI,OAAO,mBAAoB,CAC7B,IAAI,EAAI,YAAY,CAAC,EACrB,GAAI,CAAC,EAAG,MAAO,GACf,IAAI,GAAK,OAAO,qBAChB,GAAI,GAAI,CACN,IAAI,KAAO,SAAU,EAAG,CAAE,OAAO,OAAO,CAAC,EAAE,YAAY,EAAE,QAAQ,cAAe,EAAE,CAAG,EACrF,QAAS,MAAM,GACb,GAAI,KAAK,EAAE,IAAM,KAAK,EAAE,MAAM,EAAG,OAAO,OAAO,GAAG,EAAE,CAAC,EAAI,CAE7D,CACA,OAAO,EAAE,YAAc,EACzB,CACA,IAAI,EAAI,OAAO,gBAAiB,MAAQ,GAAK,EAAE,MAAM,GAAG,EAAG,OAAS,OAAS,MAAM,OAAO,MAAS,SAAW,KAAO,MAAM,IAAI,EAC/H,OAAK,OACE,OAAO,CAAC,IAAM,GADD,EAEtB,CAKA,SAAS,YAAY,EAAG,KAAM,CAC5B,GAAI,YAAY,IAAI,EAAG,OAAO,KAAK,MAAM,WAAW,CAAC,EAAI,aAAa,CAAC,EAAI,aAAa,EACxF,GAAI,CAAC,OAAO,oBAAsB,CAAC,OAAO,qBAAsB,MAAO,KACvE,IAAI,EAAI,YAAY,CAAC,EACrB,GAAI,CAAC,EAAG,MAAO,KACf,IAAI,KAAO,SAAU,EAAG,CAAE,OAAO,OAAO,CAAC,EAAE,YAAY,EAAE,QAAQ,cAAe,EAAE,CAAG,EACrF,QAAS,MAAM,OAAO,qBACpB,GAAI,KAAK,EAAE,IAAM,KAAK,EAAE,MAAM,EAAG,CAC/B,IAAI,EAAI,OAAO,OAAO,qBAAqB,EAAE,CAAC,EAC9C,OAAO,MAAM,CAAC,EAAI,IAAW,KAAK,IAAI,EAAG,CAAC,CAC5C,CAEF,MAAO,IACT,CAEA,IAAI,OAAS,KAAK,iBAAiB,eAAe,EAC9C,cAAgB,SAAS,eAAe,eAAe,EACvD,WAAa,SAAS,eAAe,YAAY,EACjD,UAAY,SAAS,eAAe,WAAW,EAC/C,UAAY,SAAS,eAAe,WAAW,EAG/C,aAAe,SAAS,iBAAiB,8BAA8B,EACvE,QAAU,SAAS,eAAe,SAAS,EAC3C,QAAU,KAGd,SAAS,KAAK,UAAU,IAAI,WAAW,EACvC,IAAI,UAAY,GAKhB,SAAS,cAAc,EAAG,CACxB,IAAI,KAAO,SAAS,KACpB,KAAK,UAAU,OAAO,YAAa,YAAa,YAAa,WAAW,EACxE,KAAK,UAAU,IAAI,UAAY,CAAC,CAClC,CAQA,IAAI,SAAW,SAAS,eAAe,UAAU,EACjD,SAAS,WAAW,EAAG,CACrB,GAAK,SACL,KAAI,IAAM,SAAS,cAAc,+BAAiC,EAAI,IAAI,EAC1E,GAAK,IACL,KAAI,KAAO,IAAI,aAAa,WAAW,GAAK,GACxC,SAAS,cAAgB,OAI7B,SAAS,UAAU,IAAI,QAAQ,EAC/B,WAAW,UAAY,CACrB,SAAS,YAAc,KACvB,SAAS,UAAU,OAAO,QAAQ,CACpC,EAAG,GAAG,IACR,CAEA,IAAI,YAAc,EAClB,SAAS,OAAO,EAAG,CAKb,IAAM,UAOV,QAAU,EACV,KAAK,UAAU,IAAI,eAAe,EAGlC,cAAc,CAAC,EAGX,KAAK,UAAU,SAAS,wBAAwB,IAClD,KAAK,UAAU,OAAO,YAAa,YAAa,YAAa,WAAW,EACxE,KAAK,UAAU,IAAI,UAAY,CAAC,GAGlC,WAAW,CAAC,EAIZ,OAAO,QAAQ,SAAU,GAAI,CAAE,GAAG,UAAU,OAAO,SAAU,GAAG,QAAQ,IAAM,CAAC,CAAG,CAAC,EAC/E,gBACF,cAAc,UAAU,IAAI,QAAQ,EACpC,WAAW,UAAY,CACrB,cAAc,YAAc,KAAK,CAAC,EAAE,KACpC,cAAc,UAAU,OAAO,QAAQ,CACzC,EAAG,GAAG,GAEJ,UAIF,QAAQ,UAAU,IAAI,QAAQ,EAC9B,WAAW,UAAY,CACrB,QAAQ,YAAc,KAAK,CAAC,EAAE,KAC9B,QAAQ,UAAU,OAAO,QAAQ,CACnC,EAAG,GAAG,GAEJ,aACF,WAAW,UAAU,IAAI,QAAQ,EACjC,WAAW,UAAY,CACrB,WAAW,YAAc,KAAK,CAAC,EAAE,MACjC,WAAW,UAAU,OAAO,QAAQ,CACtC,EAAG,GAAG,GAEJ,YAAW,UAAU,QAAQ,EAAI,GAIjC,cAAgB,aAAa,QAC/B,aAAa,QAAQ,SAAU,EAAG,CAAE,EAAE,UAAU,OAAO,SAAU,EAAE,QAAQ,IAAM,CAAC,CAAG,CAAC,EAExF,iBAAiB,CAAC,EAClB,sBAAsB,CAAC,EACvB,2BAA2B,CAAC,EAC5B,0BAA0B,CAAC,EAC3B,yBAAyB,CAAC,EAC1B,yBAAyB,CAAC,EAC1B,oBAAoB,CAAC,EACrB,kBAAkB,CAAC,EAIf,OAAO,eAAkB,YAAY,cAAc,EACnD,aAAa,aAAa,WAAW,EACzC,YAAc,WAAW,UAAY,CAGnC,KAAK,UAAU,OAAO,YAAa,YAAa,YAAa,WAAW,EACxE,KAAK,UAAU,IAAI,UAAY,CAAC,EAChC,KAAK,UAAU,OAAO,eAAe,EACrC,UAAY,EACd,EAAG,GAAG,EAER,CAGA,IAAI,UAAY,SAAS,eAAe,WAAW,EAC/C,gBAAkB,SAAS,eAAe,iBAAiB,EAC3D,UAAY,SAAS,eAAe,WAAW,EAC/C,eAAiB,GAKrB,SAAS,cAAc,EAAG,CACxB,IAAI,OAAS,SAAS,eAAe,YAAY,EACjD,GAAK,OACL,KAAI,MAAQ,SAAS,cAAc,+BAAiC,EAAI,eAAe,EAEnF,WAAa,YAAY,GAAK,UAAU,EAAE,WAC1C,OAAU,YAAc,WAAW,CAAC,GAAO,OAAS,MAAM,IAC1D,QAAU,OAAO,aAAa,KAAK,IAAM,SAAQ,OAAO,IAAM,QAC9D,KAAK,CAAC,IAAG,OAAO,IAAM,cAAgB,KAAK,CAAC,EAAE,MAAQ,YAAY,EAAI,eAAiB,WAC7F,CACA,SAAS,aAAa,EAAG,CACvB,IAAI,SAAW,SAAS,eAAe,cAAc,EACjD,MAAQ,SAAS,cAAc,+BAAiC,EAAI,eAAe,EACnF,UAAY,OAAS,SAAS,MAAQ,MAAM,MAAK,SAAS,IAAM,MAAM,IAC5E,CACA,SAAS,gBAAgB,QAAS,CAChC,GAAI,GAAC,SAAW,CAAC,WAEjB,KAAI,OAAS,UAAY,CACnB,UAAY,WAAa,QAAQ,QACrC,UAAU,UAAU,IAAI,aAAa,CACvC,EACA,QAAQ,iBAAiB,UAAW,MAAM,EACtC,CAAC,QAAQ,QAAU,QAAQ,YAAc,GAAG,OAAO,EACzD,CACI,WAAW,gBAAgB,SAAS,EAExC,SAAS,kBAAmB,CAC1B,GAAI,GAAC,iBAAmB,CAAC,WACzB,KAAI,OAAS,UAAU,OACnB,QAAU,WAAW,UAAU,UAAU,OAAO,aAAa,EACjE,gBAAgB,UAAU,OAAO,SAAU,MAAM,EACjD,gBAAgB,aAAa,aAAc,OAAS,aAAe,aAAa,EAClF,CACI,iBAAmB,YACrB,gBAAgB,iBAAiB,QAAS,SAAU,EAAG,CACrD,EAAE,gBAAgB,EACd,UAAU,QACZ,eAAiB,GACjB,UAAU,KAAK,EAAE,MAAM,UAAY,CAAC,CAAC,IAErC,eAAiB,GACjB,UAAU,MAAM,GAElB,iBAAiB,CACnB,CAAC,EACD,UAAU,iBAAiB,OAAQ,gBAAgB,EACnD,UAAU,iBAAiB,QAAS,gBAAgB,GAUtD,IAAI,iBAAmB,SAAS,eAAe,kBAAkB,EAC7D,sBAAwB,SAAS,eAAe,uBAAuB,EAC3E,SAAS,sBAAsB,EAAG,CAChC,GAAK,mBAAmB,CAAC,EACzB,KAAI,QAAU,mBAAmB,CAAC,EAKlC,GADI,wBAAuB,sBAAsB,IAAM,SACnD,EAAC,kBACD,iBAAiB,MAAQ,QAC7B,KAAI,IAAM,IAAI,MACd,IAAI,OAAS,UAAY,CACvB,iBAAiB,MAAM,QAAU,IACjC,sBAAsB,UAAY,CAChC,iBAAiB,IAAM,QACvB,sBAAsB,UAAY,CAChC,iBAAiB,MAAM,QAAU,EACnC,CAAC,CACH,CAAC,CACH,EACA,IAAI,IAAM,SACZ,CAOA,IAAI,aAAe,SAAS,eAAe,cAAc,EACrD,kBAAoB,SAAS,eAAe,mBAAmB,EACnE,qBAAuB,UAAU,YAAY,GAAK,qBAClD,SAAS,0BAA0B,EAAG,CACpC,GAAK,qBAAqB,CAAC,EAC3B,KAAI,QAAU,qBAAqB,CAAC,EAEpC,GADI,oBAAmB,kBAAkB,IAAM,SAC3C,EAAC,cACD,aAAa,MAAQ,QACzB,KAAI,IAAM,IAAI,MACd,IAAI,OAAS,UAAY,CACnB,UAAY,IAChB,aAAa,MAAM,QAAU,IAC7B,sBAAsB,UAAY,CAChC,aAAa,IAAM,QACnB,sBAAsB,UAAY,CAChC,aAAa,MAAM,QAAU,EAC/B,CAAC,CACH,CAAC,EACH,EACA,IAAI,IAAM,SACZ,CAKA,IAAI,cAAgB,SAAS,eAAe,eAAe,EACvD,mBAAqB,SAAS,eAAe,oBAAoB,EACrE,SAAS,2BAA2B,EAAG,CACrC,GAAK,sBAAsB,CAAC,EAC5B,KAAI,QAAU,sBAAsB,CAAC,EAErC,GADI,qBAAoB,mBAAmB,IAAM,SAC7C,EAAC,eACD,cAAc,MAAQ,QAC1B,KAAI,IAAM,IAAI,MACd,IAAI,OAAS,UAAY,CACnB,UAAY,IAChB,cAAc,MAAM,QAAU,IAC9B,sBAAsB,UAAY,CAChC,cAAc,IAAM,QACpB,sBAAsB,UAAY,CAChC,cAAc,MAAM,QAAU,EAChC,CAAC,CACH,CAAC,EACH,EACA,IAAI,IAAM,SACZ,CAOA,IAAI,cAAgB,SAAS,eAAe,eAAe,EACvD,iBAAmB,SAAS,eAAe,kBAAkB,EACjE,SAAS,yBAAyB,EAAG,CACnC,GAAK,gBAAgB,CAAC,EACtB,KAAI,QAAU,gBAAgB,CAAC,EAE/B,GADI,mBAAkB,iBAAiB,IAAM,SACzC,EAAC,eACD,cAAc,MAAQ,QAC1B,KAAI,IAAM,IAAI,MACd,IAAI,OAAS,UAAY,CACvB,cAAc,MAAM,QAAU,IAC9B,sBAAsB,UAAY,CAChC,cAAc,IAAM,QACpB,sBAAsB,UAAY,CAChC,cAAc,MAAM,QAAU,EAChC,CAAC,CACH,CAAC,CACH,EACA,IAAI,IAAM,SACZ,CAMA,IAAI,YAAc,SAAS,eAAe,aAAa,EACnD,iBAAmB,SAAS,eAAe,kBAAkB,EACjE,aAAe,UAAU,WAAW,GAAK,aACzC,SAAS,yBAAyB,EAAG,CACnC,GAAK,aAAa,CAAC,EACnB,KAAI,QAAU,aAAa,CAAC,EAE5B,GADI,mBAAkB,iBAAiB,IAAM,SACzC,EAAC,aACD,YAAY,MAAQ,QACxB,KAAI,IAAM,IAAI,MACd,IAAI,OAAS,UAAY,CACnB,UAAY,IAChB,YAAY,MAAM,QAAU,IAC5B,sBAAsB,UAAY,CAChC,YAAY,IAAM,QAClB,sBAAsB,UAAY,CAChC,YAAY,MAAM,QAAU,EAC9B,CAAC,CACH,CAAC,EACH,EACA,IAAI,IAAM,SACZ,CAIA,IAAI,OAAS,SAAS,eAAe,QAAQ,EACzC,YAAc,SAAS,eAAe,aAAa,EACvD,SAAS,oBAAoB,EAAG,CAC9B,GAAK,QAAQ,CAAC,EACd,KAAI,QAAU,QAAQ,CAAC,EAEvB,GADI,cAAa,YAAY,IAAM,SAC/B,EAAC,QACD,OAAO,MAAQ,QACnB,KAAI,IAAM,IAAI,MACd,IAAI,OAAS,UAAY,CACnB,UAAY,IAChB,OAAO,MAAM,QAAU,IACvB,sBAAsB,UAAY,CAChC,OAAO,IAAM,QACb,sBAAsB,UAAY,CAChC,OAAO,MAAM,QAAU,EACzB,CAAC,CACH,CAAC,EACH,EACA,IAAI,IAAM,SACZ,CAMA,IAAI,WAAa,MAAM,UAAU,MAAM,KAAK,SAAS,iBAAiB,yBAAyB,CAAC,EAChG,SAAS,kBAAkB,EAAG,CAC5B,WAAW,QAAQ,SAAU,IAAK,CAChC,IAAI,IAAM,UAAU,GAAG,EACnB,QAAU,KAAO,IAAI,CAAC,EAC1B,GAAI,GAAC,SAAW,IAAI,MAAQ,SAC5B,IAAI,IAAI,QAAQ,aAAa,EAAG,CAAE,IAAI,IAAM,QAAS,MAAQ,CAC7D,IAAI,IAAM,IAAI,MACd,IAAI,OAAS,UAAY,CAAM,UAAY,IAAG,IAAI,IAAM,QAAS,EACjE,IAAI,IAAM,QACZ,CAAC,CACH,CAEA,SAAS,iBAAiB,EAAG,CAC3B,GAAI,GAAC,WAAa,CAAC,WACnB,KAAI,QAAU,SAAS,eAAe,UAAU,EAC5C,IAAM,aAAa,CAAC,EAGxB,GAFA,cAAc,CAAC,EAEX,IAAK,CAEP,GAAI,UAAU,QAAQ,MAAQ,KAAO,UAAU,UAAU,SAAS,WAAW,EAAG,CAC1E,CAAC,gBAAkB,UAAU,UAAU,SAAS,QAAQ,EAC1D,UAAU,KAAK,EAAE,MAAM,UAAY,CAAC,CAAC,EAC9B,UAAU,MAAM,EACzB,iBAAiB,EACjB,MACF,CAIA,IAAI,SAAW,UACf,SAAS,MAAM,EACf,IAAI,SAAW,SAAS,cAAc,OAAO,EAC7C,SAAS,GAAK,YACd,SAAS,IAAM,IACf,SAAS,QAAQ,IAAM,IACvB,SAAS,MAAQ,GACjB,SAAS,KAAO,GAChB,SAAS,YAAc,GACvB,SAAS,QAAU,OACnB,SAAS,SAAW,GACpB,SAAS,iBAAiB,OAAQ,gBAAgB,EAClD,SAAS,iBAAiB,QAAS,gBAAgB,EACnD,SAAS,WAAW,aAAa,SAAU,QAAQ,EACnD,UAAY,SAER,WAAW,UAAU,UAAU,OAAO,aAAa,EACvD,gBAAgB,QAAQ,EACpB,CAAC,gBAAkB,UAAU,UAAU,SAAS,QAAQ,GAC1D,UAAU,KAAK,EAAE,MAAM,UAAY,CAAE,iBAAiB,CAAG,CAAC,EAEvD,UAAU,UAAU,SAAS,WAAW,GAC3C,UAAU,UAAU,IAAI,WAAW,EAEjC,SAAW,UAAU,UAAU,SAAS,QAAQ,GAClD,QAAQ,UAAU,IAAI,mBAAmB,EAE3C,iBAAiB,CACnB,KAAO,CAEL,UAAU,UAAU,OAAO,WAAW,EAClC,SAAS,QAAQ,UAAU,OAAO,mBAAmB,EACzD,GAAI,CAAE,UAAU,MAAM,CAAG,OAAS,EAAG,CAAC,CACxC,CAMA,aAAa,CAAC,EAChB,CAGA,IAAI,MAAQ,SAAS,eAAe,UAAU,EAC1C,MAAQ,SAAS,eAAe,UAAU,EAC9C,GAAI,OAAS,MAAO,CASlB,IAASE,WAAT,SAAmB,EAAG,CACpB,IAAI,MAAQ,OAAO,OACnB,SAAW,KAAK,IAAI,EAAG,KAAK,IAAI,MAAQ,EAAG,CAAC,CAAC,EAC7C,OAAO,QAAQ,SAAU,EAAG,GAAI,CAC9B,EAAE,UAAU,OAAO,SAAU,KAAO,QAAQ,EAC5C,EAAE,aAAa,eAAgB,KAAO,SAAW,OAAS,OAAO,CACnE,CAAC,EACD,OAAO,QAAQ,SAAU,EAAG,GAAI,CAAE,EAAE,UAAU,OAAO,SAAU,KAAO,QAAQ,CAAG,CAAC,EAC9E,UAAS,QAAQ,YAAe,SAAW,EAAK,MAAQ,OAGxD,WAAa,WAAa,UAAU,UAAU,SAAS,WAAW,IAChE,OAAO,QAAQ,IAAM,UAClB,gBAAgB,UAAU,KAAK,EAAE,MAAM,UAAY,CAAC,CAAC,EAE1D,UAAU,MAAM,GAIpB,MAAM,UAAU,OACd,oBACA,OAAO,QAAQ,IAAM,WAAa,WAAa,UAAU,UAAU,SAAS,WAAW,CACzF,EAGA,MAAM,UAAU,OAAO,gBAAiB,OAAO,QAAQ,IAAM,SAAS,EAGtE,iBAAiB,EAEjB,IAAI,YAAc,OAAO,QAAQ,EAC7B,cAAgB,OAAO,WAAW,oCAAoC,EAAE,QACxE,iBAAmB,UAAY,SAAS,SAAS,SAAS,aAAa,GAAK,SAAS,cAAc,QAAQ,gBAAgB,EAC/H,GAAI,aAAe,WAAa,CAAC,eAAiB,SAAS,QAAQ,QAAQ,GAAK,kBAAmB,CACjG,IAAI,GAAK,YAAY,sBAAsB,EACvC,GAAK,SAAS,sBAAsB,EAMpC,WAAa,iBAAiB,QAAQ,EAAE,gBAAkB,SAC1D,WACE,GAAG,IAAM,GAAG,IAAK,SAAS,WAAa,GAAG,IAAM,GAAG,IAAM,EACpD,GAAG,OAAS,GAAG,SAAQ,SAAS,WAAa,GAAG,OAAS,GAAG,OAAS,GAE1E,GAAG,KAAO,GAAG,KAAM,SAAS,YAAc,GAAG,KAAO,GAAG,KAAO,EACzD,GAAG,MAAQ,GAAG,QAAO,SAAS,YAAc,GAAG,MAAQ,GAAG,MAAQ,EAE/E,CACF,EAWSC,aAAT,UAAuB,CACrB,IAAI,EAAI,MAAM,YACd,GAAI,IAAM,EACV,KAAI,EAAI,KAAK,MAAM,MAAM,WAAa,CAAC,EACnC,IAAM,UAAUD,WAAU,CAAC,EACjC,EACSE,QAAT,UAAkB,CAChB,GAAI,YAAc,KAClB,WAAY,KACZ,aAAa,QAAQ,EAGrB,IAAI,EAAI,MAAM,YACV,EAAI,GAAK,KAAK,IAAI,MAAM,WAAa,KAAK,MAAM,MAAM,WAAa,CAAC,EAAI,CAAC,EAAI,GAAGD,aAAY,EAClG,EACSE,SAAT,SAAiB,EAAG,CAClB,IAAI,MAAQ,OAAO,OACf,QAAW,EAAI,MAAS,OAAS,MACrC,UAAY,OACZ,aAAa,QAAQ,EACrB,SAAW,WAAWD,QAAQ,IAAI,EAClC,MAAM,SAAS,CAAE,KAAM,OAAS,MAAM,YAAa,SAAU,WAAa,UAAU,QAAU,OAAS,QAAS,CAAC,EACjHF,WAAU,MAAM,CAClB,EAmESI,OAAT,UAAiB,CACf,GAAK,GACL,OAAM,UAAU,OAAO,UAAU,EACjC,IAAI,EAAI,MAAM,YACd,GAAI,EAAI,EAAG,CACT,IAAI,EAAI,KAAK,MAAM,MAAM,WAAa,CAAC,EACvC,MAAM,SAAS,CAAE,KAAM,EAAI,EAAG,SAAU,QAAS,CAAC,CACpD,CACA,GAAK,KACP,EAhKS,UAAAJ,WA6DA,YAAAC,aAMA,OAAAC,QASA,QAAAC,SA2EA,MAAAC,OA/JL,OAAS,MAAM,iBAAiB,QAAQ,EACxC,SAAW,SAAS,eAAe,WAAW,EAC9C,OAAS,SAAW,SAAS,iBAAiB,IAAI,EAAI,CAAC,EACvD,QAAU,SAAS,eAAe,YAAY,EAC9C,QAAU,MAAM,cAAc,aAAa,EAC3C,QAAU,MAAM,cAAc,aAAa,EAC3C,SAAW,EA4DX,UAAY,KACZ,SAAW,KACX,UAAY,OAAO,YAAc,OAAO,WAAW,kCAAkC,EA0BrF,UAAY,KAChB,MAAM,iBAAiB,SAAU,UAAY,CACvC,YACJ,UAAY,sBAAsB,UAAY,CAE5C,GADA,UAAY,KACR,YAAc,KAAM,CACtB,IAAI,EAAI,MAAM,YACV,EAAI,GAAK,KAAK,MAAM,MAAM,WAAa,CAAC,IAAM,WAAa,KAAK,IAAI,MAAM,WAAa,UAAY,CAAC,EAAI,GAAGF,QAAO,EACtH,MACF,CACAD,aAAY,CACd,CAAC,EACH,EAAG,CAAE,QAAS,EAAK,CAAC,EACpB,MAAM,iBAAiB,YAAaC,OAAM,EAE1C,MAAM,iBAAiB,cAAe,UAAY,CAAE,UAAY,KAAM,aAAa,QAAQ,CAAG,CAAC,EAE3F,WAGF,SAAS,iBAAiB,QAAS,SAAU,EAAG,CAC9C,IAAI,KAAO,SAAS,sBAAsB,EACtC,OAAS,EAAE,SAAW,KAAK,MAAQ,EAAE,QAAU,KAAK,OAAS,EAAE,SAAW,KAAK,KAAO,EAAE,QAAU,KAAK,OACvG,CAAC,QAAU,EAAE,YAAY,EAAE,eAAe,CAChD,EAAG,CAAE,QAAS,EAAM,CAAC,EACrB,SAAS,iBAAiB,QAAS,SAAU,EAAG,CAC9C,IAAI,EAAI,EAAE,OAAO,QAAQ,IAAI,EAC7B,GAAI,GAAC,GAAK,CAAC,SAAS,SAAS,CAAC,GAC9B,KAAI,EAAI,SAAS,EAAE,QAAQ,EAAG,EAAE,EAC5B,OAAO,SAAS,CAAC,GAAGC,SAAQ,CAAC,EACnC,CAAC,GAWC,WAAU,SAAS,MAAM,UAAY,IACrC,SAAS,QAAQ,iBAAiB,QAAS,UAAY,CAAEA,SAAQ,SAAW,CAAC,CAAG,CAAC,EACjF,SAAS,QAAQ,iBAAiB,QAAS,UAAY,CAAEA,SAAQ,SAAW,CAAC,CAAG,CAAC,EAErF,MAAM,SAAW,EACjB,MAAM,iBAAiB,UAAW,SAAU,EAAG,CACzC,EAAE,MAAQ,cAAeA,SAAQ,SAAW,CAAC,EAAG,EAAE,eAAe,GACjE,EAAE,MAAQ,eAAgBA,SAAQ,SAAW,CAAC,EAAG,EAAE,eAAe,EACxE,CAAC,EAGD,IAAI,GAAK,KACT,MAAM,iBAAiB,cAAe,SAAU,EAAG,CAC7C,EAAE,OAAO,QAAQ,QAAQ,IAC7B,GAAK,CAAE,EAAG,EAAE,QAAS,KAAM,MAAM,WAAY,MAAO,CAAE,EACtD,MAAM,kBAAkB,EAAE,SAAS,EACnC,MAAM,UAAU,IAAI,UAAU,EAChC,CAAC,EACD,MAAM,iBAAiB,cAAe,SAAU,EAAG,CACjD,GAAK,GACL,KAAI,GAAK,EAAE,QAAU,GAAG,EACxB,GAAG,MAAQ,KAAK,IAAI,GAAG,MAAO,KAAK,IAAI,EAAE,CAAC,EAC1C,MAAM,WAAa,GAAG,KAAO,GAC/B,CAAC,EAWD,MAAM,iBAAiB,YAAaC,MAAK,EACzC,MAAM,iBAAiB,gBAAiBA,MAAK,EAE7CJ,WAAU,CAAC,CACb,CAGA,iBAAiB,OAAO,EAGxB,SAAS,UAAW,CAClB,GAAI,YAAY,EAAG,OAAO,UAAU,EACpC,IAAI,OAAS,YAAY,MAAM,IAAI,GAAK,EAEpC,QAAU,MAAM,MAAQ,MAAQ,EAAI,EACxC,OAAO,OAAS,OAClB,CACA,SAAS,eAAgB,CACvB,OAAO,MAAM,IAAI,GAAK,MAAM,IAAI,GAAK,MAAM,IAAI,GAAK,MAAM,IAAI,EAChE,CAGA,SAAS,aAAa,EAAG,CACvB,IAAI,KAAO,aAAa,EACxB,OAAO,cAAc,EAAI,MAAQ,SAAS,GAAK,UAAU,MAAM,IAAI,EAAE,WACnE,YAAY,CAAC,GAAK,MAAM,IAAI,CAAC,EAAI,MAAQ,YAAY,CAAC,CAC1D,CACA,SAAS,iBAAkB,CACzB,aAAa,CACf,CAOA,IAAI,kBAAoB,KAAK,UAAU,SAAS,wBAAwB,EACpE,aAAe,GAGnB,SAAS,iBAAkB,CACzB,MAAO,CAAC,KAAM,KAAM,KAAK,EAAE,KAAK,SAAU,KAAM,CAAE,OAAO,gBAAgB,SAAU,IAAI,CAAG,CAAC,CAC7F,CACA,SAAS,qBAAsB,CAC7B,IAAI,SAAW,gBAAgB,EAC/B,KAAK,iBAAiB,kCAAkC,EAAE,QAAQ,SAAU,IAAK,CAC/E,IAAI,GAAK,IAAI,QAAQ,SAAW,MAAM,OACtC,IAAI,UAAU,OAAO,WAAY,EAAE,EACnC,IAAI,aAAa,eAAgB,GAAK,OAAS,OAAO,EACtD,IAAI,SAAW,GAAK,EAAI,GACxB,IAAI,aAAa,gBAAiB,IAAI,QAAQ,SAAW,UAAY,CAAC,SAAW,OAAS,OAAO,CACnG,CAAC,CACH,CAEA,SAAS,kBAAmB,CAC1B,oBAAoB,EACpB,IAAI,YAAc,mBAAmB,EACrC,KAAK,UAAU,OAAO,aAAc,WAAW,EAE/C,IAAIK,OAAQ,SAAS,iBAAiB,kBAAkB,EACxDA,OAAM,QAAQ,SAAU,KAAM,CAC5B,IAAI,KAAO,KAAK,QAAQ,KACxB,GAAK,KACL,KAAI,EAAI,UAAU,IAAI,EACtB,GAAI,OAAS,MAAO,CAElB,IAAI,YAAc,YAAY,KAAK,GAAK,EAAE,UAC1C,KAAK,OAAS,CAAC,YAGf,IAAI,YAAc,KAAK,YAAc,KAAK,WAAW,cAAc,uBAAuB,EACtF,YAAc,KAAK,YAAc,KAAK,WAAW,cAAc,uBAAuB,EAG1F,GAFI,aAAe,aAAe,KAAK,qBAAuB,YAAa,YAAY,WAAW,aAAa,KAAM,WAAW,EACvH,CAAC,aAAe,aAAe,YAAY,qBAAuB,MAAM,YAAY,WAAW,aAAa,KAAM,YAAY,WAAW,EAC9I,CAAC,YAAa,CAAE,KAAK,aAAa,gBAAiB,MAAM,EAAG,MAAQ,CAExE,IAAI,QAAU,KAAK,cAAc,cAAc,EAAG,MAAQ,WAAW,EACjE,UACF,QAAQ,OAAS,CAAC,MAClB,QAAQ,iBAAiB,YAAY,EAAE,QAAQ,SAAU,EAAG,CAC1D,IAAI,GAAK,OAAO,EAAE,QAAQ,GAAG,KAAO,QAAQ,KAAK,EAAI,GAAK,IAC1D,EAAE,aAAa,eAAgB,GAAK,OAAS,OAAO,EACpD,EAAE,UAAU,OAAO,QAAS,EAAE,CAChC,CAAC,GAEH,IAAI,YAAc,KAAK,cAAc,cAAc,EAC/C,cAAa,YAAY,YAAc,MAAQ,gBAAkB,gBACvE,CACA,IAAI,WAAa,KAAK,cAAc,kBAAkB,EAClD,aAAY,WAAW,OAAS,EAAE,EAAE,WAAa,EAAE,IAAM,EAAE,QAC/D,IAAI,WAAa,YAAY,IAAI,GAAK,EAClC,WAAa,YAAc,MAAM,MAAQ,MAAQ,EAAI,GACrD,aAAe,YAAY,IAAI,EAAI,UAAU,IAAI,EAAI,WAAa,GAClE,QAAU,KAAK,cAAc,sBAAsB,EACvD,GAAI,QAAS,CACX,IAAI,YAAc,EAAE,WAAa,EAAE,MAAQ,GAAK,aAAe,EAC/D,QAAQ,OAAS,CAAC,YAClB,QAAQ,MAAM,QAAU,YAAc,GAAK,OAC3C,QAAQ,YAAc,YAAc,MAAM,EAAE,MAAQ,aAAc,EAAI,EAAI,WAAa,EACzF,CACA,IAAI,UAAY,KAAK,cAAc,qBAAqB,EACpD,YAAW,UAAU,YAAc,YAAY,IAAI,EAAI,UAAU,IAAI,EAAI,gBAAkB,YAAc,aAAe,EAAI,SAAW,aAC3I,IAAI,MAAQ,KAAK,cAAc,MAAM,EACjC,QAAU,KAAK,cAAc,QAAQ,EACrC,OAAS,KAAK,cAAc,OAAO,EACnC,OAAS,KAAK,cAAc,kBAAkB,EAC9C,UAAS,QAAQ,YAAc,MAAM,EAAE,KAAK,GAChD,KAAK,aAAa,gBAAiB,EAAE,UAAY,QAAU,MAAM,EAGjE,IAAI,SAAW,YAAY,MAAM,GAAG,EAKhC,oBAAsB,YAAY,IAAI,EACtC,UAAY,oBAAsB,EAAE,IAAM,KAAK,MAAM,SAAW,WAAa,GAAG,EAAI,IACpF,cAAgB,EAAE,YAAc,qBAAwB,OAAO,SAAS,QAAQ,GAAK,SAAW,IAClG,OAAO,SAAS,SAAS,GAAK,UAAY,EAAE,MAC1C,UAAY,KAAK,cAAc,aAAa,EAEhD,GADI,WAAW,UAAU,UAAU,OAAO,iBAAkB,CAAC,EAAE,OAAS,cAAc,EAClF,MAAO,CAGT,GAFA,MAAM,UAAU,IAAI,gBAAgB,EACpC,MAAM,YAAc,GAChB,cAAe,CACjB,IAAIC,WAAY,SAAS,cAAc,MAAM,EAC7CA,WAAU,UAAY,kBACtBA,WAAU,YAAc,kBACxB,IAAI,WAAa,SAAS,cAAc,MAAM,EAC9C,WAAW,UAAY,wBACvB,WAAW,YAAc,MAAM,SAAS,EACxC,MAAM,YAAYA,UAAS,EAC3B,MAAM,YAAY,UAAU,CAC9B,CACA,MAAM,OAAS,CAAC,cAChB,MAAM,MAAM,QAAU,cAAgB,GAAK,MAC7C,CACI,SAAQ,OAAO,YAAc,QAAU,MAAM,EAAE,QAAQ,EAAI,SAAQ,EAAE,SAAW,KAChF,SAAU,OAAO,YAAc,QAAU,EAAE,SAAW,IAAK,OAAO,MAAM,QAAU,EAAE,SAAW,GAAK,QAC1G,CAAC,EACD,SAAS,iBAAiB,mBAAmB,EAAE,QAAQ,SAAU,GAAI,CACnE,GAAG,YAAc,SACnB,CAAC,EACD,SAAS,iBAAiB,qBAAqB,EAAE,QAAQ,SAAU,GAAI,CACrE,IAAIC,MAAO,YAAY,MAAM,GAAG,EAChC,GAAG,YAAcA,MAAO,EAAI,SAAQ,MAAMA,MAAO,GAAI,EAAI,EAAI,WAAa,EAC5E,CAAC,EACD,IAAI,QAAU,SAAS,cAAc,0BAA0B,EAC/D,GAAI,QACF,GAAI,OAAO,mBAAoB,CAK7B,IAAI,OAAS,YAAY,MAAM,GAAG,EAClC,QAAQ,YAAc,OAAS,EAAI,MAAM,MAAM,EAAI,mBACrD,KAAO,CACL,IAAI,KAAO,SAAS,OAAQ,MAAM,EAClC,QAAQ,YAAc,MAAM,KAAK,KAAK,CACxC,CAEJ,CACA,SAAS,iBAAiB,wBAAyB,UAAW,CAC5D,iBAAiB,EACjB,aAAa,EACb,cAAc,CAChB,CAAC,EAED,iBAAiB,GAIhB,UAAY,CACX,IAAI,GAAM,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAG,IAAI,QAAQ,EAC/D,IAAM,kBAAkB,KAAK,EAAE,GAAK,KAAO,SAAW,OAAO,EAAE,CACrE,GAAG,EAEH,IAAI,cAAgB,SAAS,eAAe,eAAe,EACvD,eAAiB,SAAS,eAAe,gBAAgB,EACzD,OAAS,SAAS,eAAe,cAAc,EAQ/C,UAAmB,SAAS,eAAe,WAAW,EACtD,aAAmB,SAAS,eAAe,cAAc,EACzD,eAAmB,SAAS,eAAe,gBAAgB,EAC3D,cAAmB,SAAS,eAAe,eAAe,EAC1D,gBAAkB,EAClB,eAAmB,SAAS,eAAe,gBAAgB,EAC3D,aAAmB,SAAS,eAAe,cAAc,EACzD,oBAAsB,SAAS,eAAe,qBAAqB,EACnE,cAAmB,SAAS,iBAAiB,2BAA2B,EAYxE,WAAa,KAQjB,SAAS,cAAe,CACtB,IAAI,KAAO,KACX,OAAC,KAAM,IAAI,EAAE,QAAQ,SAAU,KAAM,CACnC,IAAI,EAAI,UAAU,IAAI,EACtB,GAAK,EAAE,UACP,KAAI,IAAM,EAAE,OAAS,YAAY,IAAI,EAAI,KACrC,CAAC,MAAQ,IAAM,KAAK,OAAK,KAAO,CAAE,IAAK,IAAK,KAAM,KAAM,MAAO,EAAE,MAAO,KAAM,YAAY,IAAI,EAAI,EAAG,GAC3G,CAAC,EACM,IACT,CAEA,SAAS,eAAe,KAAM,CAC5B,GAAI,kBAAmB,CACrB,GAAI,aAAc,MAAO,eACzB,IAAI,OAAS,UAAU,MAAM,IAAI,EACjC,GAAI,CAAC,OAAO,UAAW,MAAO,uBAC9B,IAAI,SAAW,cAAc,IAAM,SAAS,GAAK,SAAS,EAAI,EAI9D,GAAI,UAAY,CAAC,YAAY,EAAG,CAC9B,IAAI,cAAgB,CAAC,KAAM,KAAM,KAAM,IAAI,EAAE,OAAO,SAAU,EAAG,CAAE,OAAO,MAAM,IAAI,CAAC,EAAI,CAAG,CAAC,EACzF,KAAO,cAAc,SAAW,GAAM,KAAK,cAAc,CAAC,CAAC,GAAK,CAAC,GAAG,MAAQ,WAAc,cAAc,OAAS,WACrH,MAAO,OAAS,KAAO,UAAS,YAAY,MAAM,IAAI,GAAK,IAAM,SAAQ,MAAM,OAAO,KAAK,EAAI,SACjG,CACA,OAAQ,SAAW,cAAgB,kBAAoB,SAAQ,MAAM,OAAO,KAAK,EAAI,SACvF,CAEA,IAAI,MAAQ,aAAa,EACzB,OAAI,MAAc,cAAgB,MAAM,MAAM,IAAK,EAAI,EAAI,qBACpD,OAAS,QAAU,0BAA4B,yBACxD,CAEA,SAAS,wBAAyB,CAChC,IAAI,GAAK,SAAS,cAAc,oBAAoB,EACpD,GAAK,GACL,KAAI,UAAY,UAAU,MAAM,IAAI,EAAE,UACtC,GAAG,OAAS,UACZ,GAAG,YAAc,UAAY,GAAK,kEACpC,CAEA,SAAS,eAAgB,CACvB,GAAK,aAGL,IAFA,aAAa,SAAW,mBAAqB,aAC7C,aAAa,UAAY,eAAe,UAAU,EAC9C,cAAe,CACjB,IAAI,UAAY,YAAY,EAAI,eAAe,EAAI,cAAc,MAAM,IAAI,GAAK,YAAY,MAAM,IAAI,GAAK,GAC3G,aAAa,eAAe,EACxB,cAAc,cAAgB,WAChC,cAAc,UAAU,IAAI,QAAQ,EACpC,gBAAkB,WAAW,UAAY,CACvC,cAAc,YAAc,UAC5B,cAAc,UAAU,OAAO,QAAQ,CACzC,EAAG,GAAG,GACC,cAAc,UAAU,OAAO,QAAQ,CAClD,CAGA,IAAI,EAAI,UAAU,MAAM,IAAI,EAE5B,GADI,GAAK,iBAAgB,eAAe,YAAc,MAAM,EAAE,KAAK,GAC/D,GAAK,aAAc,CAAE,IAAI,MAAQ,EAAE,IAAS,OAAO,oBAAsB,CAAC,YAAY,GAAK,MAAM,MAAQ,QAAU,MAAM,OAAS,MAAQ,MAAM,OAAS,QAAO,MAAQ,KAAK,MAAM,YAAY,MAAM,GAAG,GAAK,MAAM,OAAS,KAAO,EAAI,GAAK,GAAG,EAAI,KAAK,aAAa,YAAc,MAAM,KAAK,EAAG,aAAa,OAAS,CAAC,MAAO,aAAa,MAAM,QAAU,MAAQ,GAAK,MAAQ,CAOrX,GAHI,qBAAuB,KAAK,OAAO,IACrC,oBAAoB,YAAc,KAAK,OAAO,EAAE,MAE9C,eAAgB,CAClB,IAAI,QAAU,SAAS,cACrB,+BAAiC,QAAU,eAC7C,EACI,SAAW,eAAe,MAAQ,QAAQ,MAC5C,eAAe,IAAM,QAAQ,IAEjC,CAGI,eAAiB,cAAc,QACjC,cAAc,QAAQ,SAAU,EAAG,CACjC,EAAE,UAAU,OAAO,SAAU,EAAE,QAAQ,IAAM,OAAO,EAWpD,IAAI,GAAK,EAAE,aAAa,QAAQ,IAAM,QACtC,EAAE,aAAa,eAAgB,GAAK,OAAS,OAAO,EACpD,IAAI,MAAQ,OAAO,aAAgB,WAAa,YAAY,EAAE,aAAa,QAAQ,CAAC,EAAI,GAKxF,EAAE,SAAW,GACb,EAAE,UAAU,OAAO,aAAc,CAAC,KAAK,EACvC,IAAI,IAAM,KAAK,EAAE,aAAa,QAAQ,CAAC,GAAK,CAAC,GAAG,MAAQ,EAAE,aAAa,QAAQ,EAC/E,EAAE,aAAa,aAAc,MAAQ,GAAK,GAAK,eAAe,CAClE,CAAC,EAEH,CAGI,eAAiB,cAAc,QACjC,cAAc,QAAQ,SAAU,IAAK,CACnC,IAAI,iBAAiB,QAAS,UAAY,CACxC,IAAI,EAAI,IAAI,QAAQ,EAChB,GAAG,OAAO,CAAC,CACjB,CAAC,CACH,CAAC,EAIH,SAAS,qBAAsB,CAC7B,IAAI,EAAI,UAAU,MAAM,IAAI,EACxB,MAAQ,KAAK,cAAc,uBAAuB,EAClD,QAAU,KAAK,cAAc,yBAAyB,EACtD,MAAQ,EAAE,WAAa,EAAE,MAAQ,EACjC,QAAO,MAAM,OAAS,CAAC,OAC3B,IAAI,MAAQ,OAAS,CAAC,YAAY,GAAK,kBAAkB,EACrD,UAAS,QAAQ,YAAc,OAAS,CAAC,YAAY,GAAK,CAAC,MAAQ,wBAAwB,MAAM,IAAI,EAAI,GAC/G,CAKA,SAAS,mBAAoB,CAC3B,IAAI,SAAW,KAAK,cAAc,oBAAoB,EAClD,OAAS,KAAK,cAAc,kBAAkB,EAClD,GAAI,CAAC,UAAY,CAAC,OAAQ,MAAO,GACjC,IAAI,QAAU,iBAAiB,MAAM,IAAI,EAAG,MAAQ,UAAU,MAAM,IAAI,EACxE,GAAI,CAAC,QAAQ,WAAa,CAAC,MAAM,UAAW,MAAO,GACnD,IAAI,MAAQ,YAAY,MAAM,IAAI,GAAK,GAAK,GACxC,QAAU,SAAS,EACnB,SAAW,QAAU,GACrB,WAAa,KAAK,MAAM,UAAY,MAAM,MAAQ,MAAQ,EAAI,EAAE,EACpE,SAAS,YAAc,SAAW,UAAY,EAAI,SAAW,YAAc,SAAQ,SAAW,kBAAiB,WAAa,cAC5H,IAAI,KAAO,mBAAmB,EAC1B,CAAC,CAAC,SAAW,KAAO,QAAS,MAAM,MAAM,KAAK,CAAC,CAAC,EAChD,QAAQ,SAAW,QAAQ,UAAY,QAAQ,MAC7C,CAAC,CAAC,YAAa,MAAM,QAAQ,KAAK,CAAC,EAAG,CAAC,cAAgB,KAAO,QAAS,MAAM,QAAQ,OAAO,CAAC,CAAC,EAC9F,CAAC,CAAC,SAAW,KAAO,QAAS,MAAM,QAAQ,KAAK,CAAC,CAAC,EACxD,cAAO,YAAc,GACrB,KAAK,QAAQ,SAAU,EAAG,CACxB,IAAI,IAAM,SAAS,cAAc,KAAK,EAClC,GAAK,SAAS,cAAc,IAAI,EAAG,GAAG,YAAc,EAAE,CAAC,EAC3D,IAAI,GAAK,SAAS,cAAc,IAAI,EAAG,GAAG,YAAc,EAAE,CAAC,EAC3D,IAAI,YAAY,EAAE,EAAG,IAAI,YAAY,EAAE,EAAG,OAAO,YAAY,GAAG,CAClE,CAAC,EACM,EACT,CAEA,SAAS,cAAe,CAItB,CAAC,KAAM,KAAM,KAAM,IAAI,EAAE,QAAQ,SAAU,EAAG,CACxC,MAAM,IAAI,CAAC,GAAK,CAAC,YAAY,CAAC,IAAG,MAAM,IAAI,CAAC,EAAI,GACpD,IAAI,IAAM,YAAY,CAAC,EACnB,MAAM,IAAI,CAAC,EAAI,MAAK,MAAM,IAAI,CAAC,EAAI,IACzC,CAAC,EACD,IAAI,IAAM,SAAS,EACf,IAAM,cAAc,EACpB,UAAY,IAAM,IAkCtB,GAjCA,KAAK,UAAU,OAAO,aAAc,YAAY,CAAC,EACjD,KAAK,QAAQ,aAAe,MAAM,KAClC,KAAK,QAAQ,UAAY,UAAU,EACnC,KAAK,QAAQ,cAAgB,UAAU,EACvC,SAAS,iBAAiB,mBAAmB,EAAE,QAAQ,SAAU,GAAI,CAAE,GAAG,OAAS,CAAC,YAAY,CAAG,CAAC,EACpG,SAAS,iBAAiB,qBAAqB,EAAE,QAAQ,SAAU,GAAI,CAAE,GAAG,YAAc,UAAU,EAAI,eAAiB,CAAC,EAC1H,SAAS,iBAAiB,mBAAmB,EAAE,QAAQ,SAAU,GAAI,CAAE,GAAG,YAAc,aAAa,CAAG,CAAC,EACzG,SAAS,iBAAiB,sBAAsB,EAAE,QAAQ,SAAU,GAAI,CAAE,GAAG,YAAc,iBAAiB,CAAG,CAAC,EAChH,SAAS,iBAAiB,2BAA2B,EAAE,QAAQ,SAAU,IAAK,CACvE,IAAI,QAAQ,WAAY,IAAI,QAAQ,SAAW,IAAI,aAAa,KAAK,EAAG,IAAI,QAAQ,SAAW,IAAI,KACxG,IAAI,KAAO,IAAI,QAAQ,MAAM,EAAG,EAAI,MAAQ,KAAK,QAAQ,EACrD,OAAS,YAAY,GAAK,UAAU,EAAE,OAAS,UAAU,EAAE,OAAO,CAAC,EAAI,IAAI,QAAQ,SACnF,QAAU,IAAI,aAAa,KAAK,IAAM,SAAQ,IAAI,IAAM,QAC5D,IAAI,IAAM,YAAY,GAAK,KAAK,CAAC,GAAK,CAAC,GAAG,KAAO,0BAA4B,IAAI,QAAQ,QAC3F,CAAC,EAED,cAAc,OAAO,EACrB,aAAa,OAAO,EAGpB,SAAS,iBAAiB,qBAAqB,EAAE,QAAQ,SAAU,KAAM,CACvE,KAAK,YAAc,YAAY,EAAK,MAAQ,KAAO,cAAgB,6BAA+B,aAAe,GAAK,gCAAkC,MAAQ,IAAM,oBAAsB,aAAa,EAAI,iDAAmD,uBAAyB,aAAa,EAAI,qCAAuC,aAAa,EAAI,QAAW,MAAQ,EACjX,+CACA,MAAQ,IACL,oBAAsB,uEAAyE,0DAChG,yEACR,CAAC,EAEG,gBACF,cAAc,UAAY,MAAQ,IAAM,cAAgB,IAAM,SAAW,YAAY,EAAI,eAAiB,YAC1G,cAAc,UAAU,OAAO,WAAY,MAAQ,KAAO,IAAM,CAAC,GAG/D,eAAgB,CAClB,IAAI,IAAM,IAAM,EAAI,KAAK,IAAI,EAAG,IAAM,GAAG,EAAI,EACzC,OAAS,eAAe,cAAc,OAAO,EAC7C,SAIF,OAAO,MAAM,UAAY,UAAY,IAAM,KAE7C,eAAe,UAAU,OAAO,WAAY,MAAQ,KAAO,IAAM,CAAC,CACpE,CAuCA,GArCA,SAAS,iBAAiB,qBAAqB,EAAE,QAAQ,SAAU,IAAK,CACtE,IAAI,EAAI,IAAI,QAAQ,EAChB,EAAI,MAAM,IAAI,CAAC,EACf,QAAU,CAAC,YAAY,CAAC,EACxB,QAAU,IAAI,cAAc,UAAU,EAGtC,MAAQ,IAAI,cAAc,eAAe,EACzC,QAAO,MAAM,YAAc,GAC/B,IAAI,YAAc,KAAK,CAAC,GAAK,CAAC,GAAG,MAAQ,EACzC,CAAC,MAAM,KAAK,EAAE,QAAQ,SAAU,OAAQ,CACtC,IAAI,OAAS,QAAQ,cAAc,IAAM,MAAM,EAC/C,OAAO,aAAa,cAAe,SAAW,MAAQ,OAAS,YAAc,YAAY,EAAI,aAAa,EAAI,IAAM,IAAM,YAAc,YAAY,EAAI,gBAAkB,GAAG,EAC7K,IAAI,MAAQ,OAAO,cAAc,kBAAkB,EAC/C,QAAO,MAAM,aAAe,SAAW,MAAQ,OAAS,YAAc,YAAY,EAAI,IAAM,aAAa,EAAI,IACnH,CAAC,EACD,QAAQ,cAAc,MAAM,EAAE,SAAW,GAAK,EAC9C,IAAI,OAAS,IAAI,cAAc,aAAa,EACxC,SAAU,OAAO,SAAW,GAAK,EAAG,OAAO,aAAa,aAAc,WAAa,YAAY,EAAI,aAAa,EAAI,IAAM,QAAU,YAAc,YAAY,EAAI,gBAAkB,GAAG,EAAG,OAAO,YAAc,YAAY,EAAI,UAAY,aAAa,EAAI,UAChQ,QAAQ,cAAc,MAAM,EAAE,SAAW,CAAC,aAAa,CAAC,EACxD,IAAI,UAAU,OAAO,UAAW,OAAO,EAKvC,IAAI,aAAa,gBAAiB,QAAU,OAAS,OAAO,EAC5D,IAAI,QAAU,KAAK,CAAC,GAAK,CAAC,GAAG,MAAQ,EACrC,IAAI,aAAa,aAAc,QAAU,OAAS,gBAAkB,OAAS,KAAO,GAAK,YAAY,EAAI,4BAA8B,eAAe,EAItJ,IAAI,QAAU,IAAI,cAAc,YAAY,EACxC,UAAS,QAAQ,YAAc,GACnC,IAAI,UAAU,OAAO,WAAY,EAAI,CAAC,EACtC,IAAI,UAAU,OAAO,UAAW,EAAI,CAAC,CACvC,CAAC,EAEG,OAAQ,CACV,IAAI,EAAI,UAAU,MAAM,IAAI,EACvB,EAAE,UAGI,MAAQ,GACjB,OAAO,SAAW,GAClB,OAAO,YAAc,iBACX,eAAe,GAMzB,OAAO,SAAW,GAClB,OAAO,YAAc,oBAAmB,MAAM,EAAE,KAAK,IANrD,OAAO,SAAW,GAClB,OAAO,YAAc,YAAY,EAAK,UAAY,EAAI,UAAY,UAAY,qBAAuB,kBAAoB,IAAM,gBAAmB,MAAQ,EAAI,sBAAwB,YAAc,EAChM,+BACA,OAAS,UAAY,8BATzB,OAAO,SAAW,GAClB,OAAO,YAAc,mBAazB,CACI,cAAgB,SAAU,OAAO,SAAW,GAAM,OAAO,YAAc,gBAC3E,oBAAoB,EACpB,uBAAuB,EAIvB,cAAc,CAChB,CAGA,SAAS,iBAAiB,yBAAyB,EAAE,QAAQ,SAAU,GAAI,CACzE,IAAI,EAAI,GAAG,QAAQ,EACnB,GAAG,cAAc,MAAM,EAAE,iBAAiB,QAAS,SAAU,EAAG,CAC9D,EAAE,gBAAgB,EACb,aAAa,CAAC,IACnB,MAAM,IAAI,CAAC,GAAK,aAAa,EACxB,YAAY,EACZ,cAAgB,GADD,oBAAsB,GAE1C,gBAAgB,EAClB,CAAC,EACD,GAAG,cAAc,MAAM,EAAE,iBAAiB,QAAS,SAAU,EAAG,CAC9D,EAAE,gBAAgB,EACd,QAAM,IAAI,CAAC,GAAK,KACpB,MAAM,IAAI,CAAC,EAAI,KAAK,IAAI,EAAG,MAAM,IAAI,CAAC,EAAI,aAAa,CAAC,EACnD,YAAY,EACZ,cAAgB,GADD,oBAAsB,GAE1C,gBAAgB,EAClB,CAAC,CACH,CAAC,EAGD,SAAS,iBAAiB,qBAAqB,EAAE,QAAQ,SAAU,EAAG,CACpE,EAAE,iBAAiB,QAAS,SAAU,EAAG,CACvC,GAAI,GAAE,OAAO,QAAQ,uBAAuB,EAC5C,KAAI,EAAI,EAAE,QAAQ,EAElB,GADA,OAAO,CAAC,EACJ,cACJ,GAAI,SAAS,IAAM,EAAG,CACpB,GAAI,CAAC,UAAU,MAAM,IAAI,EAAE,WAAa,CAAC,YAAY,CAAC,GAAK,YAAY,CAAC,EAAI,EAAG,OAC/E,OAAO,KAAK,MAAM,GAAG,EAAE,QAAQ,SAAU,IAAK,CAAE,MAAM,IAAI,GAAG,EAAI,MAAQ,EAAI,EAAI,CAAG,CAAC,EAChF,YAAY,IAAG,oBAAsB,IAC1C,gBAAgB,CAClB,MAAW,OAAO,WAAW,oBAAoB,EAAE,SAAW,aAAa,CAAC,IAC1E,MAAM,IAAI,CAAC,GAAK,aAAa,EACxB,YAAY,EACZ,cAAgB,GADD,oBAAsB,GAE1C,gBAAgB,GAEpB,CAAC,CACH,CAAC,EAMD,SAAS,iBAAiB,4BAA4B,EAAE,QAAQ,SAAU,IAAK,CAC7E,IAAI,iBAAiB,QAAS,SAAU,EAAG,CACzC,EAAE,gBAAgB,EAClB,IAAI,EAAI,IAAI,QAAQ,EAChB,MAAM,IAAI,CAAC,GAAK,IACpB,MAAM,IAAI,CAAC,EAAI,KAAK,IAAI,EAAG,MAAM,IAAI,CAAC,EAAI,aAAa,CAAC,EACnD,YAAY,EACZ,cAAgB,GADD,oBAAsB,GAE1C,gBAAgB,EAClB,CAAC,CACH,CAAC,EAGD,aAAa,QAAQ,SAAU,EAAG,CAChC,EAAE,iBAAiB,QAAS,UAAY,CACtC,OAAO,EAAE,QAAQ,CAAC,CACpB,CAAC,CACH,CAAC,GAIA,UAAY,CACX,GAAI,CACF,IAAI,EAAI,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAC9C,KAAO,EAAE,IAAI,QAAQ,GAAK,EAAE,IAAI,SAAS,GAAK,IAAI,YAAY,EAClE,GAAI,CAAC,IAAK,OACV,IAAI,IAAM,CACR,GAAI,KAAM,GAAI,KAAM,GAAI,KAAM,GAAI,KAClC,eAAgB,KAAM,YAAe,KAAM,MAAS,KACpD,sBAAuB,KAAM,mBAAsB,KAAM,WAAc,KACvE,WAAc,KAAM,cAAe,KACnC,oBAAqB,KAAM,iBAAoB,KAAM,OAAU,IACjE,EACI,EAAI,IAAI,GAAG,EACX,GAAG,OAAO,CAAC,CACjB,OAAS,EAAG,CAAC,CACf,GAAG,EAMH,SAAS,eAAe,MAAO,OAAQ,CACrC,GAAI,CAAC,OAAS,CAAC,MAAM,OAAQ,OAC7B,IAAI,KAAO,MAAM,UAAU,MAAM,KAAK,KAAK,EAC3C,SAAS,KAAK,OAAQ,CACpB,KAAK,QAAQ,SAAU,EAAG,CACxB,IAAI,GAAK,IAAM,OACf,EAAE,aAAa,eAAgB,GAAK,OAAS,OAAO,EACpD,EAAE,SAAW,GAAK,EAAI,EACxB,CAAC,CACH,CACA,KAAK,QAAQ,SAAU,EAAG,EAAG,CAC3B,EAAE,iBAAiB,UAAW,SAAU,EAAG,CACzC,IAAI,EAAI,EAAE,IAAK,KAAO,EACtB,GAAI,IAAM,cAAgB,IAAM,YAAa,KAAO,UAC3C,IAAM,aAAe,IAAM,UAAW,KAAO,WAC7C,IAAM,KAAO,IAAM,QAAS,CAAE,EAAE,eAAe,EAAG,EAAE,MAAM,EAAG,MAAQ,KACzE,QACL,EAAE,eAAe,EAEjB,IAAI,MAAQ,KAAK,OAAO,SAAU,EAAG,CAAE,MAAO,CAAC,EAAE,MAAQ,CAAC,EAAE,KAAK,SAAU,EAAG,EAAG,CAC/E,OAAO,EAAE,wBAAwB,CAAC,EAAI,KAAK,4BAA8B,GAAK,CAChF,CAAC,EACD,GAAK,MAAM,OACX,KAAI,GAAK,MAAM,QAAQ,CAAC,EAAO,GAAK,IAAG,GAAK,GAG5C,QAFI,KAAO,OAAO,GAAK,KAAO,MAAM,QAAU,MAAM,MAAM,EACtD,QAAU,EACP,KAAK,aAAa,eAAe,IAAM,QAAU,UAAY,MAAM,QAAQ,KAAO,OAAO,MAAM,QAAQ,IAAI,EAAI,KAAO,MAAM,QAAU,MAAM,MAAM,EACrJ,KAAK,aAAa,eAAe,IAAM,SAAU,KAAK,MAAM,EAAG,KAAK,MAAM,GAChF,CAAC,CACH,CAAC,EAGD,KAAK,QAAQ,SAAU,EAAG,CACxB,EAAE,iBAAiB,QAAS,UAAY,CAAM,cAAgB,EAAE,aAAa,eAAe,IAAM,SAAgB,KAAK,CAAC,EAAO,QAAQ,OAAO,CAAC,EAAG,CAAC,CACrJ,CAAC,EACD,KAAK,KAAK,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,UAAU,SAAS,UAAU,CAAG,CAAC,EAAE,CAAC,GAAK,KAAK,CAAC,CAAC,CAC3F,CAGA,IAAI,MAAQ,SAAS,iBAAiB,OAAO,EAC7C,SAAS,SAAS,EAAG,CACnB,GAAI,GAAC,UAAU,EAAE,QAAQ,IAAI,EAAE,WAAa,cAC5C,KAAI,SAAW,YAAY,EAC3B,MAAM,QAAQ,SAAU,EAAG,CAAE,EAAE,UAAU,OAAO,WAAY,IAAM,CAAC,CAAG,CAAC,EACvE,MAAM,KAAO,EAAE,QAAQ,MACnB,YAAY,GAAK,UAAY,CAAC,sBAAqB,oBAAoB,EAC3E,eAAe,EACf,iBAAiB,EACjB,aAAa,EACf,CACA,MAAM,QAAQ,SAAU,EAAG,CACzB,EAAE,iBAAiB,QAAS,UAAY,CAAE,SAAS,CAAC,CAAG,CAAC,CAC1D,CAAC,EAcD,SAAS,gBAAiB,CACxB,IAAI,KAAO,MAAM,MAAQ,MAAQ,EAAI,EACrC,SAAS,iBAAiB,YAAY,EAAE,QAAQ,SAAU,GAAI,CAC5D,IAAI,KAAO,SAAS,GAAG,QAAQ,IAAK,EAAE,GAAK,EAC3C,GAAG,YAAc,KAAO,IAC1B,CAAC,CACH,CAEA,IAAI,WAAa,KAAK,iBAAiB,kCAAkC,EACzE,WAAW,QAAQ,SAAU,IAAK,CAChC,IAAI,iBAAiB,QAAS,UAAY,CACxC,IAAI,OAAS,IAAI,QAAQ,SAAW,SAAW,SAAW,QAC1D,GAAI,gBAAgB,SAAW,MAAM,SACjC,WAAW,UAAY,CAAC,gBAAgB,GAC5C,KAAI,SAAW,YAAY,EAG3B,GAFA,MAAM,OAAS,OAEX,SAAW,UAAY,UAAU,mBAAmB,EAAE,UAAW,eAAe,mBAAmB,UAC9F,SAAW,SAAW,MAAM,OAAS,MAAO,eAAe,IAAI,UAC/D,CAAC,UAAU,MAAM,IAAI,EAAE,UAAW,CACzC,IAAI,SAAW,CAAC,KAAM,KAAM,KAAK,EAAE,KAAK,SAAU,KAAM,CAAE,OAAO,UAAU,IAAI,EAAE,SAAW,CAAC,EACzF,UAAU,eAAe,QAAQ,CACvC,EACI,YAAY,GAAK,UAAY,CAAC,sBAAqB,oBAAoB,EAC3E,eAAe,EACf,iBAAiB,EACjB,aAAa,EACf,CAAC,CACH,CAAC,EACD,eAAe,UAAU,EACzB,SAAS,eAAe,KAAM,CAC5B,MAAM,QAAQ,SAAU,EAAG,CACzB,IAAI,GAAK,EAAE,QAAQ,OAAS,KAC5B,EAAE,UAAU,OAAO,WAAY,EAAE,EACjC,EAAE,aAAa,eAAgB,GAAK,OAAS,OAAO,EACpD,EAAE,SAAW,GAAK,EAAI,EACxB,CAAC,EACD,MAAM,KAAO,IACf,CAEA,eAAe,SAAS,iBAAiB,cAAc,CAAC,EAGxD,SAAS,iBAAiB,yBAAyB,EAAE,QAAQ,SAAU,EAAG,CACxE,EAAE,iBAAiB,UAAW,SAAU,EAAG,CAAE,EAAE,gBAAgB,CAAG,CAAC,EACnE,EAAE,iBAAiB,QAAS,SAAU,EAAG,CAEvC,GADA,EAAE,gBAAgB,EACd,gBAAgB,CAAC,WAAW,GAEhC,IADA,MAAM,MAAQ,OAAO,EAAE,QAAQ,GAAG,IAAM,GAAK,GAAK,GAC9C,MAAM,OAAS,MAAO,CAAE,IAAI,KAAO,EAAE,QAAQ,OAAO,EAAO,MAAM,KAAK,MAAM,CAAG,CACnF,iBAAiB,EACjB,aAAa,EACf,CAAC,CACH,CAAC,EAED,IAAI,QAAU,SAAS,iBAAiB,sCAAsC,EAC9E,QAAQ,QAAQ,SAAU,EAAG,CAC3B,EAAE,iBAAiB,QAAS,UAAY,CAClC,eACJ,QAAQ,QAAQ,SAAU,EAAG,CAAE,EAAE,UAAU,OAAO,WAAY,IAAM,CAAC,CAAG,CAAC,EACzE,MAAM,IAAM,EAAE,QAAQ,IAElB,MAAM,SAAW,UAAY,UAAU,mBAAmB,EAAE,WAAW,eAAe,mBAAmB,GACzG,YAAY,GAAK,CAAC,sBAAqB,oBAAoB,EAC/D,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,aAAa,EACf,CAAC,CACH,CAAC,EACD,eAAe,OAAO,EACtB,eAAe,EAEf,SAAS,gBAAiB,CACxB,IAAI,IAAM,SAAS,EACf,IAAM,cAAc,EACxB,GAAI,OAAO,KAEX,QADI,KAAO,aAAa,EACjB,IAAM,KAAK,CAChB,IAAI,MAAQ,CAAC,KAAM,KAAM,KAAM,IAAI,EAChC,OAAO,SAAU,EAAG,CAAE,OAAO,MAAM,IAAI,CAAC,GAAK,IAAM,CAAC,EACpD,KAAK,SAAU,EAAG,EAAG,CAAE,OAAO,YAAY,EAAI,MAAM,IAAI,CAAC,EAAI,MAAM,IAAI,CAAC,EAAI,MAAM,IAAI,CAAC,EAAI,MAAM,IAAI,CAAC,CAAG,CAAC,EAC7G,GAAI,CAAC,MAAM,OAAQ,MACnB,MAAM,IAAI,MAAM,CAAC,CAAC,GAAK,KACvB,KAAO,IACT,CACF,CAEA,GAAI,OAAQ,CAmBV,IAASC,SAAT,SAAiB,EAAG,CAAE,OAAO,OAAO,GAAK,KAAO,GAAK,CAAC,EAAE,YAAY,EAAE,QAAQ,cAAe,EAAE,CAAG,EACzFC,YAAT,SAAoB,YAAa,IAAK,KAAM,CAC1C,GAAI,YAAY,IAAI,EAAG,OAAO,aAAa,IAAI,EAC/C,IAAI,KAAO,OAAO,oBAAsB,CAAC,EACzC,GAAI,OAAO,mBAAoB,CAQ7B,QAHI,OAAS,OAAS,OAAS,EAAI,SAAS,KAAM,EAAE,GAAK,EACrD,KAAO,QAAU,MAAQ,MAAQ,EAAI,GACrC,QAAU,WAAW,GAAG,EAAE,SACrB,EAAI,EAAG,EAAI,QAAQ,OAAQ,IAClC,GAAI,OAAO,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,IAAM,OAAO,IAAI,EAAG,OAAO,QAAQ,CAAC,EAE1E,OAAO,IACT,CAGA,QAFI,EAAID,SAAQ,MAAQ,MAAQ,WAAa,WAAW,EACpD,EAAIA,SAAQ,WAAW,IAAI,CAAC,EACvB,EAAI,EAAG,EAAI,KAAK,OAAQ,IAAK,CACpC,IAAI,EAAI,KAAK,CAAC,EACd,GAAIA,SAAQ,EAAE,OAAO,IAAMA,SAAQ,cAAc,WAAW,CAAC,GAAKA,SAAQ,EAAE,OAAO,IAAM,GAAKA,SAAQ,EAAE,OAAO,IAAM,EACnH,OAAO,CAEX,CACA,OAAO,IACT,EAISE,YAAT,SAAoB,KAAM,CACxB,OAAI,YAAY,IAAI,EAAU,YAAY,IAAI,EACvC,aAAa,MAAM,IAAK,IAAI,CACrC,EACSC,mBAAT,SAA2B,YAAa,CACtC,GAAI,YAAY,EAAG,CAAE,IAAI,MAAQ,cAAc,WAAW,EAAG,OAAO,MAAQ,MAAM,OAAS,IAAM,CAGjG,GAAI,OAAO,mBAAoB,CAC7B,IAAI,EAAI,YAAY,WAAW,EAC/B,GAAI,EAAG,OAAO,EAAE,MAClB,CAEA,QADI,KAAO,OAAO,oBAAsB,CAAC,EAAG,KAAOH,SAAQ,cAAc,WAAW,CAAC,EAC5E,EAAI,EAAG,EAAI,KAAK,OAAQ,IAAO,GAAIA,SAAQ,KAAK,CAAC,EAAE,OAAO,IAAM,KAAM,OAAO,KAAK,CAAC,EAAE,QAC9F,OAAO,cAAc,WAAW,CAClC,EAKSI,oBAAT,SAA4B,WAAY,OAAQ,CAC9C,GAAI,GAAC,OAAO,oBAAsB,CAAC,YAAY,IAC/C,QAAS,KAAK,OACZ,GAAK,OAAO,CAAC,EACb,KAAI,EAAI,YAAY,EAAI,cAAc,CAAC,EAAI,YAAY,CAAC,EACpD,IAAG,WAAW,mCAAqC,EAAE,EAAE,EAAI,OAAO,CAAC,IAE3E,EACSC,eAAT,SAAuB,EAAG,CAAE,IAAI,EAAI,GAAK,EAAE,yBAA0B,OAAQ,GAAK,EAAE,OAAU,EAAE,CAAC,EAAE,gBAAkB,IAAM,EA1DlH,QAAAL,SACA,WAAAC,YA6BA,WAAAC,YAIA,kBAAAC,mBAgBA,mBAAAC,oBAQA,cAAAC,eAvEL,YAAc,CAChB,GAAI,eACJ,GAAI,sBACJ,GAAI,aACJ,GAAI,mBACN,EAMI,cAAgB,CAAE,GAAI,eAAgB,GAAI,sBAAuB,GAAI,cAAe,GAAI,mBAAoB,EAC5G,WAAa,CAAE,KAAM,iBAAkB,KAAM,iBAAkB,KAAM,iBAAkB,KAAQ,aAAc,EA6DjH,OAAO,iBAAiB,QAAS,UAAY,CAC3C,GAAI,SAAO,UAAY,cACvB,IAAI,CAAC,eAAe,GAAK,CAAC,UAAU,MAAM,IAAI,EAAE,UAAW,CAAE,aAAa,EAAG,MAAQ,CAOrF,IAAI,MAAQ,CAAC,EAEb,GADA,CAAC,KAAM,KAAM,KAAM,IAAI,EAAE,QAAQ,SAAU,EAAG,CAAE,QAAS,EAAI,EAAG,EAAI,MAAM,IAAI,CAAC,EAAG,IAAK,MAAM,KAAK,CAAC,CAAG,CAAC,EACnG,EAAC,MAAM,OACX,KAAI,QAAUJ,YAAW,MAAM,CAAC,EAAG,MAAM,IAAK,MAAM,IAAI,EACxD,GAAI,CAAC,QAAS,CACZ,QAAQ,MAAM,+BAAgC,MAAM,CAAC,EAAG,MAAM,IAAK,MAAM,IAAI,EAC7E,MACF,CAIA,IAAI,WAAa,CAAC,EACd,YAAY,GACd,WAAW,OAAS,MAAM,OAAS,KAAO,WAAa,MAAM,OAAS,MAAS,QAAQ,EAAI,eAAiB,YAAe,WAC3H,WAAW,WAAW,EAAI,SAAS,EACnC,WAAW,aAAa,EAAI,UAAU,EAAI,gBAE1C,WAAW,QAAU,CAAC,KAAM,KAAM,KAAM,IAAI,EAAE,OAAO,SAAU,EAAG,CAAE,OAAO,MAAM,IAAI,CAAC,EAAI,CAAG,CAAC,EAC3F,IAAI,SAAU,EAAG,CAAE,OAAOE,mBAAkB,CAAC,EAAI,QAAO,MAAM,IAAI,CAAC,CAAG,CAAC,EAAE,KAAK,QAAK,IAEtF,WAAW,WAAW,EAAI,OAAO,mBAAqB,SAAS,EAAI,QAAQ,QAC3E,MAAM,QAAQ,SAAU,EAAG,EAAG,CAAE,WAAW,WAAa,EAAI,EAAE,EAAIA,mBAAkB,CAAC,CAAG,CAAC,GAE3FC,oBAAmB,WAAY,MAAM,GAAG,EACxC,IAAI,KAAO,CAAE,GAAI,QAAQ,GAAI,SAAU,EAAG,WAAY,UAAW,EAC7D,GAAM,OAAO,oBAAsB,YAAY,EAAKF,YAAW,MAAM,IAAI,EAAIG,eAAc,OAAO,EACtG,IAAK,OAAO,oBAAsB,YAAY,IAAM,MAAM,OAAS,QAAU,CAAC,GAAI,CAGhF,QAAQ,MAAM,yCAA0C,MAAM,KAAM,8CAAyC,EAC7G,OAAO,YAAc,iCACrB,WAAW,UAAY,CAAE,aAAa,CAAG,EAAG,IAAI,EAChD,MACF,CAIA,GAHI,KAAI,KAAK,aAAe,IAGxB,IAAM,MAAM,OAAS,QAAU,mBAAmB,EAAG,CACvD,IAAI,QAAU,iBAAiB,MAAM,IAAI,EACrC,MAAQ,UAAU,MAAM,IAAI,EAC5B,QAAQ,WAAa,MAAM,YAC7B,WAAW,4BAA4B,EAAI,YAAY,EACnD,yBAA2B,MAAM,MAAM,QAAQ,CAAC,EAAI,qBACpD,uBAAyB,MAAM,MAAM,QAAQ,CAAC,EAAI,qBAE1D,CACA,GAAI,IAAM,MAAM,OAAS,OAAQ,CAI/B,IAAI,MAAQ,iBAAiB,MAAM,IAAI,EACnC,MAAM,WAAa,MAAM,IAAM,MAAM,QAAO,WAAW,qBAAqB,EAAI,wBAAwB,MAAM,IAAI,EACxH,CACA,IAAI,MAAQ,CAAC,IAAI,EAEjB,GAAK,MAAM,OAGX,KAAI,SAAW,OAAO,YACtB,OAAO,SAAW,GAClB,OAAO,YAAc,eACrB,aAAe,GACf,cAAc,EAEd,MAAM,eAAgB,CACpB,OAAQ,OACR,YAAa,cACb,QAAS,CAAE,eAAgB,mBAAoB,OAAU,kBAAmB,EAC5E,KAAM,KAAK,UAAU,CAAE,MAAO,KAAM,CAAC,CACvC,CAAC,EACE,KAAK,SAAU,EAAG,CACjB,OAAK,EAAE,GACA,EAAE,KAAK,EADI,EAAE,KAAK,EAAE,KAAK,SAAU,IAAK,CAAE,MAAM,GAAK,CAAC,CAE/D,CAAC,EACA,KAAK,SAAU,SAAU,CAGxB,IAAI,WAAc,UAAY,SAAS,OAAU,CAAC,EAC9C,aAAe,WAAW,OAC1B,WAAW,WAAW,OAAS,CAAC,EAAE,IAClC,KAEJ,GAAI,OAAO,WAAa,OAAO,OAAO,UAAU,SAAY,WAC1D,OAAO,OAAO,UAAU,QAAQ,YAAY,EAAE,KAAK,UAAY,CAC7D,OAAO,UAAU,KAAK,EACtB,aAAe,GACf,OAAO,SAAW,GAClB,aAAa,CACf,CAAC,EAGH,OAAO,SAAS,KAAO,OACzB,CAAC,EACA,MAAM,SAAU,IAAK,CACpB,QAAQ,MAAM,2BAA4B,GAAG,EAC7C,OAAO,YAAe,KAAO,IAAI,aAAgB,yBAGjD,WAAW,UAAY,CACrB,aAAe,GACf,OAAO,SAAW,GAClB,aAAa,CACf,EAAG,IAAI,CACT,CAAC,IACL,CAAC,EAKD,IAAI,WAAa,SAAS,eAAe,YAAY,EACjD,aAAe,SAAS,eAAe,cAAc,EACzD,GAAI,YAAc,aAAc,CAS9B,IAASC,mBAAT,SAA2B,aAAc,CAClC,aAAa,MAClB,OAAO,iBAAiB,QAAQ,aAAc,UAAY,CACxD,aAAa,MAAM,EACf,cAAc,WAAW,MAAM,CAAE,cAAe,EAAK,CAAC,CAC5D,CAAC,CACH,EAiBSC,cAAT,SAAsB,MAAO,OAAQ,CACnC,IAAI,IAAM,SAAS,cAAc,MAAM,EACvC,IAAI,UAAY,eAChB,IAAI,IAAM,SAAS,cAAc,MAAM,EACvC,IAAI,UAAY,aAChB,IAAI,YAAc,MAClB,IAAI,IAAM,SAAS,cAAc,MAAM,EACvC,IAAI,UAAY,aAChB,IAAI,YAAc,MAAM,MAAM,EAE9B,IAAI,MAAQ,SAAS,cAAc,MAAM,EAAG,MAAM,UAAY,kBAAmB,MAAM,YAAc,KACrG,IAAI,KAAO,SAAS,cAAc,MAAM,EAAG,YAAK,UAAY,kBAAmB,KAAK,YAAc,KAClG,IAAI,YAAY,KAAK,EAAG,IAAI,YAAY,IAAI,EAC5C,IAAI,YAAY,GAAG,EAAG,IAAI,YAAY,GAAG,EAClC,GACT,EACSC,gBAAT,UAA0B,CACxB,GAAK,WAEL,KAAI,WAAa,MAAM,OAAQ,MAAM,OAAS,QAC9C,IAAI,QAAU,UAAU,IAAI,EACxB,eAAiB,iBAAiB,IAAI,EAC1C,MAAM,OAAS,WACf,IAAI,QAAU,MAAM,MAAQ,MAAQ,EAAI,EACpC,KAAO,OAAO,mBAAqB,YAAY,MAAM,GAAG,EAAI,SAAS,OAAQ,MAAM,EAAE,MACrF,KAAO,KAAK,MAAM,KAAO,QAAU,QAAQ,KAAK,EAChD,GAAK,QAAQ,WAAa,QAAQ,MAAQ,GAAK,KAAO,GAAK,KAAO,EAEtE,GADA,WAAW,OAAS,CAAC,GACjB,EAAC,GACL,KAAI,QAAU,CAAC,mBAAmB,GAAK,eAAe,WAAY,OAAO,eAAe,OAAO,GAAK,EAChG,SAAW,QAAU,GAAK,KAAK,IAAI,QAAU,QAAQ,KAAK,GAAK,KAC/D,MAAQ,SAAW,UAAY,EAAI,SAAW,YAC9C,OAAS,WAAW,cAAc,oBAAoB,EACtD,OAAS,WAAW,cAAc,oBAAoB,EAE1D,GADI,SAAQ,OAAO,YAAc,MAAM,KAAK,MAAM,KAAO,GAAG,EAAI,GAAG,GAAK,SAAW,qBAAuB,KACtG,EAAC,OACL,IAAI,CAAC,SAAU,CACb,OAAO,YAAc,MAAQ,sBAAwB,MAAM,QAAQ,KAAK,EACtE,iJACF,MACF,CACA,OAAO,YAAc,GACrB,IAAI,MAAQ,SAAS,cAAc,MAAM,EACzC,MAAM,UAAY,WAClB,MAAM,YAAYD,cAAa,YAAa,QAAQ,KAAK,CAAC,EAC1D,MAAM,YAAYA,cAAa,qBAAsB,OAAO,CAAC,EAC7D,IAAI,KAAO,SAAS,cAAc,MAAM,EACxC,KAAK,UAAY,gBACjB,KAAK,YAAc,MAAQ,mKAC3B,OAAO,YAAY,KAAK,EACxB,OAAO,YAAY,IAAI,IACzB,EAqBSE,kBAAT,UAA4B,CAC1B,OAAO,iBAAiB,OAAO,aAAc,UAAY,CACnD,YAAa,UAAU,YAAc,GAAI,UAAU,OAAS,IAChED,gBAAe,EACf,IAAI,MAAQ,WAAW,cAAc,WAAW,EAC5C,WAAa,QAAO,UAAU,YAAc,MAAM,aACtD,qBAAuB,SAAS,KAAK,MAAM,SAC3C,SAAS,KAAK,MAAM,SAAW,SAC/B,aAAa,UAAU,EACvB,WAAW,aAAa,gBAAiB,MAAM,EAC3C,WAAW,UAAU,MAAM,CAAE,cAAe,EAAK,CAAC,CACxD,CAAC,CACH,EAWSE,aAAT,SAAqB,MAAO,CAC1B,IAAI,KAAO,aAAa,sBAAsB,EAC9C,OAAO,MAAM,QAAU,KAAK,MAAQ,MAAM,QAAU,KAAK,OAAS,MAAM,QAAU,KAAK,KAAO,MAAM,QAAU,KAAK,MACrH,EAUSC,mBAAT,UAA6B,CAC3B,SAAW,GACX,WAAW,SAAW,GACtB,WAAW,UAAY,UACvB,YAAY,QAAQ,SAAU,OAAQ,CAAE,OAAO,SAAW,EAAO,CAAC,EAClEL,mBAAkB,EAAK,CACzB,EAUSM,iBAAT,SAAyB,GAAI,CAC3B,IAAI,KAAQ,OAAO,SAAW,OAAO,QAAQ,QAAU,OAAO,QAAQ,OAAO,MAAS,IACtF,OAAO,MAAM,KAAO,UAAW,CAAE,YAAa,cAAe,QAAS,CAAE,OAAU,kBAAmB,CAAE,CAAC,EACrG,KAAK,SAAU,EAAG,CAAE,OAAO,EAAE,GAAK,EAAE,KAAK,EAAI,IAAM,EAAG,UAAY,CAAE,OAAO,IAAM,CAAC,EAClF,KAAK,SAAU,KAAM,CACpB,OAAI,MAAQ,OAAO,KAAK,UAAU,IAAM,GACtC,OAAO,SAAS,OAAO,KAAO,QAAU,GAAK,IAAI,EAC1C,YAEF,MAAM,KAAO,cAAe,CACjC,OAAQ,OACR,YAAa,cACb,QAAS,CAAE,eAAgB,mBAAoB,OAAU,kBAAmB,EAC5E,KAAM,KAAK,UAAU,CAAE,MAAO,CAAC,CAAE,GAAI,OAAO,EAAE,EAAG,SAAU,CAAE,CAAC,CAAE,CAAC,CACnE,CAAC,EACE,KAAK,SAAU,EAAG,CACjB,OAAK,EAAE,GACA,EAAE,KAAK,EADI,EAAE,KAAK,EAAE,KAAK,SAAU,IAAK,CAAE,MAAM,GAAK,EAAG,UAAY,CAAE,MAAM,IAAI,MAAM,YAAY,CAAG,CAAC,CAE/G,CAAC,EACA,KAAK,SAAU,SAAU,CACxB,IAAI,MAAS,UAAY,SAAS,OAAU,CAAC,EACzC,IAAM,MAAM,OAAS,MAAM,MAAM,OAAS,CAAC,EAAE,IAAM,KACvD,OAAI,OAAO,WAAa,OAAO,OAAO,UAAU,SAAY,WACnD,OAAO,UAAU,QAAQ,GAAG,EAAE,KAAK,UAAY,CACpD,cAAO,UAAU,KAAK,EACf,QACT,CAAC,GAEH,OAAO,SAAS,KAAO,KAAO,OACvB,OACT,CAAC,CACL,CAAC,CACL,EAGSC,iBAAT,SAAyB,UAAW,CAClC,GAAI,UAGJ,KAAI,MAAQ,CAAC,CAAC,OAAO,mBACjB,QAAW,OAAS,MAAM,MAAQ,OAAS,aAAa,SAAS,EAAK,CAAE,GAAI,aAAa,SAAS,CAAE,EAAI,MAAQ,YAAY,SAAS,EAAIZ,YAAW,UAAW,OAAQ,MAAM,EAC7K,GAAK,SAAW,OAAO,QAAQ,EAAE,EAAE,QAAQ,qCAAsC,EAAE,EACvF,GAAI,CAAC,SAAW,CAAC,aAAa,KAAK,EAAE,GAAK,QAAQ,YAAc,IAAU,OAAS,YAAY,UAAW,MAAM,EAAI,EAAI,CAClH,YACF,UAAU,YAAc,2DACxB,UAAU,OAAS,IAErB,MACF,CACA,SAAW,GACX,UAAY,WAAW,UACvB,WAAW,SAAW,GACtB,WAAW,YAAc,yBACzB,YAAY,QAAQ,SAAU,OAAQ,CAAE,OAAO,SAAW,EAAM,CAAC,EACjEK,mBAAkB,EAAK,EACvBM,iBAAgB,EAAE,EAAE,KAAK,SAAU,MAAO,CACpC,QAAU,UAAUD,mBAAkB,CAC5C,EAAG,SAAU,IAAK,CAChB,QAAQ,MAAM,gCAAiC,GAAG,EAClD,WAAW,YAAe,KAAO,IAAI,aAAgB,uCACrD,WAAWA,mBAAmB,IAAI,CACpC,CAAC,EACH,EAjNS,kBAAAL,mBAuBA,aAAAC,cAgBA,eAAAC,gBAwDA,iBAAAC,kBAuBA,YAAAC,aAaA,kBAAAC,mBAgBA,gBAAAC,iBAmCA,gBAAAC,iBA9LL,YAAc,aAAa,iBAAiB,wBAAwB,EACpE,UAAY,aAAa,cAAc,uBAAuB,EAC9D,SAAW,GACX,UAAY,WAAW,UAEvB,UAAY,aAAa,cAAc,uBAAuB,EAC9D,UAAY,aAAa,cAAc,uBAAuB,EAC9D,qBAQJ,aAAa,iBAAiB,QAAS,UAAY,CAC7C,aAAa,OACjB,WAAW,aAAa,gBAAiB,OAAO,EAC5C,uBAAyB,SAC3B,SAAS,KAAK,MAAM,SAAW,qBAC/B,qBAAuB,QAE3B,CAAC,EAQD,IAAI,WAAa,aAAa,cAAc,wBAAwB,EAqDhE,cAAgB,aAAa,cAAc,2BAA2B,EACtE,eACF,cAAc,iBAAiB,QAAS,UAAY,CAC7C,aAAa,MAClB,OAAO,iBAAiB,QAAQ,aAAc,UAAY,CAGxD,GAFA,aAAa,MAAM,EAEf,MAAM,SAAW,QAAS,CAAE,IAAI,SAAW,MAAM,UAAU,KAAK,KAAK,KAAK,iBAAiB,0CAA0C,EAAG,SAAU,EAAG,CAAE,OAAO,EAAE,eAAiB,IAAM,CAAC,EAAO,UAAU,SAAS,MAAM,CAAG,CAC/N,IAAI,YAAc,MAAM,UAAU,KAAK,KAAK,SAAS,iBAAiB,uBAAuB,EAAG,SAAU,EAAG,CAAE,OAAO,EAAE,eAAiB,IAAM,CAAC,EAC5I,aAAe,CAAC,YAAY,UAAU,SAAS,UAAU,GAAG,YAAY,MAAM,EAClF,IAAI,OAAS,SAAS,eAAe,cAAc,GAAK,YACxD,GAAK,OACL,QAAO,eAAe,CAAE,SAAU,OAAO,WAAW,kCAAkC,EAAE,QAAU,OAAS,SAAU,MAAO,OAAQ,CAAC,EAGrI,IAAI,QAAU,MAAM,UAAU,KAAK,KAAK,OAAO,iBAAiB,uCAAuC,EAAG,SAAU,GAAI,CAAE,OAAO,GAAG,eAAiB,IAAM,CAAC,GAAK,YAC7J,SAAS,QAAQ,MAAM,CAAE,cAAe,EAAK,CAAC,EACpD,CAAC,CACH,CAAC,EAeH,WAAW,iBAAiB,QAAS,SAAU,MAAO,CAChD,UAAY,WAAW,WAC3B,MAAM,gBAAgB,EACjB,aAAa,KACbP,mBAAkB,EAAI,EADHG,kBAAiB,EAE3C,CAAC,EACG,WAAW,UAAU,iBAAiB,QAAS,UAAY,CAAEH,mBAAkB,EAAI,CAAG,CAAC,EAG3F,IAAI,iBAAmB,GAKvB,aAAa,iBAAiB,cAAe,SAAU,MAAO,CAAE,iBAAmBI,aAAY,KAAK,CAAG,CAAC,EACxG,aAAa,iBAAiB,QAAS,SAAU,MAAO,CAClD,kBAAoBA,aAAY,KAAK,GAAGJ,mBAAkB,EAAI,EAClE,iBAAmB,EACrB,CAAC,EACD,aAAa,iBAAiB,SAAU,SAAU,MAAO,CACvD,MAAM,eAAe,EACrBA,mBAAkB,EAAI,CACxB,CAAC,EAQD,OAAO,iBAAiB,WAAYK,kBAAiB,EA0CrD,OAAO,qBAAuBC,iBA8B9B,YAAY,QAAQ,SAAU,OAAQ,CACpC,OAAO,iBAAiB,QAAS,UAAY,CAAEC,iBAAgB,OAAO,QAAQ,MAAM,CAAG,CAAC,CAC1F,CAAC,CACH,CAEF,CAEA,SAAS,iBAAiB,kBAAkB,EAAE,QAAQ,SAAU,OAAQ,CACtE,OAAO,iBAAiB,QAAS,UAAY,CACvC,CAAC,YAAY,GAAK,cAAgB,CAAC,WAAW,EAAE,YACpD,UAAU,EACV,cAAgB,cAAc,IAAM,SAAS,EAAG,aAAe,GAC/D,aAAa,EACf,CAAC,CACH,CAAC,EAGD,GAAI,CACF,IAAI,YAAc,IAAI,gBAAgB,OAAO,SAAS,MAAM,EACxD,WAAa,IAAI,gBAAgB,OAAO,OAAO,SAAS,MAAQ,EAAE,EAAE,QAAQ,KAAM,EAAE,CAAC,EACrF,WAAa,YAAY,IAAI,MAAM,GAAK,WAAW,IAAI,QAAQ,GAAK,WAAW,IAAI,MAAM,GAAK,GAI9F,wBAAwB,KAAK,UAAU,GAAK,UAAU,EAAE,UAAS,MAAM,OAAS,SACtF,OAAS,EAAG,CAAC,CAGb,SAAS,mBAAoB,CAC3B,IAAI,QAAU,CAAC,EACf,KAAK,iBAAiB,kBAAkB,EAAE,QAAQ,SAAU,KAAM,CAChE,IAAI,KAAO,KAAK,QAAQ,KACxB,GAAI,GAAC,KAAM,KAAM,KAAK,EAAE,QAAQ,IAAI,IAAM,IAAM,QAAQ,KAAK,SAAU,OAAQ,CAAE,OAAO,OAAO,OAAS,IAAM,CAAC,GAC/G,KAAI,MAAQ,UAAU,IAAI,EACtB,MAAM,WAAa,OAAO,SAAS,MAAM,KAAK,GAAK,MAAM,MAAQ,GACnE,QAAQ,KAAK,CAAC,KAAM,KAAM,KAAM,KAAM,MAAO,MAAM,KAAK,CAAC,EAE7D,CAAC,EACD,IAAI,UAAY,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAE,IAAI,MAAM,EAClE,OAAS,QAAQ,KAAK,SAAU,OAAQ,CAAE,OAAO,OAAO,OAAS,SAAW,CAAC,EASjF,GAPI,CAAC,QAAU,MAAM,SAAW,WAAU,OAAS,QAAQ,KAAK,SAAU,OAAQ,CAAE,OAAO,OAAO,OAAS,mBAAqB,CAAC,GAC5H,SAAQ,OAAS,QAAQ,KAAK,SAAU,OAAQ,CAAE,OAAO,OAAO,OAAS,IAAM,CAAC,GAChF,SACH,OAAS,QAAQ,OAAO,SAAU,OAAQ,OAAQ,CAChD,MAAO,CAAC,QAAU,OAAO,MAAQ,OAAO,MAAQ,OAAS,MAC3D,EAAG,IAAI,GAEL,CAAC,QAAU,MAAM,SAAW,SAAY,aAAM,OAAS,QAAgB,kBAAkB,EAGzF,SAAU,SAAS,OAAO,IAAI,EAAG,eAAe,OAAO,IAAI,EACjE,CACA,kBAAkB,EAClB,aAAa,GAUZ,UAA0B,CAwCzB,GAvCI,CAAC,WAAa,CAAC,SAOf,UAAU,aAAe,SAAS,MACpC,SAAS,KAAK,YAAY,SAAS,EAEjC,cAQF,aAAa,iBAAiB,QAAS,UAAY,CACjD,GAAI,kBAAmB,CACrB,GAAI,aAAc,OAClB,GAAI,CAAC,OAAO,SAAU,CAAE,OAAO,MAAM,EAAG,MAAQ,CAChD,IAAI,OAAS,UAAU,MAAM,IAAI,EAAE,UAAY,SAAS,eAAe,cAAc,EAAI,SAAS,cAAc,QAAQ,EACxH,GAAI,OAAQ,CACV,OAAO,eAAe,CAAE,SAAU,OAAO,WAAW,kCAAkC,EAAE,QAAU,OAAS,SAAU,MAAO,OAAQ,CAAC,EACrI,IAAI,QAAU,OAAO,cAAc,qDAAqD,EACpF,SAAS,QAAQ,MAAM,CAAE,cAAe,EAAK,CAAC,CACpD,CACA,MACF,CAEA,IAAI,OAAS,SAAS,cAAc,aAAa,GACpC,SAAS,cAAc,YAAY,GACnC,SAAS,eAAe,cAAc,EAC/C,QACF,OAAO,eAAe,CAAE,SAAU,SAAU,MAAO,OAAQ,CAAC,CAEhE,CAAC,EAEC,EAAE,yBAA0B,SAG9B,OAcF,IAAI,UAAY,SAAS,cAAc,aAAa,EAEpD,SAAS,iBAAkB,CACzB,GAAK,OACL,KAAI,KAAO,OAAO,sBAAsB,EACpC,GAAK,OAAO,aAAe,SAAS,gBAAgB,aAcpD,KAAQ,KAAK,OAAS,EACtB,MAAQ,KAAK,IAAM,GAQvB,GAAI,CAAC,mBAAqB,OAAS,UAAW,CAC5C,IAAI,GAAK,UAAU,sBAAsB,EACrC,GAAG,IAAM,KAAI,MAAQ,GAC3B,CAEA,IAAI,KAAQ,KAAO,OAAU,MAAQ,QAAU,KAC3C,mBAAqB,OAAO,WAAW,qBAAqB,EAAE,UAAS,KAAO,MAE9E,OAAS,aACX,WAAa,KACT,eAAc,aAAa,UAAY,eAAe,IAAI,GAC9D,UAAU,aAAa,eAAgB,MAAQ,QAAQ,GAEzD,UAAU,UAAU,OAAO,UAAW,CAAC,CAAC,IAAI,EAC5C,UAAU,aAAa,cAAe,KAAO,QAAU,MAAM,EAQzD,UAAW,YAAW,UAAU,MAAQ,CAAC,MAC7C,SAAS,KAAK,UAAU,OAAO,oBAAqB,CAAC,CAAC,IAAI,EAC5D,CAEA,IAAI,SAAW,IAAI,qBAAqB,UAAY,CAClD,gBAAgB,CAClB,EAAG,CACD,WAAY,MACZ,UAAW,CACb,CAAC,EACD,SAAS,QAAQ,MAAM,EAInB,WAAW,SAAS,QAAQ,SAAS,EAKzC,IAAI,gBAAkB,KA+BtB,GA9BA,OAAO,iBAAiB,SAAU,UAAY,CACxC,kBACJ,gBAAkB,sBAAsB,UAAY,CAClD,gBAAkB,KAClB,gBAAgB,CAClB,CAAC,EACH,EAAG,CAAE,QAAS,EAAK,CAAC,EAMpB,OAAO,iBAAiB,YAAa,eAAe,EACpD,OAAO,iBAAiB,SAAU,eAAe,EAKjD,OAAO,uBAAyB,gBAChC,gBAAgB,EAGhB,cAAc,EAQV,KAAM,CACR,IAAI,iBAAmB,IAAI,qBAAqB,SAAU,QAAS,CACjE,QAAQ,QAAQ,SAAU,MAAO,CAC/B,SAAS,KAAK,UAAU,OAAO,oBAAqB,MAAM,cAAc,CAC1E,CAAC,CACH,EAAG,CACD,WAAY,MACZ,UAAW,CACb,CAAC,EACD,iBAAiB,QAAQ,IAAI,CAC/B,CAUA,SAAS,KAAK,UAAU,IAAI,gBAAgB,EAC5C,SAAS,mBAAoB,CAC3B,GAAK,UACL,KAAI,EAAI,UAAU,aAClB,SAAS,gBAAgB,MAAM,YAAY,cAAe,EAAI,IAAI,EACpE,CACA,kBAAkB,EAGlB,OAAO,iBAAiB,SAAU,iBAAiB,CACrD,GAAG,GAMF,UAAiC,CAChC,IAAI,MAAQ,SAAS,eAAe,kBAAkB,EAClD,SAAW,KAAK,iBAAiB,gBAAgB,EACjD,YAAc,KAClB,GAAI,CAAC,OAAS,CAAC,SAAS,OAAQ,OAQhC,SAAS,KAAK,YAAY,KAAK,EAE/B,SAAS,UAAU,MAAO,CACxB,YAAc,MAAM,cACpB,OAAO,iBAAiB,OAAO,MAAO,UAAY,CAChD,MAAM,UAAU,IAAI,MAAM,EAC1B,MAAM,aAAa,cAAe,OAAO,EACzC,SAAS,KAAK,MAAM,SAAW,SAC/B,IAAI,SAAW,MAAM,cAAc,WAAW,EAC1C,UAAU,SAAS,MAAM,CAAE,cAAe,EAAK,CAAC,CACtD,CAAC,CACH,CACA,SAAS,YAAa,CACpB,OAAO,iBAAiB,QAAQ,MAAO,UAAY,CACjD,MAAM,UAAU,OAAO,MAAM,EAC7B,MAAM,aAAa,cAAe,MAAM,EACxC,SAAS,KAAK,MAAM,SAAW,GAC3B,aAAe,YAAY,aAAa,YAAY,MAAM,CAAE,cAAe,EAAK,CAAC,CACvF,CAAC,CACH,CAEA,SAAS,QAAQ,SAAU,OAAQ,CAAE,OAAO,iBAAiB,QAAS,SAAS,CAAG,CAAC,EAMnF,MAAM,iBAAiB,QAAS,SAAU,EAAG,CAC3C,GAAI,EAAE,OAAO,QAAQ,iBAAiB,EAAG,CAAE,WAAW,EAAG,MAAQ,CACjE,IAAI,OAAS,MAAM,cAAc,YAAY,EACzC,QAAU,CAAC,OAAO,SAAS,EAAE,MAAM,GAAG,WAAW,CACvD,CAAC,EACD,SAAS,iBAAiB,UAAW,SAAU,EAAG,CAEhD,GADI,EAAE,MAAQ,UAAY,MAAM,UAAU,SAAS,MAAM,GAAG,WAAW,EACnE,IAAE,MAAQ,OAAS,MAAM,aAAa,aAAa,IAAM,SAG7D,KAAI,UAAY,MAAM,UAAU,OAAO,KAAK,MAAM,iBAChD,6FACF,EAAG,SAAU,QAAS,CACpB,OAAO,QAAQ,UAAY,GAAK,CAAC,QAAQ,QAAQ,WAAW,GAC1D,CAAC,QAAQ,QAAQ,SAAS,GAAK,QAAQ,eAAe,EAAE,OAAS,GACjE,OAAO,iBAAiB,OAAO,EAAE,aAAe,SACpD,CAAC,EACD,GAAI,CAAC,UAAU,OAAQ,CAAE,EAAE,eAAe,EAAG,MAAQ,CACrD,IAAI,MAAQ,UAAU,CAAC,EACnB,KAAO,UAAU,UAAU,OAAS,CAAC,EACrCC,SAAU,SAAS,cACnB,EAAE,WAAaA,WAAY,OAAS,UAAU,QAAQA,QAAO,EAAI,IACnE,EAAE,eAAe,EACjB,KAAK,MAAM,CAAE,cAAe,EAAK,CAAC,GACzB,CAAC,EAAE,WAAaA,WAAY,MAAQ,UAAU,QAAQA,QAAO,EAAI,KAC1E,EAAE,eAAe,EACjB,MAAM,MAAM,CAAE,cAAe,EAAK,CAAC,GAEvC,CAAC,CACH,GAAG,GASF,UAA8B,CAC7B,IAAI,KAAO,KAAK,iBAAiB,yBAAyB,EACrD,KAAK,QACV,KAAK,QAAQ,SAAU,IAAK,CAC1B,IAAI,iBAAiB,SAAU,UAAY,CACpC,IAAI,aAAa,MAAM,GAC5B,KAAK,QAAQ,SAAU,MAAO,CACxB,QAAU,KAAO,MAAM,aAAa,MAAM,IACxC,OAAO,gBAAiB,OAAO,gBAAgB,MAAM,KAAK,EACzD,MAAM,gBAAgB,MAAM,EAErC,CAAC,CACH,CAAC,CACH,CAAC,CACH,GAAG,CAEL,CAEI,SAAS,aAAe,UAC1B,SAAS,iBAAiB,mBAAoB,IAAI,EAElD,KAAK,CAET,GAAG,GAKF,UAAY,CACX,aACA,IAAI,IAAM,SAAS,eAAe,iBAAiB,EACnD,GAAI,CAAC,IAAK,OACV,IAAI,MAAQ,SAAS,eAAe,cAAc,EAC9C,KAAO,SAAS,eAAe,eAAe,EAC9C,OAAS,CAAC,EACV,UAAY,GACZ,YAAc,EACd,YAAc,EACd,WAAa,OAAO,YAAc,OAAO,WAAW,kCAAkC,EAAE,QAE5F,SAAS,aAAa,IAAK,MAAO,CAChC,IAAI,IAAM,IAAI,IAAI,IAAK,SAAS,OAAO,EACvC,OAAI,IAAI,WAAa,mBAAmB,IAAI,aAAa,IAAI,QAAS,KAAK,EACpE,IAAI,IACb,CAEA,SAAS,WAAW,IAAK,CAGvB,OAAO,QAAQ,SAAU,MAAO,EAAG,CAC7B,KAAK,IAAI,EAAI,GAAG,EAAI,GAAG,MAAM,IAAI,gBAAgB,KAAK,CAC5D,CAAC,EACD,OAAO,QAAQ,SAAU,MAAO,EAAG,CAC7B,KAAK,IAAI,EAAI,GAAG,GAAK,GAAK,CAAC,MAAM,IAAI,aAAa,KAAK,IACzD,MAAM,IAAI,IAAM,MAAM,IAE1B,CAAC,CACH,CAEA,SAAS,SAAS,IAAK,CAErB,GADA,IAAM,KAAK,IAAI,EAAG,KAAK,IAAI,IAAK,OAAO,OAAS,CAAC,CAAC,EAC9C,MAAQ,UACZ,WAAY,IACZ,WAAW,GAAG,EACd,OAAO,QAAQ,SAAU,MAAO,EAAG,CACjC,MAAM,IAAI,UAAU,OAAO,SAAU,IAAM,GAAG,EAC1C,IAAM,IAAK,MAAM,IAAI,aAAa,eAAgB,MAAM,EACvD,MAAM,IAAI,gBAAgB,cAAc,CAC/C,CAAC,EACD,IAAI,OAAS,OAAO,GAAG,EAAE,IACrB,OAAS,OAAO,YAAc,KAAK,YAAc,OAAO,aAAe,EAE3E,KAAK,SAAS,CAAE,KAAM,OAAQ,SAAU,MAAO,CAAC,EAClD,CAEA,SAAS,OAAO,IAAK,QAAS,CAC5B,IAAI,SAAW,KAAK,IAAI,IAAM,SAAS,EACvC,SAAS,GAAG,EACZ,MAAM,SAAS,CACb,KAAM,UAAY,MAAM,YAExB,SAAU,SAAW,WAAa,GAAK,CAAC,WAAa,SAAW,MAClE,CAAC,CACH,CAEA,SAAS,OAAQ,CACf,IAAI,aAAe,KAAK,IAAI,KAAM,KAAK,IAAI,KAAM,SAAS,gBAAgB,YAAc,CAAC,CAAC,EAC1F,SAAS,iBAAiB,mBAAmB,EAAE,QAAQ,SAAU,MAAO,CACtE,GAAI,OAAM,cAAc,OAAO,EAC/B,KAAI,OAAS,MAAM,cAAc,KAAK,EACtC,GAAI,GAAC,QAAU,CAAC,OAAO,aAAa,KAAK,GACzC,KAAI,KAAO,SAAS,cAAc,KAAK,EACvC,KAAK,UAAY,YACjB,IAAI,IAAM,SAAS,cAAc,KAAK,EACtC,IAAI,IAAM,OAAO,aAAa,KAAK,GAAK,GACxC,IAAI,SAAW,QACf,KAAK,YAAY,GAAG,EACpB,MAAM,YAAY,IAAI,EACtB,IAAI,IAAM,SAAS,cAAc,QAAQ,EACzC,IAAI,KAAO,SACX,IAAI,UAAY,YAChB,IAAI,aAAa,aAAc,UAAY,OAAO,OAAS,GAAK,kBAAkB,EAClF,IAAI,MAAQ,SAAS,cAAc,KAAK,EACxC,MAAM,IAAM,aAAa,OAAO,aAAa,KAAK,EAAG,GAAG,EACxD,MAAM,IAAM,GACZ,MAAM,MAAQ,GACd,MAAM,OAAS,GACf,MAAM,SAAW,QACjB,IAAI,YAAY,KAAK,EACrB,IAAI,IAAM,OAAO,OACjB,IAAI,iBAAiB,QAAS,UAAY,CAAE,OAAO,IAAK,EAAI,CAAG,CAAC,EAChE,KAAK,YAAY,GAAG,EACpB,OAAO,KAAK,CACV,MAAO,SAAS,MAAM,QAAQ,EAAG,EAAE,EACnC,IAAK,aAAa,OAAO,aAAa,KAAK,EAAG,YAAY,EAC1D,IAAK,IACL,IAAK,GACP,CAAC,GACH,CAAC,CACH,CAEA,MAAM,iBAAiB,SAAU,UAAY,CACvC,CAAC,IAAI,MAAQ,cACjB,YAAc,sBAAsB,UAAY,CAC9C,YAAc,EACV,IAAI,MAAQ,OAAO,QACrB,SAAS,KAAK,MAAM,MAAM,WAAa,KAAK,IAAI,MAAM,YAAa,CAAC,CAAC,CAAC,CAE1E,CAAC,EACH,EAAG,CAAE,QAAS,EAAK,CAAC,EAIpB,SAAS,eAAgB,CACnB,CAAC,IAAI,MAAQ,UAAY,GAAK,MAAM,cAAgB,cACxD,YAAc,MAAM,YACpB,MAAM,SAAS,CAAE,KAAM,UAAY,YAAa,SAAU,MAAO,CAAC,EACpE,CACI,mBAAoB,OAAQ,IAAI,eAAe,aAAa,EAAE,QAAQ,KAAK,EAC1E,OAAO,iBAAiB,SAAU,aAAa,EAEpD,IAAI,iBAAiB,QAAS,UAAY,CACpC,aAAa,qBAAqB,WAAW,EACjD,YAAc,EACd,OAAO,QAAQ,SAAU,MAAO,CAAE,MAAM,IAAI,gBAAgB,KAAK,CAAG,CAAC,EACrE,MAAM,gBAAgB,EACtB,KAAK,gBAAgB,EACrB,OAAS,CAAC,EACV,UAAY,EACd,CAAC,EAED,SAAS,iBAAiB,QAAS,SAAU,EAAG,CAC9C,IAAI,EAAI,EAAE,kBAAkB,QAAU,EAAE,OAAS,KACjD,GAAK,EACL,IAAI,EAAE,QAAQ,iBAAiB,EAAG,CAGhC,GAFI,IAAI,OACR,MAAM,EACF,CAAC,OAAO,QAAQ,OACpB,OAAO,iBAAiB,KAAK,GAAG,EAChC,YAAc,MAAM,YACpB,IAAI,QAAU,SAAS,eAAe,YAAY,EAC9C,QAAU,QAAU,SAAS,QAAQ,YAAa,EAAE,EAAI,EAAI,EAC5D,IAAM,OAAO,UAAU,SAAU,MAAO,CAAE,OAAO,MAAM,QAAU,OAAS,CAAC,EAC/E,OAAO,KAAK,IAAI,IAAK,CAAC,EAAG,EAAK,EAC9B,MACF,EACI,EAAE,QAAQ,kBAAkB,GAAK,IAAM,MAAK,OAAO,iBAAiB,MAAM,GAAG,EACnF,CAAC,CACH,GAAG",
  "names": ["updatePurchaseHeader", "schedulePurchaseHeader", "setActive", "syncToTrack", "endNav", "goSlide", "endTD", "tiers", "onceLabel", "once", "normOpt", "pdpVariant", "boxPlanFor", "storeFlavorOption", "applyBoxProperties", "sellingPlanOf", "closeBuyOncePopup", "onceSchedRow", "fillOnceUpsell", "openBuyOncePopup", "outsideOnce", "resetOnceCheckout", "oneTimeCheckout", "checkoutOneTime", "current"]
}
