{
  "version": 3,
  "sources": ["/cdn/shop/t/21/assets/rt-tire-finder.js?cb=1792513296"],
  "sourcesContent": ["/* RT Tire Size Finder: the main script of sections/rt-tire-size-finder.liquid, moved out 2026-10-20 so\n   browsers cache it (homepage and tire collections) instead of re-downloading ~100 KB in every page.\n   EDIT IT HERE. It must stay a plain, NON-deferred <script src> inside the finder's root element:\n   it finds its own card through document.currentScript, which is null in a deferred script.\n   The Staggered pairs script stays inline in the section (the nightly pair builder reads it there). */\n  (function () {\n    window.RTShareState.init('tire');\n    var hostScript = document.currentScript;\n    var root = hostScript.closest('[data-rt-tsf]')\n            || document.querySelector('[data-rt-tsf]');\n    var dataScript = hostScript.previousElementSibling;\n    if (!dataScript || !dataScript.matches('script[data-rt-tsf-data]')) {\n      dataScript = document.querySelector('script[data-rt-tsf-data]');\n    }\n\n    async function initFinder() {\n      var catalogSearch = window.RTCatalogSearch;\n      if (catalogSearch) await catalogSearch.ready;\n      if (!root || root.dataset.tsfInit) return;\n      root.dataset.tsfInit = '1';\n      // The Staggered pairs panel reads a tire we list the way these chips do.\n      window.RT_TSF_SEASONS_OF = seasonsOf;\n      if (catalogSearch) root.classList.add('rt-catalog-native');\n\n    var $ = function (k) { return root.querySelector('[data-tsf=\"' + k + '\"]'); };\n    var W = $('w'), A = $('a'), D = $('d'), GO = $('go'), META = $('meta'), COPY = $('copy');\n    var HOME_NOTE = $('home-note');\n    var HOME_COMBINED = root.classList.contains('rt-tsf--home-combined');\n    var HOME_CHOICES = root.querySelectorAll('[data-home-season]');\n    var HOME_REFINEMENT = $('home-refinement');\n    var HOME_PICKED = false;\n    var RESULT_UI = null;\n    var WL = $('w-label'), AL = $('a-label'), DL = $('d-label');\n    var CHIPS = root.querySelectorAll('.rt-tsf__chip[data-season]');\n    var TCHIPS = root.querySelectorAll('.rt-tsf__chip[data-type]');\n    var TROW = root.querySelector('.rt-tsf__chips--type');\n    var TYPE = '';               // '' = all \u00B7 'lt' \u00B7 'p' (passenger) \u00B7 'st' \u00B7 'atv'; several ride as 'lt,p' (RT 2026-10-04). 'atv' is always alone.\n    // ---- MULTI PICK PURE BLOCK START ----\n    // A row holds several picks (RT 2026-10-04). Construction and tread keep them as one\n    // comma list in their own order, so the wire value is the variable.\n    var TYPE_ORDER = ['p', 'lt', 'st', 'atv'], TERRAIN_ORDER = ['at', 'rt', 'mt', 'st'];\n    function listOf(v) { return v ? String(v).split(',') : []; }\n    function undo(v) { try { return decodeURIComponent(v); } catch (e) { return ''; } }\n    function inList(v, k) { return !v || listOf(v).indexOf(k) !== -1; }\n    function cleanList(v, order) {\n      var got = listOf(String(v || '').toLowerCase());\n      return order.filter(function (k) { return got.indexOf(k) !== -1; }).join(',');\n    }\n    // A tap adds the chip or drops it; the empty chip (\"All\") clears the row.\n    function toggleList(v, k, order) {\n      if (!k) return '';\n      var got = listOf(v), i = got.indexOf(k);\n      if (i === -1) got.push(k); else got.splice(i, 1);\n      return cleanList(got.join(','), order);\n    }\n    // ATV is a different collection, never a mix: it replaces the row and nothing joins it.\n    function toggleType(v, k) {\n      if (k === 'atv') return 'atv';\n      return toggleList(v === 'atv' ? '' : v, k, TYPE_ORDER);\n    }\n    function toggleBrand(list, b) {\n      if (!b) return [];\n      var out = list.slice(), i = out.indexOf(b);\n      if (i === -1) out.push(b); else out.splice(i, 1);\n      return out;\n    }\n    function brandsFrom(raw) {\n      // A link may carry the comma itself encoded (the supplier band writes rt-brand=A%2CB).\n      return String(raw || '').replace(/%2C/gi, ',').split(',').map(function (b) {\n        try { return decodeURIComponent(b); } catch (e) { return b; }\n      }).filter(Boolean);\n    }\n    // ---- MULTI PICK PURE BLOCK END ----\n    var GCHIPS = root.querySelectorAll('.rt-tsf__chip[data-terrain]');\n    var GROW = root.querySelector('.rt-tsf__chips--terrain');\n    var TERRAIN = '';            // '' = all \u00B7 'at' \u00B7 'rt' \u00B7 'mt' \u00B7 'st' (street/hwy)\n    var BROW = root.querySelector('.rt-tsf__chips--brand');\n    var BRAND = [];              // [] = all brands; otherwise exact custom.brand values\n    var SROW = root.querySelector('.rt-tsf__chips--stud');\n    var SCHIPS = root.querySelectorAll('.rt-tsf__chip[data-stud]');\n    var STUD = '';              // studdable, studded, or legacy 1 (either)\n    var SORT_BTN = root.querySelector('.rt-tsf__chip[data-sort]');\n    var SORT_ROW = root.querySelector('.rt-tsf__chips--sort');\n    var SORT_ANCHOR = document.createComment('');\n    if (SORT_ROW) SORT_ROW.before(SORT_ANCHOR);\n    var STG_CHIP = document.querySelector('.rt-stg-m__chip'), STG_HOME = STG_CHIP && STG_CHIP.parentNode;\n    var SORT = false;            // true = lowest price first, on our grid and the supplier band\n    var ROWS = [];               // [{w,a,d, n,s, cnt:{as,aw,su,wi}, tags:[...]}]\n    var SEASONS = new Set();     // empty = All\n    var KEYS = ['as', 'aw', 'su', 'wi'];\n    var NOUN = { as: 'all-season', aw: 'all-weather', su: 'summer', wi: 'winter' };\n    var ATV_ROWS = \"20|10.00|8|1|0|0|0|0|0|0|0|0|0|0|@atv\\n22|8.00|10|1|0|0|0|0|0|0|0|0|0|0|@atv\\n22|9.50|10|2|0|0|0|0|0|0|0|0|0|0|@atv\\n22|11.00|8|1|0|0|0|0|0|0|0|0|0|0|@atv\\n22|11.00|9|1|0|0|0|0|0|0|0|0|0|0|@atv\\n22|11.00|10|1|0|0|0|0|0|0|0|0|0|0|@atv\\n23|8.00|10|1|0|0|0|0|0|0|0|0|0|0|@atv\\n23|8.00|11|1|0|0|0|0|0|0|0|0|0|0|@atv\\n23|8.00|12|2|0|0|0|0|0|0|0|0|0|0|@atv\\n23|9.50|12|1|0|0|0|0|0|0|0|0|0|0|@atv\\n23|9.50|14|1|0|0|0|0|0|0|0|0|0|0|@atv\\n23|10.00|10|1|0|0|0|0|0|0|0|0|0|0|@atv\\n23|10.00|12|1|0|0|0|0|0|0|0|0|0|0|@atv\\n23|10.50|12|2|0|0|0|0|0|0|0|0|0|0|@atv\\n23|11.00|10|1|0|0|0|0|0|0|0|0|0|0|@atv\\n24|8.00|11|1|0|0|0|0|0|0|0|0|0|0|@atv\\n24|8.00|12|2|0|0|0|0|0|0|0|0|0|0|@atv\\n24|9.00|11|1|0|0|0|0|0|0|0|0|0|0|@atv\\n24|9.50|10|1|0|0|0|0|0|0|0|0|0|0|@atv\\n24|10.00|11|2|0|0|0|0|0|0|0|0|0|0|@atv\\n24|10.50|10|1|0|0|0|0|0|0|0|0|0|0|@atv\\n24|11.00|10|2|0|0|0|0|0|0|0|0|0|0|@atv\\n24|11.00|12|1|0|0|0|0|0|0|0|0|0|0|@atv\\n25|8.00|11|1|0|0|0|0|0|0|0|0|0|0|@atv\\n25|8.00|12|8|0|0|0|0|0|0|0|0|0|0|@atv\\n25|9.00|12|1|0|0|0|0|0|0|0|0|0|0|@atv\\n25|10.00|11|1|0|0|0|0|0|0|0|0|0|0|@atv\\n25|10.00|12|8|0|0|0|0|0|0|0|0|0|0|@atv\\n25|10.50|12|1|0|0|0|0|0|0|0|0|0|0|@atv\\n25|11.00|10|1|0|0|0|0|0|0|0|0|0|0|@atv\\n25|11.00|12|4|0|0|0|0|0|0|0|0|0|0|@atv\\n25|12.00|9|1|0|0|0|0|0|0|0|0|0|0|@atv\\n25|12.00|11|1|0|0|0|0|0|0|0|0|0|0|@atv\\n25|12.00|12|1|0|0|0|0|0|0|0|0|0|0|@atv\\n26|8.00|14|1|0|0|0|0|0|0|0|0|0|0|@atv\\n26|9.00|12|8|0|0|0|0|0|0|0|0|0|0|@atv\\n26|10.00|12|2|0|0|0|0|0|0|0|0|0|0|@atv\\n26|11.00|12|7|0|0|0|0|0|0|0|0|0|0|@atv\\n26|12.00|12|1|0|0|0|0|0|0|0|0|0|0|@atv\\n27|9.00|12|4|0|0|0|0|0|0|0|0|0|0|@atv\\n27|9.00|14|5|0|0|0|0|0|0|0|0|0|0|@atv\\n27|10.00|12|1|0|0|0|0|0|0|0|0|0|0|@atv\\n27|10.00|14|4|0|0|0|0|0|0|0|0|0|0|@atv\\n27|11.00|12|5|0|0|0|0|0|0|0|0|0|0|@atv\\n27|11.00|14|4|0|0|0|0|0|0|0|0|0|0|@atv\\n27|12.00|12|1|0|0|0|0|0|0|0|0|0|0|@atv\\n27|12.00|14|1|0|0|0|0|0|0|0|0|0|0|@atv\\n28|8.00|14|1|1|0|0|0|0|0|0|0|0|0|@atv\\n28|8.50|14|1|0|0|0|0|0|0|0|0|0|0|@atv\\n28|9.00|14|1|0|0|0|0|0|0|0|0|0|0|@atv\\n28|9.50|14|1|0|0|0|0|0|0|0|0|0|0|@atv\\n28|10.00|12|3|0|0|0|0|0|0|0|0|0|0|@atv\\n28|10.00|14|8|0|0|0|0|0|0|0|0|0|0|@atv\\n28|11.00|14|2|0|0|0|0|0|0|0|0|0|0|@atv\\n28|12.00|12|1|0|0|0|0|0|0|0|0|0|0|@atv\\n28|12.00|14|1|0|0|0|0|0|0|0|0|0|0|@atv\\n29|9.00|14|2|0|0|0|0|0|0|0|0|0|0|@atv\\n29|10.00|16|1|0|0|0|0|0|0|0|0|0|0|@atv\\n29|11.00|14|2|0|0|0|0|0|0|0|0|0|0|@atv\\n29.5|8.00|14|1|1|0|0|0|0|0|0|0|0|0|@atv\\n30|8.50|16|1|0|0|0|0|0|0|0|0|0|0|@atv\\n30|9.00|14|1|0|0|0|0|0|0|0|0|0|0|@atv\\n30|9.50|14|1|0|0|0|0|0|0|0|0|0|0|@atv\\n30|9.50|16|1|0|0|0|0|0|0|0|0|0|0|@atv\\n30|10.00|14|9|0|0|0|0|0|0|0|0|0|0|@atv\\n30|10.00|15|4|0|0|0|0|0|0|0|0|0|0|@atv\\n30|10.00|16|2|0|0|0|0|0|0|0|0|0|0|@atv\\n30|11.00|14|4|0|0|0|0|0|0|0|0|0|0|@atv\\n30|11.00|15|2|0|0|0|0|0|0|0|0|0|0|@atv\\n30|12.00|12|1|0|0|0|0|0|0|0|0|0|0|@atv\\n30|12.00|14|1|0|0|0|0|0|0|0|0|0|0|@atv\\n30|14.00|14|1|0|0|0|0|0|0|0|0|0|0|@atv\\n31|10.00|14|1|0|0|0|0|0|0|0|0|0|0|@atv\\n31|10.00|15|1|0|0|0|0|0|0|0|0|0|0|@atv\\n32|8.00|14|1|1|0|0|0|0|0|0|0|0|0|@atv\\n32|8.50|18|1|0|0|0|0|0|0|0|0|0|0|@atv\\n32|9.50|15|1|0|0|0|0|0|0|0|0|0|0|@atv\\n32|9.50|18|1|0|0|0|0|0|0|0|0|0|0|@atv\\n32|10.00|14|8|0|0|0|0|0|0|0|0|0|0|@atv\\n32|10.00|15|4|0|0|0|0|0|0|0|0|0|0|@atv\\n32|10.00|16|1|0|0|0|0|0|0|0|0|0|0|@atv\\n32|10.00|18|1|0|0|0|0|0|0|0|0|0|0|@atv\\n32|10.50|14|1|1|0|0|0|0|0|0|0|0|0|@atv\\n32|11.00|15|2|0|0|0|0|0|0|0|0|0|0|@atv\\n32|14.00|15|1|0|0|0|0|0|0|0|0|0|0|@atv\\n33|8.50|20|1|0|0|0|0|0|0|0|0|0|0|@atv\\n33|9.50|20|1|0|0|0|0|0|0|0|0|0|0|@atv\\n33|10.00|15|2|0|0|0|0|0|0|0|0|0|0|@atv\\n33|10.00|18|1|0|0|0|0|0|0|0|0|0|0|@atv\\n33|10.00|20|1|0|0|0|0|0|0|0|0|0|0|@atv\\n34|8.00|14|1|0|0|0|0|0|0|0|0|0|0|@atv\\n34|8.50|18|1|0|0|0|0|0|0|0|0|0|0|@atv\\n34|10.00|18|1|0|0|0|0|0|0|0|0|0|0|@atv\\n35|8.50|20|1|0|0|0|0|0|0|0|0|0|0|@atv\\n35|9.50|20|1|0|0|0|0|0|0|0|0|0|0|@atv\\n35|9.50|24|1|0|0|0|0|0|0|0|0|0|0|@atv\\n35|10.00|15|5|0|0|0|0|0|0|0|0|0|0|@atv\\n37|8.50|24|1|0|0|0|0|0|0|0|0|0|0|@atv\\n37|9.50|22|1|0|0|0|0|0|0|0|0|0|0|@atv\\n37|10.00|15|2|0|0|0|0|0|0|0|0|0|0|@atv\\n37|10.50|24|1|0|0|0|0|0|0|0|0|0|0|@atv\\n40|9.50|24|1|0|0|0|0|0|0|0|0|0|0|@atv\\n40|10.00|18|1|0|0|0|0|0|0|0|0|0|0|@atv\\n40|10.50|24|1|0|0|0|0|0|0|0|0|0|0|@atv\\n50|10.50|24|1|0|0|0|0|0|0|0|0|0|0|@atv\\n205|30|12|1|0|0|0|0|0|0|0|0|0|0|@atv\\n215|50|12|1|0|0|0|0|0|0|0|0|0|0|@atv\";\n    var RESULTS = false;         // true when the URL already carries a size filter\n\n    // \u2500\u2500 rt-only: a staff-curated allowlist \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    // Quo's \uD83D\uDEDE Tire size tool used to text one product URL per ticked tire. RT\n    // 2026-08-12: \"i want it to send as one link. not multiple links.\" So the\n    // message now names the tires and carries ONE link \u2014 this page, size-filtered\n    // as always, narrowed to exactly the handles the staffer ticked.\n    //\n    //   /collections/tires?filter.p.tag=2256517&rt-only=<handle>[~<variantId>],<handle>\u2026\n    //\n    // QUERY form only: SMS clients drop #fragments from a tappable link, which is\n    // why rt-season/rt-type already have a query form too. The value arrives\n    // percent-encoded (a raw comma can end a phone's link detector mid-URL).\n    //\n    // THIS PARAM IS A PERMANENT, ADDITIVE CONTRACT. Texted links live in customers'\n    // phones forever. Never rename it, never make its ABSENCE mean something new \u2014\n    // every older link has no rt-only and must keep showing the whole size.\n    //\n    // Fails CLOSED, always. A malformed token voids the whole allowlist and the\n    // grid stays empty rather than quietly widening to every tire in the size:\n    // the customer is holding a message that names five specific tires, so showing\n    // forty is a worse lie than showing none. The parse is wrapped so a bad URL can\n    // never take the rest of the finder down with it.\n    var ONLY = null;             // {handle: true | '<variantId>'} \u2014 null = no allowlist\n    try {\n      var onlyRaw = new URLSearchParams(location.search).get('rt-only');\n      if (onlyRaw) {\n        ONLY = {};\n        onlyRaw.split(',').forEach(function (tok) {\n          var bits = String(tok).split('~');\n          var h = bits[0], v = bits.length > 1 ? bits[1] : '';\n          if (bits.length > 2 || !/^[a-z0-9][a-z0-9-]*$/.test(h) || (v && !/^\\d+$/.test(v))) {\n            ONLY = ONLY || {};\n            ONLY.__bad = 1;\n            return;\n          }\n          ONLY[h] = v || true;\n        });\n      }\n    } catch (e) { ONLY = { __bad: 1 }; }\n    // Pre-hide the grid the moment we know an allowlist is in play. This script is\n    // inline ABOVE the product grid, so the class lands before those cards parse\n    // and no redraw \u2014 Globo's included \u2014 can ever flash the full size first.\n    // applyFilter() lifts it once every card has been shown or hidden on purpose.\n    if (ONLY) {\n      try { document.documentElement.classList.add('rt-tsf-only-pending'); } catch (e) {}\n      // The finder's own filtering is gated on the size-list asset loading. If that\n      // never arrives, applyFilter never runs and a pre-hidden grid would stay\n      // blank \u2014 the one place fail-closed costs the customer the whole page. This\n      // watchdog does not fail OPEN to fix that (showing forty tires under a\n      // message naming five is the worse lie): it applies the allowlist on its own,\n      // with no dependency on the size data, and only then reveals the grid.\n      setTimeout(function () {\n        try {\n          var el = document.documentElement;\n          if (!el.classList.contains('rt-tsf-only-pending')) return;   // applyFilter got there\n          var anchors = document.querySelectorAll('a[href*=\"/products/\"]'), seen = {};\n          for (var i = 0; i < anchors.length; i++) {\n            var a = anchors[i];\n            if (a.closest('header,nav,[data-rt-tsf]')) continue;\n            var h = (a.getAttribute('href').match(/\\/products\\/([^/?#]+)/) || [])[1];\n            if (!h || seen[h]) continue;\n            seen[h] = 1;\n            var card = a.closest('li,.grid__item,.card-wrapper');\n            if (!card) continue;\n            card.style.display = (!ONLY.__bad && Object.prototype.hasOwnProperty.call(ONLY, h)) ? '' : 'none';\n          }\n          el.classList.remove('rt-tsf-only-pending');\n        } catch (e) {}\n      }, 6000);\n    }\n\n    // The finder also renders on season-collection pages (templateSuffix\n    // \"tires\" on winter / all-season-weather, and the single-season SEO\n    // collections should they ever get the template). There the chips are\n    // PRE-SEEDED from the collection handle, and a chip CLICK NAVIGATES to\n    // /collections/tires with the new season set \u2014 the grid on those pages\n    // only holds that collection's season, so an in-place toggle would show\n    // a misleading empty page.\n    var PATH_COLL = (location.pathname.match(/\\/collections\\/([^\\/?#]+)/) || [])[1] || '';\n    var ON_TIRES = PATH_COLL === 'tires';\n    var ON_ATV = PATH_COLL === 'atv-quad-tires';\n    var SEED = {\n      'winter': ['wi'],\n      'all-season-weather': ['as', 'aw'],\n      'all-season-tires': ['as'],\n      'all-weather-tires': ['aw'],\n      'summer-tires': ['su']\n    };\n\n    // Refinement chips (season/construction/terrain) stay hidden until a FULL\n    // size is entered (RT 8/4: \"can't sort it before there is a size\") \u2014 on\n    // EVERY placement, homepage and collections alike. revealChips() fires\n    // from render() once slot() matches, which also covers URL-restored sizes\n    // at boot. One-way per page load. Seeded season pages hide their pre-lit\n    // chips too \u2014 the page heading already names the season.\n    if (!PATH_COLL) root.classList.add('rt-tsf--launch');\n    function revealChips() { root.classList.add('rt-tsf--open'); }\n\n    function numeric(a, b) { return parseFloat(a) - parseFloat(b); }\n    // Season count within the current construction filter (all / LT / ST / passenger).\n    // Passenger is the REMAINDER \u2014 everything that is not LT, ST or ATV \u2014 so the\n    // three chips partition the size instead of overlapping. Clamped at 0: the\n    // LT/total columns are rebuilt on a different cadence than the ST ones, and a\n    // negative would read as \"chip has no tires\" rather than crash the dropdowns.\n    function nonNeg(v) { return v > 0 ? v : 0; }\n    function cntSeason1(r, k, ty) {\n      if (ty === 'lt') return r.cntLT[k];\n      if (ty === 'st') return r.cntST[k];\n      if (ty === 'p')  return nonNeg(r.cnt[k] - r.cntLT[k] - r.cntST[k]);\n      return r.cnt[k];\n    }\n    function cntSeason(r, k) {\n      if (TYPE === 'atv') return 0;\n      if (r.cat) return 1;\n      if (!TYPE) return r.cnt[k];\n      var t = 0;\n      listOf(TYPE).forEach(function (ty) { t += cntSeason1(r, k, ty); });\n      return t;\n    }\n    function base1(r, ty) {\n      return ty === 'atv' ? r.atv\n           : ty === 'lt' ? r.lt\n           : ty === 'st' ? r.st\n           : ty === 'p' ? nonNeg(r.n - r.lt - r.st - r.atv)\n           : r.n;\n    }\n    function countOf(r) {\n      if (r.cat) return TYPE === 'atv' ? 0 : 1;\n      var base = 0;\n      if (!TYPE) base = r.n;\n      else listOf(TYPE).forEach(function (ty) { base += base1(r, ty); });\n      if (!SEASONS.size) return base;\n      var t = 0;\n      SEASONS.forEach(function (k) { t += cntSeason(r, k); });\n      return t;   // slight overcount if a tire carries two season tags \u2014 used\n                  // only for >0 gating and labels, never for hiding.\n    }\n    // The size a texted link names stays pickable even when the season/type chips leave it\n    // no tires of ours (RT 10/14: 255/50R19 + all-weather opened with Diameter blank).\n    var PIN_ROW = null;\n    function rowsNow() { return ROWS.filter(function (r) { return r === PIN_ROW || countOf(r) > 0; }); }\n\n    // \u2500\u2500 dropdown cascade (Metric/Flotation optgroups mirror RT's sticky bar) \u2500\u2500\n    function fillWidths(keep) {\n      var ws = {};\n      rowsNow().forEach(function (r) { ws[r.w] = 1; });\n      var all = Object.keys(ws).sort(numeric);\n      var metric = all.filter(function (w) { return parseFloat(w) >= 100; });\n      var flot   = all.filter(function (w) { return parseFloat(w) < 100; });\n      W.innerHTML = '';\n      var ph = document.createElement('option');\n      ph.value = ''; ph.textContent = TYPE === 'atv' ? root.dataset.atvHeight : 'Width';\n      W.appendChild(ph);\n      var flotationLabel = TYPE === 'atv' ? 'ATV / Quad (in)' : 'Flotation (in)';\n      [['Metric (mm)', metric], [flotationLabel, flot]].forEach(function (g) {\n        if (!g[1].length) return;\n        var og = document.createElement('optgroup');\n        og.label = g[0];\n        g[1].forEach(function (w) {\n          var op = document.createElement('option');\n          op.value = w; op.textContent = w;\n          og.appendChild(op);\n        });\n        W.appendChild(og);\n      });\n      W.disabled = all.length === 0;\n      if (keep && ws[keep]) W.value = keep;\n    }\n\n    function fill(sel, values, placeholder, keep, fmt) {\n      sel.innerHTML = '';\n      var o = document.createElement('option');\n      o.value = ''; o.textContent = placeholder;\n      sel.appendChild(o);\n      values.forEach(function (v) {\n        var op = document.createElement('option');\n        op.value = v; op.textContent = fmt ? fmt(v) : v;\n        sel.appendChild(op);\n      });\n      sel.disabled = values.length === 0;\n      if (keep && values.indexOf(keep) !== -1) sel.value = keep;\n      // One option \u2192 pick it (saves a tap) \u2014 but ONLY on a fresh cascade.\n      // When we were asked to keep a value that no longer exists, fall back to\n      // the placeholder instead: silently auto-picking a DIFFERENT size than\n      // the one the user entered is how the LT-switched-my-size bug happened.\n      else if (!keep && values.length === 1) sel.value = values[0];\n    }\n\n    function cascadeA(keep) {\n      var vals = {};\n      rowsNow().forEach(function (r) { if (r.w === W.value) vals[r.a] = 1; });\n      fill(A, Object.keys(vals).sort(numeric), TYPE === 'atv' ? root.dataset.atvWidth : 'Ratio', keep);\n    }\n    function cascadeD(keep) {\n      var vals = {};\n      rowsNow().forEach(function (r) { if (r.w === W.value && r.a === A.value) vals[r.d] = 1; });\n      fill(D, Object.keys(vals).sort(numeric), TYPE === 'atv' ? root.dataset.atvRim : 'Diameter', keep,\n        TYPE === 'atv' ? function (v) { return v + '\"'; } : function (v) { return 'R' + v; });\n    }\n\n    function slot() {\n      if (!W.value || !A.value || !D.value) return null;\n      for (var i = 0; i < ROWS.length; i++) {\n        var r = ROWS[i];\n        if (r.w === W.value && r.a === A.value && r.d === D.value) return r;\n      }\n      return null;\n    }\n\n    // \u2500\u2500 URL state \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    function hashOf() {\n      var parts = [];\n      if (SEASONS.size) parts.push('rt-season=' + KEYS.filter(function (k) { return SEASONS.has(k); }).join(','));\n      if (TYPE) parts.push('rt-type=' + TYPE);\n      if (STUD) parts.push('rt-stud=' + STUD);\n      if (TERRAIN) parts.push('rt-terrain=' + TERRAIN);\n      if (BRAND.length) parts.push('rt-brand=' + BRAND.map(encodeURIComponent).join(','));\n      if (SORT) parts.push('rt-sort=lo');\n      return parts.length ? '#' + parts.join('&') : '';\n    }\n    function hrefOf(s) {\n      if (catalogSearch) {\n        var u = new URL(location.href); u.searchParams.delete('filter.p.tag');\n        if (s) u.searchParams.set('filter.p.tag', s.tags[0]); u.hash = hashOf(); return u.toString();\n      }\n      if (s.cat) return '/collections/tires?view=rt-catalog&rtq=' + encodeURIComponent(sizeText(s)) + hashOf();\n      var qs = s.tags.map(function (t) { return 'filter.p.tag=' + encodeURIComponent(t); }).join('&');\n      var route = (TYPE === 'atv' || (s.atv && s.atv === s.n))\n        ? '/collections/atv-quad-tires'\n        : '/collections/tires';\n      return route + '?' + qs + hashOf();\n    }\n    function sizeText(s) { return s.w + (parseFloat(s.w) < 100 ? 'x' : '/') + s.a + 'R' + s.d; }\n    function pushHash() {\n      // Strip the ?rt-season= query form (texted links use it because SMS\n      // clients drop #fragments) \u2014 after the first in-page toggle the hash is\n      // the single source of truth.\n      var p = new URLSearchParams(location.search);\n      p.delete('rt-season');\n      p.delete('rt-type');\n      p.delete('rt-stud');\n      p.delete('rt-terrain');\n      p.delete('rt-brand');\n      p.delete('rt-sort');\n      // A staff allowlist is the view the customer ARRIVED at, not a filter they\n      // are stuck inside. pushHash only ever runs off an in-page chip/GO click, so\n      // the first time they refine anything they are browsing on their own terms:\n      // release the curated set and let the normal filters take over. Leaving it\n      // on would make their chip clicks do nothing (applyFilter ignores season and\n      // type while ONLY is live) and the page would read as broken.\n      p.delete('rt-only');\n      ONLY = null;\n      var qs = p.toString();\n      history.replaceState(null, '', location.pathname + (qs ? '?' + qs : '') + hashOf());\n      window.RTShareState.replace(window.RTShareState.groups.tire, location.hash);\n      syncCopy();\n    }\n\n    // \u2500\u2500 Copy link \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    // Nothing is built here. This finder has kept its whole state in the URL since it\n    // shipped \u2014 size in the native filter.p.tag param, chips in the hash \u2014 so the button\n    // copies location.href and that is the entire mechanism. One builder means a copied\n    // link, a texted rt-season= link and the Quo size button can never disagree.\n    // Shown only once the URL says something: a size filter is applied, or a chip is on.\n    // A bare /collections/tires is already its own link and needs no button.\n    function urlHasState() {\n      return /(?:^|[?&])filter\\.p\\.tag=/.test(location.search) || !!hashOf() || !!(catalogSearch && catalogSearch.stockActive());\n    }\n    function syncCopy() {\n      if (COPY) root.classList.toggle('rt-tsf--sharable', urlHasState());\n    }\n    if (COPY) {\n      var copyT = 0;\n      var COPY_LABEL = COPY.textContent;\n      COPY.addEventListener('click', function () {\n        var url = window.RTShareState.url(location.href);\n        function said(msg, ok) {\n          COPY.textContent = msg; COPY.classList.toggle('done', !!ok);\n          clearTimeout(copyT);\n          copyT = setTimeout(function () {\n            COPY.textContent = COPY_LABEL; COPY.classList.remove('done');\n          }, 1900);\n        }\n        // writeText must be called straight out of the tap or iOS drops the gesture;\n        // execCommand is the fallback for a browser without the async API.\n        function legacy() {\n          try {\n            var ta = document.createElement('textarea');\n            ta.value = url; ta.setAttribute('readonly', '');\n            ta.style.position = 'fixed'; ta.style.top = '-1000px'; ta.style.opacity = '0';\n            document.body.appendChild(ta);\n            ta.select(); ta.setSelectionRange(0, url.length);\n            var ok = document.execCommand('copy');\n            document.body.removeChild(ta);\n            said(ok ? 'Link copied' : 'Press \\u2318C to copy', ok);\n          } catch (e) { said('Press \\u2318C to copy', false); }\n        }\n        if (navigator.clipboard && navigator.clipboard.writeText) {\n          navigator.clipboard.writeText(url).then(function () { said('Link copied', true); }, legacy);\n        } else legacy();\n      });\n    }\n\n    // \u2500\u2500 client-side season filter on the results grid \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    // Cards are found generically (works for Dawn's grid AND Globo's client-\n    // rendered replacement): every /products/ link, walked up to the highest\n    // ancestor that only contains links to that same product.\n    // The walk never climbs into the grid's list or the page around it: with ONE tire in the size\n    // every link on the page is that tire, so it reached <main> and the season filter hid the\n    // whole page (315/40R21 winter link, RT 2026-10-01).\n    function cardOf(a) {\n      var el = a, handle = (a.getAttribute('href').match(/\\/products\\/([^/?#]+)/) || [])[1];\n      while (el.parentElement && el.parentElement !== document.body) {\n        var up = el.parentElement;\n        if (/^(MAIN|UL|OL)$/.test(up.tagName) || /^shopify-section/.test(up.id || '') ||\n            up.id === 'product-grid' || up.id === 'MainContent' || up.querySelector('#product-grid')) break;\n        var links = el.parentElement.querySelectorAll('a[href*=\"/products/\"]');\n        var same = true;\n        for (var i = 0; i < links.length; i++) {\n          var h = (links[i].getAttribute('href').match(/\\/products\\/([^/?#]+)/) || [])[1];\n          if (h !== handle) { same = false; break; }\n        }\n        if (!same) break;\n        el = el.parentElement;\n      }\n      return el === a ? a.parentElement : el;\n    }\n    function seasonOfTitle(t) {\n      t = (t || '').toLowerCase();\n      if (t.indexOf('winter') !== -1) return 'wi';\n      if (/all[\\s-]?weather/.test(t)) return 'aw';\n      if (/all[\\s-]?season/.test(t)) return 'as';\n      if (t.indexOf('summer') !== -1) return 'su';\n      // Supplier titles often name only the winter LINE (Snow Leopard, Blizzak, X-Ice, SW628), so\n      // \"winter\" alone hid them under the Winter chip: 3,706 of 4,047 rows in 15 sizes had no season (9/23).\n      if (/\\bice|\\bx-?ice|\\bsnow|blizzak|hakka|observe\\b|\\balpin|viking|ultra ?grip|arctic|artic\\b|nord ?frost|nordica|nordic|\\bpolar|frost|inverno|himalaya|winspike|i\\*?pike|wintrac|\\bessn|glacier|wnova|winguard|wintr\\b|true north|eco north|i[*-]?cept|\\bsw6\\d\\d|\\brws-?\\d/.test(t)) return 'wi';\n      // Studded/studless A/T, M/T, R/T (Grabber A/TX, M55) are not winter tires; bare \"studdable\" never counts.\n      if (/\\bstud(?:ded|less)\\b/.test(t) && !/\\b[amrx]\\/t|\\b(?:at|mt|rt|xt|atx)\\d?w?\\b|(?:all|mud|rugged|trail)[\\s-]?terrain|grappler|\\bm-?55\\b/.test(t)) return 'wi';\n      return null;\n    }\n    // Seasons for a card, as a LIST. The title is one source and it is SILENT on\n    // 110 active road tires \u2014 nearly all mud-terrains (\"\u2026 Sailun Terramax M/T\n    // Mud-Terrain Tires\") whose TAGS do say a season. Those vanished the instant a\n    // customer ticked a season chip, while staff saw them in Quo off the same\n    // catalog and texted a size+season link straight to them (measured 2026-08-10).\n    // RT_SEASON_MAP (assets/rt-season-map.js, generated from the live catalog)\n    // answers handle -> keys for exactly those products. Keying off the product\n    // HANDLE and not the card markup is what makes this survive Globo swapping the\n    // whole grid client-side. Where the map is silent the title still decides, so\n    // the 6 products whose tag and title CONTRADICT each other are left untouched\n    // for RT to adjudicate rather than silently resolved here.\n    function seasonsOf(handle, title) {\n      var m = window.RT_SEASON_MAP && window.RT_SEASON_MAP[handle];\n      if (m && m.length) return m;\n      var s = seasonOfTitle(title);\n      return s ? [s] : [];\n    }\n    function hasSeason(list, k) { return !!list && list.indexOf(k) !== -1; }\n    function anySeason(list) {\n      for (var i = 0; i < (list || []).length; i++) { if (SEASONS.has(list[i])) return true; }\n      return false;\n    }\n    // Construction from the title, THREE-WAY (RT 2026-08-18 \u2014 trailer tires were\n    // showing up under Passenger, because 'p' used to mean \"not LT\"):\n    //   LT275/60R20 \u2026 / LT35X12.50R20 \u2026  = lt   (light truck)\n    //   ST205/75R14 \u2026                    = st   (special trailer)\n    //   everything else                  = p    (passenger)\n    // The size digits must follow the code, which is what keeps model names out\n    // (\"ST Maxx\", \"STT Pro\", \"SALT\" never match). Audited against the live\n    // catalog 2026-08-18: 37 ST titles, 451 LT, zero overlap. The four commercial\n    // 11R22.5/24.5 IRONHEAD \"TRAILER\" tires carry no ST code and are not ST here\n    // \u2014 they are wide-base sizes and live on the commercial collection.\n    // Same rule as tire-tool-core.js constructionOf(), which is what Quo texts.\n    // A FLOTATION size is light-truck by construction whether or not the title\n    // spells LT \u2014 35X12.5R20 does not exist for a car, and only 4 of 207 flotation\n    // titles carry the prefix. Reading the code alone called the other 203\n    // \"passenger\", so the LT chip promised a count the grid then refused to show\n    // (12 promised, 0 rendered on 33/12.50R20). RIM decides, same 15\" cutoff the\n    // size parser uses: 8-14\" is ATV/quad/SxS and is NOT light truck.\n    var FLOT_TITLE = /(?<![\\d.])(?:LT|P)?\\s*\\d{2}(?:\\.\\d)?\\s*[x\u00D7]\\s*\\d{1,2}(?:\\.\\d+)?\\s*[x\u00D7r\\-]\\s*(\\d{2}(?:\\.\\d)?)(?!\\.?\\d)/i;\n    // A C-TYPE size (235/65R16C) is a light-COMMERCIAL van tire \u2014 no LT prefix\n    // and not flotation, so the code-only read filed all of them as passenger\n    // and the LT chip hid them (RT, 2026-08-20, searching 2356516 Winter+LT).\n    // The C must sit directly on the rim number, so a model name starting with\n    // C cannot match. 4 of 2,446 active tires flip p -> lt; nothing else moves.\n    var CTYPE_TITLE = /(?<![\\d.])\\d{2,3}\\s*\\/\\s*\\d{2}\\s*[Zz]?[\\/R]\\s*\\d{2}(?:\\.\\d)?C(?![A-Za-z0-9])/i;\n    function typeOfTitle(t) {\n      if (ON_ATV) return 'atv';\n      if (/(^|\\s)ST\\s*\\d/i.test(t || '')) return 'st';\n      if (/(^|\\s)LT\\s*\\d/i.test(t || '')) return 'lt';\n      if (CTYPE_TITLE.test(t || '')) return 'lt';\n      var m = FLOT_TITLE.exec(t || '');\n      return (m && parseFloat(m[1]) >= 15) ? 'lt' : 'p';\n    }\n    // Studdable / studded. It is a TITLE fact and nothing else: the catalog has\n    // no stud tag at all (audited 2026-08-28 over 2458 tire products \u2014 0 tags,\n    // 335 titles, 202 Studdable + 133 Studded), so it is read off the same title\n    // the customer reads, the way construction is. Deliberately the SAME regex as\n    // tire-tool-core / the Quo panel's tzIsStud, so the chip a staffer ticks in Quo\n    // and the page their texted link opens can never disagree about which tires\n    // qualify. \"(Studless)\" is the OPPOSITE claim and carries three catalog titles\n    // of its own, which is why the doubled d is load-bearing.\n    // Sailun Terramax RT in a ply-rated (LT / flotation) size is studdable \u2014 custom.studdable=true on all\n    // 28 of them, the XL passenger sizes are not \u2014 and the titles never say so (audit 2026-10-02).\n    function studOfTitle(t) { return /\\bstud(?:d?able|ded)?\\b|winspike/i.test(t || '') || (/terramax r\\/?t\\b/i.test(t || '') && /\\b\\d{1,2} ply\\b/i.test(t || '')); }\n    function studStateOfTitle(t) {\n      t = String(t || '');\n      if (/stud+[\\s-]*less|\\b(?:non|not|un)[\\s-]*stud/i.test(t)) return '';\n      var can = /stud+ab+le/i.test(t), installed = /stud+ed\\b|\\(p-s\\)/i.test(t);\n      if (can && installed) return 'differ';\n      if (installed) return 'studded';\n      return can || studOfTitle(t) ? 'studdable' : '';\n    }\n    function studMatches(c) {\n      return !STUD || (STUD === '1' ? c.stud : c.studs === STUD);\n    }\n    // Tread type from card text \u2014 AUDITED against all 2388 active tires\n    // 2026-08-04 (the v11 token-only version put 750 winter tires, 94 A/T and\n    // 52 R/T into \"Street & Highway\"). Two rules keep it honest:\n    //  1. EXCLUSIONS return null: commercial (11R22.5/24.5, Ironhead, steer/\n    //     drive/all-position), trailer, ATV/SxS, and WINTER. An A/T-vs-M/T\n    //     answer doesn't exist for those; null means \"no tread chip matches\n    //     me\", so they only ever appear under All Treads.\n    //  2. Abbreviation patterns are CASE-SENSITIVE. Card text carries prose\n    //     (\"Starting at\") and model names (ATREZZO, Terrain ATTACK) that a\n    //     case-insensitive \\bAT\\b swallows whole. Word forms (MUD-TERRAIN,\n    //     WILDPEAK) stay case-insensitive.\n    // Model names are listed because RT's catalog encodes tread in the MODEL,\n    // not a badge: Ridge Grappler / ST Maxx / Rugged Trek are R/T; A/T4W is\n    // A/T but has no \\bA/T\\b boundary (trailing W). Add new models here.\n    var TR_EXCL = [/\\b\\d{2}R(19\\.5|22\\.5|24\\.5)\\b/i, /IRONHEAD/i, /\\bSTEER\\b/i,\n      /ALL POSITION/i, /REGIONAL/i, /MIXED SERVICE/i, /CLOSED SHOULDER/i,\n      /\\bTRAILER\\b/i, /\\bST\\d{3}\\//i,\n      /\\bSxS\\b/i, /\\bATV\\b/i, /\\bQUAD\\b/i, /SUPER ATV/i, /\\bITP\\b/i,\n      /TRAIL BLADE BOSS/i, /ASSASSINATOR/i,\n      // ATV sizes are 32x10.5-14 (DASH before the rim) where road tires are\n      // 35X12.50R20 (R). The ATV/Quad/SxS TAGS aren't in card text, so size\n      // format is the only ATV signal a card carries. Catches Infamous\n      // Ultimate MT, which otherwise reads as a mud-terrain.\n      /\\b\\d{2}x\\d{1,2}(\\.\\d+)?-\\d{2}\\b/i, /INFAMOUS/i];\n    var TR_MT = [/\\bM\\/T[0-9A-Z]*\\b/, /\\bMT\\d?\\b/, /MUD[\\s-]?TERRAIN/i, /STT\\s*PRO/i,\n      /TRAIL GRAPPLER/i, /MUD GRAPPLER/i, /FIERCE ATTITUDE/i, /\\bKM[23]\\b/,\n      /COURAGIA M/i, /RAZR MT/i, /ULTIMATE MT/i, /TERRITORY MT/i, /DESTINATION M\\/?T/i];\n    var TR_RT = [/\\bR\\/T[0-9A-Z]*\\b/, /\\bRT\\b/, /\\bX\\/T[0-9A-Z]*\\b/, /\\bXT\\b/,\n      /RUGGED[\\s-]?TERRAIN/i, /RIDGE GRAPPLER/i, /ST\\s*MAXX/i];\n    var TR_AT = [/\\bA\\/T[0-9A-Z]*\\b/, /\\bAT\\d?W?\\b/, /\\bATX\\b/, /ALL[\\s-]?TERRAIN/i,\n      /WILDPEAK A/i, /TERRA GRAPPLER/i, /RECON GRAPPLER/i, /\\bKO[23]\\b/, /DURATRAC/i,\n      /ROAD\\+?TRAIL/i, /STRONGHOLD/i, /ROADIAN ATX/i, /WORKHORSE AT/i, /TRAIL HOG/i,\n      /\\bM-?55\\b/i,                  // Toyo M-55 \u2014 toyotires.com files it All-Terrain\n      /TRAIL[\\s-]?TERRAIN/i,         // BFG Trail-Terrain T/A \u2014 title HYPHENATES it\n      /RUGGED TREK/i,                // Cooper: all-terrain, not R/T\n      /EXO GRAPPLER/i,               // Nitto: \"Heavy Duty All-Terrain\"\n      /NITTO G2/i,                   // = Terra Grappler G2, title drops the model\n      /TRAIL[R]?UNNER/i,             // Goodyear Trailrunner AT (catalog spells it \"Trailunner\")\n      // Tightened to the model's own A/T designation: the bare-brand forms\n      // (GEOLANDAR A, DUELER A, LTX A ...) would match any future non-A/T\n      // variant of the same line, and run against card text at that.\n      /GEOLANDAR A\\/?T/i, /GRABBER A\\/?T/i, /DUELER A\\/?T/i, /LTX A\\/?T/i, /ATLAS R\\/?T/i];\n    function anyRe(t, list) {\n      for (var i = 0; i < list.length; i++) { if (list[i].test(t)) return true; }\n      return false;\n    }\n    function terrainOfTitle(t, season) {\n      t = t || '';\n      if (hasSeason(season, 'wi') || anyRe(t, TR_EXCL)) return null;\n      if (anyRe(t, TR_MT)) return 'mt';\n      if (anyRe(t, TR_RT)) return 'rt';\n      if (anyRe(t, TR_AT)) return 'at';\n      return 'st';\n    }\n    // Card text carries price/badges/\"Starting at\" as well as the title, which\n    // is a standing false-positive risk for the short tread tokens. Prefer the\n    // real title node (Dawn AND Globo render .card__heading), then the product\n    // link's own text, and only fall back to the whole card if markup changes.\n    function titleOf(card, a) {\n      var h = card.querySelector('.card__heading, .full-unstyled-link');\n      var t = (h && h.textContent || '').trim();\n      if (!t) t = (a.textContent || '').trim();\n      return t || card.textContent;\n    }\n    function collectCards() {\n      if (catalogSearch) return catalogSearch.cards().map(function (c) {\n        var p = catalogSearch.record(c.handle), se;\n        // A supplier card reads the way the \"More tires\" band reads it (RT 2026-10-02: All Weather\n        // showed 0 catalogue tires here) \u2014 window.RT_CAT_TIRE, rt-catalog-season.js.\n        if (p && p.source === 'supplier' && window.RT_CAT_TIRE) {\n          var r = window.RT_CAT_TIRE.read(p);\n          return { handle: c.handle, el: c.el, season: r.season, type: r.type, stud: r.stud, terrain: r.terrain, brand: r.brand,\n            studs: r.studs, title: p.title };\n        }\n        se = seasonsOf(c.handle, p.title);\n        return { handle: c.handle, el: c.el, season: se, type: typeOfTitle(p.title),\n          stud: studOfTitle(p.title), studs: studStateOfTitle(p.title), terrain: terrainOfTitle(p.title, se),\n          brand: (window.RT_BRAND_MAP || {})[c.handle] || '' };\n      }).filter(function (c) { return catalogSearch.sizeMatches(c.handle); });\n      var seen = {}, out = [];\n      // Scope to below the finder so header/menu product links are ignored.\n      var anchors = document.querySelectorAll('a[href*=\"/products/\"]');\n      for (var i = 0; i < anchors.length; i++) {\n        var a = anchors[i];\n        if (root.contains(a) || a.closest('header,nav')) continue;\n        var handle = (a.getAttribute('href').match(/\\/products\\/([^/?#]+)/) || [])[1];\n        if (!handle || seen[handle]) continue;\n        seen[handle] = 1;\n        var card = cardOf(a);\n        var txt = titleOf(card, a), se = seasonsOf(handle, txt);\n        out.push({ handle: handle, el: card, season: se,\n                   type: typeOfTitle(txt),\n                   stud: studOfTitle(txt), studs: studStateOfTitle(txt),\n                   terrain: terrainOfTitle(txt, se),\n                   // Brand is the CURATED metafield (rt-brand-map.js), never a title\n                   // regex: the rim Brand pill and Quo both read custom.brand, and a\n                   // second classifier here is how two surfaces start disagreeing.\n                   brand: (window.RT_BRAND_MAP || {})[handle] || '' });\n      }\n      return out;\n    }\n    function tagStudded(cards) {\n      cards.forEach(function (c) {\n        var label = (window.RT_CAT_STUD_LABELS || {})[c.studs];\n        var t = c.el.querySelector('.rt-tsf-studded');\n        if (!label) { if (t) t.remove(); return; }\n        var h = c.el.querySelector('.rt-catalog-card-info > h3');\n        if (!h) return;\n        if (!t) {\n          t = document.createElement('p');\n          t.className = 'rt-tsf-studded';\n          h.insertAdjacentElement('afterend', t);\n        }\n        t.setAttribute('data-studs', c.studs);\n        t.textContent = label;\n      });\n    }\n    function updateCountText(n) {\n      var els = document.querySelectorAll('div,span,p,h1,h2,h3');\n      for (var i = 0; i < els.length; i++) {\n        var el = els[i];\n        if (!el.children.length && /^[\\d,]+\\s+Products?$/.test(el.textContent.trim())) {\n          el.textContent = n + (n === 1 ? ' Product' : ' Products');\n        }\n      }\n    }\n    // The terrain row EARNS its place: shown only when the set the customer is\n    // looking at splits into >=2 tread types with enough products for the\n    // refinement to change anything (>=5), counted within the active\n    // season/construction filters. Passenger sizes never qualify (every title\n    // classifies 'st') \u2014 that's what keeps this row truck-only without a\n    // hard-coded size list. Stays visible while a terrain chip is active so\n    // it can always be un-picked.\n    // Point every link on this card at a specific variant. Used only for an\n    // rt-only token that carried one (`handle~variantId`), where the size the\n    // customer asked about lives on ONE variant of a multi-size product. Existing\n    // ?variant= wins \u2014 Globo and Dawn both sometimes render a variant-specific\n    // card already, and overwriting that would be us guessing over their data.\n    function pinVariant(c, vid) {\n      var links = c.el.querySelectorAll('a[href*=\"/products/' + c.handle + '\"]');\n      for (var i = 0; i < links.length; i++) {\n        var href = links[i].getAttribute('href') || '';\n        if (href.indexOf('variant=') !== -1) continue;\n        links[i].setAttribute('href', href + (href.indexOf('?') === -1 ? '?' : '&') + 'variant=' + vid);\n      }\n    }\n    function updateTerrainRow(cards) {\n      if (!GROW) return;\n      // A curated handful does not get refined further \u2014 the tread row would be\n      // counting the staffer's own five picks back at the customer.\n      if (ONLY) { GROW.hidden = true; return; }\n      var counts = { at: 0, rt: 0, mt: 0, st: 0 }, total = 0, classes = 0, k;\n      cards.forEach(function (c) {\n        if (!c.terrain) return;          // winter / commercial / trailer / ATV\n        if ((!SEASONS.size || anySeason(c.season))\n            && inList(TYPE, c.type)\n            && studMatches(c)) { counts[c.terrain]++; total++; }\n      });\n      for (k in counts) { if (counts[k]) classes++; }\n      GROW.hidden = !((total >= 5 && classes >= 2) || TERRAIN);\n      if (GROW.hidden) return;\n      GCHIPS.forEach(function (c) {\n        var t = c.dataset.terrain;\n        if (!t) return;\n        c.style.display = (counts[t] || (TERRAIN && inList(TERRAIN, t))) ? '' : 'none';\n        c.textContent = c.dataset.label;\n      });\n    }\n    // The stud row appears under the seasons that can actually take studs \u2014\n    // winter AND all-weather, because the studdable Toyo M55 and Yokohama A/T XD\n    // G017 are tagged all-weather, not winter, so a winter-only gate could never\n    // reach them (same list as the Quo panel's TZ_STUD_SEASONS) \u2014 and only when\n    // this size actually has some. It also stays up whenever the chip is ON:\n    // nothing on this page may be hidden without the switch that un-hides it.\n    function updateStudRow(counts) {\n      if (!SROW) return;\n      // A staff allowlist is a human's own picks; refining it further would be\n      // counting them back at the customer. Same call as the tread and brand rows.\n      if (ONLY) { SROW.hidden = true; return; }\n      var seasonOk = SEASONS.has('wi') || SEASONS.has('aw');\n      SROW.hidden = !(STUD || (seasonOk && counts.studdable + counts.studded > 0));\n      SCHIPS.forEach(function (chip) { chip.hidden = !(counts[chip.dataset.stud] || STUD === chip.dataset.stud || STUD === '1'); });\n    }\n    // The Brand row is built from the tires actually in THIS size, counted inside\n    // the season/construction/tread filters already picked \u2014 so it never offers a\n    // brand that would return nothing. Same \"earns its place\" rule as the tread\n    // row: two or more brands, or it stays hidden. A tire with no brand on file\n    // shows by default and drops out once a brand is picked.\n    function updateBrandRow(cards) {\n      if (!BROW) return;\n      // A staff allowlist is a human's five picks \u2014 refining it by brand would be\n      // counting their own choices back at the customer. Same call as the tread row.\n      if (ONLY) { BROW.hidden = true; return; }\n      var counts = {}, names = [], n = 0;\n      cards.forEach(function (c) {\n        if (!c.brand) return;\n        if ((!SEASONS.size || anySeason(c.season))\n            && inList(TYPE, c.type)\n            && studMatches(c)\n            && inList(TERRAIN, c.terrain)) {\n          if (!counts[c.brand]) { counts[c.brand] = 0; names.push(c.brand); }\n          counts[c.brand]++; n++;\n        }\n      });\n      BROW.hidden = !(names.length >= 2 || BRAND.length);\n      if (BROW.hidden) return;\n      // Most-stocked brand first, then alphabetical \u2014 a size usually has a couple of\n      // brands that matter and a tail of ones, and the tail should not lead.\n      names.sort(function (a, b) { return counts[b] - counts[a] || (a < b ? -1 : a > b ? 1 : 0); });\n      // The picked brand always survives, even if the other filters moved under it,\n      // so it can be un-picked.\n      BRAND.forEach(function (b) { if (names.indexOf(b) === -1) names.push(b); });\n      var html = \"<button type='button' class='rt-tsf__chip' data-brand='' data-label='All Brands' aria-pressed='false'>All Brands</button>\";\n      names.forEach(function (b) {\n        html += \"<button type='button' class='rt-tsf__chip' data-brand=\\\"\" + esc(b) + \"\\\" data-label=\\\"\" + esc(b) + \"\\\" aria-pressed='false'>\"\n             + esc(b) + '</button>';\n      });\n      BROW.innerHTML = html;\n      paintBrandChips();\n    }\n    function esc(v) {\n      return String(v).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n    }\n    function paintBrandChips() {\n      if (!BROW) return;\n      BROW.querySelectorAll('.rt-tsf__chip').forEach(function (c) {\n        var b = c.dataset.brand || '', on = b ? BRAND.indexOf(b) !== -1 : !BRAND.length;\n        c.classList.toggle('is-on', on);\n        c.setAttribute('aria-pressed', on ? 'true' : 'false');\n      });\n    }\n    // Chips are rebuilt on every filter pass, so the click is delegated to the row.\n    if (BROW) BROW.addEventListener('click', function (ev) {\n      var chip = ev.target.closest('.rt-tsf__chip');\n      if (!chip || !BROW.contains(chip)) return;\n      // Clicking the chip that is already lit turns it OFF. The lit pill is the\n      // control the customer is looking at, and on a size carrying a dozen makes\n      // the \"All Brands\" reset can sit a whole wrapped row away \u2014 it must not be\n      // the only way back. Read the chip's own is-on class rather than comparing\n      // against the variable: that keeps the identifier's count equal, which the\n      // pusher's feature-grep requires.\n      BRAND = toggleBrand(BRAND, chip.dataset.brand || '');\n      paintBrandChips();\n      pushHash();\n      applyFilter();\n    });\n\n    SCHIPS.forEach(function (chip) { chip.addEventListener('click', function () {\n      // Multi-select like every other row: both lit = '1' (either), so a\n      // customer can show studdable AND factory studded together, then untick each.\n      var picked = STUD === '1' ? ['studdable', 'studded'] : STUD ? [STUD] : [];\n      var i = picked.indexOf(chip.dataset.stud);\n      if (i === -1) picked.push(chip.dataset.stud); else picked.splice(i, 1);\n      STUD = picked.length === 2 ? '1' : (picked[0] || '');\n      paintChips();\n      pushHash();\n      applyFilter();\n    }); });\n    if (SORT_BTN) SORT_BTN.addEventListener('click', function () {\n      SORT = !SORT;\n      paintChips();\n      pushHash();\n      applyFilter();\n    });\n\n    // ---- TIRE PRICE SORT PURE BLOCK START ----\n    // The number on the card, in cents. A sale card uses the sale price. No readable\n    // price sorts last \u2014 a tire we cannot price is not the cheapest thing on the page.\n    function priceSortOn(hash) {\n      return /(?:^|[#&])rt-sort=lo\\b/.test(hash || '');\n    }\n    function dollars(text) {\n      var m = String(text || '').replace(/,/g, '').match(/\\$\\s*(\\d+(?:\\.\\d+)?)/);\n      return m ? Math.round(parseFloat(m[1]) * 100) : null;\n    }\n    function cardCents(el) {\n      var pr = el.querySelector('.price');\n      if (!pr) return null;\n      var node = pr.classList.contains('price--on-sale')\n        ? pr.querySelector('.price__sale .price-item--sale')\n        : pr.querySelector('.price__regular .price-item--regular');\n      var cents = node ? dollars(node.textContent) : null;\n      return cents == null ? dollars(pr.textContent) : cents;\n    }\n    function byPrice(a, b) {\n      var pa = a.cents == null ? Infinity : a.cents;\n      var pb = b.cents == null ? Infinity : b.cents;\n      return pa - pb || a.ord - b.ord;\n    }\n    // On: priced visible cards low to high, then unpriced, then hidden in arrival order.\n    // Off: every card back in the order it arrived, hidden ones included.\n    function sortEntries(list, on) {\n      if (!on) return list.slice().sort(function (a, b) { return a.ord - b.ord; });\n      var vis = [], hid = [];\n      list.forEach(function (e) { (e.show ? vis : hid).push(e); });\n      vis.sort(byPrice);\n      hid.sort(function (a, b) { return a.ord - b.ord; });\n      return vis.concat(hid);\n    }\n    // ---- TIRE PRICE SORT PURE BLOCK END ----\n    var ORD_OF = {}, ORD_N = 0;\n    function ordOf(c) {\n      if (ORD_OF[c.handle] == null) ORD_OF[c.handle] = ORD_N++;\n      return ORD_OF[c.handle];\n    }\n    function sortShopGrid(cards) {\n      var on = priceSortOn(location.hash);\n      var groups = new Map();\n      cards.forEach(function (c) {\n        var p = c.el.parentElement;\n        if (!p) return;\n        if (!groups.has(p)) groups.set(p, []);\n        groups.get(p).push(c);\n      });\n      groups.forEach(function (list, parent) {\n        var dom = list.slice().sort(function (a, b) {\n          if (a.el === b.el) return 0;\n          return (a.el.compareDocumentPosition(b.el) & 4) ? -1 : 1;\n        });\n        var ordered = sortEntries(dom.map(function (c) {\n          return { el: c.el, cents: cardCents(c.el), ord: ordOf(c), show: c.el.style.display !== 'none' };\n        }), on);\n        var same = true;\n        for (var i = 0; i < ordered.length; i++) if (ordered[i].el !== dom[i].el) { same = false; break; }\n        if (same) return;\n        var after = dom[dom.length - 1].el.nextSibling;\n        var frag = document.createDocumentFragment();\n        ordered.forEach(function (e) { frag.appendChild(e.el); });\n        parent.insertBefore(frag, after);\n      });\n    }\n\n    var applying = false;\n    function applyFilter() {\n      // Launcher placement (homepage etc.): there is no results grid to manage,\n      // and the page-wide scroll-trigger strip below would kill Dawn's homepage\n      // entry animations. Collection pages only.\n      if (!PATH_COLL) {\n        // No results grid on this placement, so there is nothing to hide and\n        // nothing the pre-hide could be protecting.\n        if (ONLY) { try { document.documentElement.classList.remove('rt-tsf-only-pending'); } catch (e) {} }\n        return 0;\n      }\n      applying = true;\n      // Dawn's scroll-in animation leaves elements at opacity 0 / hidden until\n      // its own observer reveals them \u2014 and when Globo interrupts that (its\n      // filter API 500s were observed doing exactly this), cards AND the whole\n      // .product-grid-container stay invisible forever. We manage visibility\n      // here, so strip the animation state page-wide; losing the entry\n      // animation is the price of never rendering an invisible grid.\n      document.querySelectorAll('.scroll-trigger').forEach(function (el) {\n        el.classList.remove('scroll-trigger', 'animate--slide-in', 'scroll-trigger--offscreen');\n        el.removeAttribute('data-cascade');\n      });\n      if (catalogSearch) catalogSearch.cards().forEach(function (c) { c.el.style.display = 'none'; });\n      var cards = collectCards(), visible = 0;\n      // Studs are decided BEFORE anything is shown or hidden. The refinement rides\n      // in the link now (rt-stud=1), so a stale or hand-edited URL can ask for a\n      // size that has none: fail OPEN rather than render an empty grid under a\n      // message promising tires \u2014 the same call updateChipAvailability already\n      // makes for a season chip with no stock behind it.\n      // Counted inside the rows ABOVE it and nothing below \u2014 season and\n      // construction \u2014 which is this file's standing convention: the tread row\n      // counts within season+construction, and the brand row within those plus\n      // tread. The stud row sits directly under construction, so it stops there.\n      var studCounts = { studdable: 0, studded: 0 };\n      cards.forEach(function (c) {\n        if (Object.prototype.hasOwnProperty.call(studCounts, c.studs)\n            && (!SEASONS.size || anySeason(c.season)) && inList(TYPE, c.type)) studCounts[c.studs]++;\n      });\n      updateStudRow(studCounts);\n      cards.forEach(function (c) {\n        // A staff allowlist REPLACES the refinement filters \u2014 it does not stack\n        // with them. A person read the thread and ticked these exact tires; the\n        // season/type/terrain filters classify off the TITLE, and a title is\n        // silent about season often enough that ANDing them would hide a tire a\n        // staffer deliberately picked. One void token voids the whole list.\n        var show = ONLY\n          ? (!ONLY.__bad && Object.prototype.hasOwnProperty.call(ONLY, c.handle))\n          : ((!SEASONS.size || anySeason(c.season))\n             && inList(TYPE, c.type)\n             && studMatches(c)\n             && inList(TERRAIN, c.terrain)\n             && (!BRAND.length || BRAND.indexOf(c.brand) !== -1));\n        if (catalogSearch) show = show && catalogSearch.stockAllows(c.handle);\n        c.el.style.display = show ? '' : 'none';\n        c.el.dataset.rtTsfDone = '1';   // lets the observer spot node swaps\n        // The size lives on ONE variant of a multi-size product: point the card at\n        // that variant, the way the per-product link the message used to carry did.\n        if (show && ONLY && typeof ONLY[c.handle] === 'string') pinVariant(c, ONLY[c.handle]);\n        if (show) visible++;\n      });\n      updateTerrainRow(cards);\n      updateBrandRow(cards);\n      updateCountText(visible);\n      sortShopGrid(cards);\n      // Every card is now shown or hidden on purpose \u2014 safe to reveal the grid.\n      if (ONLY) {\n        try { document.documentElement.classList.remove('rt-tsf-only-pending'); } catch (e) {}\n      }\n      applying = false;\n      if (catalogSearch) { catalogSearch.filtered(); tagStudded(cards); }\n      syncResultsUI();\n      return visible;\n    }\n    // Globo replaces the grid client-side after load (and on its own pagination)\n    // \u2014 re-apply when the set of product cards actually changes.\n    var lastFp = '';\n    function fingerprint() {\n      return collectCards().map(function (c) { return c.handle; }).sort().join(',');\n    }\n    var obTimer = null;\n    var gridMO = new MutationObserver(function () {\n      if (applying || appending) return;\n      clearTimeout(obTimer);\n      obTimer = setTimeout(function () {\n        var cards = collectCards();\n        var fp = cards.map(function (c) { return c.handle; }).sort().join(',');\n        // Re-apply on a new card SET \u2014 or when Globo swapped in fresh nodes for\n        // the same products (same handles, unmarked elements).\n        var swapped = cards.some(function (c) { return !c.el.dataset.rtTsfDone; });\n        if (catalogSearch) tagStudded(cards);\n        if (fp !== lastFp || swapped) { lastFp = fp; applyFilter(); }\n      }, 200);\n    });\n    gridMO.observe(document.body, { childList: true, subtree: true });\n\n    // Globo adds .spf-filter-loading while its API call runs, and its CSS hides\n    // the ENTIRE grid (.spf-filter-loading #gf-products > * {visibility:hidden}).\n    // When that API errors (HTTP 500s observed live 2026-08-03) the class never\n    // clears and the page looks empty. Watchdog: stuck ~3s with cards present \u2192\n    // clear it so the server-rendered results show. Normal Globo loads finish in\n    // well under 3s and are untouched.\n    var spfStuck = 0;\n    setInterval(function () {\n      var el = document.querySelector('.spf-filter-loading');\n      if (!el || !collectCards().length) { spfStuck = 0; return; }\n      if (++spfStuck >= 2) {\n        el.classList.remove('spf-filter-loading');\n        spfStuck = 0;\n        applyFilter();\n      }\n    }, 1500);\n\n    // \u2500\u2500 infinite scroll \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    // Fetch the NEXT server page (same query = same size filter), pull the\n    // Dawn-rendered cards out of its #product-grid, and append them to\n    // whatever grid is on screen (Dawn's, or Globo's replacement \u2014 Globo's\n    // card snippet mimics Dawn markup, so they mix cleanly). The season\n    // filter is re-applied to the new cards immediately.\n    var NEXT_PAGE = 2, LOADING = false, PAGES_DONE = false, appending = false;\n    var CHASE_CAP = 5, chaseLeft = CHASE_CAP;\n    // RT 2026-09-23: the supplier bands under this grid (\"More tires we can order in\", the ATV catalogue)\n    // stay hidden until every page of OUR tires is in \u2014 otherwise supplier tires showed first and then got\n    // shoved down by the next page. 'more' | 'done' | 'failed'.\n    function pagesSignal(state) {\n      window.rtTfPages = state;\n      try { document.dispatchEvent(new CustomEvent('rt-tf:pages', { detail: state })); } catch (e) {}\n    }\n    pagesSignal('more');\n    // Size-filtered views are tiny (biggest size \u2248 43 tires \u2248 2 server pages), so\n    // load every page up front there \u2014 the season/tread chip counts are computed\n    // from the cards in the DOM, and with only page 1 loaded they understate what\n    // the Show-N button (asset data) promises. Gated on RESULTS (the tag matched a\n    // known size row) \u2014 a raw filter.p.tag alone can be any hand-crafted tag and\n    // must stay lazy; EAGER_MAX is the backstop.\n    var EAGER = false, EAGER_MAX = 12;\n    var sentinel = null;\n\n    function liveContainer() {\n      var cards = collectCards();\n      return cards.length ? cards[cards.length - 1].el.parentElement : null;\n    }\n    function nextURL() {\n      var p = new URLSearchParams(location.search);\n      p.set('page', NEXT_PAGE);\n      return location.pathname + '?' + p.toString();\n    }\n    function loadMore() {\n      if (LOADING || PAGES_DONE) return;\n      LOADING = true;\n      if (sentinel) { sentinel.classList.add('rt-tsf-loading'); sentinel.textContent = 'Loading more tires\u2026'; }\n      fetch(nextURL())\n        .then(function (r) { return r.text(); })\n        .then(function (html) {\n          var doc = new DOMParser().parseFromString(html, 'text/html');\n          var grid = doc.getElementById('product-grid');\n          var container = liveContainer();\n          var known = {};\n          collectCards().forEach(function (c) { known[c.handle] = 1; });\n          var added = 0;\n          if (grid && container) {\n            Array.prototype.slice.call(grid.children).forEach(function (li) {\n              var a = li.querySelector('a[href*=\"/products/\"]');\n              var h = a && (a.getAttribute('href').match(/\\/products\\/([^/?#]+)/) || [])[1];\n              if (!h || known[h]) return;\n              // Dawn's scroll-in animation observer never sees appended nodes \u2014\n              // strip the classes so cards render immediately.\n              li.classList.remove('scroll-trigger', 'animate--slide-in');\n              li.removeAttribute('data-cascade');\n              appending = true;\n              container.appendChild(li);\n              appending = false;\n              known[h] = 1; added++;\n            });\n          }\n          if (!added) { PAGES_DONE = true; pagesSignal('done'); }\n          else { NEXT_PAGE++; lastFp = fingerprint(); }\n          var visible = applyFilter();\n          LOADING = false;\n          if (sentinel) { sentinel.classList.remove('rt-tsf-loading'); sentinel.textContent = ''; }\n          // If everything new was hidden by the season filter, keep chasing while\n          // the sentinel stays in range and pages remain \u2014 a filtered-down grid can\n          // be shorter than the viewport, so no scroll event would re-arm the chase.\n          // The burst cap only paces the fetches now (350ms breather per burst).\n          if (added && ((EAGER && NEXT_PAGE <= EAGER_MAX) || sentinelNear())) {\n            if (chaseLeft-- > 0) loadMore();\n            else { chaseLeft = CHASE_CAP; setTimeout(loadMore, 350); }\n          }\n        })\n        .catch(function () {\n          LOADING = false;\n          if (sentinel) { sentinel.classList.remove('rt-tsf-loading'); sentinel.textContent = ''; }\n          pagesSignal('failed');\n        });\n    }\n    function sentinelNear() {\n      if (!sentinel) return false;\n      // A hidden grid (the Staggered pairs panel hides it) gives the sentinel an all-zero rect.\n      // top 0 read as \"near\", so one scroll with the panel open chased every page of the\n      // collection in behind it: 104 pages, 72 MB of HTML, and a frozen phone (2026-10-13).\n      if (!sentinel.getClientRects().length) return false;\n      var r = sentinel.getBoundingClientRect();\n      return r.top < (window.innerHeight + 800);\n    }\n    function chase() { chaseLeft = CHASE_CAP; if (sentinelNear()) loadMore(); }\n    var scrollIO = null;   // keep a reference \u2014 an unreferenced observer can be GC'd\n    function initScroll() {\n      if (catalogSearch || !PATH_COLL) { pagesSignal('done'); return; }   // no grid to extend\n      var container = liveContainer();\n      if (!container) {\n        if (!document.querySelector('a[href*=\"/products/\"]')) { pagesSignal('done'); return; }   // empty collection\n        setTimeout(initScroll, 600); return;   // Globo may still be rendering\n      }\n      sentinel = document.createElement('div');\n      sentinel.style.minHeight = '2px';\n      sentinel.setAttribute('role', 'status');\n      sentinel.setAttribute('aria-live', 'polite');\n      // base.css hides empty divs (div:empty{display:none}); a display:none\n      // sentinel never intersects, which kills the IO path entirely.\n      sentinel.style.display = 'block';\n      container.insertAdjacentElement('afterend', sentinel);\n      scrollIO = new IntersectionObserver(function (es) {\n        es.forEach(function (e) { if (e.isIntersecting) { chaseLeft = CHASE_CAP; loadMore(); } });\n      }, { rootMargin: '800px 0px' });\n      scrollIO.observe(sentinel);\n      // Scroll/resize fallback in case the observer misses (Globo re-renders,\n      // odd scroll containers): cheap throttled proximity check.\n      var t = 0;\n      var onScroll = function () {\n        if (t) return;\n        t = setTimeout(function () {\n          t = 0;\n          if (sentinelNear()) { chaseLeft = CHASE_CAP; loadMore(); }\n        }, 250);\n      };\n      window.addEventListener('scroll', onScroll, { passive: true });\n      window.addEventListener('resize', onScroll, { passive: true });\n      // An allowlist must load EVERY page: a ticked tire sitting on server page 2\n      // would otherwise never enter the DOM, and the customer would get four cards\n      // under a message naming five tires. Bounded by EAGER_MAX either way.\n      EAGER = RESULTS || !!ONLY;\n      if (EAGER) loadMore();\n    }\n\n    // \u2500\u2500 sticky quick bar + FIND SIZE FAB (native) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    // Replaces the old Globo-driven pair: the theme.liquid sticky size bar\n    // (which set gf_ params) and the custom_liquid FAB that opened Globo's\n    // drawer. Collection pages only \u2014 the homepage placement is its own hero.\n    // Both appear after scrolling past the finder and run entirely off ROWS +\n    // the finder's own cascade, so they can never offer a size the finder\n    // wouldn't (the old bar's static lists could \u2014 that was the Globo gap).\n    var BAR = null, FAB = null, BW, BA, BD;\n    function gotoFinder() {\n      if (RESULT_UI && RESULT_UI.mobile) setResultsExpanded(true);\n      var card = root.querySelector('.rt-tsf__card');\n      if (!card) return;\n      card.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      card.classList.remove('rt-tsf__card--flash');\n      void card.offsetWidth;                    // restart the animation\n      card.classList.add('rt-tsf__card--flash');\n    }\n    function syncBar() {\n      if (!BAR) return;\n      [[BW, W, 'Width'], [BA, A, 'Height'], [BD, D, 'Rim']].forEach(function (p) {\n        p[0].innerHTML = p[1].innerHTML;\n        p[0].value = p[1].value;\n        p[0].disabled = p[1].disabled;\n        // Old-bar placeholder labels \u2014 shorter than the finder's \"Ratio\" /\n        // \"Diameter\", and what mobile users have been reading for months.\n        if (p[0].options.length && !p[0].options[0].value) p[0].options[0].textContent = p[2];\n      });\n    }\n    function initQuickUI() {\n      if (!PATH_COLL || BAR) return;\n      BAR = document.createElement('div');\n      BAR.id = 'rt-tsf-bar';\n      var fb = document.createElement('button');\n      fb.type = 'button'; fb.className = 'rt-tsf-bar__btn rt-tsf-bar__filter';\n      fb.textContent = '\u2261 Filter';\n      fb.addEventListener('click', gotoFinder);\n      var wrap = document.createElement('div');\n      wrap.className = 'rt-tsf-bar__sizes';\n      function mk(label) { var s = document.createElement('select'); s.className = 'rt-tsf-bar__sel'; s.setAttribute('aria-label', label); return s; }\n      BW = mk('Tire width'); BA = mk('Aspect ratio'); BD = mk('Rim diameter');\n      var sep = document.createElement('span');\n      sep.className = 'rt-tsf-bar__sep'; sep.textContent = '/';\n      // No separator before diameter \u2014 its options already read \"R16\".\n      wrap.appendChild(BW); wrap.appendChild(sep); wrap.appendChild(BA); wrap.appendChild(BD);\n      [[BW, W], [BA, A], [BD, D]].forEach(function (p) {\n        p[0].addEventListener('change', function () {\n          p[1].value = p[0].value;\n          p[1].dispatchEvent(new Event('change'));  // runs the finder's cascade\n          syncBar();\n        });\n      });\n      var go = document.createElement('button');\n      go.type = 'button'; go.className = 'rt-tsf-bar__btn rt-tsf-bar__go';\n      go.textContent = 'Find \u2192';\n      go.addEventListener('click', function () {\n        var s = slot();\n        if (s && countOf(s) > 0) { location.href = hrefOf(s); return; }\n        gotoFinder();                              // incomplete size \u2192 full card\n      });\n      BAR.appendChild(fb); BAR.appendChild(wrap); BAR.appendChild(go);\n      document.body.appendChild(BAR);\n      syncBar();\n\n      FAB = document.createElement('button');\n      FAB.id = 'rt-tsf-fab'; FAB.type = 'button';\n      FAB.setAttribute('aria-label', 'Find Size');\n      FAB.innerHTML = '<svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path d=\"M3 6h18M6 12h12M10 18h4\" stroke=\"#04121c\" stroke-width=\"2.4\" stroke-linecap=\"round\"/></svg><span>Find Size</span>';\n      FAB.addEventListener('click', gotoFinder);\n      document.body.appendChild(FAB);\n\n      var qt = 0;\n      var onQuickScroll = function () {\n        if (qt) return;\n        qt = setTimeout(function () {\n          qt = 0;\n          var y = window.pageYOffset || document.documentElement.scrollTop || 0;\n          BAR.classList.toggle('rt-show', y > 320);\n          // FAB only when the quick bar is NOT up \u2014 both at once obscured ~180px\n          // of a phone viewport, and both do the same job (jump to the finder).\n          FAB.classList.toggle('rt-show', y > 320 && !BAR.classList.contains('rt-show'));\n        }, 120);\n      };\n      window.addEventListener('scroll', onQuickScroll, { passive: true });\n      window.addEventListener('resize', onQuickScroll, { passive: true });\n      onQuickScroll();\n    }\n\n    // \u2500\u2500 render \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    // Two spellings of ONE size \u2014 35x12.50R18 and 305/70R18 are the same tire,\n    // and three of RT's are titled the metric way \u2014 so the data gives both rows\n    // the other's tags and Shopify ORs them into one grid. Name the partner in\n    // the meta: \"19 tires in 35x12.50R18\" on its own would claim 19 tires that\n    // size does not have. Found from the row's own tags (tags[0] is always the\n    // size's own digits), so there is no second list here to fall out of date.\n    function equivOf(s) {\n      for (var i = 0; i < ROWS.length; i++) {\n        var r = ROWS[i];\n        if (r !== s && s.tags.indexOf(r.tags[0]) !== -1) {\n          return r.w + (parseFloat(r.w) < 100 ? 'x' : '/') + r.a + 'R' + r.d;\n        }\n      }\n      return '';\n    }\n\n\n    function resultsSizeText(s) {\n      if (!s) return '';\n      return (TYPE === 'atv' || (s.atv && s.atv === s.n))\n        ? s.w + 'x' + s.a + '-' + s.d\n        : s.w + (parseFloat(s.w) < 100 ? 'x' : '/') + s.a + 'R' + s.d;\n    }\n    function setResultsExpanded(open, focus) {\n      var ui = RESULT_UI;\n      if (!ui || !ui.mobile) return;\n      ui.expanded = open;\n      root.classList.toggle('rt-tsf--results-expanded', open);\n      ui.toggle.setAttribute('aria-expanded', String(open));\n      ui.toggle.querySelector('span').textContent = open ? ui.labels.close : ui.labels.filters;\n      if (!open && focus) {\n        ui.toggle.focus({ preventScroll: true });\n        root.scrollIntoView({ block: 'start', behavior: window.matchMedia('(prefers-reduced-motion: reduce)').matches ? 'auto' : 'smooth' });\n      }\n    }\n    function syncResultsUI() {\n      var ui = RESULT_UI;\n      if (!ui || !ui.mobile) return;\n      var names = [];\n      CHIPS.forEach(function (chip) {\n        if (chip.dataset.season !== 'all' && SEASONS.has(chip.dataset.season)) names.push(chip.textContent.trim());\n      });\n      var parts = [names.length ? names.join(' & ') : ui.labels.allTires];\n      var typeText0 = Array.from(TCHIPS).filter(function (c) { return TYPE && c.dataset.type && inList(TYPE, c.dataset.type); })\n        .map(function (c) { return c.textContent.trim(); }).join(' & ');\n      var terrainText0 = Array.from(GCHIPS).filter(function (c) { return TERRAIN && c.dataset.terrain && inList(TERRAIN, c.dataset.terrain); })\n        .map(function (c) { return c.dataset.label || c.textContent.trim(); }).join(' & ');\n      if (typeText0) parts.push(typeText0);\n      if (STUD) parts.push((window.RT_CAT_STUD_FILTERS || {})[STUD] || ui.labels.studs);\n      if (terrainText0) parts.push(terrainText0);\n      if (BRAND.length) parts.push(BRAND.join(' & '));\n      var sizeText = resultsSizeText(ui.appliedSize) || ui.labels.allSizes;\n      if (ui.size.textContent !== sizeText) ui.size.textContent = sizeText;\n      var typeText = parts.join(' \u00B7 ');\n      if (ui.type.textContent !== typeText) ui.type.textContent = typeText;\n      if (ui.barLabel && ui.barLabel.textContent !== sizeText) ui.barLabel.textContent = sizeText;\n      ui.groups.forEach(function (g) {\n        var hidden = (g.key === 'season' && TYPE === 'atv') || g.nodes.every(function (node) { return node.hidden; });\n        g.details.hidden = hidden;\n        if (hidden) g.details.open = false;\n        var value = g.key === 'construction' ? (typeText0 || ui.labels.all)\n          : g.key === 'tread' ? (terrainText0 || ui.labels.all)\n          : g.key === 'brand' ? (BRAND.join(' & ') || ui.labels.all) : '';\n        if (g.value.textContent !== value) g.value.textContent = value;\n      });\n      [W,A,D].forEach(function (field) {\n        if (field.options.length && !field.options[0].value && field.options[0].textContent !== '\u2014') field.options[0].textContent = '\u2014';\n      });\n      GO.textContent = ui.labels.show;\n      var anySize = !!(W.value || A.value || D.value);\n      if (!anySize) { GO.href = '#'; GO.removeAttribute('aria-disabled'); }\n      ui.notice.textContent = anySize && GO.getAttribute('aria-disabled') === 'true'\n        ? (slot() ? ui.labels.noMatches : ui.labels.incomplete) : '';\n    }\n    function initCompactResults(appliedSize) {\n      var summary = $('results-summary'), editor = $('results-editor');\n      if (!summary || !editor || !PATH_COLL) return;\n      var ui = RESULT_UI = {\n        labels: summary.dataset, editor: editor, toggle: $('results-toggle'),\n        size: $('results-size'), type: $('results-type'), appliedSize: appliedSize,\n        mobile: false, expanded: false, groups: [], goMarker: null, barLabel: null\n      };\n      ui.notice = document.createElement('p');\n      ui.notice.className = 'rt-tsf__results-notice';\n      ui.notice.setAttribute('aria-live', 'polite');\n      editor.appendChild(ui.notice);\n      if (BAR) {\n        ui.barLabel = document.createElement('span');\n        ui.barLabel.className = 'rt-tsf-bar__results-summary';\n        BAR.appendChild(ui.barLabel);\n      }\n      var media = window.matchMedia('(max-width: 749px)');\n      function group(key, nodes) {\n        nodes = nodes.filter(Boolean);\n        if (!nodes.length) return;\n        var details = document.createElement('details');\n        details.className = 'rt-tsf__results-group';\n        details.dataset.resultsGroup = key;\n        details.style.order = String(ui.groups.length);\n        var heading = document.createElement('summary');\n        var title = document.createElement('span'); title.textContent = ui.labels[key];\n        var value = document.createElement('small');\n        heading.appendChild(title); heading.appendChild(value); details.appendChild(heading);\n        var markers = nodes.map(function (node) {\n          var marker = document.createComment(''); node.before(marker); details.appendChild(node); return marker;\n        });\n        editor.appendChild(details);\n        ui.groups.push({ key: key, details: details, nodes: nodes, markers: markers, value: value });\n        details.addEventListener('toggle', function () {\n          if (details.open) ui.groups.forEach(function (g) { if (g.details !== details) g.details.open = false; });\n        });\n      }\n      function mode() {\n        if (media.matches === ui.mobile) return;\n        ui.mobile = media.matches;\n        if (ui.mobile) {\n          group('size', [root.querySelector('.rt-tsf__row')]);\n          group('season', [$('chips')]);\n          group('construction', [TROW]); group('studs', [SROW]);\n          group('tread', [GROW]); group('brand', [BROW]);\n          group('more', [root.querySelector('.rt-tsf__share'), root.querySelector('.rt-tsf__search'), root.querySelector('.rt-tsf__specialty')]);\n          var summary = $('results-summary');\n          if (summary && SORT_ROW) summary.appendChild(SORT_ROW);\n          // Staggered pairs chip rides in the card beside $ low to high, not on its own row\n          // under it, where it looked like it was floating (RT 2026-09-30).\n          if (STG_CHIP && SORT_ROW) { SORT_ROW.appendChild(STG_CHIP); SORT_ROW.classList.add('rt-tsf__chips--stg'); STG_HOME.style.display = 'none'; }\n          ui.goMarker = document.createComment(''); GO.before(ui.goMarker); editor.appendChild(GO);\n          if (BAR) BAR.classList.add('rt-tsf-bar--results');\n          setResultsExpanded(ui.expanded);\n          syncResultsUI();\n        } else {\n          if (ui.goMarker) ui.goMarker.replaceWith(GO);\n          ui.groups.forEach(function (g) {\n            g.nodes.forEach(function (node,i) { g.markers[i].replaceWith(node); });\n            g.details.remove();\n          });\n          ui.groups = [];\n          if (SORT_ANCHOR && SORT_ROW) SORT_ANCHOR.after(SORT_ROW);\n          if (STG_CHIP) { STG_HOME.appendChild(STG_CHIP); STG_HOME.style.display = ''; if (SORT_ROW) SORT_ROW.classList.remove('rt-tsf__chips--stg'); }\n          root.classList.remove('rt-tsf--results-expanded');\n          if (BAR) BAR.classList.remove('rt-tsf-bar--results');\n          var w = W.value, a = A.value, d = D.value;\n          fillWidths(w); cascadeA(a); cascadeD(d); render();\n        }\n      }\n      ui.toggle.addEventListener('click', function () { setResultsExpanded(!ui.expanded); });\n      editor.addEventListener('keydown', function (event) {\n        if (event.key === 'Escape') { event.preventDefault(); setResultsExpanded(false, true); }\n      });\n      if (media.addEventListener) media.addEventListener('change', mode);\n      else media.addListener(mode);\n      mode();\n    }\n\n    function homeSeason() {\n      if (SEASONS.size === 1 && SEASONS.has('wi')) return 'winter';\n      if (SEASONS.size && !SEASONS.has('wi') && !SEASONS.has('su')) return 'year';\n      return 'all';\n    }\n    function rememberHomeSelection() {\n      if (!HOME_PICKED) return;\n      try {\n        var previous = history.state;\n        if (previous !== null && typeof previous !== 'object') return;\n        var value = { version: 1, season: homeSeason(), w: W.value, a: A.value, d: D.value };\n        if (previous && JSON.stringify(previous.rtHomeTireFinder) === JSON.stringify(value)) return;\n        var next = Object.assign({}, previous || {});\n        next.rtHomeTireFinder = value;\n        history.replaceState(next, '');\n      } catch (e) {}\n    }\n    function restoreHomeSelection() {\n      if (!HOME_COMBINED) return false;\n      var saved;\n      try { saved = history.state && history.state.rtHomeTireFinder; } catch (e) { return false; }\n      if (!saved || saved.version !== 1 || ['all', 'year', 'winter'].indexOf(saved.season) === -1) return false;\n      if ([saved.w, saved.a, saved.d].some(function (v) { return typeof v !== 'string'; })) return false;\n      HOME_PICKED = true;\n      SEASONS.clear();\n      fillWidths(saved.w); cascadeA(saved.a); cascadeD(saved.d);\n      if (saved.season === 'winter') SEASONS.add('wi');\n      if (saved.season === 'year') { SEASONS.add('as'); SEASONS.add('aw'); }\n      paintChips();\n      return true;\n    }\n    function renderHome(s) {\n      if (!HOME_COMBINED || !HOME_NOTE) return false;\n      var picked = homeSeason();\n      HOME_CHOICES.forEach(function (button) {\n        button.setAttribute('aria-pressed', HOME_PICKED && button.dataset.homeSeason === picked ? 'true' : 'false');\n      });\n      HOME_REFINEMENT.hidden = !HOME_PICKED;\n      [W, A, D].forEach(function (field) {\n        if (field.options.length && !field.options[0].value && field.options[0].textContent !== '\u2014') field.options[0].textContent = '\u2014';\n      });\n      GO.textContent = HOME_NOTE.dataset.search;\n      META.textContent = '';\n      if (!HOME_PICKED) {\n        GO.href = '#';\n        GO.setAttribute('aria-disabled', 'true');\n        HOME_NOTE.textContent = '';\n        return true;\n      }\n      if (!W.value && !A.value && !D.value) {\n        GO.href = '/collections/' + (picked === 'winter' ? 'winter' : picked === 'year' ? 'all-season-weather' : 'tires');\n        GO.removeAttribute('aria-disabled');\n        HOME_NOTE.textContent = '';\n      } else if (!s || !countOf(s)) {\n        GO.href = '#';\n        GO.setAttribute('aria-disabled', 'true');\n        HOME_NOTE.textContent = s ? HOME_NOTE.dataset.noMatches : HOME_NOTE.dataset.incomplete;\n      } else {\n        GO.href = hrefOf(s);\n        GO.removeAttribute('aria-disabled');\n        HOME_NOTE.textContent = s.cat ? CAT_NOTE : '';\n      }\n      rememberHomeSelection();\n      return true;\n    }\n\n    function render() {\n      syncBar();               // mirror cascades into the sticky quick bar\n      syncCopy();              // ...and the share link tracks whether the URL says anything\n      var s = slot();\n      if (renderHome(s)) return;\n      if (s && !s.cat) revealChips();    // full size present -> refinement chips appear\n      var n = s ? countOf(s) : 0;\n      if (!s || !n) {\n        GO.setAttribute('aria-disabled', 'true');\n        GO.href = '#';\n        GO.textContent = 'Find tires';\n        META.textContent = '';\n        syncResultsUI();\n        return;\n      }\n      GO.href = hrefOf(s);\n      GO.removeAttribute('aria-disabled');\n      if (s.cat) {\n        GO.textContent = 'See tires we can order';\n        META.innerHTML = '<strong>' + sizeText(s) + '</strong> \u00B7 ' + CAT_NOTE;\n        syncResultsUI();\n        return;\n      }\n      var sep = parseFloat(s.w) < 100 ? 'x' : '/';   // 35x12.50R20 vs 275/60R20\n      var size = (TYPE === 'atv' || (s.atv && s.atv === s.n))\n        ? s.w + 'x' + s.a + '-' + s.d\n        : s.w + sep + s.a + 'R' + s.d;\n      var eq = equivOf(s);\n      if (eq) size += ' or ' + eq;\n      if (!SEASONS.size) {\n        // n is already construction-aware (all / LT / passenger)\n        GO.textContent = 'Show ' + n + (n === 1 ? ' tire' : ' tires');\n        META.innerHTML = '<strong>' + n + '</strong> ' + (n === 1 ? 'tire' : 'tires')\n          + ' in ' + size + (TYPE ? '' : ' \u00B7 <strong>' + s.s + '</strong> in stock now');\n      } else if (SEASONS.size === 1) {\n        var k = KEYS.filter(function (x) { return SEASONS.has(x); })[0];\n        GO.textContent = 'Show ' + n + (n === 1 ? ' tire' : ' tires');\n        META.innerHTML = '<strong>' + n + '</strong> ' + NOUN[k] + ' '\n          + (n === 1 ? 'tire' : 'tires') + ' in ' + size;\n      } else {\n        // Multi-select: per-type breakdown (a tire can carry two season tags,\n        // so a summed single number could double-count).\n        GO.textContent = 'Show tires';\n        var parts = [];\n        KEYS.forEach(function (k) {\n          var c = cntSeason(s, k);\n          if (SEASONS.has(k) && c) parts.push('<strong>' + c + '</strong> ' + NOUN[k]);\n        });\n        META.innerHTML = (parts.length ? parts.join(' + ') : '<strong>0</strong>') + ' in ' + size;\n      }\n      syncResultsUI();\n    }\n\n    // With a FULL size selected, hide any chip that would show 0 tires in that\n    // size (e.g. LT on 205/55R16) \u2014 the size the user entered is never changed\n    // out from under them; the impossible options disappear instead. With no\n    // full size, all chips show and the dropdowns cascade as usual.\n    function typeCountFor(s, t) {\n      var save = TYPE; TYPE = t;\n      var v = countOf(s);\n      TYPE = save;\n      return v;\n    }\n    function updateChipAvailability() {\n      var s = slot();\n      CHIPS.forEach(function (c) {\n        var k = c.dataset.season;\n        c.style.display = TYPE === 'atv'\n          ? (k === 'all' ? '' : 'none')\n          : ((k === 'all' || !s || cntSeason(s, k) > 0 || (s === PIN_ROW && SEASONS.has(k))) ? '' : 'none');\n      });\n      TCHIPS.forEach(function (c) {\n        var t = c.dataset.type;\n        c.style.display = (t === '' || !s || typeCountFor(s, t) > 0) ? '' : 'none';\n      });\n      // The construction row EARNS its place, the same way the tread row does: it\n      // only appears when the size actually SPLITS. A flotation size is all LT and\n      // a trailer-only size is all ST, so a lone chip there just selects everything\n      // the customer is already looking at \u2014 clutter that reads like a filter and\n      // does nothing. Stays up while a chip is active so it can always be un-picked,\n      // and the ATV collection's row is left alone (it routes between collections).\n      if (TROW && !ON_ATV) {\n        var kinds = 0;\n        if (s && !s.cat) ['p', 'lt', 'st'].forEach(function (t) { if (typeCountFor(s, t) > 0) kinds++; });\n        TROW.hidden = !!s && kinds < 2 && !TYPE;\n      }\n      if (s && !HOME_COMBINED) {\n        // Never leave an active selection pointing at a hidden chip (possible\n        // via URL restore or a size change while a filter is on).\n        var changed = false;\n        // The linked size keeps the linked season even with none of ours: the band below then\n        // shows that season from our suppliers (RT 10/14, an all-weather link showed winters).\n        KEYS.forEach(function (k) {\n          if (SEASONS.has(k) && cntSeason(s, k) === 0 && s !== PIN_ROW) { SEASONS.delete(k); changed = true; }\n        });\n        if (TYPE) {\n          var keepT = listOf(TYPE).filter(function (t) { return typeCountFor(s, t) > 0; }).join(',');\n          if (keepT !== TYPE) { TYPE = keepT; changed = true; }\n        }\n        if (changed) paintChips();\n      }\n    }\n\n    function paintChips() {\n      WL.textContent = TYPE === 'atv' ? root.dataset.atvHeight : 'Width';\n      AL.textContent = TYPE === 'atv' ? root.dataset.atvWidth : 'Ratio';\n      DL.textContent = TYPE === 'atv' ? root.dataset.atvRim : 'Diameter';\n      CHIPS.forEach(function (c) {\n        var k = c.dataset.season;\n        var on = k === 'all' ? SEASONS.size === 0 : SEASONS.has(k);\n        c.classList.toggle('is-on', on);\n        c.setAttribute('aria-pressed', on ? 'true' : 'false');\n      });\n      TCHIPS.forEach(function (c) {\n        var on = c.dataset.type ? !!TYPE && inList(TYPE, c.dataset.type) : !TYPE;\n        c.classList.toggle('is-on', on);\n        c.setAttribute('aria-pressed', on ? 'true' : 'false');\n      });\n      // A season that cannot take studs clears the refinement outright. Otherwise\n      // unticking Winter would leave a hidden stud filter running with no chip on\n      // screen to switch it off.\n      if (!(SEASONS.has('wi') || SEASONS.has('aw'))) STUD = false;\n      SCHIPS.forEach(function (chip) {\n        var on = STUD === chip.dataset.stud || STUD === '1';\n        chip.classList.toggle('is-on', on);\n        chip.setAttribute('aria-pressed', on ? 'true' : 'false');\n      });\n      GCHIPS.forEach(function (c) {\n        var on = c.dataset.terrain ? !!TERRAIN && inList(TERRAIN, c.dataset.terrain) : !TERRAIN;\n        c.classList.toggle('is-on', on);\n        c.setAttribute('aria-pressed', on ? 'true' : 'false');\n      });\n      paintBrandChips();\n      if (SORT_BTN) {\n        SORT_BTN.classList.toggle('is-on', SORT);\n        SORT_BTN.setAttribute('aria-pressed', SORT ? 'true' : 'false');\n      }\n    }\n\n    CHIPS.forEach(function (chip) {\n      chip.addEventListener('click', function () {\n        if (TYPE === 'atv') {\n          SEASONS.clear();\n          paintChips();\n          render();\n          return;\n        }\n        var k = chip.dataset.season;\n        if (k === 'all') SEASONS.clear();\n        else if (SEASONS.has(k)) SEASONS.delete(k);\n        else SEASONS.add(k);\n        paintChips();\n        // A fully-selected size is NEVER touched by a chip click (chips that\n        // would empty it are hidden). Only partial selections re-cascade.\n        if (!slot()) {\n          var w = W.value, a = A.value, d = D.value;\n          fillWidths(w); cascadeA(a); cascadeD(d);\n        }\n        updateChipAvailability();\n        render();\n        if (!ON_TIRES) {\n          // Season-collection page: this grid only holds ITS season, so an\n          // in-place toggle would mislead. Navigate to /collections/tires\n          // with the new set (carrying the size when one is fully picked).\n          var s = slot();\n          if (s && s.cat) { location.href = hrefOf(s); return; }\n          var qs = s ? '?' + s.tags.map(function (t) {\n            return 'filter.p.tag=' + encodeURIComponent(t);\n          }).join('&') : '';\n          location.href = '/collections/tires' + qs + hashOf();\n          return;\n        }\n        // Chips filter the grid live on ANY tires page \u2014 sized search or the\n        // full collection (infinite scroll makes the full page browsable too).\n        pushHash(); applyFilter(); chase();\n      });\n    });\n\n    TCHIPS.forEach(function (chip) {\n      chip.addEventListener('click', function () {\n        // Re-clicking the lit chip clears it, the same as the tread and brand\n        // rows. The ATV chip is the one exception: a click there ROUTES between\n        // collections, so clearing it would bounce the customer off the page\n        // they are standing on.\n        TYPE = toggleType(TYPE, chip.dataset.type);\n        if (TYPE === 'atv') SEASONS.clear();\n        paintChips();\n        if (!slot()) {\n          var w = W.value, a = A.value, d = D.value;\n          fillWidths(w); cascadeA(a); cascadeD(d);\n        }\n        updateChipAvailability();\n        render();\n        var selected = slot();\n        var selectedQuery = selected ? '?' + selected.tags.map(function (t) {\n          return 'filter.p.tag=' + encodeURIComponent(t);\n        }).join('&') : '';\n        if (PATH_COLL && TYPE === 'atv' && !ON_ATV) {\n          location.href = '/collections/atv-quad-tires' + selectedQuery + hashOf();\n          return;\n        }\n        if (ON_ATV && TYPE !== 'atv') {\n          location.href = '/collections/tires' + selectedQuery + hashOf();\n          return;\n        }\n        // Unlike seasons, construction toggles in place on EVERY page \u2014 a\n        // season collection's grid still contains both LT and passenger.\n        pushHash(); applyFilter(); chase();\n      });\n    });\n\n    GCHIPS.forEach(function (chip) {\n      chip.addEventListener('click', function () {\n        // Several treads can be lit; re-clicking a lit chip drops it.\n        TERRAIN = toggleList(TERRAIN, chip.dataset.terrain, TERRAIN_ORDER);\n        paintChips();\n        // No cascade/updateChipAvailability: terrain isn't in ROWS, it only\n        // filters cards client-side \u2014 the size a customer picked never moves.\n        pushHash(); applyFilter(); chase();\n      });\n    });\n\n\n    HOME_CHOICES.forEach(function (button) {\n      button.addEventListener('click', function () {\n        var selected = slot();\n        HOME_PICKED = true;\n        SEASONS.clear();\n        if (button.dataset.homeSeason === 'winter') SEASONS.add('wi');\n        if (button.dataset.homeSeason === 'year') { SEASONS.add('as'); SEASONS.add('aw'); }\n        paintChips();\n        if (!selected) {\n          var w = W.value, a = A.value, d = D.value;\n          fillWidths(w); cascadeA(a); cascadeD(d);\n        }\n        updateChipAvailability();\n        render();\n      });\n    });\n\n    W.addEventListener('change', function () { cascadeA(); cascadeD(); updateChipAvailability(); render(); });\n    A.addEventListener('change', function () { cascadeD(); updateChipAvailability(); render(); });\n    D.addEventListener('change', function () { updateChipAvailability(); render(); });\n\n    if (HOME_COMBINED) {\n      window.addEventListener('pageshow', function () {\n        setTimeout(function () {\n          if (!restoreHomeSelection()) {\n            var w = W.value, a = A.value, d = D.value;\n            fillWidths(w); cascadeA(a); cascadeD(d);\n          }\n          updateChipAvailability();\n          render();\n        }, 0);\n      });\n    }\n\n    // Same size already on screen? Toggle in place instead of reloading.\n    GO.addEventListener('click', function (e) {\n      if (catalogSearch) {\n        e.preventDefault();\n        if (W.value && !slot()) return;\n        catalogSearch.setTireSize(slot()); RESULTS = !!slot(); pushHash(); applyFilter(); setResultsExpanded(false, true); return;\n      }\n      if (HOME_COMBINED) renderHome(slot());\n      if (RESULT_UI && RESULT_UI.mobile) {\n        if (!W.value && !A.value && !D.value) {\n          e.preventDefault(); setResultsExpanded(false, true); return;\n        }\n        if (GO.getAttribute('aria-disabled') === 'true') {\n          var sizeGroup = RESULT_UI.groups.find(function (g) { return g.key === 'size'; });\n          if (sizeGroup) sizeGroup.details.open = true;\n        }\n      }\n      // aria-disabled doesn't stop keyboard activation of an href=\"#\" link \u2014\n      // guard it here so Enter can't jump the page to the top.\n      if (GO.getAttribute('aria-disabled') === 'true') { e.preventDefault(); return; }\n      var s = slot();\n      if (!s || !RESULTS || s.cat) return;\n      var current = new URLSearchParams(location.search).getAll('filter.p.tag');\n      var same = current.length && current.every(function (t) { return s.tags.indexOf(t) !== -1; });\n      if (same) { e.preventDefault(); pushHash(); applyFilter(); setResultsExpanded(false, true); }\n    });\n\n    // \u2500\u2500 data + URL restore \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    // Rows: w|ratio|dia|n|stock|AS|AW|SU|WI|LT|asLT|awLT|suLT|wiLT[|altTag...]\n    // ST counts ride in a SECOND string (window.RT_TIRE_ST, same asset file), NOT\n    // as more columns here: this row's tail is alt size TAGS, and an extra number\n    // there would be read as a tag by any finder still cached in a customer's\n    // browser \u2014 filtering a texted link down to nothing. A separate global is\n    // additive: an older finder just ignores it and shows the size as it always did.\n    function parse(raw) {\n      raw.split('\\n').forEach(function (line) {\n        if (!line) return;\n        var f = line.split('|');\n        if (f.length === 14 && f[13] === '@atv') f.splice(13, 0, '0');\n        var extra = f.slice(14);\n        var isAtv = extra.indexOf('@atv') !== -1;\n        var sizeTags = [(f[0] + f[1] + f[2]).replace(/\\./g, '')];\n        if (isAtv) sizeTags.push('atv-' + f[0] + 'x' + parseFloat(f[1]) + '-' + f[2]);\n        ROWS.push({\n          w: f[0], a: f[1], d: f[2],\n          n: parseInt(f[3], 10), s: parseInt(f[4], 10),\n          cnt: { as: parseInt(f[5], 10), aw: parseInt(f[6], 10),\n                 su: parseInt(f[7], 10), wi: parseInt(f[8], 10) },\n          lt: parseInt(f[9], 10),\n          atv: isAtv ? parseInt(f[3], 10) : 0,\n          cntLT: { as: parseInt(f[10], 10), aw: parseInt(f[11], 10),\n                   su: parseInt(f[12], 10), wi: parseInt(f[13], 10) },\n          // ST defaults to zero for EVERY row, so a size with no trailer tires \u2014\n          // and the inline ATV rows, which are never in RT_TIRE_ST \u2014 still read\n          // r.cntST[k] safely and behave exactly as they did before ST existed.\n          st: 0, cntST: { as: 0, aw: 0, su: 0, wi: 0 },\n          tags: sizeTags.concat(extra.filter(function (tag) {\n            return tag !== '@atv';\n          }))\n        });\n      });\n    }\n\n    // Catalogue sizes (window.RT_CATALOG_SIZES, rt-catalog-sizes.js, w|a|d): consumer\n    // sizes a supplier carries that no website listing has. RT 9/28: 255/60R17 had\n    // five catalogue tires and could not be picked here. They join the dropdowns\n    // as r.cat rows and open the catalogue page for that size (hrefOf); season and\n    // construction are left to that page, whose data is live. Fails open: no asset,\n    // no extra rows.\n    var CAT_NOTE = 'Not listed on our website yet \u2014 see the tires we can order in for this size.';\n    function parseCat(raw) {\n      var have = {};\n      function key(w, a, d) { return parseFloat(w) + '|' + parseFloat(a) + '|' + parseFloat(d); }\n      ROWS.forEach(function (r) { have[key(r.w, r.a, r.d)] = 1; });\n      raw.split('\\n').forEach(function (line) {\n        var f = line.split('|');\n        if (f.length < 3 || have[key(f[0], f[1], f[2])]) return;\n        have[key(f[0], f[1], f[2])] = 1;\n        ROWS.push({\n          w: f[0], a: f[1], d: f[2], n: 0, s: 0, cat: true,\n          cnt: { as: 0, aw: 0, su: 0, wi: 0 }, lt: 0, atv: 0,\n          cntLT: { as: 0, aw: 0, su: 0, wi: 0 },\n          st: 0, cntST: { as: 0, aw: 0, su: 0, wi: 0 },\n          tags: [(f[0] + f[1] + f[2]).replace(/\\./g, '')]\n        });\n      });\n    }\n\n    // Live catalogue sizes (RT 2026-10-18: 215/60R14 had a BFGoodrich in the catalogue and\n    // could not be picked, because rt-catalog-sizes.js is a dated build nobody re-runs).\n    // After boot the finder reads the catalogue Worker's own size list, keeps the consumer\n    // sizes, adds any the asset lacks as r.cat rows and drops cat rows the catalogue no\n    // longer carries. Website rows are never touched and the customer's picks stay.\n    // Fails open: no answer, a short list or an error leaves the asset's list as it is.\n    var LIVE_CAT_URL = 'https://rt-catalog-search.rtsaleslimited.workers.dev/api/refinements?kind=tire';\n    // Port of consumerSize() in supplier-search/public/tire-audience.mjs. Change one, change both.\n    function consumerSize(width, aspect, diameter) {\n      function num(v) {\n        if (!/^\\d+(?:\\.\\d+)?$/.test(String(v == null ? '' : v).trim())) return null;\n        var n = Number(v);\n        return isFinite(n) && n > 0 ? n : null;\n      }\n      var w = num(width), a = num(aspect), d = num(diameter);\n      if (w === null || a === null || d === null) return false;\n      if (w < 100) return !(d <= 14 || w < 28) && w <= 44 && a >= 8 && a <= 16.5 && d >= 15 && d <= 28;\n      if (d === 17.5 || d === 19.5 || d === 22.5 || d === 24.5) return false;\n      if (d % 1 !== 0) return false;\n      var tallest = d >= 21 ? 65 : 90;\n      return w % 10 === 5 && w >= 125 && w <= 355 && a >= 25 && a <= tallest && d >= 13 && d <= 30;\n    }\n    // '215/60R14' \u2192 '215|60|14'; flotation ratios read like the finder's rows: 12.50.\n    function liveCatLines(sizes) {\n      var out = [];\n      sizes.forEach(function (s) {\n        var m = /^(\\d+(?:\\.\\d+)?)[x\\/](\\d+(?:\\.\\d+)?)R(\\d+(?:\\.\\d+)?)$/i.exec(String(s || '').trim());\n        if (!m || !consumerSize(m[1], m[2], m[3])) return;\n        out.push(m[1] + '|' + (parseFloat(m[1]) < 100 ? (+m[2]).toFixed(2) : m[2]) + '|' + m[3]);\n      });\n      return out;\n    }\n    function applyLiveCat(lines) {\n      function key(w, a, d) { return parseFloat(w) + '|' + parseFloat(a) + '|' + parseFloat(d); }\n      var live = {};\n      lines.forEach(function (line) { var f = line.split('|'); live[key(f[0], f[1], f[2])] = 1; });\n      var before = ROWS.length;\n      // A cat row under the width on screen stays, so a half-picked size is never pulled.\n      ROWS = ROWS.filter(function (r) {\n        return !r.cat || live[key(r.w, r.a, r.d)] || r === PIN_ROW || (W.value && r.w === W.value);\n      });\n      var dropped = before - ROWS.length;\n      parseCat(lines.join('\\n'));\n      if (!dropped && ROWS.length === before) return;\n      root.dataset.tsfLiveCat = String(ROWS.length - before + dropped) + '+/' + dropped + '-';\n      refreshCascade();\n    }\n    // Rebuild the dropdowns with the picks kept. A select the customer has open is\n    // left alone until it closes; rebuilding its options under the finger shuts it.\n    function refreshCascade() {\n      var ae = document.activeElement;\n      if (ae && ae.tagName === 'SELECT' && (root.contains(ae) || ae.closest('.rt-tsf-bar'))) {\n        ae.addEventListener('blur', function once() { ae.removeEventListener('blur', once); setTimeout(refreshCascade, 0); });\n        return;\n      }\n      var w = W.value, a = A.value, d = D.value;\n      fillWidths(w); cascadeA(a); cascadeD(d);\n      updateChipAvailability();\n      render();\n    }\n    function loadLiveCat() {\n      if (!window.fetch) return;\n      var ctl = window.AbortController ? new AbortController() : null;\n      var timer = ctl ? setTimeout(function () { ctl.abort(); }, 10000) : 0;\n      fetch(LIVE_CAT_URL, ctl ? { signal: ctl.signal } : {}).then(function (r) {\n        if (!r.ok) throw new Error('HTTP ' + r.status);\n        return r.json();\n      }).then(function (j) {\n        clearTimeout(timer);\n        // The asset build refuses under 500 sizes; the page does the same.\n        if (!j || !Array.isArray(j.size) || j.size.length < 500) return;\n        var lines = liveCatLines(j.size);\n        if (lines.length < 300) return;\n        applyLiveCat(lines);\n      }).catch(function () { clearTimeout(timer); });\n    }\n\n    // ST rows: w|ratio|dia|ST|asST|awST|suST|wiST \u2014 only sizes that have trailer\n    // tires (9 of 372 today). Applied onto the rows parse() already built.\n    function parseST(raw) {\n      var by = {};\n      raw.split('\\n').forEach(function (line) {\n        if (!line) return;\n        var f = line.split('|');\n        if (f.length < 8) return;\n        by[f[0] + '|' + f[1] + '|' + f[2]] = f;\n      });\n      ROWS.forEach(function (r) {\n        var f = by[r.w + '|' + r.a + '|' + r.d];\n        if (!f) return;\n        r.st = parseInt(f[3], 10) || 0;\n        r.cntST = { as: parseInt(f[4], 10) || 0, aw: parseInt(f[5], 10) || 0,\n                    su: parseInt(f[6], 10) || 0, wi: parseInt(f[7], 10) || 0 };\n      });\n    }\n\n    if (typeof window.RT_TIRE_SIZES === 'string') {\n      if (catalogSearch) {\n        ROWS = catalogSearch.tireRows(collectCards());\n        catalogSearch.onFilter(function () { applyFilter(); syncCopy(); });\n      } else {\n        parse(window.RT_TIRE_SIZES);\n        if (!ON_ATV && typeof window.RT_CATALOG_SIZES === 'string') parseCat(window.RT_CATALOG_SIZES);\n      }\n      if (ON_ATV) parse(ATV_ROWS);   // ATV sizes ONLY on the ATV collection (RT 8/4)\n      if (!catalogSearch && typeof window.RT_TIRE_ST === 'string') parseST(window.RT_TIRE_ST);\n\n      // chips from #rt-season=aw,wi \u2014 hash wins \u2014 OR ?rt-season=aw,wi (query\n      // form used by Quo-texted links, since SMS clients drop #fragments from\n      // tappable URLs; Shopify normalizes the comma to %2C, so read it via\n      // URLSearchParams which decodes it).\n      var hm = location.hash.match(/rt-season=([a-z,%2C]+)/i);\n      var seasonStr = hm ? decodeURIComponent(hm[1])\n                         : (new URLSearchParams(location.search).get('rt-season') || '');\n      seasonStr.split(',').forEach(function (k) {\n        if (KEYS.indexOf(k) !== -1) SEASONS.add(k);\n      });\n      // No explicit season in the URL? Pre-seed from the collection handle on\n      // season-collection pages (winter \u2192 \u2744, all-season-weather \u2192 AS+AW, \u2026).\n      if (!SEASONS.size && SEED[PATH_COLL]) {\n        SEED[PATH_COLL].forEach(function (k) { SEASONS.add(k); });\n      }\n      // Construction from #rt-type=lt|p|st (hash wins) or ?rt-type= (texted links).\n      var tm = location.hash.match(/rt-type=([^&]+)/i);\n      TYPE = cleanList(tm ? undo(tm[1]) : (new URLSearchParams(location.search).get('rt-type') || ''), TYPE_ORDER);\n      if (listOf(TYPE).indexOf('atv') !== -1) TYPE = 'atv';\n      if (ON_ATV && !TYPE) TYPE = 'atv';\n      if (TYPE === 'atv') SEASONS.clear();\n      // Tread from #rt-terrain=at|rt|mt|st (hash wins) or ?rt-terrain=.\n      var gm = location.hash.match(/rt-terrain=([^&]+)/i);\n      TERRAIN = cleanList(gm ? undo(gm[1]) : (new URLSearchParams(location.search).get('rt-terrain') || ''), TERRAIN_ORDER);\n      // Studs from #rt-stud=1 (hash wins) or ?rt-stud=1 \u2014 the query form is the\n      // one Quo texts, since SMS clients drop #fragments from tappable URLs.\n      var sm = location.hash.match(/(?:^#|&)rt-stud=([^&]*)/i);\n      var sv = sm ? undo(sm[1]) : (new URLSearchParams(location.search).get('rt-stud') || '');\n      STUD = ['1', 'studdable', 'studded'].indexOf(sv) !== -1 ? sv : '';\n      if (TYPE === 'atv') STUD = false;\n      // Brand from #rt-brand=<name> (hash wins) or ?rt-brand=. No allow-list: the\n      // value is a catalogue brand name, and an unknown one simply matches nothing\n      // until the row rebuilds and offers it back.\n      var bm = location.hash.match(/rt-brand=([^&]+)/i);\n      BRAND = bm ? brandsFrom(bm[1])\n                 : brandsFrom(encodeURIComponent(new URLSearchParams(location.search).get('rt-brand') || '').replace(/%2C/gi, ','));\n      // Low-to-high. Hash wins, same as the other chips; a texted link may carry ?rt-sort=lo.\n      SORT = priceSortOn(location.hash)\n             || (new URLSearchParams(location.search).get('rt-sort') || '') === 'lo';\n      paintChips();\n\n      // size from ?filter.p.tag=\u2026\n      var params = new URLSearchParams(location.search).getAll('filter.p.tag');\n      if (catalogSearch && !params.length) params = catalogSearch.initialSizeTags();\n      var row = null;\n      if (params.length) {\n        // hrefOf() emits the row's OWN tag first, so match on that before\n        // anything else: equivalent sizes deliberately share every tag now, and\n        // the old row-major scan would restore whichever of the pair sorts\n        // first \u2014 a 305/70R18 link opening with 35 / 12.50 / R18 in the boxes.\n        // The size a customer picked is never changed out from under them.\n        for (var i = 0; i < ROWS.length && !row; i++) {\n          if (ROWS[i].tags[0] === params[0]) row = ROWS[i];\n        }\n        for (var i = 0; i < ROWS.length && !row; i++) {\n          for (var j = 0; j < params.length; j++) {\n            if (ROWS[i].tags.indexOf(params[j]) !== -1) { row = ROWS[i]; break; }\n          }\n        }\n      }\n      RESULTS = !!row;\n      PIN_ROW = row;\n      if (catalogSearch) catalogSearch.setTireSize(row);\n\n      fillWidths(row && row.w);\n      cascadeA(row && row.a);\n      cascadeD(row && row.d);\n      if (HOME_COMBINED) {\n        HOME_PICKED = !!row || SEASONS.size > 0;\n        restoreHomeSelection();\n      }\n      updateChipAvailability();\n      render();\n      lastFp = fingerprint();\n      applyFilter();     // restores chip-hiding on load (sized or full page)\n      initScroll();      // infinite scroll on every tires page\n      initQuickUI();     // sticky quick bar + FIND SIZE FAB (collection pages)\n      initCompactResults(row);\n      // Supplier sizes newer than rt-catalog-sizes.js (RT 10/18); the asset's list until it answers.\n      if (!catalogSearch && !ON_ATV) loadLiveCat();\n      // Globo usually re-renders shortly after load; the observer catches it.\n      } else {\n        META.textContent = 'Size list unavailable \u2014 please text 306-361-4412.';\n      }\n    }\n\n    if (typeof window.RT_TIRE_SIZES === 'string') {\n      initFinder();\n    } else if (dataScript) {\n      dataScript.addEventListener('load', initFinder, { once: true });\n    }\n  })();\n"],
  "mappings": "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",
  "names": ["i", "se", "sizeText", "summary", "k", "j"]
}
