{
  "version": 3,
  "sources": ["/cdn/shop/t/2/assets/predictive-search.js?rev=8"],
  "sourcesContent": ["/* predictive-search.js \u2014 live suggestions for every search box: the always-on\n   header bar, the search drawer (the header icon, and phones on product\n   pages) and the box on the results page. Adds: rotating \"typewriter\"\n   placeholder, recent + popular searches while the box is empty, matching\n   collections, and typo/half-word rescue via Shopify's own suggestions. */\n(function () {\n  'use strict';\n  var theme = window.theme || {};\n  // Search suggestions show the variant's own price and compare-at, nothing\n  // computed. This used to derive a discount from theme.sale when the sale was\n  // store-wide \u2014 the predictive-search JSON carries no collection data, so a\n  // scoped sale had to be skipped here anyway. Since 2026-08-14 the sale is real\n  // compare-at pricing, so the JSON already contains both numbers and there is\n  // nothing to infer.\n\n  // Both lists are theme settings (Theme settings > Search), comma-separated\n  // in the editor and split in layout/theme.liquid.\n  function list(a) { return (a || []).map(function (s) { return String(s).trim(); }).filter(Boolean); }\n  // Prompts for the typewriter placeholder.\n  var TERMS = list(theme.search && theme.search.typewriter);\n  // Shown under \"Popular\" while the box is empty. Same list as the results\n  // page's Trending chips (templates/search.json) \u2014 keep the two in step.\n  var POPULAR = list(theme.search && theme.search.popular);\n\n  function str(key, fallback) { return (theme.strings && theme.strings[key]) || fallback; }\n  // Quotes too: the output also goes into href and src attributes.\n  function esc(s) {\n    return String(s == null ? '' : s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')\n      .replace(/\"/g, '&quot;').replace(/'/g, '&#39;');\n  }\n  // \"%n pieces\" -> \"6 pieces\"; split/join so a \"$\" in the text is never a replace() pattern.\n  function counted(n, one, many) { return (n === 1 ? one : many).split('%n').join(String(n)); }\n  function scope() { return theme.searchScope || window.theme.searchScope; }\n  function resultsUrl(term) {\n    var sc = scope();\n    return sc ? sc.url(term) : ((theme.routes && theme.routes.search) || '/search') + '?q=' + encodeURIComponent(term) + '&type=product';\n  }\n\n  // Whole-dollar prices print without \".00\", like the rest of the storefront.\n  function money(amount) {\n    var fmt = theme.moneyFormat || '${{amount}}';\n    return fmt.replace(/\\{\\{\\s*\\w+\\s*\\}\\}/, esc(String(amount).replace(/\\.00$/, '')));\n  }\n  function num(s) { return parseFloat(String(s == null ? '' : s).replace(/[^0-9.]/g, '')) || 0; }\n\n  // The struck price must belong to the same variant as the price beside it.\n  // The product-level compare_at_price_max paired with the cheapest price put\n  // \"$89 ~~$535~~\" on a sale ladder, so the pair comes from the cheapest\n  // variant in the payload; with no variants there is no comparison at all.\n  function priceHtml(p) {\n    if (typeof p.price !== 'string' || !p.price) return '';\n    var now = p.price, compare = null;\n    if (p.variants && p.variants.length) {\n      var cheapest = p.variants.reduce(function (a, v) { return !a || num(v.price) < num(a.price) ? v : a; }, null);\n      now = cheapest.price;\n      if (num(cheapest.compare_at_price) > num(cheapest.price)) compare = cheapest.compare_at_price;\n    } else if (num(p.compare_at_price_min) > num(p.price)) {\n      // The suggest payload usually carries no variants. On the size ladder the\n      // cheapest size also has the lowest compare-at, so the two minimums are\n      // one variant's pair (never compare_at_price_max, which is the largest).\n      compare = p.compare_at_price_min;\n    }\n    if (compare) {\n      return '<span class=\"ps-item__price ps-item__price--sale\"><span class=\"ps-item__now\">' + money(now) +\n        '</span> <s class=\"ps-item__was\">' + money(compare) + '</s></span>';\n    }\n    return '<span class=\"ps-item__price\">' + money(now) + '</span>';\n  }\n\n  // The suggest JSON hands back the full-resolution upload (often 3000px+),\n  // which took seconds to arrive and left the 48px tile as a blank navy\n  // square. Ask the CDN for a 96px rendition and load it eagerly \u2014 the\n  // dropdown is only on screen while the shopper is looking at it.\n  function thumb(src) {\n    if (!src) return '<span class=\"ps-item__ph\"></span>';\n    src += (src.indexOf('?') > -1 ? '&' : '?') + 'width=96';\n    return '<img src=\"' + esc(src) + '\" alt=\"\" width=\"48\" height=\"48\" loading=\"eager\" decoding=\"async\">';\n  }\n\n  function chips(list, cls) {\n    return list.map(function (t) {\n      return '<a class=\"ps-chip' + (cls ? ' ' + cls : '') + '\" href=\"' + esc(resultsUrl(t)) + '\">' + esc(t) + '</a>';\n    }).join('');\n  }\n\n  /* Empty box: recent searches (this browser) and the popular list.\n     render() and renderIdle() return the line the status region announces\n     (nothing for the idle list). */\n  function renderIdle(container) {\n    var sc = scope();\n    var recent = sc ? sc.recent.get() : [];\n    var html = '';\n    if (recent.length) {\n      html += '<div class=\"ps-group\"><div class=\"ps-group__head\"><span class=\"ps-heading\">' + esc(str('recentSearches', 'Recent searches')) +\n        '</span><button type=\"button\" class=\"ps-clear\" data-ps-clear>' + esc(str('clear', 'Clear')) + '</button></div>' +\n        '<div class=\"ps-chips\">' + chips(recent, 'ps-chip--recent') + '</div></div>';\n    }\n    if (POPULAR.length) {\n      html += '<div class=\"ps-group\"><div class=\"ps-group__head\"><span class=\"ps-heading\">' + esc(str('popularSearches', 'Popular')) +\n        '</span></div><div class=\"ps-chips\">' + chips(POPULAR) + '</div></div>';\n    }\n    container.innerHTML = html;\n    container.hidden = !html;\n    return '';\n  }\n\n  /* One short line for screen readers (\"6 pieces, 2 collections\", \"No exact\n     matches. 6 closest matches. Did you mean caesar?\") instead of a live\n     list that re-read every title and price on each keystroke. */\n  function summary(res, products, colls, fixes) {\n    var bits = [];\n    if (products.length) {\n      bits.push(res.fallback\n        ? counted(products.length, str('closestMatchOne', '%n closest match'), str('closestMatchMany', '%n closest matches'))\n        : counted(products.length, str('pieceOne', '%n piece'), str('pieceMany', '%n pieces')));\n    }\n    if (colls.length) bits.push(counted(colls.length, str('collectionOne', '%n collection'), str('collectionMany', '%n collections')));\n    if (!bits.length && !fixes.length) return str('noResults', 'No matches yet');\n    var out = bits.join(', ');\n    if (res.fallback) out = str('noExactMatches', 'No exact matches') + (out ? '. ' + out : '');\n    if (fixes.length) out += (out ? '. ' : '') + str('didYouMean', 'Did you mean') + ' ' + fixes[0] + '?';\n    return out;\n  }\n\n  function render(container, q, res) {\n    var html = '';\n    // Shopify's corrections / completions (\"ceasar\" -> caesar, \"colos\" ->\n    // colosseum). Only asked for when the exact words found no products.\n    var fixes = (res.queries || []).map(function (x) { return x.text; })\n      .filter(function (t) { return t && t.toLowerCase() !== q.toLowerCase(); }).slice(0, 3);\n    if (fixes.length) {\n      html += '<div class=\"ps-group ps-group--fixes\"><span class=\"ps-heading\">' + esc(str('didYouMean', 'Did you mean')) +\n        '</span><div class=\"ps-chips\">' + chips(fixes, 'ps-chip--fix') + '</div></div>';\n    }\n    var colls = (res.collections || []).slice(0, 3);\n    if (colls.length) {\n      html += '<div class=\"ps-group\"><span class=\"ps-heading\">' + esc(str('collections', 'Collections')) + '</span><ul class=\"ps-colls\" role=\"list\">';\n      colls.forEach(function (c) {\n        var img = c.featured_image && c.featured_image.url;\n        html += '<li><a class=\"ps-coll\" href=\"' + esc(c.url) + '\"><span class=\"ps-coll__media\">' + thumb(img) + '</span>' +\n          '<span class=\"ps-coll__title\">' + esc(c.title) + '</span><span class=\"ps-coll__arrow\" aria-hidden=\"true\">&rarr;</span></a></li>';\n      });\n      html += '</ul></div>';\n    }\n    var products = (res.products || []).slice(0, 6);\n    if (products.length) {\n      html += '<div class=\"ps-group\"><span class=\"ps-heading\">' + esc(res.fallback ? str('closestMatches', 'Closest matches') : str('products', 'Pieces')) +\n        '</span><ul class=\"ps-list\" role=\"list\">';\n      products.forEach(function (p) {\n        html += '<li><a class=\"ps-item\" href=\"' + esc(p.url) + '\"><span class=\"ps-item__media\">' + thumb(p.image || (p.featured_image && p.featured_image.url)) + '</span>' +\n          '<span class=\"ps-item__title\">' + esc(p.title) + '</span>' + priceHtml(p) + '</a></li>';\n      });\n      html += '</ul></div>';\n    }\n    if (!products.length && !colls.length && !fixes.length) {\n      html += '<p class=\"ps-empty\">' + esc(str('noResults', 'No matches yet')) + '</p>' +\n        (POPULAR.length ? '<div class=\"ps-group\"><span class=\"ps-heading\">' + esc(str('popularSearches', 'Popular')) + '</span><div class=\"ps-chips\">' + chips(POPULAR) + '</div></div>' : '');\n    }\n    // The same scoped result set the form submits, in the shopper's own words.\n    // When only Shopify's fuzzy pass found anything, follow its correction\n    // (the results page then says \"Showing results for \u2026\"). Without one, the\n    // results page finds its own correction or shows the wide matches.\n    if (!res.fallback || fixes.length || products.length) {\n      var allTerm = res.fallback && fixes.length ? fixes[0] : q;\n      var allHref = resultsUrl(allTerm) + (allTerm !== q ? '&corrected_from=' + encodeURIComponent(q) : '');\n      html += '<a class=\"ps-all\" href=\"' + esc(allHref) + '\">' + esc(str('seeAll', 'See all results for')) + ' \u201C' + esc(allTerm) + '\u201D &rarr;</a>';\n    }\n    container.innerHTML = html;\n    container.hidden = false;\n    return summary(res, products, colls, fixes);\n  }\n\n  /* ---- fetching ---- */\n  // The cache lives in search-scope.js, shared with the submit-time spelling\n  // correction there.\n  function suggest(q, types, signal) {\n    var sc = scope();\n    if (sc && sc.suggest) return sc.suggest(q, types, signal);\n    return Promise.resolve({ products: [], collections: [], queries: [] });\n  }\n\n  /* Two passes, the second only when the first finds no products:\n       1. the scoped words \u2014 the same rules the results page uses, so the\n          dropdown never shows a print that merely mentions the word in its\n          description, and \"See all\" lands on these same pieces;\n       2. the raw text, which Shopify matches with typo and prefix tolerance\n          (\"ceasar\", \"colos\", \"leg\"), plus its suggested corrections.\n     Field-scoped terms get neither tolerance, so mid-word typing lands in\n     pass 2 until the word is complete. */\n  function fetchScoped(q, signal) {\n    var sc = scope();\n    var scoped = sc && !sc.isAlreadyScoped(q) ? sc.build(q) : '';\n    var first = scoped ? suggest(scoped, 'product,collection', signal) : Promise.resolve(null);\n    return first.then(function (r1) {\n      if (r1 && r1.products.length) return { products: r1.products, collections: r1.collections, fallback: false };\n      return suggest(q, 'query,product,collection', signal).then(function (r2) {\n        return {\n          products: r2.products,\n          collections: (r1 && r1.collections.length) ? r1.collections : r2.collections,\n          queries: r2.queries,\n          fallback: true\n        };\n      });\n    });\n  }\n\n  /* Keep the list above the phone keyboard: the visual viewport shrinks when\n     it opens while vh units do not, so 70vh ran under the keys. */\n  function fit(container) {\n    if (container.hidden) return;\n    var vv = window.visualViewport;\n    var bottom = vv ? vv.height + vv.offsetTop : window.innerHeight;\n    var room = Math.floor(bottom - container.getBoundingClientRect().top - 12);\n    container.style.maxHeight = Math.max(180, Math.min(room, 560)) + 'px';\n  }\n\n  var uid = 0;\n  function bind(input) {\n    var scopeEl = input.closest('[data-predictive-scope]') || document;\n    var results = scopeEl.querySelector('[data-predictive-results]');\n    if (!results) return;\n    var timer, seq = 0, ctrl = null;\n    if (!input.getAttribute('enterkeyhint')) input.setAttribute('enterkeyhint', 'search');\n\n    /* Combobox semantics (the markup sets role, aria-autocomplete and\n       aria-controls): aria-expanded follows the list's hidden attribute,\n       whoever flips it (Escape, outside click, scroll, a render). */\n    if (!results.id) results.id = 'PredictiveResults-' + (++uid);\n    input.setAttribute('aria-controls', results.id);\n    function syncExpanded() { input.setAttribute('aria-expanded', results.hidden ? 'false' : 'true'); }\n    syncExpanded();\n    if (window.MutationObserver) new MutationObserver(syncExpanded).observe(results, { attributes: true, attributeFilter: ['hidden'] });\n\n    // Polite status line, next to the list (not inside it: the list is rewritten on every render).\n    var status = document.createElement('p');\n    status.className = 'visually-hidden';\n    status.setAttribute('role', 'status');\n    status.setAttribute('aria-live', 'polite');\n    status.setAttribute('aria-atomic', 'true');\n    results.parentNode.insertBefore(status, results.nextSibling);\n    // Unchanged text is left alone, so \"6 pieces\" isn't repeated on every keystroke.\n    function announce(text) { if (status.textContent !== text) status.textContent = text; }\n\n    function show(fn) { announce(fn() || ''); fit(results); }\n\n    function search() {\n      var q = input.value.trim();\n      if (ctrl) { ctrl.abort(); ctrl = null; }\n      if (q.length < 2) { seq++; input.removeAttribute('data-no-exact'); show(function () { return renderIdle(results); }); return; }\n      var mine = ++seq;\n      ctrl = window.AbortController ? new AbortController() : null;\n      fetchScoped(q, ctrl && ctrl.signal).then(function (res) {\n        // A slow answer for \"le\" must not replace the one for \"legion\".\n        if (mine !== seq || input.value.trim() !== q) return;\n        // These exact words find nothing: search-scope.js corrects on submit.\n        if (res.fallback) input.setAttribute('data-no-exact', q.toLowerCase());\n        else input.removeAttribute('data-no-exact');\n        show(function () { return render(results, q, res); });\n      }).catch(function () {});\n    }\n\n    input.addEventListener('input', function () { clearTimeout(timer); timer = setTimeout(search, 200); });\n    // Set by Escape inside the list: focus goes back to the box and the list\n    // stays closed (the focus handler used to reopen it straight away).\n    var quietFocus = false;\n    input.addEventListener('focus', function () {\n      if (quietFocus) { quietFocus = false; return; }\n      if (!results.hidden && results.innerHTML) return;\n      search();\n    });\n    // Text typed before this script ran (the bar is on screen and typeable\n    // well before deferred scripts on a phone) never fired an input event we\n    // heard: look it up now.\n    if (document.activeElement === input) search();\n\n    results.addEventListener('click', function (e) {\n      var clear = e.target.closest('[data-ps-clear]');\n      if (!clear) return;\n      e.preventDefault();\n      var sc = scope();\n      if (sc) sc.recent.clear();\n      show(function () { return renderIdle(results); });\n      input.focus();\n    });\n\n    /* Close the dropdown on outside click / Escape. The event path, not\n       contains(): \"Clear\" re-renders the list, so by the time the click\n       reaches the document its button is detached and contains() said\n       \"outside\", closing the whole list. The path is fixed at dispatch. */\n    document.addEventListener('click', function (e) {\n      var path = e.composedPath ? e.composedPath() : null;\n      var inside = path && path.length ? path.indexOf(scopeEl) !== -1 : scopeEl.contains(e.target);\n      if (!inside) results.hidden = true;\n    });\n    input.addEventListener('keydown', function (e) {\n      if (e.key === 'Escape') { results.hidden = true; return; }\n      if (e.key === 'ArrowDown' && !results.hidden) {\n        var first = results.querySelector('a');\n        if (first) { e.preventDefault(); first.focus(); }\n      }\n    });\n    results.addEventListener('keydown', function (e) {\n      if (e.key !== 'ArrowDown' && e.key !== 'ArrowUp' && e.key !== 'Escape') return;\n      var links = Array.prototype.slice.call(results.querySelectorAll('a'));\n      var i = links.indexOf(document.activeElement);\n      e.preventDefault();\n      if (e.key === 'Escape') { results.hidden = true; quietFocus = true; input.focus(); quietFocus = false; return; }\n      var next = e.key === 'ArrowDown' ? i + 1 : i - 1;\n      if (next < 0) input.focus();\n      else if (links[next]) links[next].focus();\n    });\n\n    if (window.visualViewport) window.visualViewport.addEventListener('resize', function () { fit(results); });\n\n    // A touch scroll of the page fires no click, so the \"outside click\" rule\n    // never closed the list and the sticky header (which stays put while it is\n    // open, see global.js) followed the shopper down the page. Close it once\n    // the page has moved well away; small jumps from the keyboard opening or\n    // closing leave it alone.\n    var openedAt = null;\n    input.addEventListener('focus', function () { openedAt = window.scrollY; });\n    window.addEventListener('scroll', function () {\n      if (results.hidden || document.activeElement === input || results.contains(document.activeElement)) { openedAt = window.scrollY; return; }\n      if (openedAt === null) openedAt = window.scrollY;\n      if (Math.abs(window.scrollY - openedAt) > 120) results.hidden = true;\n    }, { passive: true });\n  }\n\n  /* ---- rotating \"typewriter\" placeholder ---- */\n  function typewriter(input) {\n    if (!TERMS.length) return;\n    var reduce = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n    if (reduce) { input.placeholder = 'Search \u201C' + TERMS[0] + '\u201D'; return; }\n    // One pass through TERMS, then stop: an endless setTimeout chain kept a\n    // timer (and a placeholder repaint) alive for the whole session on every\n    // page. It also idles while the tab is hidden.\n    var ti = 0, ci = 0, deleting = false;\n    function tick() {\n      // Pause while the field is in use, or while the tab is in the background.\n      if (document.hidden || document.activeElement === input || input.value) { return setTimeout(tick, 1200); }\n      var term = TERMS[ti];\n      if (!deleting) {\n        ci++;\n        input.placeholder = 'Search \u201C' + term.slice(0, ci) + '\u201D';\n        if (ci >= term.length) { deleting = true; return setTimeout(tick, 1500); }\n        return setTimeout(tick, 85);\n      }\n      ci--;\n      input.placeholder = 'Search \u201C' + term.slice(0, Math.max(0, ci)) + '\u201D';\n      if (ci <= 0) {\n        deleting = false;\n        ti++;\n        // Last term typed and cleared \u2014 leave the placeholder on it and stop.\n        if (ti >= TERMS.length) { input.placeholder = 'Search \u201C' + TERMS[TERMS.length - 1] + '\u201D'; return; }\n        return setTimeout(tick, 300);\n      }\n      return setTimeout(tick, 40);\n    }\n    tick();\n  }\n\n  function init() {\n    document.querySelectorAll('[data-predictive-input]').forEach(function (input) {\n      bind(input);\n      if (input.hasAttribute('data-typewriter')) typewriter(input);\n    });\n\n    // Header search icon (only present when the always-on bar is disabled) \u2192 open drawer\n    var drawer = document.getElementById('search-drawer');\n    document.addEventListener('click', function (e) {\n      var toggle = e.target.closest('[data-search-toggle]');\n      if (toggle && drawer && theme.drawers) {\n        e.preventDefault();\n        theme.drawers.open('search-drawer');\n        var di = drawer.querySelector('[data-predictive-input]');\n        if (di) setTimeout(function () { di.focus(); }, 90);\n      }\n    });\n  }\n\n  if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); }\n  else { init(); }\n})();\n"],
  "mappings": "CAKC,UAAY,CACX,aACA,IAAI,MAAQ,OAAO,OAAS,CAAC,EAU7B,SAAS,KAAK,EAAG,CAAE,OAAQ,GAAK,CAAC,GAAG,IAAI,SAAU,EAAG,CAAE,OAAO,OAAO,CAAC,EAAE,KAAK,CAAG,CAAC,EAAE,OAAO,OAAO,CAAG,CAEpG,IAAI,MAAQ,KAAK,MAAM,QAAU,MAAM,OAAO,UAAU,EAGpD,QAAU,KAAK,MAAM,QAAU,MAAM,OAAO,OAAO,EAEvD,SAAS,IAAI,IAAK,SAAU,CAAE,OAAQ,MAAM,SAAW,MAAM,QAAQ,GAAG,GAAM,QAAU,CAExF,SAAS,IAAI,EAAG,CACd,OAAO,OAAO,GAAK,KAAO,GAAK,CAAC,EAAE,QAAQ,KAAM,OAAO,EAAE,QAAQ,KAAM,MAAM,EAAE,QAAQ,KAAM,MAAM,EAChG,QAAQ,KAAM,QAAQ,EAAE,QAAQ,KAAM,OAAO,CAClD,CAEA,SAAS,QAAQ,EAAG,IAAK,KAAM,CAAE,OAAQ,IAAM,EAAI,IAAM,MAAM,MAAM,IAAI,EAAE,KAAK,OAAO,CAAC,CAAC,CAAG,CAC5F,SAAS,OAAQ,CAAE,OAAO,MAAM,aAAe,OAAO,MAAM,WAAa,CACzE,SAAS,WAAW,KAAM,CACxB,IAAI,GAAK,MAAM,EACf,OAAO,GAAK,GAAG,IAAI,IAAI,GAAM,MAAM,QAAU,MAAM,OAAO,QAAW,WAAa,MAAQ,mBAAmB,IAAI,EAAI,eACvH,CAGA,SAAS,MAAM,OAAQ,CACrB,IAAI,IAAM,MAAM,aAAe,cAC/B,OAAO,IAAI,QAAQ,oBAAqB,IAAI,OAAO,MAAM,EAAE,QAAQ,QAAS,EAAE,CAAC,CAAC,CAClF,CACA,SAAS,IAAI,EAAG,CAAE,OAAO,WAAW,OAAO,GAAK,KAAO,GAAK,CAAC,EAAE,QAAQ,WAAY,EAAE,CAAC,GAAK,CAAG,CAM9F,SAAS,UAAU,EAAG,CACpB,GAAI,OAAO,EAAE,OAAU,UAAY,CAAC,EAAE,MAAO,MAAO,GACpD,IAAI,IAAM,EAAE,MAAO,QAAU,KAC7B,GAAI,EAAE,UAAY,EAAE,SAAS,OAAQ,CACnC,IAAI,SAAW,EAAE,SAAS,OAAO,SAAU,EAAG,EAAG,CAAE,MAAO,CAAC,GAAK,IAAI,EAAE,KAAK,EAAI,IAAI,EAAE,KAAK,EAAI,EAAI,CAAG,EAAG,IAAI,EAC5G,IAAM,SAAS,MACX,IAAI,SAAS,gBAAgB,EAAI,IAAI,SAAS,KAAK,IAAG,QAAU,SAAS,iBAC/E,MAAW,IAAI,EAAE,oBAAoB,EAAI,IAAI,EAAE,KAAK,IAIlD,QAAU,EAAE,sBAEd,OAAI,QACK,gFAAkF,MAAM,GAAG,EAChG,mCAAqC,MAAM,OAAO,EAAI,cAEnD,gCAAkC,MAAM,GAAG,EAAI,SACxD,CAMA,SAAS,MAAM,IAAK,CAClB,OAAK,KACL,MAAQ,IAAI,QAAQ,GAAG,EAAI,GAAK,IAAM,KAAO,WACtC,aAAe,IAAI,GAAG,EAAI,qEAFhB,mCAGnB,CAEA,SAAS,MAAMA,MAAM,IAAK,CACxB,OAAOA,MAAK,IAAI,SAAU,EAAG,CAC3B,MAAO,qBAAuB,IAAM,IAAM,IAAM,IAAM,WAAa,IAAI,WAAW,CAAC,CAAC,EAAI,KAAO,IAAI,CAAC,EAAI,MAC1G,CAAC,EAAE,KAAK,EAAE,CACZ,CAKA,SAAS,WAAW,UAAW,CAC7B,IAAI,GAAK,MAAM,EACX,OAAS,GAAK,GAAG,OAAO,IAAI,EAAI,CAAC,EACjC,KAAO,GACX,OAAI,OAAO,SACT,MAAQ,8EAAgF,IAAI,IAAI,iBAAkB,iBAAiB,CAAC,EAClI,+DAAiE,IAAI,IAAI,QAAS,OAAO,CAAC,EAAI,wCACnE,MAAM,OAAQ,iBAAiB,EAAI,gBAE9D,QAAQ,SACV,MAAQ,8EAAgF,IAAI,IAAI,kBAAmB,SAAS,CAAC,EAC3H,sCAAwC,MAAM,OAAO,EAAI,gBAE7D,UAAU,UAAY,KACtB,UAAU,OAAS,CAAC,KACb,EACT,CAKA,SAAS,QAAQ,IAAK,SAAU,MAAO,MAAO,CAC5C,IAAI,KAAO,CAAC,EAOZ,GANI,SAAS,QACX,KAAK,KAAK,IAAI,SACV,QAAQ,SAAS,OAAQ,IAAI,kBAAmB,kBAAkB,EAAG,IAAI,mBAAoB,oBAAoB,CAAC,EAClH,QAAQ,SAAS,OAAQ,IAAI,WAAY,UAAU,EAAG,IAAI,YAAa,WAAW,CAAC,CAAC,EAEtF,MAAM,QAAQ,KAAK,KAAK,QAAQ,MAAM,OAAQ,IAAI,gBAAiB,eAAe,EAAG,IAAI,iBAAkB,gBAAgB,CAAC,CAAC,EAC7H,CAAC,KAAK,QAAU,CAAC,MAAM,OAAQ,OAAO,IAAI,YAAa,gBAAgB,EAC3E,IAAI,IAAM,KAAK,KAAK,IAAI,EACxB,OAAI,IAAI,WAAU,IAAM,IAAI,iBAAkB,kBAAkB,GAAK,IAAM,KAAO,IAAM,KACpF,MAAM,SAAQ,MAAQ,IAAM,KAAO,IAAM,IAAI,aAAc,cAAc,EAAI,IAAM,MAAM,CAAC,EAAI,KAC3F,GACT,CAEA,SAAS,OAAO,UAAW,EAAG,IAAK,CACjC,IAAI,KAAO,GAGP,OAAS,IAAI,SAAW,CAAC,GAAG,IAAI,SAAU,EAAG,CAAE,OAAO,EAAE,IAAM,CAAC,EAChE,OAAO,SAAU,EAAG,CAAE,OAAO,GAAK,EAAE,YAAY,IAAM,EAAE,YAAY,CAAG,CAAC,EAAE,MAAM,EAAG,CAAC,EACnF,MAAM,SACR,MAAQ,kEAAoE,IAAI,IAAI,aAAc,cAAc,CAAC,EAC/G,gCAAkC,MAAM,MAAO,cAAc,EAAI,gBAErE,IAAI,OAAS,IAAI,aAAe,CAAC,GAAG,MAAM,EAAG,CAAC,EAC1C,MAAM,SACR,MAAQ,kDAAoD,IAAI,IAAI,cAAe,aAAa,CAAC,EAAI,2CACrG,MAAM,QAAQ,SAAU,EAAG,CACzB,IAAI,IAAM,EAAE,gBAAkB,EAAE,eAAe,IAC/C,MAAQ,gCAAkC,IAAI,EAAE,GAAG,EAAI,kCAAoC,MAAM,GAAG,EAAI,uCACpE,IAAI,EAAE,KAAK,EAAI,+EACrD,CAAC,EACD,MAAQ,eAEV,IAAI,UAAY,IAAI,UAAY,CAAC,GAAG,MAAM,EAAG,CAAC,EAkB9C,GAjBI,SAAS,SACX,MAAQ,kDAAoD,IAAI,IAAI,SAAW,IAAI,iBAAkB,iBAAiB,EAAI,IAAI,WAAY,QAAQ,CAAC,EACjJ,0CACF,SAAS,QAAQ,SAAU,EAAG,CAC5B,MAAQ,gCAAkC,IAAI,EAAE,GAAG,EAAI,kCAAoC,MAAM,EAAE,OAAU,EAAE,gBAAkB,EAAE,eAAe,GAAI,EAAI,uCACtH,IAAI,EAAE,KAAK,EAAI,UAAY,UAAU,CAAC,EAAI,WAChF,CAAC,EACD,MAAQ,eAEN,CAAC,SAAS,QAAU,CAAC,MAAM,QAAU,CAAC,MAAM,SAC9C,MAAQ,uBAAyB,IAAI,IAAI,YAAa,gBAAgB,CAAC,EAAI,QACxE,QAAQ,OAAS,kDAAoD,IAAI,IAAI,kBAAmB,SAAS,CAAC,EAAI,gCAAkC,MAAM,OAAO,EAAI,eAAiB,KAMnL,CAAC,IAAI,UAAY,MAAM,QAAU,SAAS,OAAQ,CACpD,IAAI,QAAU,IAAI,UAAY,MAAM,OAAS,MAAM,CAAC,EAAI,EACpD,QAAU,WAAW,OAAO,GAAK,UAAY,EAAI,mBAAqB,mBAAmB,CAAC,EAAI,IAClG,MAAQ,2BAA6B,IAAI,OAAO,EAAI,KAAO,IAAI,IAAI,SAAU,qBAAqB,CAAC,EAAI,UAAO,IAAI,OAAO,EAAI,mBAC/H,CACA,iBAAU,UAAY,KACtB,UAAU,OAAS,GACZ,QAAQ,IAAK,SAAU,MAAO,KAAK,CAC5C,CAKA,SAAS,QAAQ,EAAG,MAAO,OAAQ,CACjC,IAAI,GAAK,MAAM,EACf,OAAI,IAAM,GAAG,QAAgB,GAAG,QAAQ,EAAG,MAAO,MAAM,EACjD,QAAQ,QAAQ,CAAE,SAAU,CAAC,EAAG,YAAa,CAAC,EAAG,QAAS,CAAC,CAAE,CAAC,CACvE,CAUA,SAAS,YAAY,EAAG,OAAQ,CAC9B,IAAI,GAAK,MAAM,EACX,OAAS,IAAM,CAAC,GAAG,gBAAgB,CAAC,EAAI,GAAG,MAAM,CAAC,EAAI,GACtD,MAAQ,OAAS,QAAQ,OAAQ,qBAAsB,MAAM,EAAI,QAAQ,QAAQ,IAAI,EACzF,OAAO,MAAM,KAAK,SAAU,GAAI,CAC9B,OAAI,IAAM,GAAG,SAAS,OAAe,CAAE,SAAU,GAAG,SAAU,YAAa,GAAG,YAAa,SAAU,EAAM,EACpG,QAAQ,EAAG,2BAA4B,MAAM,EAAE,KAAK,SAAU,GAAI,CACvE,MAAO,CACL,SAAU,GAAG,SACb,YAAc,IAAM,GAAG,YAAY,OAAU,GAAG,YAAc,GAAG,YACjE,QAAS,GAAG,QACZ,SAAU,EACZ,CACF,CAAC,CACH,CAAC,CACH,CAIA,SAAS,IAAI,UAAW,CACtB,GAAI,WAAU,OACd,KAAI,GAAK,OAAO,eACZ,OAAS,GAAK,GAAG,OAAS,GAAG,UAAY,OAAO,YAChD,KAAO,KAAK,MAAM,OAAS,UAAU,sBAAsB,EAAE,IAAM,EAAE,EACzE,UAAU,MAAM,UAAY,KAAK,IAAI,IAAK,KAAK,IAAI,KAAM,GAAG,CAAC,EAAI,KACnE,CAEA,IAAI,IAAM,EACV,SAAS,KAAK,MAAO,CACnB,IAAI,QAAU,MAAM,QAAQ,yBAAyB,GAAK,SACtD,QAAU,QAAQ,cAAc,2BAA2B,EAC/D,GAAI,CAAC,QAAS,OACd,IAAI,MAAO,IAAM,EAAG,KAAO,KACtB,MAAM,aAAa,cAAc,GAAG,MAAM,aAAa,eAAgB,QAAQ,EAK/E,QAAQ,KAAI,QAAQ,GAAK,sBAAwB,EAAE,KACxD,MAAM,aAAa,gBAAiB,QAAQ,EAAE,EAC9C,SAAS,cAAe,CAAE,MAAM,aAAa,gBAAiB,QAAQ,OAAS,QAAU,MAAM,CAAG,CAClG,aAAa,EACT,OAAO,kBAAkB,IAAI,iBAAiB,YAAY,EAAE,QAAQ,QAAS,CAAE,WAAY,GAAM,gBAAiB,CAAC,QAAQ,CAAE,CAAC,EAGlI,IAAI,OAAS,SAAS,cAAc,GAAG,EACvC,OAAO,UAAY,kBACnB,OAAO,aAAa,OAAQ,QAAQ,EACpC,OAAO,aAAa,YAAa,QAAQ,EACzC,OAAO,aAAa,cAAe,MAAM,EACzC,QAAQ,WAAW,aAAa,OAAQ,QAAQ,WAAW,EAE3D,SAAS,SAAS,KAAM,CAAM,OAAO,cAAgB,OAAM,OAAO,YAAc,KAAM,CAEtF,SAAS,KAAK,GAAI,CAAE,SAAS,GAAG,GAAK,EAAE,EAAG,IAAI,OAAO,CAAG,CAExD,SAAS,QAAS,CAChB,IAAI,EAAI,MAAM,MAAM,KAAK,EAEzB,GADI,OAAQ,KAAK,MAAM,EAAG,KAAO,MAC7B,EAAE,OAAS,EAAG,CAAE,MAAO,MAAM,gBAAgB,eAAe,EAAG,KAAK,UAAY,CAAE,OAAO,WAAW,OAAO,CAAG,CAAC,EAAG,MAAQ,CAC9H,IAAI,KAAO,EAAE,IACb,KAAO,OAAO,gBAAkB,IAAI,gBAAoB,KACxD,YAAY,EAAG,MAAQ,KAAK,MAAM,EAAE,KAAK,SAAU,IAAK,CAElD,OAAS,KAAO,MAAM,MAAM,KAAK,IAAM,IAEvC,IAAI,SAAU,MAAM,aAAa,gBAAiB,EAAE,YAAY,CAAC,EAChE,MAAM,gBAAgB,eAAe,EAC1C,KAAK,UAAY,CAAE,OAAO,OAAO,QAAS,EAAG,GAAG,CAAG,CAAC,EACtD,CAAC,EAAE,MAAM,UAAY,CAAC,CAAC,CACzB,CAEA,MAAM,iBAAiB,QAAS,UAAY,CAAE,aAAa,KAAK,EAAG,MAAQ,WAAW,OAAQ,GAAG,CAAG,CAAC,EAGrG,IAAI,WAAa,GACjB,MAAM,iBAAiB,QAAS,UAAY,CAC1C,GAAI,WAAY,CAAE,WAAa,GAAO,MAAQ,CAC1C,CAAC,QAAQ,QAAU,QAAQ,WAC/B,OAAO,CACT,CAAC,EAIG,SAAS,gBAAkB,OAAO,OAAO,EAE7C,QAAQ,iBAAiB,QAAS,SAAU,EAAG,CAC7C,IAAI,MAAQ,EAAE,OAAO,QAAQ,iBAAiB,EAC9C,GAAK,MACL,GAAE,eAAe,EACjB,IAAI,GAAK,MAAM,EACX,IAAI,GAAG,OAAO,MAAM,EACxB,KAAK,UAAY,CAAE,OAAO,WAAW,OAAO,CAAG,CAAC,EAChD,MAAM,MAAM,EACd,CAAC,EAMD,SAAS,iBAAiB,QAAS,SAAU,EAAG,CAC9C,IAAI,KAAO,EAAE,aAAe,EAAE,aAAa,EAAI,KAC3C,OAAS,MAAQ,KAAK,OAAS,KAAK,QAAQ,OAAO,IAAM,GAAK,QAAQ,SAAS,EAAE,MAAM,EACtF,SAAQ,QAAQ,OAAS,GAChC,CAAC,EACD,MAAM,iBAAiB,UAAW,SAAU,EAAG,CAC7C,GAAI,EAAE,MAAQ,SAAU,CAAE,QAAQ,OAAS,GAAM,MAAQ,CACzD,GAAI,EAAE,MAAQ,aAAe,CAAC,QAAQ,OAAQ,CAC5C,IAAI,MAAQ,QAAQ,cAAc,GAAG,EACjC,QAAS,EAAE,eAAe,EAAG,MAAM,MAAM,EAC/C,CACF,CAAC,EACD,QAAQ,iBAAiB,UAAW,SAAU,EAAG,CAC/C,GAAI,IAAE,MAAQ,aAAe,EAAE,MAAQ,WAAa,EAAE,MAAQ,UAC9D,KAAI,MAAQ,MAAM,UAAU,MAAM,KAAK,QAAQ,iBAAiB,GAAG,CAAC,EAChE,EAAI,MAAM,QAAQ,SAAS,aAAa,EAE5C,GADA,EAAE,eAAe,EACb,EAAE,MAAQ,SAAU,CAAE,QAAQ,OAAS,GAAM,WAAa,GAAM,MAAM,MAAM,EAAG,WAAa,GAAO,MAAQ,CAC/G,IAAI,KAAO,EAAE,MAAQ,YAAc,EAAI,EAAI,EAAI,EAC3C,KAAO,EAAG,MAAM,MAAM,EACjB,MAAM,IAAI,GAAG,MAAM,IAAI,EAAE,MAAM,EAC1C,CAAC,EAEG,OAAO,gBAAgB,OAAO,eAAe,iBAAiB,SAAU,UAAY,CAAE,IAAI,OAAO,CAAG,CAAC,EAOzG,IAAI,SAAW,KACf,MAAM,iBAAiB,QAAS,UAAY,CAAE,SAAW,OAAO,OAAS,CAAC,EAC1E,OAAO,iBAAiB,SAAU,UAAY,CAC5C,GAAI,QAAQ,QAAU,SAAS,gBAAkB,OAAS,QAAQ,SAAS,SAAS,aAAa,EAAG,CAAE,SAAW,OAAO,QAAS,MAAQ,CACrI,WAAa,OAAM,SAAW,OAAO,SACrC,KAAK,IAAI,OAAO,QAAU,QAAQ,EAAI,MAAK,QAAQ,OAAS,GAClE,EAAG,CAAE,QAAS,EAAK,CAAC,CACtB,CAGA,SAAS,WAAW,MAAO,CACzB,GAAI,CAAC,MAAM,OAAQ,OACnB,IAAI,OAAS,OAAO,YAAc,OAAO,WAAW,kCAAkC,EAAE,QACxF,GAAI,OAAQ,CAAE,MAAM,YAAc,gBAAa,MAAM,CAAC,EAAI,SAAK,MAAQ,CAIvE,IAAI,GAAK,EAAG,GAAK,EAAG,SAAW,GAC/B,SAAS,MAAO,CAEd,GAAI,SAAS,QAAU,SAAS,gBAAkB,OAAS,MAAM,MAAS,OAAO,WAAW,KAAM,IAAI,EACtG,IAAI,KAAO,MAAM,EAAE,EACnB,GAAI,CAAC,SAGH,OAFA,KACA,MAAM,YAAc,gBAAa,KAAK,MAAM,EAAG,EAAE,EAAI,SACjD,IAAM,KAAK,QAAU,SAAW,GAAa,WAAW,KAAM,IAAI,GAC/D,WAAW,KAAM,EAAE,EAI5B,GAFA,KACA,MAAM,YAAc,gBAAa,KAAK,MAAM,EAAG,KAAK,IAAI,EAAG,EAAE,CAAC,EAAI,SAC9D,IAAM,EAAG,CAIX,GAHA,SAAW,GACX,KAEI,IAAM,MAAM,OAAQ,CAAE,MAAM,YAAc,gBAAa,MAAM,MAAM,OAAS,CAAC,EAAI,SAAK,MAAQ,CAClG,OAAO,WAAW,KAAM,GAAG,CAC7B,CACA,OAAO,WAAW,KAAM,EAAE,CAC5B,CACA,KAAK,CACP,CAEA,SAAS,MAAO,CACd,SAAS,iBAAiB,yBAAyB,EAAE,QAAQ,SAAU,MAAO,CAC5E,KAAK,KAAK,EACN,MAAM,aAAa,iBAAiB,GAAG,WAAW,KAAK,CAC7D,CAAC,EAGD,IAAI,OAAS,SAAS,eAAe,eAAe,EACpD,SAAS,iBAAiB,QAAS,SAAU,EAAG,CAC9C,IAAI,OAAS,EAAE,OAAO,QAAQ,sBAAsB,EACpD,GAAI,QAAU,QAAU,MAAM,QAAS,CACrC,EAAE,eAAe,EACjB,MAAM,QAAQ,KAAK,eAAe,EAClC,IAAI,GAAK,OAAO,cAAc,yBAAyB,EACnD,IAAI,WAAW,UAAY,CAAE,GAAG,MAAM,CAAG,EAAG,EAAE,CACpD,CACF,CAAC,CACH,CAEI,SAAS,aAAe,UAAa,SAAS,iBAAiB,mBAAoB,IAAI,EACpF,KAAK,CACd,GAAG",
  "names": ["list"]
}
