{
  "version": 3,
  "sources": ["/cdn/shop/t/22/assets/sav-clasp.js?r=3"],
  "sourcesContent": ["/*! sav-clasp.js \u2014 \"The Clasp\": vault-door page transition for Seventyninth Avenue. v1.2.0\n *  Plain IIFE, ES2017 max, no modules, no libraries.\n *  Companions: assets/sav-clasp.css and the head snippet in layout/theme.liquid.\n *\n *  DEPLOY NOTE: bump the &r=N cache-breaker in layout/theme.liquid on EVERY re-upload\n *  of this file or sav-clasp.css (Shopify's ?v= has been observed not to change).\n *\n *  Public debug hook: window.SAVClasp\n *    .version                 '1.2.0'\n *    .running                 boolean (getter)\n *    .phase                   '' | 'closing' | 'rest' | 'opening' (getter)\n *    .storageOk               boolean (getter) \u2014 sessionStorage usable; false \u21D2 no click interception at all\n *    .close(url?)             play CLOSE; with url \u2192 navigate at \u2248.55s; without \u2192 hold closed (10s self-destruct)\n *    .open(opts?)             play OPEN from rest (builds a rest overlay if none); opts.hold keeps the end frame\n *    .hold()                  build the resting closed state instantly and hold it (10s self-destruct)\n *    .remove()                destroy overlay + classes + timers; page interactive again\n *    .rehearse()              close \u2192 hold 250ms \u2192 open, in place, no navigation (\u22481.6s)\n *    .gate(on)                toggle html.sav-clasp-gate (the head snippet's pseudo gate) for screenshot diffs\n *    .debug(on)               arm/disarm the ?sav_clasp_test switch for THIS tab (sessionStorage 'sav-clasp-debug')\n *    .metrics                 {clickToOpenStart, clickToOpenEnd} ms, measured from the origin click (Date.now based)\n *    .logo                    resolved wordmark URL\n *\n *  URL switch: ?sav_clasp_test=close|open|hold plays that state and holds it (no navigation).\n *  It is IGNORED on a published storefront: it requires sessionStorage['sav-clasp-debug']==='1'\n *  (set it with SAVClasp.debug(true) and reload), a non-main theme role, or preview_theme_id.\n *  Every held state also self-destructs after 10s, and Escape tears down any run at any time.\n *\n *  Failsafes, in order of last resort: Escape key (which HONOURS a pending click) \u00B7\n *  visibilitychange \"visible again\" release \u00B7 close guard (raw setTimeout in its own slot, so\n *  pagehide's clearTimers() cannot cancel it: 2.5s when no navigation started, re-checked every\n *  1s up to 8s while one is genuinely in flight, and re-armed rather than retired while the tab\n *  is hidden) \u00B7 unconditional OPEN safety timer (1.3s, raw setTimeout) \u00B7 pageshow(persisted) \u00B7\n *  the head snippet's own gate watchdog.\n *\n *  Events on document: 'sav-clasp:closestart', 'sav-clasp:openstart', 'sav-clasp:openend', 'sav-clasp:cancel'.\n */\n(function (window, document) {\n  'use strict';\n  if (!window || !document || window.SAVClasp) { return; }\n\n  var VERSION = '1.2.0';\n  var KEY = 'sav-clasp';                 // sessionStorage handshake key\n  var DEBUG_KEY = 'sav-clasp-debug';     // sessionStorage opt-in for ?sav_clasp_test\n  var ID = 'sav-clasp';                  // overlay element id\n\n  /* The rendition width is emitted by Liquid from the theme's own logo_width setting (\u00D72 for DPR,\n     clamped 300\u2013800) so the overlay <img>, the gate background and the header logo all resolve to\n     ONE CDN entry instead of the overlay adding a fresh full-priority request to the destination. */\n  var LOGO_WIDTH = (function () {\n    var w = 0;\n    try { w = parseInt(window.__savClaspLogoW, 10) || 0; } catch (e) { w = 0; }\n    return (w >= 200 && w <= 1600) ? w : 500;\n  })();\n  var DEFAULT_LOGO = 'https://cdn.shopify.com/s/files/1/0691/3959/5354/files/Shop_logo_89d75e2b-3eed-4602-a327-74ddd5d40797.png?width=' + LOGO_WIDTH;\n  var DEFAULT_AR = 5.6103;               // wordmark w/h fallback if Liquid did not emit the real one\n\n  /* Timings in ms \u2014 mirror sav-clasp.css. Change both or neither.\n     Every CLOSE beat ends at 520ms, so navigating at 550ms cannot catch one mid-flight. */\n  var T = {\n    closeNavAt: 550,         // doors shut + every beat landed at .52; navigate here\n    closeNavFallback: 650,   // second, idempotent navigate attempt\n    closeHoldFallback: 700,  // last CLOSE beat ends at 520 \u2192 flip to rest when holding\n    closeWatchdog: 2500,     // first guard tick: no navigation started by now \u2192 release the page\n    navWatchdog: 8000,       // navigation IS in flight: give the network this long before releasing\n    guardRetry: 1000,        // guard re-arm interval (hidden tab, or navigation still pending)\n    holdWatchdog: 10000,     // ANY held state (test/rehearse/hold) self-destructs here\n    openEndFallback: 900,    // 'sav-clasp-panel-r-out' ends at 620 (.58 + .04 breath); teardown else here\n    openSafety: 1300,        // unconditional destination teardown (raw setTimeout, not cancellable by clearTimers)\n    riseFallback: 1000,      // 'sav-clasp-rise' ends at 820\n    holdCapDefault: 350,     // destination: ONE shared budget for DOM + stylesheet + wordmark (--sav-clasp-hold-cap)\n    rehearseHold: 250,\n    flagMaxAge: 6000,        // documentation: MUST equal the head snippet's age window\n    hoverDwell: 90,          // hover-intent delay before a prefetch is issued\n    prewarmDelay: 1500\n  };\n\n  /* destroy() reasons that mean \"the user cancelled\", as opposed to \"we released the page while a\n     navigation was still in flight\". The first kind always clears the handshake; the second kind\n     keeps it, so a slow-but-legitimate navigation still gates when it finally commits (the flag's\n     own 6s age check is then the sole expiry). */\n  var NAV_CANCEL = { escape: 1, manual: 1, holdwatchdog: 1, 'test-expiry': 1, bfcache: 1, error: 1 };\n\n  var html = document.documentElement;\n  var S = {\n    running: false,\n    phase: '',\n    overlay: null,\n    timers: [],\n    safety: 0,            // raw setTimeout id: OPEN failsafe\n    expiry: 0,            // raw setTimeout id: held-state / test-mode failsafe\n    guard: 0,             // raw setTimeout id: CLOSE guard \u2014 deliberately NOT in S.timers\n    token: 0,             // bumped by every run and every destroy; invalidates in-flight async chains\n    left: false,          // pagehide has fired\n    navigated: false,\n    held: false,          // this rest state was asked for (hold/test/rehearse), not a stuck CLOSE\n    storageOk: true,\n    returnFocus: null,\n    pendingHref: null,    // the click we took over; honoured if the animation is cancelled\n    canLift: null,        // cached \"#MainContent has no fixed/sticky descendant\" probe\n    logo: '',\n    closeStart: 0,\n    metrics: { clickToOpenStart: null, clickToOpenEnd: null }\n  };\n\n  /* ---------------------------------------------------------------- utils */\n  function timer(fn, ms) { var id = setTimeout(fn, ms); S.timers.push(id); return id; }\n  function clearTimers() { for (var i = 0; i < S.timers.length; i++) { clearTimeout(S.timers[i]); } S.timers = []; }\n  function clearSafety() { if (S.safety) { clearTimeout(S.safety); S.safety = 0; } }\n  function clearExpiry() { if (S.expiry) { clearTimeout(S.expiry); S.expiry = 0; } }\n  function clearGuard() { if (S.guard) { clearTimeout(S.guard); S.guard = 0; } }\n  function raf(fn) { return window.requestAnimationFrame ? window.requestAnimationFrame(fn) : setTimeout(fn, 16); }\n  /* next frame, or 50ms if the tab is hidden and frames are paused (rAF alone would stall navigation there) */\n  function afterFrame(fn) {\n    var done = false;\n    function once() { if (!done) { done = true; fn(); } }\n    raf(once); setTimeout(once, 50);\n  }\n  function dispatch(name, detail) {\n    try { document.dispatchEvent(new CustomEvent(name, { detail: detail || {} })); } catch (e) { /* noop */ }\n  }\n\n  /* Live MediaQueryList objects, created once. `.matches` is always current, so nothing has to be\n     re-constructed (or re-listened for) on the pointer path. */\n  var MQ_REDUCE = null, MQ_COARSE = null;\n  try { MQ_REDUCE = window.matchMedia ? window.matchMedia('(prefers-reduced-motion: reduce)') : null; } catch (e) { MQ_REDUCE = null; }\n  try { MQ_COARSE = window.matchMedia ? window.matchMedia('(pointer: coarse)') : null; } catch (e) { MQ_COARSE = null; }\n  function reduceMotion() { return !!(MQ_REDUCE && MQ_REDUCE.matches); }\n  function coarsePointer() { return !!(MQ_COARSE && MQ_COARSE.matches); }\n\n  function cssVar(name) {\n    try { return getComputedStyle(html).getPropertyValue(name).trim(); } catch (e) { return ''; }\n  }\n  function cssReady() { return cssVar('--sav-clasp-ready') === '1'; }\n  /* getComputedStyle flushes pending style; memoise the answer once it turns true so the click and\n     prefetch paths stop forcing a recalc on every event. It can only go false\u2192true (the sheet is\n     preloaded in <head> and swapped to a stylesheet on load), so caching a true is safe. */\n  var CSS_OK = false;\n  function cssOk() { if (CSS_OK) { return true; } CSS_OK = cssReady(); return CSS_OK; }\n  function cssMs(name, fallback) {\n    var v = cssVar(name); if (!v) { return fallback; }\n    var n = parseFloat(v); if (isNaN(n)) { return fallback; }\n    if (/ms\\s*$/i.test(v)) { return n; }\n    if (/s\\s*$/i.test(v)) { return n * 1000; }\n    return n;\n  }\n  function logoAr() {\n    var n = parseFloat(cssVar('--sav-clasp-logo-ar'));\n    return (n > 0.05 && n < 40) ? n : DEFAULT_AR;\n  }\n  function themeTransitionsOn() {\n    var b = document.body;\n    return !!((b && b.classList.contains('page-transition--enabled')) || html.classList.contains('page-transition--enabled'));\n  }\n  function clearGateTimer() {\n    try { if (window.__savClaspGateTimer) { clearTimeout(window.__savClaspGateTimer); window.__savClaspGateTimer = 0; } } catch (e) { /* noop */ }\n  }\n  /* Drop the head snippet's pseudo gate. fade=true \u2192 300ms opacity fade instead of a hard cut.\n     The fade rule also kills pointer-events, so the page is live for the whole dissolve. */\n  function dropGate(fade) {\n    clearGateTimer();\n    try { window.__savClaspGate = false; } catch (e) { /* noop */ }\n    if (!html.classList.contains('sav-clasp-gate')) {\n      html.classList.remove('sav-clasp-gate-fade');\n      return;\n    }\n    if (fade) {\n      html.classList.add('sav-clasp-gate-fade');\n      setTimeout(function () {\n        html.classList.remove('sav-clasp-gate');\n        html.classList.remove('sav-clasp-gate-fade');\n      }, 340);\n    } else {\n      html.classList.remove('sav-clasp-gate');\n      html.classList.remove('sav-clasp-gate-fade');\n    }\n  }\n  function clearFlag() { try { sessionStorage.removeItem(KEY); } catch (e) { /* noop */ } }\n  /* The handshake carries `from` (the origin pathname) so the destination can prove provenance\n     from document.referrer instead of merely accepting any same-origin referrer. */\n  function writeFlag(href, logo) {\n    try {\n      sessionStorage.setItem(KEY, JSON.stringify({ t: Date.now(), href: href, from: location.pathname, logo: logo }));\n      return true;\n    } catch (e) { return false; }\n  }\n  function probeStorage() {\n    try {\n      sessionStorage.setItem(KEY + ':probe', '1');\n      sessionStorage.removeItem(KEY + ':probe');\n      return true;\n    } catch (e) { return false; }\n  }\n\n  /* ----------------------------------------------------------- wordmark */\n  function withWidth(url) {\n    try {\n      var u = new URL(url, location.href);\n      if (u.protocol !== 'https:' && u.protocol !== 'http:') { return ''; }\n      if (/\\.svg(\\?|$)/i.test(u.pathname)) { return u.href; }\n      u.searchParams.set('width', String(LOGO_WIDTH));\n      return u.href;\n    } catch (e) { return ''; }\n  }\n  function sane(url) { return typeof url === 'string' && /^https?:\\/\\/[^\\s\"'()\\\\]+$/i.test(url); }\n  /* Order matters: the Liquid URL is the one the head snippet paints as --sav-clasp-logo (gate\n     background AND .sav-clasp__mark background), so preferring it keeps every surface on one\n     rendition \u2014 one cache entry, no cold fetch at the swap. */\n  function resolveLogo() {\n    var flag = window.__savClaspFlag;\n    if (flag && sane(flag.logo)) { return flag.logo; }\n    var liquid = window.__savClaspLogo;\n    if (liquid) { var l = withWidth(String(liquid)); if (sane(l)) { return l; } }\n    var sels = [\n      'header img[src*=\"Shop_logo\"]', 'img[src*=\"Shop_logo\"]',\n      'header a[href=\"/\"] img', '[class*=\"header\"] a[href=\"/\"] img',\n      'header [class*=\"logo\"] img', '[class*=\"header\"] [class*=\"logo\"] img'\n    ];\n    for (var i = 0; i < sels.length; i++) {\n      var img = null;\n      try { img = document.querySelector(sels[i]); } catch (e) { img = null; }\n      if (img) {\n        var src = withWidth(img.currentSrc || img.src || '');\n        if (sane(src)) { return src; }\n      }\n    }\n    return DEFAULT_LOGO;\n  }\n  function prewarm(url) { try { var i = new Image(); i.decoding = 'async'; i.src = url; } catch (e) { /* noop */ } }\n\n  /* ------------------------------------------------------------ overlay */\n  var SPARK_SVG = '<svg class=\"sav-clasp__spark\" viewBox=\"0 0 100 100\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M50 0L51.2 48.8 100 50 51.2 51.2 50 100 48.8 51.2 0 50 48.8 48.8Z\"/></svg>';\n  /* The spark is a SIBLING of the glint (see the CSS note): as a child it was composited inside\n     the glint's blend group and inherited its scale animations, neither of which the gate \u2014 where\n     the spark is its own background layer \u2014 reproduces. */\n  var SHELL =\n    '<div class=\"sav-clasp__depth\"></div>' +\n    '<div class=\"sav-clasp__panel sav-clasp__panel--l\"></div>' +\n    '<div class=\"sav-clasp__panel sav-clasp__panel--r\"></div>' +\n    '<div class=\"sav-clasp__seam\"></div>' +\n    '<div class=\"sav-clasp__glint\"></div>' +\n    SPARK_SVG +\n    '<div class=\"sav-clasp__mark\"><span class=\"sav-clasp__halo\"></span></div>';\n\n  /* A node mid-dissolve (.sav-clasp--fading) is skipped: it is already pointer-dead, it owns its\n     own removal timer, and cutting it here would turn the graceful fade back into a snap. */\n  function removeStale() {\n    var nodes = document.querySelectorAll('#' + ID + ', .sav-clasp');\n    for (var i = 0; i < nodes.length; i++) {\n      var n = nodes[i];\n      if (n.classList && n.classList.contains('sav-clasp--fading')) { continue; }\n      if (n.parentNode) { n.parentNode.removeChild(n); }\n    }\n  }\n  /* build() returns a DETACHED overlay \u2014 on the destination it is only attached once the\n     wordmark is ready, so the gate (which is painting the identical rest state, wordmark\n     included) is never occluded by an overlay with an undecoded mark. */\n  function build(stateName, logoUrl) {\n    var el = document.createElement('div');\n    el.className = 'sav-clasp';\n    el.id = ID;\n    el.setAttribute('aria-hidden', 'true');\n    el.setAttribute('role', 'presentation');\n    el.setAttribute('data-state', stateName);\n    el.innerHTML = SHELL;\n    var img = document.createElement('img');\n    var ar = logoAr();\n    img.className = 'sav-clasp__logo';\n    img.alt = '';\n    img.width = 1000;                                   // reserve the mark box before the bytes arrive,\n    img.height = Math.max(1, Math.round(1000 / ar));    // at the REAL wordmark ratio, never a baked one\n    img.setAttribute('decoding', 'async');\n    img.setAttribute('draggable', 'false');\n    img.src = logoUrl;\n    img.addEventListener('error', function () {\n      if (img.src !== DEFAULT_LOGO) { img.src = DEFAULT_LOGO; }\n    });\n    el.querySelector('.sav-clasp__mark').appendChild(img);\n    return el;\n  }\n  /* Appended to <html>, NOT <body>: a transform / filter / will-change on <body> (the theme's own\n     slide-reveal transition, an app embed, a theme.css rule) makes <body> a stacking context \u2014 which\n     would clamp the overlay under the gate's html::before/::after \u2014 and the containing block for\n     position:fixed, which would un-cover the viewport on a scrolled page. As a sibling of <body> the\n     overlay shares the root stacking context with the gate. */\n  function attach(el) {\n    removeStale();\n    html.appendChild(el);\n    S.overlay = el;\n    return el;\n  }\n  function onAnimName(el, names, fn) {\n    var done = false;\n    function handler(e) {\n      if (done) { return; }\n      if (names.indexOf(e.animationName) === -1) { return; }\n      done = true;\n      el.removeEventListener('animationend', handler);\n      fn(e);\n    }\n    el.addEventListener('animationend', handler);\n    return function cancel() { done = true; el.removeEventListener('animationend', handler); };\n  }\n  function riseTarget() {\n    return document.getElementById('MainContent') || document.querySelector('main[role=\"main\"]') || document.querySelector('main');\n  }\n  /* Anything position:fixed inside the rise target would be re-anchored (and mis-positioned) by a\n     transform on that target, so the 12px lift is only used when nothing in there is fixed/sticky.\n     The probe is a cheap structural selector (no [class*=] substring matching against thousands of\n     product-card nodes) plus a bounded computed-style sample of the first 20 element children, and\n     it is HOISTED OUT of the OPEN frame \u2014 it used to run inside the same rAF callback that promotes\n     two half-viewport layers and starts six animations. */\n  var FIXED_HAZARD = '[data-sav-fixed],dialog,[role=\"dialog\"],[aria-modal=\"true\"],[data-sticky],[class~=\"sticky\"],[class~=\"fixed\"]';\n  function probeLift() {\n    if (S.canLift !== null) { return; }\n    var el = riseTarget();\n    if (!el) { S.canLift = false; return; }\n    var hazard = null;\n    try { hazard = el.querySelector(FIXED_HAZARD); } catch (e) { hazard = null; }\n    if (hazard) { S.canLift = false; return; }\n    var kids = el.children || [];\n    var n = kids.length < 20 ? kids.length : 20;\n    for (var i = 0; i < n; i++) {\n      var p = '';\n      try { p = getComputedStyle(kids[i]).position; } catch (e) { p = ''; }\n      if (p === 'fixed' || p === 'sticky') { S.canLift = false; return; }\n    }\n    S.canLift = true;\n  }\n  function clearRise(el) {\n    el.classList.remove('sav-clasp-rise');\n    el.classList.remove('sav-clasp-rise--lift');\n  }\n  function startRise() {\n    var el = riseTarget(); if (!el) { return; }\n    var v = cssVar('--sav-clasp-rise');\n    var lift = !(v === '0' || v === '0px' || v === 'none');\n    if (lift) {\n      if (S.canLift === null) { probeLift(); }             // fallback only; runOpen/playOpen pre-probe\n      lift = S.canLift === true;\n    }\n    el.classList.add('sav-clasp-rise');\n    if (lift) { el.classList.add('sav-clasp-rise--lift'); }\n    var cancel = onAnimName(el, ['sav-clasp-rise', 'sav-clasp-rise-lift'], function () { clearRise(el); });\n    timer(function () { cancel(); clearRise(el); }, T.riseFallback);\n  }\n\n  /* ------------------------------------------------------------ destroy */\n  function destroy(reason) {\n    /* Keep the handshake when we are releasing the page WHILE a navigation is genuinely in flight:\n       the destination is still coming and must still be allowed to gate. Every user-cancelling\n       reason clears it, so an abandoned run can never gate a later, unrelated click. */\n    var keepFlag = S.navigated && !S.left && S.phase === 'closing' && !NAV_CANCEL[reason || ''];\n    S.token++;                                  // invalidate every in-flight async chain\n    clearTimers();\n    clearSafety();\n    clearExpiry();\n    clearGuard();\n    dropGate(false);\n    removeStale();\n    html.classList.remove('sav-clasp-closing');\n    html.classList.remove('sav-clasp-opening');\n    html.classList.remove('sav-clasp-lock');\n    var r = document.querySelectorAll('.sav-clasp-rise');\n    for (var i = 0; i < r.length; i++) { clearRise(r[i]); }\n    S.overlay = null;\n    S.running = false;\n    S.phase = '';\n    S.left = false;\n    S.navigated = false;\n    S.held = false;\n    S.pendingHref = null;\n    if (!keepFlag) { clearFlag(); }\n    try { window.__savClaspFlag = null; window.__savClaspGate = false; } catch (e) { /* noop */ }\n    /* Give the keyboard user their place back on every cancellation path. */\n    try {\n      if (S.returnFocus && S.returnFocus.isConnected && reason && reason !== 'bfcache' && typeof S.returnFocus.focus === 'function') {\n        S.returnFocus.focus({ preventScroll: true });\n      }\n    } catch (e) { /* noop */ }\n    S.returnFocus = null;\n    if (reason) { dispatch('sav-clasp:cancel', { reason: reason }); }\n  }\n\n  /* Soft teardown: dissolve the doors over 300ms instead of cutting them in one frame. The node is\n     un-idded and marked --fading (opacity 0, pointer-events none) so it is already inert, then\n     destroy() runs immediately \u2014 the page is interactive at once, the picture just catches up. */\n  function fadeAway(reason) {\n    var el = S.overlay;\n    if (el && el.parentNode) {\n      el.removeAttribute('id');\n      el.classList.remove('sav-clasp--run');\n      el.classList.add('sav-clasp--fading');\n      setTimeout(function () { if (el.parentNode) { el.parentNode.removeChild(el); } }, 360);\n      S.overlay = null;\n    }\n    destroy(reason);\n  }\n  /* Release the page from a run and HONOUR the click that started it. Cancelling the animation must\n     never cancel the user's navigation: onClick already called preventDefault(), so simply tearing\n     down would leave them on the page they tried to leave, with no feedback at all. */\n  function release(reason, fade) {\n    var pending = (S.phase === 'closing' && !S.navigated) ? S.pendingHref : null;\n    if (fade) { fadeAway(reason); } else { destroy(reason); }\n    if (pending) { try { location.assign(pending); } catch (e) { /* noop */ } }\n  }\n\n  /* -------------------------------------------------------------- CLOSE */\n  function close(href, opts) {\n    opts = opts || {};\n    if (S.running) { return false; }\n    if (reduceMotion() || !cssOk()) { return false; }\n    var logo = S.logo || resolveLogo();\n\n    /* Handshake first, before anything paints: if it cannot be persisted (Safari private mode,\n       in-app webviews, blocked DOM storage, quota) the destination could never play OPEN, and a\n       CLOSE with no OPEN is worse than no transition. Refuse, and let the browser navigate. */\n    if (href) {\n      if (!S.storageOk || !writeFlag(href, logo)) { clearFlag(); return false; }\n    } else {\n      clearFlag();\n    }\n\n    S.logo = logo;\n    S.running = true;\n    S.phase = 'closing';\n    S.navigated = false;\n    S.left = false;\n    S.held = false;\n    S.pendingHref = href || null;\n    S.closeStart = Date.now();\n    var token = ++S.token;\n    clearTimers();\n    clearSafety();\n    clearExpiry();\n    clearGuard();\n\n    try {\n      S.returnFocus = document.activeElement || null;\n      if (S.returnFocus && typeof S.returnFocus.blur === 'function') { S.returnFocus.blur(); }\n    } catch (e) { S.returnFocus = null; }\n\n    html.classList.add('sav-clasp-closing');\n    html.classList.add('sav-clasp-lock');\n\n    var overlay = attach(build('closing', logo));\n    overlay.classList.add('sav-clasp--run');\n    prewarm(logo);\n\n    dispatch('sav-clasp:closestart', { href: href || null });\n\n    function go() {\n      if (S.token !== token || S.navigated || S.left) { return; }\n      S.navigated = true;\n      afterFrame(function () { if (!S.left && S.token === token) { location.assign(href); } });\n    }\n    function settle() {\n      if (S.token !== token || !S.overlay || S.phase !== 'closing') { return; }\n      S.phase = 'rest';\n      S.held = true;                             // a deliberate held state, not a stuck CLOSE\n      S.overlay.classList.remove('sav-clasp--run');\n      S.overlay.setAttribute('data-state', 'rest');\n      html.classList.remove('sav-clasp-closing');\n      html.classList.remove('sav-clasp-lock');   // never leave the page pointer-dead in a held state\n      if (typeof opts.onRest === 'function') { opts.onRest(); }\n    }\n    /* The CLOSE guard lives in its own raw-setTimeout slot, NOT in S.timers: pagehide calls\n       clearTimers(), and on any UA that fires pagehide without a commit (iOS app switch, an\n       abandoned navigation) that used to wipe the only thing that could ever release the page.\n       It also re-arms instead of retiring while the tab is hidden. */\n    function armGuard() {\n      clearGuard();\n      S.guard = setTimeout(function tick() {\n        S.guard = 0;\n        if (S.token !== token) { return; }\n        if (S.left) { return; }                                    // a real unload: the doors ride out with the page\n        if (document.visibilityState === 'hidden') {               // nobody is watching; look again shortly\n          S.guard = setTimeout(tick, T.guardRetry);\n          return;\n        }\n        if (S.navigated && (Date.now() - S.closeStart) < T.navWatchdog) {\n          S.guard = setTimeout(tick, T.guardRetry);                // navigation genuinely in flight\n          return;\n        }\n        release('watchdog', true);                                 // 300ms dissolve, page live at once\n      }, T.closeWatchdog);\n    }\n\n    if (href) {\n      /* animationend on the beat that actually finishes FIRST ('sav-clasp-panel-r-in' at .52 \u2014\n         the doors are shut, which is the semantically correct moment), with the .55 timer as the\n         fallback and .65 as an idempotent retry. Binding this to a later beat, as an earlier\n         revision did, made the animationend leg dead code and the whole path timer-only. */\n      var cancelNav = onAnimName(overlay, ['sav-clasp-panel-r-in'], go);\n      timer(go, T.closeNavAt);\n      timer(function () { cancelNav(); go(); }, T.closeNavFallback);\n      armGuard();\n    } else {\n      var cancelHold = onAnimName(overlay, ['sav-clasp-glint-in'], settle);\n      timer(function () { cancelHold(); settle(); }, T.closeHoldFallback);\n      /* EVERY holding close arms a self-destruct \u2014 no path may hold the page forever.\n         In the expiry slot, so pagehide's clearTimers() cannot cancel it either. */\n      clearExpiry();\n      S.expiry = setTimeout(function () {\n        S.expiry = 0;\n        if (S.token === token) { destroy('holdwatchdog'); }\n      }, T.holdWatchdog);\n    }\n    return true;\n  }\n\n  /* --------------------------------------------------------------- OPEN */\n  function playOpen(overlay, opts) {\n    opts = opts || {};\n    if (!overlay || !overlay.parentNode) { return; }\n    var token = ++S.token;\n    S.phase = 'opening';\n    S.running = true;\n    var flag = window.__savClaspFlag;\n    var t0 = flag && +flag.t ? +flag.t : 0;\n    if (!opts.noRise && S.canLift === null) { probeLift(); }   // never inside the OPEN frame\n\n    /* Unconditional failsafe, registered BEFORE the frame callback and deliberately not via\n       timer(): if anything below throws, or the animationend is swallowed by an iOS freeze,\n       the overlay still comes off and the page is interactive. */\n    clearSafety();\n    S.safety = setTimeout(function () {\n      S.safety = 0;\n      if (S.overlay || html.classList.contains('sav-clasp-opening') || html.classList.contains('sav-clasp-gate')) {\n        destroy('safety');\n      }\n    }, T.openSafety);\n\n    afterFrame(function () {\n      if (S.token !== token) { return; }\n      try {\n        html.classList.remove('sav-clasp-lock');\n        html.classList.add('sav-clasp-opening');\n        overlay.classList.add('sav-clasp--run');\n        overlay.setAttribute('data-state', 'opening');\n        /* Drop the gate one frame LATER: its ::after wordmark bridges the swap frame even if\n           the overlay's <img> is still undecoded. */\n        raf(function () { if (S.token === token) { dropGate(false); } });\n        if (!opts.noRise) { startRise(); }\n        if (t0) { S.metrics.clickToOpenStart = Date.now() - t0; }\n        try { performance.mark('sav-clasp:openstart'); } catch (e) { /* noop */ }\n        dispatch('sav-clasp:openstart', { metrics: S.metrics });\n\n        var cancel = onAnimName(overlay, ['sav-clasp-panel-r-out'], finish);\n        timer(function () { cancel(); finish(); }, T.openEndFallback);\n      } catch (e) {\n        destroy('error');\n      }\n\n      function finish() {\n        if (S.token !== token || S.phase !== 'opening') { return; }\n        clearSafety();\n        if (t0) { S.metrics.clickToOpenEnd = Date.now() - t0; }\n        try { performance.mark('sav-clasp:openend'); } catch (e) { /* noop */ }\n        html.classList.remove('sav-clasp-opening');\n        try { window.__savClaspFlag = null; window.__savClaspGate = false; } catch (e) { /* noop */ }\n        if (opts.hold) {\n          S.phase = 'rest';                       // held at the fully-open end frame for inspection\n          S.held = true;\n          overlay.classList.remove('sav-clasp--run');\n          clearExpiry();\n          S.expiry = setTimeout(function () { S.expiry = 0; destroy('holdwatchdog'); }, T.holdWatchdog);\n        } else {\n          if (overlay.parentNode) { overlay.parentNode.removeChild(overlay); }\n          S.overlay = null;\n          S.running = false;\n          S.phase = '';\n        }\n        dispatch('sav-clasp:openend', { metrics: S.metrics });\n      }\n    });\n  }\n\n  /* Destination: gate was set pre-paint by the head snippet; swap it for the DOM overlay and open.\n     ONE shared wall-clock deadline covers DOM + stylesheet + wordmark, so --sav-clasp-hold-cap is a\n     real cap (three serial budgets could hold a fully sealed page for ~570ms against a ~350ms\n     contract, all of it spent with no progress indication). */\n  function waitCss(deadline) {\n    return new Promise(function (resolve) {\n      if (cssReady()) { CSS_OK = true; return resolve(true); }\n      var settled = false;\n      function done(ok) { if (!settled) { settled = true; if (ok) { CSS_OK = true; } resolve(ok); } }\n      var link = document.getElementById('sav-clasp-css') || document.querySelector('link[href*=\"sav-clasp.css\"]');\n      if (link) {\n        /* The <link> starts life as rel=preload and swaps to rel=stylesheet in its own onload, so a\n           load event does not by itself mean the sheet is APPLIED \u2014 only resolve on the sentinel,\n           and let the poll below carry us the rest of the way. */\n        link.addEventListener('load', function () { if (cssReady()) { done(true); } });\n        link.addEventListener('error', function () { done(false); });\n      }\n      (function poll() {\n        if (settled) { return; }\n        if (cssReady()) { return done(true); }\n        if (Date.now() >= deadline) { return done(false); }\n        setTimeout(poll, 16);\n      })();\n    });\n  }\n  function waitLogo(img, deadline) {\n    return new Promise(function (resolve) {\n      var settled = false;\n      function done() { if (!settled) { settled = true; resolve(); } }\n      if (!img) { return done(); }\n      if (img.complete && img.naturalWidth > 0) { return done(); }\n      if (typeof img.decode === 'function') { try { img.decode().then(done, done); } catch (e) { /* noop */ } }\n      img.addEventListener('load', done);\n      img.addEventListener('error', done);\n      var left = deadline - Date.now();\n      setTimeout(done, left > 0 ? left : 0);\n    });\n  }\n  function waitDom(deadline) {\n    return new Promise(function (resolve) {\n      if (document.readyState !== 'loading') { return resolve(); }\n      var settled = false;\n      function done() { if (!settled) { settled = true; resolve(); } }\n      document.addEventListener('DOMContentLoaded', done);\n      var left = deadline - Date.now();\n      setTimeout(done, left > 0 ? left : 0);\n    });\n  }\n  function runOpen() {\n    var token = ++S.token;\n    var deadline = Date.now() + cssMs('--sav-clasp-hold-cap', T.holdCapDefault);\n    S.running = true;\n    S.phase = 'opening';\n    var logo = resolveLogo();\n    S.logo = logo;\n\n    waitDom(deadline).then(function () {\n      if (S.token !== token) { return false; }\n      probeLift();                                        // nothing is animating yet: safe place for a subtree scan\n      return waitCss(deadline);\n    }).then(function (ok) {\n      if (S.token !== token) { return; }\n      if (!ok) {                                          // stylesheet never applied: fade the gate, plain page\n        dropGate(true);\n        S.running = false; S.phase = '';\n        try { window.__savClaspFlag = null; } catch (e) { /* noop */ }\n        return;\n      }\n      if (!html.classList.contains('sav-clasp-gate')) {   // head watchdog already dropped the gate: stay plain\n        try { console.debug('sav-clasp: gate was dropped before the script ran (slow document); loading plain, no OPEN.'); } catch (e) { /* noop */ }\n        S.running = false; S.phase = '';\n        try { window.__savClaspFlag = null; window.__savClaspGate = false; } catch (e2) { /* noop */ }\n        return;\n      }\n      /* Build DETACHED and wait for the wordmark on what is LEFT of the shared budget; the gate\n         keeps painting the identical rest state (wordmark included) until the overlay can\n         reproduce it exactly, and .sav-clasp__mark's background covers an undecoded <img>. */\n      var el = build('rest', logo);\n      var img = el.querySelector('.sav-clasp__logo');\n      return waitLogo(img, deadline).then(function () {\n        if (S.token !== token) { return; }\n        if (!html.classList.contains('sav-clasp-gate')) { S.running = false; S.phase = ''; return; }\n        attach(el);                                        // z-index one above the gate: covers it exactly\n        playOpen(el, {});\n      });\n    }).catch(function () { destroy('error'); });\n  }\n\n  /* ------------------------------------------------------- public open() */\n  function open(opts) {\n    opts = opts || {};\n    if (reduceMotion() || !cssOk()) { return false; }\n    var overlay = S.overlay && S.overlay.parentNode ? S.overlay : null;\n    if (overlay && S.phase !== 'rest') { return false; }\n    if (!overlay) {\n      clearTimers();\n      clearExpiry();\n      S.logo = S.logo || resolveLogo();\n      var el = build('rest', S.logo);\n      var img = el.querySelector('.sav-clasp__logo');\n      var token = ++S.token;\n      attach(el);\n      S.running = true; S.phase = 'rest'; S.held = true;\n      waitLogo(img, Date.now() + cssMs('--sav-clasp-hold-cap', T.holdCapDefault)).then(function () {\n        if (S.token !== token) { return; }\n        playOpen(el, opts);\n      });\n      return true;\n    }\n    clearTimers();\n    clearExpiry();\n    playOpen(overlay, opts);\n    return true;\n  }\n  function hold() {\n    if (reduceMotion() || !cssOk()) { return false; }\n    if (S.running && S.phase !== 'rest') { return false; }\n    clearTimers();\n    clearSafety();\n    S.logo = S.logo || resolveLogo();\n    var token = ++S.token;\n    attach(build('rest', S.logo));\n    S.running = true; S.phase = 'rest'; S.held = true;\n    clearExpiry();\n    S.expiry = setTimeout(function () { S.expiry = 0; if (S.token === token) { destroy('holdwatchdog'); } }, T.holdWatchdog);\n    return true;\n  }\n  function rehearse() {\n    if (S.running) { return false; }\n    return close(null, { onRest: function () { timer(function () { open({}); }, T.rehearseHold); } });\n  }\n  function gate(on) {\n    if (on === undefined) { on = !html.classList.contains('sav-clasp-gate'); }\n    clearGateTimer();\n    html.classList.remove('sav-clasp-gate-fade');\n    html.classList.toggle('sav-clasp-gate', !!on);\n    return html.classList.contains('sav-clasp-gate');\n  }\n  function debug(on) {\n    try {\n      if (on === false) { sessionStorage.removeItem(DEBUG_KEY); return false; }\n      sessionStorage.setItem(DEBUG_KEY, '1');\n      return true;\n    } catch (e) { return false; }\n  }\n\n  /* --------------------------------------------------------- link filter */\n  var DENY_PATH = /^(?:\\/[a-z]{2}(?:-[a-z]{2,4})?)?\\/(cart|checkout|checkouts|account|customer_authentication|customer_identity|search|password|challenge|apps|a|tools|services|admin|cdn|community|wallets|discount|orders|gift_cards|payments|shopify_pay|files|s)(\\/|$)/i;\n  /* Same-origin URLs that do not produce a navigation (download / viewer / feed): the document is\n     never unloaded, so pagehide never fires and the doors would sit shut until the guard. */\n  var FILE_EXT = /\\.(?:pdf|zip|gz|tgz|rar|csv|tsv|xlsx?|docx?|pptx?|jpe?g|png|gif|webp|avif|svg|ico|bmp|heic|mp4|mov|webm|m4v|mp3|wav|ogg|txt|json|xml|atom|rss)$/i;\n  var COLLECTIONS = /^(?:\\/[a-z]{2}(?:-[a-z]{2,4})?)?\\/collections(\\/|$)/i;\n  var BLOCK_SEL = 'form, button, [role=\"button\"], [data-no-clasp], dialog, [role=\"dialog\"], [aria-modal=\"true\"], cart-drawer, .cart-drawer, [class*=\"cart-drawer\"], [id*=\"CartDrawer\"], [id*=\"cart-drawer\"], [class*=\"modal\"], [class*=\"popover\"], predictive-search, [class*=\"predictive-search\"], [class*=\"quick-buy\"], [class*=\"quick-add\"], [class*=\"quick-view\"], [class*=\"localization\"]';\n  var NAV_SEL = 'header, nav, footer, [role=\"navigation\"], [class*=\"mega-menu\"], [class*=\"megamenu\"], [class*=\"mega_menu\"], [class*=\"menu-drawer\"], [id*=\"menu-drawer\"], [id^=\"shopify-section-\"][id*=\"header\"], [id^=\"shopify-section-\"][id*=\"footer\"]';\n\n  function isMenuContainer(el) {\n    var s = (el.tagName || '') + ' ' + (el.className && el.className.baseVal !== undefined ? el.className.baseVal : (el.className || '')) + ' ' + (el.id || '');\n    return /menu|navigation|\\bnav\\b/i.test(s) && !/cart|localization|search/i.test(s);\n  }\n  function qualifies(a, url) {\n    if (a.hasAttribute('data-sav-clasp')) { return true; }\n    if (COLLECTIONS.test(url.pathname)) { return true; }\n    var nav = null;\n    try { nav = a.closest(NAV_SEL); } catch (e) { nav = null; }\n    return !!nav;\n  }\n  /* Anchor-only half of the filter (no event state) \u2014 shared by the click handler and the prefetch.\n     It is the expensive half (two closest() calls over ~30 selectors, most of them [class*=]\n     substring matchers), which is why the hover path only reaches it after a dwell. */\n  function candidate(a) {\n    if (!a || !(a instanceof HTMLAnchorElement)) { return null; }\n    var target = (a.getAttribute('target') || '').toLowerCase();\n    if (target && target !== '_self') { return null; }\n    if (a.hasAttribute('download')) { return null; }\n    if (/\\bexternal\\b/i.test(a.getAttribute('rel') || '')) { return null; }\n\n    var blocker = null;\n    try { blocker = a.closest(BLOCK_SEL); } catch (err) { blocker = null; }\n    if (blocker && !(isMenuContainer(blocker) && blocker.tagName !== 'FORM' && blocker.tagName !== 'BUTTON' && !blocker.hasAttribute('data-no-clasp'))) { return null; }\n\n    var raw = a.getAttribute('href') || '';\n    if (!raw || raw.charAt(0) === '#') { return null; }\n    var url;\n    try { url = new URL(raw, location.href); } catch (err) { return null; }\n    if (url.protocol !== 'http:' && url.protocol !== 'https:') { return null; }\n    if (url.origin !== location.origin) { return null; }\n    if (DENY_PATH.test(url.pathname)) { return null; }\n    if (FILE_EXT.test(url.pathname)) { return null; }          // /files/size-guide.pdf, .atom feeds, images\u2026\n    if (/\\/feed(\\/|$)/i.test(url.pathname)) { return null; }\n    try { if (url.searchParams.get('format')) { return null; } } catch (e) { /* noop */ }\n    if (url.pathname === location.pathname) { return null; }   // same page (incl. pagination/sort/filter links)\n    if (!qualifies(a, url)) { return null; }\n    return url;\n  }\n  function anchorFrom(e) {\n    var start = (e.composedPath && e.composedPath()[0]) || e.target;\n    if (!start || !start.closest) { return null; }\n    return start.closest('a[href]');\n  }\n  function onClick(e) {\n    if (e.defaultPrevented) { return; }\n    if (e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) { return; }\n    var a = anchorFrom(e);\n    if (!a || !(a instanceof HTMLAnchorElement)) { return; }\n\n    if (S.running) {\n      /* Only swallow while an overlay is actually on screen and shut. A leaked running flag with\n         no overlay must never make the site's links dead. */\n      if (S.overlay && S.overlay.parentNode && (S.phase === 'closing' || S.phase === 'rest')) { e.preventDefault(); }\n      return;\n    }\n    if (reduceMotion() || !cssOk() || themeTransitionsOn()) { return; }\n\n    var url = candidate(a);\n    if (!url) { return; }\n    /* preventDefault only once CLOSE has actually taken the navigation (handshake written). */\n    if (close(url.href, {})) { e.preventDefault(); }\n  }\n\n  /* Warm the destination document before the click; recovers most of the CDN round trip.\n     pointerdown / focusin are real intent signals and fire once. pointerover is NOT: a single\n     sweep across a mega-menu crosses a dozen links on the way somewhere else, so it is gated\n     behind a 90ms dwell, skipped entirely on coarse pointers (touch is already covered by\n     pointerdown), and the whole thing is capped at 6 documents per page. */\n  var prefetched = {};\n  var prefetchCount = 0;\n  var PREFETCH_MAX = 6;\n  var lastIntent = null;\n  var lastHover = null;\n  var hoverTimer = 0;\n  function prefetch(href) {\n    if (prefetched[href] || prefetchCount >= PREFETCH_MAX) { return; }\n    prefetched[href] = 1; prefetchCount++;\n    try {\n      var l = document.createElement('link');\n      l.rel = 'prefetch';\n      l.href = href;\n      (document.head || html).appendChild(l);\n    } catch (e) { /* noop */ }\n  }\n  function onPointer(e) {\n    if (S.running || !S.storageOk) { return; }\n    var a = anchorFrom(e);\n    if (!a || a === lastIntent) { return; }\n    lastIntent = a;\n    if (reduceMotion() || !cssOk() || themeTransitionsOn()) { return; }\n    var url = candidate(a);\n    if (url) { prefetch(url.href); }\n  }\n  function onHover(e) {\n    if (S.running || !S.storageOk) { return; }\n    if (coarsePointer() || reduceMotion()) { return; }\n    var a = anchorFrom(e);\n    if (!a || a === lastHover) { return; }\n    lastHover = a;\n    clearTimeout(hoverTimer);\n    hoverTimer = setTimeout(function () {\n      hoverTimer = 0;\n      if (lastHover !== a) { return; }\n      onPointer({ target: a });\n    }, T.hoverDwell);\n  }\n  function onHoverOut(e) {\n    var a = lastHover;\n    if (!a) { return; }\n    var to = e && e.relatedTarget;\n    if (to && a.contains && a.contains(to)) { return; }   // still inside the same link\n    clearTimeout(hoverTimer); hoverTimer = 0;\n    lastHover = null;\n  }\n\n  /* ---------------------------------------------------------- lifecycle */\n  function onPageShow(e) { if (e && e.persisted) { destroy('bfcache'); } }\n  /* Keep the closed doors during a REAL unload. A pagehide with persisted=true (bfcache entry, iOS\n     app/tab backgrounding) is not an unload, so it must not wipe the timers \u2014 the CLOSE guard lives\n     outside S.timers anyway, and the visibility handler below is the unconditional escape hatch. */\n  function onPageHide(e) {\n    S.left = true;\n    if (!(e && e.persisted)) { clearTimers(); }\n  }\n  function onVisibility() {\n    if (document.visibilityState === 'hidden') {\n      if (S.phase === 'opening') { destroy('hidden'); }      // finish instantly; nobody is watching\n      return;                                                 // 'closing': leave alone, the guard re-arms\n    }\n    /* Visible again. Any overlay that is still attached and is not mid-OPEN has outlived its run:\n       release it unconditionally (and honour the click if the navigation had not fired yet). This\n       is the one recovery that cannot be disarmed by a latched S.left or a cleared timer, so it\n       carries no conjuncts beyond \"not a state somebody deliberately asked to hold\". */\n    if (S.overlay && S.overlay.parentNode && S.phase !== 'opening' && !S.held) { release('resumed', true); }\n  }\n  function onKeydown(e) {\n    if (!e) { return; }\n    if (e.key === 'Escape' || e.key === 'Esc' || e.keyCode === 27) {\n      /* Escape means \"release me from the animation\", not \"cancel my click\": inside the first\n         550ms of a CLOSE the link's default was already prevented, so a bare teardown would\n         silently swallow the navigation. destroy() clears the handshake, so the destination\n         loads plain \u2014 an instant navigation, which is exactly what Escape should produce. */\n      if (S.running || S.overlay || html.classList.contains('sav-clasp-gate')) { release('escape', false); }\n    }\n  }\n\n  /* ?sav_clasp_test is a maintenance switch, never reachable by a customer who is simply handed\n     a URL: it needs an explicit per-tab opt-in, or a non-live theme, or a theme preview. */\n  function testAllowed() {\n    try { if (sessionStorage.getItem(DEBUG_KEY) === '1') { return true; } } catch (e) { /* noop */ }\n    try { if (window.Shopify && window.Shopify.designMode) { return false; } } catch (e) { /* noop */ }\n    if (/[?&]preview_theme_id=/.test(location.search)) { return true; }\n    var role = '';\n    try { role = (window.Shopify && window.Shopify.theme && window.Shopify.theme.role) ? String(window.Shopify.theme.role).toLowerCase() : ''; } catch (e) { role = ''; }\n    if (role && role !== 'main' && role !== 'live' && role !== 'published') { return true; }\n    return false;\n  }\n  function testMode() {\n    var m = /[?&]sav_clasp_test=(close|open|hold)\\b/i.exec(location.search);\n    if (!m) { return; }\n    if (!testAllowed()) {\n      try { console.warn('sav-clasp: ?sav_clasp_test is ignored here. Run SAVClasp.debug(true) in this tab and reload, or use the theme preview.'); } catch (e) { /* noop */ }\n      return;\n    }\n    var mode = m[1].toLowerCase();\n    waitCss(Date.now() + 3000).then(function (ok) {\n      if (!ok) { return; }\n      if (mode === 'hold') { hold(); }\n      else if (mode === 'close') { close(null, {}); }\n      else { open({ hold: true }); }\n      /* Hard expiry on top of every per-state watchdog: a test URL can never park the page. */\n      clearExpiry();\n      S.expiry = setTimeout(function () { S.expiry = 0; destroy('test-expiry'); }, T.holdWatchdog);\n    });\n  }\n\n  function init() {\n    window.addEventListener('pageshow', onPageShow);\n    window.addEventListener('pagehide', onPageHide);\n    document.addEventListener('visibilitychange', onVisibility);\n    document.addEventListener('keydown', onKeydown);        // universal escape hatch, always registered\n\n    var gated = html.classList.contains('sav-clasp-gate');\n    var flagOk = !!(window.__savClaspGate === true && window.__savClaspFlag);\n\n    if (themeTransitionsOn()) {\n      // Opt OUT rather than fight theme.js's own link-click transition. Still clean any stale gate.\n      try { console.warn('sav-clasp: theme page transitions are on (body.page-transition--enabled); sav-clasp disabled. Set animate_page_transitions=false.'); } catch (e) { /* noop */ }\n      destroy('');\n      return;\n    }\n    if (reduceMotion()) { destroy(''); return; }\n\n    /* A transform / filter / will-change on <body> makes it the containing block for\n       position:fixed and its own stacking context. The overlay is appended to <html> to stay out\n       of that trap, but a <body> in that state usually means another page-transition layer is\n       running anyway \u2014 so refuse rather than paint a vault that does not cover the viewport. */\n    var bodyTrap = false;\n    try {\n      var bs = getComputedStyle(document.body);\n      bodyTrap = (bs.transform && bs.transform !== 'none') ||\n                 (bs.filter && bs.filter !== 'none') ||\n                 (bs.perspective && bs.perspective !== 'none') ||\n                 /transform|filter|perspective/i.test(bs.willChange || '');\n    } catch (e) { bodyTrap = false; }\n    if (bodyTrap) {\n      try { console.warn('sav-clasp: <body> is a containing block for position:fixed (transform/filter/will-change); sav-clasp disabled.'); } catch (e2) { /* noop */ }\n      destroy('');\n      return;\n    }\n\n    S.storageOk = probeStorage();\n    cssOk();\n    window.addEventListener('load', function () { cssOk(); });\n\n    if (gated && flagOk) {\n      runOpen();\n    } else {\n      if (gated) { dropGate(false); }\n      removeStale();\n      try { window.__savClaspFlag = null; window.__savClaspGate = false; } catch (e) { /* noop */ }\n      testMode();\n    }\n\n    if (!S.storageOk) {\n      // No handshake possible \u21D2 never intercept a click: the store degrades to plain navigation.\n      try { console.warn('sav-clasp: sessionStorage unavailable; page transitions disabled (plain navigation).'); } catch (e) { /* noop */ }\n      return;\n    }\n\n    // bubble phase on window: every document-level delegated handler in theme.js runs first\n    window.addEventListener('click', onClick, false);\n    window.addEventListener('pointerdown', onPointer, true);\n    window.addEventListener('focusin', onPointer, true);     // keyboard users get the same prefetch\n    window.addEventListener('pointerover', onHover, true);\n    window.addEventListener('pointerout', onHoverOut, true);\n\n    // warm the wordmark rendition the overlay will use, off the critical path\n    timer(function () { S.logo = S.logo || resolveLogo(); prewarm(S.logo); }, T.prewarmDelay);\n  }\n\n  /* ------------------------------------------------------------- expose */\n  var api = {\n    version: VERSION,\n    close: function (url) { return close(url ? String(url) : null, {}); },\n    open: function (opts) { return open(opts || {}); },\n    hold: hold,\n    remove: function () { destroy('manual'); return true; },\n    rehearse: rehearse,\n    gate: gate,\n    debug: debug\n  };\n  Object.defineProperty(api, 'running', { get: function () { return S.running; } });\n  Object.defineProperty(api, 'phase', { get: function () { return S.phase; } });\n  Object.defineProperty(api, 'storageOk', { get: function () { return S.storageOk; } });\n  Object.defineProperty(api, 'metrics', { get: function () { return S.metrics; } });\n  Object.defineProperty(api, 'logo', { get: function () { return S.logo || resolveLogo(); } });\n  Object.defineProperty(api, 'overlay', { get: function () { return S.overlay; } });\n  window.SAVClasp = api;\n\n  if (document.body) { init(); } else { document.addEventListener('DOMContentLoaded', init); }\n})(window, document);"],
  "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAoCC,SAAUA,QAAQC,UAAU,CAC3B,aACA,GAAI,CAACD,SAAU,CAACC,WAAYD,QAAO,SAAY,OAE/C,IAAI,QAAU,QACV,IAAM,YACN,UAAY,kBACZ,GAAK,YAKL,YAAc,UAAY,CAC5B,IAAI,EAAI,EACR,GAAI,CAAE,EAAI,SAASA,QAAO,gBAAiB,EAAE,GAAK,CAAG,OAAS,EAAG,CAAE,EAAI,CAAG,CAC1E,OAAQ,GAAK,KAAO,GAAK,KAAQ,EAAI,GACvC,GAAG,EACC,aAAe,mHAAqH,WACpI,WAAa,OAIb,EAAI,CACN,WAAY,IACZ,iBAAkB,IAClB,kBAAmB,IACnB,cAAe,KACf,YAAa,IACb,WAAY,IACZ,aAAc,IACd,gBAAiB,IACjB,WAAY,KACZ,aAAc,IACd,eAAgB,IAChB,aAAc,IACd,WAAY,IACZ,WAAY,GACZ,aAAc,IAChB,EAMI,WAAa,CAAE,OAAQ,EAAG,OAAQ,EAAG,aAAc,EAAG,cAAe,EAAG,QAAS,EAAG,MAAO,CAAE,EAE7F,KAAOC,UAAS,gBAChB,EAAI,CACN,QAAS,GACT,MAAO,GACP,QAAS,KACT,OAAQ,CAAC,EACT,OAAQ,EACR,OAAQ,EACR,MAAO,EACP,MAAO,EACP,KAAM,GACN,UAAW,GACX,KAAM,GACN,UAAW,GACX,YAAa,KACb,YAAa,KACb,QAAS,KACT,KAAM,GACN,WAAY,EACZ,QAAS,CAAE,iBAAkB,KAAM,eAAgB,IAAK,CAC1D,EAGA,SAAS,MAAM,GAAI,GAAI,CAAE,IAAI,GAAK,WAAW,GAAI,EAAE,EAAG,SAAE,OAAO,KAAK,EAAE,EAAU,EAAI,CACpF,SAAS,aAAc,CAAE,QAAS,EAAI,EAAG,EAAI,EAAE,OAAO,OAAQ,IAAO,aAAa,EAAE,OAAO,CAAC,CAAC,EAAK,EAAE,OAAS,CAAC,CAAG,CACjH,SAAS,aAAc,CAAM,EAAE,SAAU,aAAa,EAAE,MAAM,EAAG,EAAE,OAAS,EAAK,CACjF,SAAS,aAAc,CAAM,EAAE,SAAU,aAAa,EAAE,MAAM,EAAG,EAAE,OAAS,EAAK,CACjF,SAAS,YAAa,CAAM,EAAE,QAAS,aAAa,EAAE,KAAK,EAAG,EAAE,MAAQ,EAAK,CAC7E,SAAS,IAAI,GAAI,CAAE,OAAOD,QAAO,sBAAwBA,QAAO,sBAAsB,EAAE,EAAI,WAAW,GAAI,EAAE,CAAG,CAEhH,SAAS,WAAW,GAAI,CACtB,IAAI,KAAO,GACX,SAAS,MAAO,CAAO,OAAQ,KAAO,GAAM,GAAG,EAAK,CACpD,IAAI,IAAI,EAAG,WAAW,KAAM,EAAE,CAChC,CACA,SAAS,SAAS,KAAM,OAAQ,CAC9B,GAAI,CAAEC,UAAS,cAAc,IAAI,YAAY,KAAM,CAAE,OAAQ,QAAU,CAAC,CAAE,CAAC,CAAC,CAAG,OAAS,EAAG,CAAa,CAC1G,CAIA,IAAI,UAAY,KAAM,UAAY,KAClC,GAAI,CAAE,UAAYD,QAAO,WAAaA,QAAO,WAAW,kCAAkC,EAAI,IAAM,OAAS,EAAG,CAAE,UAAY,IAAM,CACpI,GAAI,CAAE,UAAYA,QAAO,WAAaA,QAAO,WAAW,mBAAmB,EAAI,IAAM,OAAS,EAAG,CAAE,UAAY,IAAM,CACrH,SAAS,cAAe,CAAE,MAAO,CAAC,EAAE,WAAa,UAAU,QAAU,CACrE,SAAS,eAAgB,CAAE,MAAO,CAAC,EAAE,WAAa,UAAU,QAAU,CAEtE,SAAS,OAAO,KAAM,CACpB,GAAI,CAAE,OAAO,iBAAiB,IAAI,EAAE,iBAAiB,IAAI,EAAE,KAAK,CAAG,OAAS,EAAG,CAAE,MAAO,EAAI,CAC9F,CACA,SAAS,UAAW,CAAE,OAAO,OAAO,mBAAmB,IAAM,GAAK,CAIlE,IAAI,OAAS,GACb,SAAS,OAAQ,CAAE,OAAI,OAAiB,IAAQ,OAAS,SAAS,EAAU,OAAQ,CACpF,SAAS,MAAM,KAAM,SAAU,CAC7B,IAAI,EAAI,OAAO,IAAI,EAAG,GAAI,CAAC,EAAK,OAAO,SACvC,IAAI,EAAI,WAAW,CAAC,EAAG,OAAI,MAAM,CAAC,EAAY,SAC1C,UAAU,KAAK,CAAC,EAAY,EAC5B,SAAS,KAAK,CAAC,EAAY,EAAI,IAC5B,CACT,CACA,SAAS,QAAS,CAChB,IAAI,EAAI,WAAW,OAAO,qBAAqB,CAAC,EAChD,OAAQ,EAAI,KAAQ,EAAI,GAAM,EAAI,UACpC,CACA,SAAS,oBAAqB,CAC5B,IAAI,EAAIC,UAAS,KACjB,MAAO,CAAC,EAAG,GAAK,EAAE,UAAU,SAAS,0BAA0B,GAAM,KAAK,UAAU,SAAS,0BAA0B,EACzH,CACA,SAAS,gBAAiB,CACxB,GAAI,CAAMD,QAAO,sBAAuB,aAAaA,QAAO,mBAAmB,EAAGA,QAAO,oBAAsB,EAAK,OAAS,EAAG,CAAa,CAC/I,CAGA,SAAS,SAAS,KAAM,CACtB,eAAe,EACf,GAAI,CAAEA,QAAO,eAAiB,EAAO,OAAS,EAAG,CAAa,CAC9D,GAAI,CAAC,KAAK,UAAU,SAAS,gBAAgB,EAAG,CAC9C,KAAK,UAAU,OAAO,qBAAqB,EAC3C,MACF,CACI,MACF,KAAK,UAAU,IAAI,qBAAqB,EACxC,WAAW,UAAY,CACrB,KAAK,UAAU,OAAO,gBAAgB,EACtC,KAAK,UAAU,OAAO,qBAAqB,CAC7C,EAAG,GAAG,IAEN,KAAK,UAAU,OAAO,gBAAgB,EACtC,KAAK,UAAU,OAAO,qBAAqB,EAE/C,CACA,SAAS,WAAY,CAAE,GAAI,CAAE,eAAe,WAAW,GAAG,CAAG,OAAS,EAAG,CAAa,CAAE,CAGxF,SAAS,UAAU,KAAM,KAAM,CAC7B,GAAI,CACF,sBAAe,QAAQ,IAAK,KAAK,UAAU,CAAE,EAAG,KAAK,IAAI,EAAG,KAAM,KAAM,KAAM,SAAS,SAAU,KAAM,IAAK,CAAC,CAAC,EACvG,EACT,OAAS,EAAG,CAAE,MAAO,EAAO,CAC9B,CACA,SAAS,cAAe,CACtB,GAAI,CACF,sBAAe,QAAQ,IAAM,SAAU,GAAG,EAC1C,eAAe,WAAW,IAAM,QAAQ,EACjC,EACT,OAAS,EAAG,CAAE,MAAO,EAAO,CAC9B,CAGA,SAAS,UAAU,IAAK,CACtB,GAAI,CACF,IAAI,EAAI,IAAI,IAAI,IAAK,SAAS,IAAI,EAClC,OAAI,EAAE,WAAa,UAAY,EAAE,WAAa,QAAkB,IAC5D,eAAe,KAAK,EAAE,QAAQ,GAClC,EAAE,aAAa,IAAI,QAAS,OAAO,UAAU,CAAC,EACvC,EAAE,KACX,OAAS,EAAG,CAAE,MAAO,EAAI,CAC3B,CACA,SAAS,KAAK,IAAK,CAAE,OAAO,OAAO,KAAQ,UAAY,6BAA6B,KAAK,GAAG,CAAG,CAI/F,SAAS,aAAc,CACrB,IAAI,KAAOA,QAAO,eAClB,GAAI,MAAQ,KAAK,KAAK,IAAI,EAAK,OAAO,KAAK,KAC3C,IAAI,OAASA,QAAO,eACpB,GAAI,OAAQ,CAAE,IAAI,EAAI,UAAU,OAAO,MAAM,CAAC,EAAG,GAAI,KAAK,CAAC,EAAK,OAAO,CAAK,CAM5E,QALI,KAAO,CACT,+BAAgC,wBAChC,yBAA0B,oCAC1B,6BAA8B,uCAChC,EACS,EAAI,EAAG,EAAI,KAAK,OAAQ,IAAK,CACpC,IAAI,IAAM,KACV,GAAI,CAAE,IAAMC,UAAS,cAAc,KAAK,CAAC,CAAC,CAAG,OAAS,EAAG,CAAE,IAAM,IAAM,CACvE,GAAI,IAAK,CACP,IAAI,IAAM,UAAU,IAAI,YAAc,IAAI,KAAO,EAAE,EACnD,GAAI,KAAK,GAAG,EAAK,OAAO,GAC1B,CACF,CACA,OAAO,YACT,CACA,SAAS,QAAQ,IAAK,CAAE,GAAI,CAAE,IAAI,EAAI,IAAI,MAAS,EAAE,SAAW,QAAS,EAAE,IAAM,GAAK,OAAS,EAAG,CAAa,CAAE,CAGjH,IAAI,UAAY,+KAIZ,MACF,8NAKA,UACA,2EAIF,SAAS,aAAc,CAErB,QADI,MAAQA,UAAS,iBAAiB,IAAM,GAAK,cAAc,EACtD,EAAI,EAAG,EAAI,MAAM,OAAQ,IAAK,CACrC,IAAI,EAAI,MAAM,CAAC,EACX,EAAE,WAAa,EAAE,UAAU,SAAS,mBAAmB,GACvD,EAAE,YAAc,EAAE,WAAW,YAAY,CAAC,CAChD,CACF,CAIA,SAAS,MAAM,UAAW,QAAS,CACjC,IAAI,GAAKA,UAAS,cAAc,KAAK,EACrC,GAAG,UAAY,YACf,GAAG,GAAK,GACR,GAAG,aAAa,cAAe,MAAM,EACrC,GAAG,aAAa,OAAQ,cAAc,EACtC,GAAG,aAAa,aAAc,SAAS,EACvC,GAAG,UAAY,MACf,IAAI,IAAMA,UAAS,cAAc,KAAK,EAClC,GAAK,OAAO,EAChB,WAAI,UAAY,kBAChB,IAAI,IAAM,GACV,IAAI,MAAQ,IACZ,IAAI,OAAS,KAAK,IAAI,EAAG,KAAK,MAAM,IAAO,EAAE,CAAC,EAC9C,IAAI,aAAa,WAAY,OAAO,EACpC,IAAI,aAAa,YAAa,OAAO,EACrC,IAAI,IAAM,QACV,IAAI,iBAAiB,QAAS,UAAY,CACpC,IAAI,MAAQ,eAAgB,IAAI,IAAM,aAC5C,CAAC,EACD,GAAG,cAAc,kBAAkB,EAAE,YAAY,GAAG,EAC7C,EACT,CAMA,SAAS,OAAO,GAAI,CAClB,mBAAY,EACZ,KAAK,YAAY,EAAE,EACnB,EAAE,QAAU,GACL,EACT,CACA,SAAS,WAAW,GAAI,MAAO,GAAI,CACjC,IAAI,KAAO,GACX,SAAS,QAAQ,EAAG,CACd,MACA,MAAM,QAAQ,EAAE,aAAa,IAAM,KACvC,KAAO,GACP,GAAG,oBAAoB,eAAgB,OAAO,EAC9C,GAAG,CAAC,EACN,CACA,UAAG,iBAAiB,eAAgB,OAAO,EACpC,UAAkB,CAAE,KAAO,GAAM,GAAG,oBAAoB,eAAgB,OAAO,CAAG,CAC3F,CACA,SAAS,YAAa,CACpB,OAAOA,UAAS,eAAe,aAAa,GAAKA,UAAS,cAAc,mBAAmB,GAAKA,UAAS,cAAc,MAAM,CAC/H,CAOA,IAAI,aAAe,+GACnB,SAAS,WAAY,CACnB,GAAI,EAAE,UAAY,KAClB,KAAI,GAAK,WAAW,EACpB,GAAI,CAAC,GAAI,CAAE,EAAE,QAAU,GAAO,MAAQ,CACtC,IAAI,OAAS,KACb,GAAI,CAAE,OAAS,GAAG,cAAc,YAAY,CAAG,OAAS,EAAG,CAAE,OAAS,IAAM,CAC5E,GAAI,OAAQ,CAAE,EAAE,QAAU,GAAO,MAAQ,CAGzC,QAFI,KAAO,GAAG,UAAY,CAAC,EACvB,EAAI,KAAK,OAAS,GAAK,KAAK,OAAS,GAChC,EAAI,EAAG,EAAI,EAAG,IAAK,CAC1B,IAAI,EAAI,GACR,GAAI,CAAE,EAAI,iBAAiB,KAAK,CAAC,CAAC,EAAE,QAAU,OAAS,EAAG,CAAE,EAAI,EAAI,CACpE,GAAI,IAAM,SAAW,IAAM,SAAU,CAAE,EAAE,QAAU,GAAO,MAAQ,CACpE,CACA,EAAE,QAAU,GACd,CACA,SAAS,UAAU,GAAI,CACrB,GAAG,UAAU,OAAO,gBAAgB,EACpC,GAAG,UAAU,OAAO,sBAAsB,CAC5C,CACA,SAAS,WAAY,CACnB,IAAI,GAAK,WAAW,EAAG,GAAK,GAC5B,KAAI,EAAI,OAAO,kBAAkB,EAC7B,KAAO,EAAE,IAAM,KAAO,IAAM,OAAS,IAAM,QAC3C,OACE,EAAE,UAAY,MAAQ,UAAU,EACpC,KAAO,EAAE,UAAY,IAEvB,GAAG,UAAU,IAAI,gBAAgB,EAC7B,MAAQ,GAAG,UAAU,IAAI,sBAAsB,EACnD,IAAI,OAAS,WAAW,GAAI,CAAC,iBAAkB,qBAAqB,EAAG,UAAY,CAAE,UAAU,EAAE,CAAG,CAAC,EACrG,MAAM,UAAY,CAAE,OAAO,EAAG,UAAU,EAAE,CAAG,EAAG,EAAE,YAAY,EAChE,CAGA,SAAS,QAAQ,OAAQ,CAIvB,IAAI,SAAW,EAAE,WAAa,CAAC,EAAE,MAAQ,EAAE,QAAU,WAAa,CAAC,WAAW,QAAU,EAAE,EAC1F,EAAE,QACF,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,SAAS,EAAK,EACd,YAAY,EACZ,KAAK,UAAU,OAAO,mBAAmB,EACzC,KAAK,UAAU,OAAO,mBAAmB,EACzC,KAAK,UAAU,OAAO,gBAAgB,EAEtC,QADI,EAAIA,UAAS,iBAAiB,iBAAiB,EAC1C,EAAI,EAAG,EAAI,EAAE,OAAQ,IAAO,UAAU,EAAE,CAAC,CAAC,EACnD,EAAE,QAAU,KACZ,EAAE,QAAU,GACZ,EAAE,MAAQ,GACV,EAAE,KAAO,GACT,EAAE,UAAY,GACd,EAAE,KAAO,GACT,EAAE,YAAc,KACX,UAAY,UAAU,EAC3B,GAAI,CAAED,QAAO,eAAiB,KAAMA,QAAO,eAAiB,EAAO,OAAS,EAAG,CAAa,CAE5F,GAAI,CACE,EAAE,aAAe,EAAE,YAAY,aAAe,QAAU,SAAW,WAAa,OAAO,EAAE,YAAY,OAAU,YACjH,EAAE,YAAY,MAAM,CAAE,cAAe,EAAK,CAAC,CAE/C,OAAS,EAAG,CAAa,CACzB,EAAE,YAAc,KACZ,QAAU,SAAS,mBAAoB,CAAE,OAAQ,MAAO,CAAC,CAC/D,CAKA,SAAS,SAAS,OAAQ,CACxB,IAAI,GAAK,EAAE,QACP,IAAM,GAAG,aACX,GAAG,gBAAgB,IAAI,EACvB,GAAG,UAAU,OAAO,gBAAgB,EACpC,GAAG,UAAU,IAAI,mBAAmB,EACpC,WAAW,UAAY,CAAM,GAAG,YAAc,GAAG,WAAW,YAAY,EAAE,CAAK,EAAG,GAAG,EACrF,EAAE,QAAU,MAEd,QAAQ,MAAM,CAChB,CAIA,SAAS,QAAQ,OAAQ,KAAM,CAC7B,IAAI,QAAW,EAAE,QAAU,WAAa,CAAC,EAAE,UAAa,EAAE,YAAc,KAExE,GADI,KAAQ,SAAS,MAAM,EAAY,QAAQ,MAAM,EACjD,QAAW,GAAI,CAAE,SAAS,OAAO,OAAO,CAAG,OAAS,EAAG,CAAa,CAC1E,CAGA,SAAS,MAAM,KAAM,KAAM,CAGzB,GAFA,KAAO,MAAQ,CAAC,EACZ,EAAE,SACF,aAAa,GAAK,CAAC,MAAM,EAAK,MAAO,GACzC,IAAI,KAAO,EAAE,MAAQ,YAAY,EAKjC,GAAI,MACF,GAAI,CAAC,EAAE,WAAa,CAAC,UAAU,KAAM,IAAI,EAAK,iBAAU,EAAU,QAElE,UAAU,EAGZ,EAAE,KAAO,KACT,EAAE,QAAU,GACZ,EAAE,MAAQ,UACV,EAAE,UAAY,GACd,EAAE,KAAO,GACT,EAAE,KAAO,GACT,EAAE,YAAc,MAAQ,KACxB,EAAE,WAAa,KAAK,IAAI,EACxB,IAAI,MAAQ,EAAE,EAAE,MAChB,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,EAEX,GAAI,CACF,EAAE,YAAcC,UAAS,eAAiB,KACtC,EAAE,aAAe,OAAO,EAAE,YAAY,MAAS,YAAc,EAAE,YAAY,KAAK,CACtF,OAAS,EAAG,CAAE,EAAE,YAAc,IAAM,CAEpC,KAAK,UAAU,IAAI,mBAAmB,EACtC,KAAK,UAAU,IAAI,gBAAgB,EAEnC,IAAI,QAAU,OAAO,MAAM,UAAW,IAAI,CAAC,EAC3C,QAAQ,UAAU,IAAI,gBAAgB,EACtC,QAAQ,IAAI,EAEZ,SAAS,uBAAwB,CAAE,KAAM,MAAQ,IAAK,CAAC,EAEvD,SAAS,IAAK,CACR,EAAE,QAAU,OAAS,EAAE,WAAa,EAAE,OAC1C,EAAE,UAAY,GACd,WAAW,UAAY,CAAM,CAAC,EAAE,MAAQ,EAAE,QAAU,OAAS,SAAS,OAAO,IAAI,CAAK,CAAC,EACzF,CACA,SAAS,QAAS,CACZ,EAAE,QAAU,OAAS,CAAC,EAAE,SAAW,EAAE,QAAU,YACnD,EAAE,MAAQ,OACV,EAAE,KAAO,GACT,EAAE,QAAQ,UAAU,OAAO,gBAAgB,EAC3C,EAAE,QAAQ,aAAa,aAAc,MAAM,EAC3C,KAAK,UAAU,OAAO,mBAAmB,EACzC,KAAK,UAAU,OAAO,gBAAgB,EAClC,OAAO,KAAK,QAAW,YAAc,KAAK,OAAO,EACvD,CAKA,SAAS,UAAW,CAClB,WAAW,EACX,EAAE,MAAQ,WAAW,SAAS,MAAO,CAEnC,GADA,EAAE,MAAQ,EACN,EAAE,QAAU,OACZ,GAAE,KACN,IAAIA,UAAS,kBAAoB,SAAU,CACzC,EAAE,MAAQ,WAAW,KAAM,EAAE,UAAU,EACvC,MACF,CACA,GAAI,EAAE,WAAc,KAAK,IAAI,EAAI,EAAE,WAAc,EAAE,YAAa,CAC9D,EAAE,MAAQ,WAAW,KAAM,EAAE,UAAU,EACvC,MACF,CACA,QAAQ,WAAY,EAAI,EAC1B,EAAG,EAAE,aAAa,CACpB,CAEA,GAAI,KAAM,CAKR,IAAI,UAAY,WAAW,QAAS,CAAC,sBAAsB,EAAG,EAAE,EAChE,MAAM,GAAI,EAAE,UAAU,EACtB,MAAM,UAAY,CAAE,UAAU,EAAG,GAAG,CAAG,EAAG,EAAE,gBAAgB,EAC5D,SAAS,CACX,KAAO,CACL,IAAI,WAAa,WAAW,QAAS,CAAC,oBAAoB,EAAG,MAAM,EACnE,MAAM,UAAY,CAAE,WAAW,EAAG,OAAO,CAAG,EAAG,EAAE,iBAAiB,EAGlE,YAAY,EACZ,EAAE,OAAS,WAAW,UAAY,CAChC,EAAE,OAAS,EACP,EAAE,QAAU,OAAS,QAAQ,cAAc,CACjD,EAAG,EAAE,YAAY,CACnB,CACA,MAAO,EACT,CAGA,SAAS,SAAS,QAAS,KAAM,CAE/B,GADA,KAAO,MAAQ,CAAC,EACZ,GAAC,SAAW,CAAC,QAAQ,YACzB,KAAI,MAAQ,EAAE,EAAE,MAChB,EAAE,MAAQ,UACV,EAAE,QAAU,GACZ,IAAI,KAAOD,QAAO,eACd,GAAK,MAAQ,CAAC,KAAK,EAAI,CAAC,KAAK,EAAI,EACjC,CAAC,KAAK,QAAU,EAAE,UAAY,MAAQ,UAAU,EAKpD,YAAY,EACZ,EAAE,OAAS,WAAW,UAAY,CAChC,EAAE,OAAS,GACP,EAAE,SAAW,KAAK,UAAU,SAAS,mBAAmB,GAAK,KAAK,UAAU,SAAS,gBAAgB,IACvG,QAAQ,QAAQ,CAEpB,EAAG,EAAE,UAAU,EAEf,WAAW,UAAY,CACrB,GAAI,EAAE,QAAU,MAAS,OACzB,GAAI,CACF,KAAK,UAAU,OAAO,gBAAgB,EACtC,KAAK,UAAU,IAAI,mBAAmB,EACtC,QAAQ,UAAU,IAAI,gBAAgB,EACtC,QAAQ,aAAa,aAAc,SAAS,EAG5C,IAAI,UAAY,CAAM,EAAE,QAAU,OAAS,SAAS,EAAK,CAAK,CAAC,EAC1D,KAAK,QAAU,UAAU,EAC1B,KAAM,EAAE,QAAQ,iBAAmB,KAAK,IAAI,EAAI,IACpD,GAAI,CAAE,YAAY,KAAK,qBAAqB,CAAG,OAAS,EAAG,CAAa,CACxE,SAAS,sBAAuB,CAAE,QAAS,EAAE,OAAQ,CAAC,EAEtD,IAAI,OAAS,WAAW,QAAS,CAAC,uBAAuB,EAAG,MAAM,EAClE,MAAM,UAAY,CAAE,OAAO,EAAG,OAAO,CAAG,EAAG,EAAE,eAAe,CAC9D,OAAS,EAAG,CACV,QAAQ,OAAO,CACjB,CAEA,SAAS,QAAS,CAChB,GAAI,IAAE,QAAU,OAAS,EAAE,QAAU,WACrC,aAAY,EACR,KAAM,EAAE,QAAQ,eAAiB,KAAK,IAAI,EAAI,IAClD,GAAI,CAAE,YAAY,KAAK,mBAAmB,CAAG,OAAS,EAAG,CAAa,CACtE,KAAK,UAAU,OAAO,mBAAmB,EACzC,GAAI,CAAEA,QAAO,eAAiB,KAAMA,QAAO,eAAiB,EAAO,OAAS,EAAG,CAAa,CACxF,KAAK,MACP,EAAE,MAAQ,OACV,EAAE,KAAO,GACT,QAAQ,UAAU,OAAO,gBAAgB,EACzC,YAAY,EACZ,EAAE,OAAS,WAAW,UAAY,CAAE,EAAE,OAAS,EAAG,QAAQ,cAAc,CAAG,EAAG,EAAE,YAAY,IAExF,QAAQ,YAAc,QAAQ,WAAW,YAAY,OAAO,EAChE,EAAE,QAAU,KACZ,EAAE,QAAU,GACZ,EAAE,MAAQ,IAEZ,SAAS,oBAAqB,CAAE,QAAS,EAAE,OAAQ,CAAC,EACtD,CACF,CAAC,EACH,CAMA,SAAS,QAAQ,SAAU,CACzB,OAAO,IAAI,QAAQ,SAAU,QAAS,CACpC,GAAI,SAAS,EAAK,cAAS,GAAa,QAAQ,EAAI,EACpD,IAAI,QAAU,GACd,SAAS,KAAK,GAAI,CAAO,UAAW,QAAU,GAAU,KAAM,OAAS,IAAQ,QAAQ,EAAE,EAAK,CAC9F,IAAI,KAAOC,UAAS,eAAe,eAAe,GAAKA,UAAS,cAAc,6BAA6B,EACvG,OAIF,KAAK,iBAAiB,OAAQ,UAAY,CAAM,SAAS,GAAK,KAAK,EAAI,CAAK,CAAC,EAC7E,KAAK,iBAAiB,QAAS,UAAY,CAAE,KAAK,EAAK,CAAG,CAAC,IAE5D,SAAS,MAAO,CACf,GAAI,SACJ,IAAI,SAAS,EAAK,OAAO,KAAK,EAAI,EAClC,GAAI,KAAK,IAAI,GAAK,SAAY,OAAO,KAAK,EAAK,EAC/C,WAAW,KAAM,EAAE,EACrB,GAAG,CACL,CAAC,CACH,CACA,SAAS,SAAS,IAAK,SAAU,CAC/B,OAAO,IAAI,QAAQ,SAAU,QAAS,CACpC,IAAI,QAAU,GACd,SAAS,MAAO,CAAO,UAAW,QAAU,GAAM,QAAQ,EAAK,CAE/D,GADI,CAAC,KACD,IAAI,UAAY,IAAI,aAAe,EAAK,OAAO,KAAK,EACxD,GAAI,OAAO,IAAI,QAAW,WAAc,GAAI,CAAE,IAAI,OAAO,EAAE,KAAK,KAAM,IAAI,CAAG,OAAS,EAAG,CAAa,CACtG,IAAI,iBAAiB,OAAQ,IAAI,EACjC,IAAI,iBAAiB,QAAS,IAAI,EAClC,IAAI,KAAO,SAAW,KAAK,IAAI,EAC/B,WAAW,KAAM,KAAO,EAAI,KAAO,CAAC,CACtC,CAAC,CACH,CACA,SAAS,QAAQ,SAAU,CACzB,OAAO,IAAI,QAAQ,SAAU,QAAS,CACpC,GAAIA,UAAS,aAAe,UAAa,OAAO,QAAQ,EACxD,IAAI,QAAU,GACd,SAAS,MAAO,CAAO,UAAW,QAAU,GAAM,QAAQ,EAAK,CAC/DA,UAAS,iBAAiB,mBAAoB,IAAI,EAClD,IAAI,KAAO,SAAW,KAAK,IAAI,EAC/B,WAAW,KAAM,KAAO,EAAI,KAAO,CAAC,CACtC,CAAC,CACH,CACA,SAAS,SAAU,CACjB,IAAI,MAAQ,EAAE,EAAE,MACZ,SAAW,KAAK,IAAI,EAAI,MAAM,uBAAwB,EAAE,cAAc,EAC1E,EAAE,QAAU,GACZ,EAAE,MAAQ,UACV,IAAI,KAAO,YAAY,EACvB,EAAE,KAAO,KAET,QAAQ,QAAQ,EAAE,KAAK,UAAY,CACjC,OAAI,EAAE,QAAU,MAAgB,IAChC,UAAU,EACH,QAAQ,QAAQ,EACzB,CAAC,EAAE,KAAK,SAAU,GAAI,CACpB,GAAI,EAAE,QAAU,MAChB,IAAI,CAAC,GAAI,CACP,SAAS,EAAI,EACb,EAAE,QAAU,GAAO,EAAE,MAAQ,GAC7B,GAAI,CAAED,QAAO,eAAiB,IAAM,OAAS,EAAG,CAAa,CAC7D,MACF,CACA,GAAI,CAAC,KAAK,UAAU,SAAS,gBAAgB,EAAG,CAC9C,GAAI,CAAE,QAAQ,MAAM,4FAA4F,CAAG,OAAS,EAAG,CAAa,CAC5I,EAAE,QAAU,GAAO,EAAE,MAAQ,GAC7B,GAAI,CAAEA,QAAO,eAAiB,KAAMA,QAAO,eAAiB,EAAO,OAAS,GAAI,CAAa,CAC7F,MACF,CAIA,IAAI,GAAK,MAAM,OAAQ,IAAI,EACvB,IAAM,GAAG,cAAc,kBAAkB,EAC7C,OAAO,SAAS,IAAK,QAAQ,EAAE,KAAK,UAAY,CAC9C,GAAI,EAAE,QAAU,MAChB,IAAI,CAAC,KAAK,UAAU,SAAS,gBAAgB,EAAG,CAAE,EAAE,QAAU,GAAO,EAAE,MAAQ,GAAI,MAAQ,CAC3F,OAAO,EAAE,EACT,SAAS,GAAI,CAAC,CAAC,EACjB,CAAC,EACH,CAAC,EAAE,MAAM,UAAY,CAAE,QAAQ,OAAO,CAAG,CAAC,CAC5C,CAGA,SAAS,KAAK,KAAM,CAElB,GADA,KAAO,MAAQ,CAAC,EACZ,aAAa,GAAK,CAAC,MAAM,EAAK,MAAO,GACzC,IAAI,QAAU,EAAE,SAAW,EAAE,QAAQ,WAAa,EAAE,QAAU,KAC9D,GAAI,SAAW,EAAE,QAAU,OAAU,MAAO,GAC5C,GAAI,CAAC,QAAS,CACZ,YAAY,EACZ,YAAY,EACZ,EAAE,KAAO,EAAE,MAAQ,YAAY,EAC/B,IAAI,GAAK,MAAM,OAAQ,EAAE,IAAI,EACzB,IAAM,GAAG,cAAc,kBAAkB,EACzC,MAAQ,EAAE,EAAE,MAChB,cAAO,EAAE,EACT,EAAE,QAAU,GAAM,EAAE,MAAQ,OAAQ,EAAE,KAAO,GAC7C,SAAS,IAAK,KAAK,IAAI,EAAI,MAAM,uBAAwB,EAAE,cAAc,CAAC,EAAE,KAAK,UAAY,CACvF,EAAE,QAAU,OAChB,SAAS,GAAI,IAAI,CACnB,CAAC,EACM,EACT,CACA,mBAAY,EACZ,YAAY,EACZ,SAAS,QAAS,IAAI,EACf,EACT,CACA,SAAS,MAAO,CAEd,GADI,aAAa,GAAK,CAAC,MAAM,GACzB,EAAE,SAAW,EAAE,QAAU,OAAU,MAAO,GAC9C,YAAY,EACZ,YAAY,EACZ,EAAE,KAAO,EAAE,MAAQ,YAAY,EAC/B,IAAI,MAAQ,EAAE,EAAE,MAChB,cAAO,MAAM,OAAQ,EAAE,IAAI,CAAC,EAC5B,EAAE,QAAU,GAAM,EAAE,MAAQ,OAAQ,EAAE,KAAO,GAC7C,YAAY,EACZ,EAAE,OAAS,WAAW,UAAY,CAAE,EAAE,OAAS,EAAO,EAAE,QAAU,OAAS,QAAQ,cAAc,CAAK,EAAG,EAAE,YAAY,EAChH,EACT,CACA,SAAS,UAAW,CAClB,OAAI,EAAE,QAAkB,GACjB,MAAM,KAAM,CAAE,OAAQ,UAAY,CAAE,MAAM,UAAY,CAAE,KAAK,CAAC,CAAC,CAAG,EAAG,EAAE,YAAY,CAAG,CAAE,CAAC,CAClG,CACA,SAAS,KAAK,GAAI,CAChB,OAAI,KAAO,SAAa,GAAK,CAAC,KAAK,UAAU,SAAS,gBAAgB,GACtE,eAAe,EACf,KAAK,UAAU,OAAO,qBAAqB,EAC3C,KAAK,UAAU,OAAO,iBAAkB,CAAC,CAAC,EAAE,EACrC,KAAK,UAAU,SAAS,gBAAgB,CACjD,CACA,SAAS,MAAM,GAAI,CACjB,GAAI,CACF,OAAI,KAAO,IAAS,eAAe,WAAW,SAAS,EAAU,KACjE,eAAe,QAAQ,UAAW,GAAG,EAC9B,GACT,OAAS,EAAG,CAAE,MAAO,EAAO,CAC9B,CAGA,IAAI,UAAY,2PAGZ,SAAW,mJACX,YAAc,uDACd,UAAY,8WACZ,QAAU,yOAEd,SAAS,gBAAgB,GAAI,CAC3B,IAAI,GAAK,GAAG,SAAW,IAAM,KAAO,GAAG,WAAa,GAAG,UAAU,UAAY,OAAY,GAAG,UAAU,QAAW,GAAG,WAAa,IAAO,KAAO,GAAG,IAAM,IACxJ,MAAO,2BAA2B,KAAK,CAAC,GAAK,CAAC,4BAA4B,KAAK,CAAC,CAClF,CACA,SAAS,UAAU,EAAG,IAAK,CAEzB,GADI,EAAE,aAAa,gBAAgB,GAC/B,YAAY,KAAK,IAAI,QAAQ,EAAK,MAAO,GAC7C,IAAI,IAAM,KACV,GAAI,CAAE,IAAM,EAAE,QAAQ,OAAO,CAAG,OAAS,EAAG,CAAE,IAAM,IAAM,CAC1D,MAAO,CAAC,CAAC,GACX,CAIA,SAAS,UAAU,EAAG,CACpB,GAAI,CAAC,GAAK,EAAE,aAAa,mBAAsB,OAAO,KACtD,IAAI,QAAU,EAAE,aAAa,QAAQ,GAAK,IAAI,YAAY,EAG1D,GAFI,QAAU,SAAW,SACrB,EAAE,aAAa,UAAU,GACzB,gBAAgB,KAAK,EAAE,aAAa,KAAK,GAAK,EAAE,EAAK,OAAO,KAEhE,IAAI,QAAU,KACd,GAAI,CAAE,QAAU,EAAE,QAAQ,SAAS,CAAG,OAAS,IAAK,CAAE,QAAU,IAAM,CACtE,GAAI,SAAW,EAAE,gBAAgB,OAAO,GAAK,QAAQ,UAAY,QAAU,QAAQ,UAAY,UAAY,CAAC,QAAQ,aAAa,eAAe,GAAM,OAAO,KAE7J,IAAI,IAAM,EAAE,aAAa,MAAM,GAAK,GACpC,GAAI,CAAC,KAAO,IAAI,OAAO,CAAC,IAAM,IAAO,OAAO,KAC5C,IAAI,IACJ,GAAI,CAAE,IAAM,IAAI,IAAI,IAAK,SAAS,IAAI,CAAG,OAAS,IAAK,CAAE,OAAO,IAAM,CAKtE,GAJI,IAAI,WAAa,SAAW,IAAI,WAAa,UAC7C,IAAI,SAAW,SAAS,QACxB,UAAU,KAAK,IAAI,QAAQ,GAC3B,SAAS,KAAK,IAAI,QAAQ,GAC1B,gBAAgB,KAAK,IAAI,QAAQ,EAAK,OAAO,KACjD,GAAI,CAAE,GAAI,IAAI,aAAa,IAAI,QAAQ,EAAK,OAAO,IAAQ,OAAS,EAAG,CAAa,CAEpF,OADI,IAAI,WAAa,SAAS,UAC1B,CAAC,UAAU,EAAG,GAAG,EAAY,KAC1B,GACT,CACA,SAAS,WAAW,EAAG,CACrB,IAAI,MAAS,EAAE,cAAgB,EAAE,aAAa,EAAE,CAAC,GAAM,EAAE,OACzD,MAAI,CAAC,OAAS,CAAC,MAAM,QAAkB,KAChC,MAAM,QAAQ,SAAS,CAChC,CACA,SAAS,QAAQ,EAAG,CAClB,GAAI,GAAE,kBACF,IAAE,SAAW,GAAK,EAAE,SAAW,EAAE,SAAW,EAAE,UAAY,EAAE,QAChE,KAAI,EAAI,WAAW,CAAC,EACpB,GAAI,GAAC,GAAK,EAAE,aAAa,oBAEzB,IAAI,EAAE,QAAS,CAGT,EAAE,SAAW,EAAE,QAAQ,aAAe,EAAE,QAAU,WAAa,EAAE,QAAU,SAAW,EAAE,eAAe,EAC3G,MACF,CACA,GAAI,eAAa,GAAK,CAAC,MAAM,GAAK,mBAAmB,GAErD,KAAI,IAAM,UAAU,CAAC,EAChB,KAED,MAAM,IAAI,KAAM,CAAC,CAAC,GAAK,EAAE,eAAe,IAC9C,CAOA,IAAI,WAAa,CAAC,EACd,cAAgB,EAChB,aAAe,EACf,WAAa,KACb,UAAY,KACZ,WAAa,EACjB,SAAS,SAAS,KAAM,CACtB,GAAI,aAAW,IAAI,GAAK,eAAiB,cACzC,YAAW,IAAI,EAAI,EAAG,gBACtB,GAAI,CACF,IAAI,EAAIC,UAAS,cAAc,MAAM,EACrC,EAAE,IAAM,WACR,EAAE,KAAO,MACRA,UAAS,MAAQ,MAAM,YAAY,CAAC,CACvC,OAAS,EAAG,CAAa,EAC3B,CACA,SAAS,UAAU,EAAG,CACpB,GAAI,IAAE,SAAW,CAAC,EAAE,WACpB,KAAI,EAAI,WAAW,CAAC,EACpB,GAAI,GAAC,GAAK,IAAM,cAChB,WAAa,EACT,eAAa,GAAK,CAAC,MAAM,GAAK,mBAAmB,IACrD,KAAI,IAAM,UAAU,CAAC,EACjB,KAAO,SAAS,IAAI,IAAI,GAC9B,CACA,SAAS,QAAQ,EAAG,CAClB,GAAI,IAAE,SAAW,CAAC,EAAE,YAChB,gBAAc,GAAK,aAAa,GACpC,KAAI,EAAI,WAAW,CAAC,EAChB,CAAC,GAAK,IAAM,YAChB,UAAY,EACZ,aAAa,UAAU,EACvB,WAAa,WAAW,UAAY,CAClC,WAAa,EACT,YAAc,GAClB,UAAU,CAAE,OAAQ,CAAE,CAAC,CACzB,EAAG,EAAE,UAAU,GACjB,CACA,SAAS,WAAW,EAAG,CACrB,IAAI,EAAI,UACR,GAAK,EACL,KAAI,GAAK,GAAK,EAAE,cACZ,IAAM,EAAE,UAAY,EAAE,SAAS,EAAE,IACrC,aAAa,UAAU,EAAG,WAAa,EACvC,UAAY,MACd,CAGA,SAAS,WAAW,EAAG,CAAM,GAAK,EAAE,WAAa,QAAQ,SAAS,CAAK,CAIvE,SAAS,WAAW,EAAG,CACrB,EAAE,KAAO,GACH,GAAK,EAAE,WAAc,YAAY,CACzC,CACA,SAAS,cAAe,CACtB,GAAIA,UAAS,kBAAoB,SAAU,CACrC,EAAE,QAAU,WAAa,QAAQ,QAAQ,EAC7C,MACF,CAKI,EAAE,SAAW,EAAE,QAAQ,YAAc,EAAE,QAAU,WAAa,CAAC,EAAE,MAAQ,QAAQ,UAAW,EAAI,CACtG,CACA,SAAS,UAAU,EAAG,CACf,IACD,EAAE,MAAQ,UAAY,EAAE,MAAQ,OAAS,EAAE,UAAY,MAKrD,EAAE,SAAW,EAAE,SAAW,KAAK,UAAU,SAAS,gBAAgB,IAAK,QAAQ,SAAU,EAAK,CAEtG,CAIA,SAAS,aAAc,CACrB,GAAI,CAAE,GAAI,eAAe,QAAQ,SAAS,IAAM,IAAO,MAAO,EAAQ,OAAS,EAAG,CAAa,CAC/F,GAAI,CAAE,GAAID,QAAO,SAAWA,QAAO,QAAQ,WAAc,MAAO,EAAS,OAAS,EAAG,CAAa,CAClG,GAAI,wBAAwB,KAAK,SAAS,MAAM,EAAK,MAAO,GAC5D,IAAI,KAAO,GACX,GAAI,CAAE,KAAQA,QAAO,SAAWA,QAAO,QAAQ,OAASA,QAAO,QAAQ,MAAM,KAAQ,OAAOA,QAAO,QAAQ,MAAM,IAAI,EAAE,YAAY,EAAI,EAAI,OAAS,EAAG,CAAE,KAAO,EAAI,CACpK,MAAI,SAAQ,OAAS,QAAU,OAAS,QAAU,OAAS,YAE7D,CACA,SAAS,UAAW,CAClB,IAAI,EAAI,0CAA0C,KAAK,SAAS,MAAM,EACtE,GAAK,EACL,IAAI,CAAC,YAAY,EAAG,CAClB,GAAI,CAAE,QAAQ,KAAK,wHAAwH,CAAG,OAAS,EAAG,CAAa,CACvK,MACF,CACA,IAAI,KAAO,EAAE,CAAC,EAAE,YAAY,EAC5B,QAAQ,KAAK,IAAI,EAAI,GAAI,EAAE,KAAK,SAAU,GAAI,CACvC,KACD,OAAS,OAAU,KAAK,EACnB,OAAS,QAAW,MAAM,KAAM,CAAC,CAAC,EACpC,KAAK,CAAE,KAAM,EAAK,CAAC,EAE1B,YAAY,EACZ,EAAE,OAAS,WAAW,UAAY,CAAE,EAAE,OAAS,EAAG,QAAQ,aAAa,CAAG,EAAG,EAAE,YAAY,EAC7F,CAAC,EACH,CAEA,SAAS,MAAO,CACdA,QAAO,iBAAiB,WAAY,UAAU,EAC9CA,QAAO,iBAAiB,WAAY,UAAU,EAC9CC,UAAS,iBAAiB,mBAAoB,YAAY,EAC1DA,UAAS,iBAAiB,UAAW,SAAS,EAE9C,IAAI,MAAQ,KAAK,UAAU,SAAS,gBAAgB,EAChD,OAAS,CAAC,EAAED,QAAO,iBAAmB,IAAQA,QAAO,gBAEzD,GAAI,mBAAmB,EAAG,CAExB,GAAI,CAAE,QAAQ,KAAK,mIAAmI,CAAG,OAAS,EAAG,CAAa,CAClL,QAAQ,EAAE,EACV,MACF,CACA,GAAI,aAAa,EAAG,CAAE,QAAQ,EAAE,EAAG,MAAQ,CAM3C,IAAI,SAAW,GACf,GAAI,CACF,IAAI,GAAK,iBAAiBC,UAAS,IAAI,EACvC,SAAY,GAAG,WAAa,GAAG,YAAc,QACjC,GAAG,QAAU,GAAG,SAAW,QAC3B,GAAG,aAAe,GAAG,cAAgB,QACtC,gCAAgC,KAAK,GAAG,YAAc,EAAE,CACrE,OAAS,EAAG,CAAE,SAAW,EAAO,CAChC,GAAI,SAAU,CACZ,GAAI,CAAE,QAAQ,KAAK,gHAAgH,CAAG,OAAS,GAAI,CAAa,CAChK,QAAQ,EAAE,EACV,MACF,CAMA,GAJA,EAAE,UAAY,aAAa,EAC3B,MAAM,EACND,QAAO,iBAAiB,OAAQ,UAAY,CAAE,MAAM,CAAG,CAAC,EAEpD,OAAS,OACX,QAAQ,MACH,CACD,OAAS,SAAS,EAAK,EAC3B,YAAY,EACZ,GAAI,CAAEA,QAAO,eAAiB,KAAMA,QAAO,eAAiB,EAAO,OAAS,EAAG,CAAa,CAC5F,SAAS,CACX,CAEA,GAAI,CAAC,EAAE,UAAW,CAEhB,GAAI,CAAE,QAAQ,KAAK,sFAAsF,CAAG,OAAS,EAAG,CAAa,CACrI,MACF,CAGAA,QAAO,iBAAiB,QAAS,QAAS,EAAK,EAC/CA,QAAO,iBAAiB,cAAe,UAAW,EAAI,EACtDA,QAAO,iBAAiB,UAAW,UAAW,EAAI,EAClDA,QAAO,iBAAiB,cAAe,QAAS,EAAI,EACpDA,QAAO,iBAAiB,aAAc,WAAY,EAAI,EAGtD,MAAM,UAAY,CAAE,EAAE,KAAO,EAAE,MAAQ,YAAY,EAAG,QAAQ,EAAE,IAAI,CAAG,EAAG,EAAE,YAAY,CAC1F,CAGA,IAAI,IAAM,CACR,QAAS,QACT,MAAO,SAAU,IAAK,CAAE,OAAO,MAAM,IAAM,OAAO,GAAG,EAAI,KAAM,CAAC,CAAC,CAAG,EACpE,KAAM,SAAU,KAAM,CAAE,OAAO,KAAK,MAAQ,CAAC,CAAC,CAAG,EACjD,KAAM,KACN,OAAQ,UAAY,CAAE,eAAQ,QAAQ,EAAU,EAAM,EACtD,SAAU,SACV,KAAM,KACN,MAAO,KACT,EACA,OAAO,eAAe,IAAK,UAAW,CAAE,IAAK,UAAY,CAAE,OAAO,EAAE,OAAS,CAAE,CAAC,EAChF,OAAO,eAAe,IAAK,QAAS,CAAE,IAAK,UAAY,CAAE,OAAO,EAAE,KAAO,CAAE,CAAC,EAC5E,OAAO,eAAe,IAAK,YAAa,CAAE,IAAK,UAAY,CAAE,OAAO,EAAE,SAAW,CAAE,CAAC,EACpF,OAAO,eAAe,IAAK,UAAW,CAAE,IAAK,UAAY,CAAE,OAAO,EAAE,OAAS,CAAE,CAAC,EAChF,OAAO,eAAe,IAAK,OAAQ,CAAE,IAAK,UAAY,CAAE,OAAO,EAAE,MAAQ,YAAY,CAAG,CAAE,CAAC,EAC3F,OAAO,eAAe,IAAK,UAAW,CAAE,IAAK,UAAY,CAAE,OAAO,EAAE,OAAS,CAAE,CAAC,EAChFA,QAAO,SAAW,IAEdC,UAAS,KAAQ,KAAK,EAAYA,UAAS,iBAAiB,mBAAoB,IAAI,CAC1F,GAAG,OAAQ,QAAQ",
  "names": ["window", "document"]
}
