{
  "version": 3,
  "sources": ["/cdn/shop/t/24/assets/wmn-catalog-graph.js?wmn=20261102why1"],
  "sourcesContent": ["/**\n * WMN catalog entity graph \u2014 lazy-loaded side-car for engagement / discover.\n * Cuba/country query aliases + linkQuery (v2026-08-04b).\n *\n * Exposes window.wmnCatalogGraph:\n *   ensureLoaded() \u2192 Promise<data>\n *   resolveProduct(handle) \u2192 { artists, genres, imprints }\n *   expand(entities, depth?) \u2192 candidate product handles\n *   relatedGenres(slug, kinds?) \u2192 [{ slug, kind }]  kind \u2208 p|c|s\n *   linkQuery(text) \u2192 [{ id, score }]\n */\n(function (window, document) {\n  'use strict';\n\n  /* v8: invalidate stale session graphs (e.g. Hlybini latin-america) that survived hard refresh */\n  var CACHE_KEY = 'wmn_catalog_graph_v9';\n  var ACCEPTED_GRAPH_V = { 1: 1, 2: 1, 3: 1, 4: 1, 5: 1 };\n  var data = null;\n  var loadPromise = null;\n  var scriptEl =\n    document.currentScript ||\n    document.querySelector('script[data-wmn-catalog-graph]');\n\n  function graphUrl() {\n    if (scriptEl) {\n      var src = scriptEl.getAttribute('data-src');\n      if (src) return src;\n    }\n    var meta = document.querySelector('meta[name=\"wmn-catalog-graph-url\"]');\n    if (meta) {\n      var content = meta.getAttribute('content');\n      if (content) return content;\n    }\n    return null;\n  }\n\n  function normalize(str) {\n    var s = String(str || '').toLowerCase();\n    try {\n      s = s.normalize('NFKD').replace(/[\\u0300-\\u036f]/g, '');\n    } catch (e) {\n      /* older browsers */\n    }\n    return s\n      .replace(/['']/g, '')\n      .replace(/[^a-z0-9]+/g, ' ')\n      .replace(/^\\s+|\\s+$/g, '')\n      .replace(/\\s+/g, ' ');\n  }\n\n  function readSessionCache() {\n    try {\n      var raw = window.sessionStorage.getItem(CACHE_KEY);\n      if (!raw) return null;\n      var parsed = JSON.parse(raw);\n      var url = graphUrl();\n      /* Envelope { url, graph } \u2014 drop cache when asset URL / cachebust changes */\n      if (parsed && parsed.graph && parsed.graph.products) {\n        if (url && parsed.url && parsed.url !== url) return null;\n        if (ACCEPTED_GRAPH_V[parsed.graph.v]) return parsed.graph;\n        return null;\n      }\n      /* Legacy bare graph blob */\n      if (parsed && parsed.products && ACCEPTED_GRAPH_V[parsed.v]) {\n        return parsed;\n      }\n    } catch (e) {\n      /* ignore */\n    }\n    return null;\n  }\n\n  function writeSessionCache(graph) {\n    try {\n      window.sessionStorage.setItem(\n        CACHE_KEY,\n        JSON.stringify({ url: graphUrl(), graph: graph })\n      );\n    } catch (e) {\n      /* quota / private mode */\n    }\n  }\n\n  /** Seed imageCache from baked graph `img` fields \u2014 For you must not wait on product.js. */\n  function seedImageCacheFromGraph(graph) {\n    if (!graph || !graph.products) return;\n    var handles = Object.keys(graph.products);\n    var i;\n    for (i = 0; i < handles.length; i++) {\n      var h = handles[i];\n      var p = graph.products[h];\n      if (!p || !p.img) continue;\n      if (Object.prototype.hasOwnProperty.call(imageCache, h) && imageCache[h]) {\n        continue;\n      }\n      imageCache[h] = withImageWidth(normalizeImageUrl(p.img), 200) || p.img;\n    }\n  }\n\n  function fetchGraph() {\n    var url = graphUrl();\n    if (!url) {\n      return Promise.reject(new Error('wmn-catalog-graph: missing data-src'));\n    }\n    return fetch(url, { credentials: 'same-origin' }).then(function (res) {\n      if (!res.ok) throw new Error('wmn-catalog-graph: HTTP ' + res.status);\n      return res.json();\n    });\n  }\n\n  function handleize(text) {\n    return normalize(text).replace(/\\s+/g, '-').replace(/^-|-$/g, '').slice(0, 100);\n  }\n\n  function shopRoot() {\n    var root =\n      window.Shopify && window.Shopify.routes && window.Shopify.routes.root\n        ? window.Shopify.routes.root\n        : '/';\n    if (root.slice(-1) !== '/') root += '/';\n    return root;\n  }\n\n  function genreSlugFromTag(tag, genres) {\n    if (!tag || !genres) return '';\n    var needle = String(tag).toLowerCase();\n    var slugs = Object.keys(genres);\n    var i;\n    for (i = 0; i < slugs.length; i++) {\n      var slug = slugs[i];\n      var node = genres[slug];\n      var label = node && node.n ? String(node.n).toLowerCase() : '';\n      if (label && label === needle) return slug;\n      if (slug === handleize(tag)) return slug;\n    }\n    return '';\n  }\n\n  function productTags(raw) {\n    if (!raw) return [];\n    if (Object.prototype.toString.call(raw) === '[object Array]') {\n      return raw.map(function (t) {\n        return String(t || '').trim();\n      }).filter(Boolean);\n    }\n    return String(raw)\n      .split(',')\n      .map(function (t) {\n        return t.trim();\n      })\n      .filter(Boolean);\n  }\n\n  function coverFromStorefrontProduct(p) {\n    if (!p) return '';\n    if (p.featured_image) {\n      if (typeof p.featured_image === 'string') return p.featured_image;\n      if (p.featured_image.src) return p.featured_image.src;\n    }\n    if (p.images && p.images.length) {\n      var img = p.images[0];\n      if (typeof img === 'string') return img;\n      if (img && img.src) return img.src;\n    }\n    return '';\n  }\n\n  /** Merge published products missing from the baked graph (same-day releases). */\n  function mergeStorefrontProduct(graph, p) {\n    if (!graph || !graph.products || !p || !p.handle) return false;\n    var handle = String(p.handle);\n    if (graph.products[handle]) return false;\n\n    var type = String(p.product_type || '').trim();\n    var artistSlug = type ? handleize(type) : '';\n    var vendor = String(p.vendor || '').trim();\n    var imprintSlug = vendor ? handleize(vendor) : '';\n    var tags = productTags(p.tags);\n    var genreSlugs = [];\n    var ti;\n    for (ti = 0; ti < tags.length; ti++) {\n      var gs = genreSlugFromTag(tags[ti], graph.genres);\n      if (gs && genreSlugs.indexOf(gs) === -1) genreSlugs.push(gs);\n    }\n\n    var node = {\n      t: String(p.title || handle),\n      g: genreSlugs\n    };\n    if (artistSlug) node.a = artistSlug;\n    if (imprintSlug) node.i = imprintSlug;\n    var img = coverFromStorefrontProduct(p);\n    if (img) node.img = img;\n    graph.products[handle] = node;\n\n    if (artistSlug) {\n      var artist = graph.artists[artistSlug] || {\n        n: type,\n        g: [],\n        p: [],\n        r: []\n      };\n      if (artist.p.indexOf(handle) === -1) artist.p.push(handle);\n      var gi;\n      for (gi = 0; gi < genreSlugs.length; gi++) {\n        if (artist.g.indexOf(genreSlugs[gi]) === -1) artist.g.push(genreSlugs[gi]);\n      }\n      graph.artists[artistSlug] = artist;\n    }\n\n    for (gi = 0; gi < genreSlugs.length; gi++) {\n      var gnode = graph.genres[genreSlugs[gi]];\n      if (!gnode) continue;\n      if (!gnode.p) gnode.p = [];\n      if (gnode.p.indexOf(handle) === -1) gnode.p.push(handle);\n      if (artistSlug) {\n        if (!gnode.a) gnode.a = [];\n        if (gnode.a.indexOf(artistSlug) === -1) gnode.a.push(artistSlug);\n      }\n    }\n\n    if (imprintSlug) {\n      var imprint = graph.imprints[imprintSlug] || { n: vendor, p: [] };\n      if (imprint.p.indexOf(handle) === -1) imprint.p.push(handle);\n      graph.imprints[imprintSlug] = imprint;\n    }\n\n    if (img) {\n      imageCache[handle] = withImageWidth(normalizeImageUrl(img), 200) || img;\n    }\n    return true;\n  }\n\n  var liveSyncPromise = null;\n\n  function syncLiveProducts() {\n    if (!data || !data.products) return Promise.resolve(data);\n    if (liveSyncPromise) return liveSyncPromise;\n\n    liveSyncPromise = (function () {\n      var page = 1;\n      var added = 0;\n      var root = shopRoot();\n\n      function next() {\n        return fetch(\n          root + 'products.json?limit=250&page=' + page,\n          { credentials: 'same-origin' }\n        )\n          .then(function (res) {\n            if (!res.ok) throw new Error('products.json ' + res.status);\n            return res.json();\n          })\n          .then(function (json) {\n            var list = (json && json.products) || [];\n            var i;\n            for (i = 0; i < list.length; i++) {\n              if (mergeStorefrontProduct(data, list[i])) added += 1;\n            }\n            if (list.length === 250) {\n              page += 1;\n              return next();\n            }\n            return added;\n          });\n      }\n\n      return next()\n        .then(function (n) {\n          liveSyncPromise = null;\n          if (n > 0) {\n            seedImageCacheFromGraph(data);\n            writeSessionCache(data);\n            try {\n              document.dispatchEvent(\n                new CustomEvent('wmn:catalog-graph-updated', {\n                  detail: { added: n }\n                })\n              );\n              document.dispatchEvent(\n                new CustomEvent('wmn:focus-changed', { detail: null })\n              );\n            } catch (e) {\n              /* ignore */\n            }\n          }\n          return data;\n        })\n        .catch(function () {\n          liveSyncPromise = null;\n          return data;\n        });\n    })();\n\n    return liveSyncPromise;\n  }\n\n  function ensureLoaded() {\n    ensureAffinity();\n    if (data) {\n      seedImageCacheFromGraph(data);\n      syncLiveProducts();\n      return Promise.resolve(data);\n    }\n    if (loadPromise) return loadPromise;\n\n    var cached = readSessionCache();\n    if (cached) {\n      data = cached;\n      seedImageCacheFromGraph(data);\n      syncLiveProducts();\n      return Promise.resolve(data);\n    }\n\n    loadPromise = fetchGraph()\n      .then(function (graph) {\n        data = graph;\n        seedImageCacheFromGraph(data);\n        writeSessionCache(graph);\n        loadPromise = null;\n        syncLiveProducts();\n        ensureAffinity();\n        return data;\n      })\n      .catch(function (err) {\n        loadPromise = null;\n        throw err;\n      });\n\n    return loadPromise;\n  }\n\n  /**\n   * @param {string} handle\n   * @returns {{ artists: string[], genres: string[], countries: string[], regions: string[], imprints: string[] }}\n   */\n  function resolveProduct(handle) {\n    var empty = {\n      artists: [],\n      genres: [],\n      countries: [],\n      regions: [],\n      imprints: []\n    };\n    if (!data || !handle) return empty;\n    var p = data.products[handle];\n    if (!p) return empty;\n    return {\n      artists: p.a ? [p.a] : [],\n      genres: p.g ? p.g.slice() : [],\n      countries: p.c ? p.c.slice() : [],\n      regions: p.rg ? p.rg.slice() : [],\n      imprints: p.i ? [p.i] : []\n    };\n  }\n\n  function entityParts(id) {\n    var s = String(id || '');\n    var i = s.indexOf(':');\n    if (i < 0) return { kind: '', key: s };\n    return { kind: s.slice(0, i), key: s.slice(i + 1) };\n  }\n\n  /**\n   * Parse genres[slug].r \u2192 [{ slug, kind }] with kind \u2208 p|c|s.\n   * Accepts legacy plain-string lists.\n   */\n  function parseGenreRelated(node) {\n    var out = [];\n    if (!node || !node.r) return out;\n    var i;\n    for (i = 0; i < node.r.length; i++) {\n      var row = node.r[i];\n      if (!row) continue;\n      if (typeof row === 'string') {\n        out.push({ slug: row, kind: 's' });\n      } else if (Object.prototype.toString.call(row) === '[object Array]') {\n        if (row[0]) out.push({ slug: String(row[0]), kind: String(row[1] || 's') });\n      }\n    }\n    return out;\n  }\n\n  /**\n   * Related genre slugs for a genre key.\n   * @param {string} slug\n   * @param {string[]=} kinds optional filter e.g. ['p','c']\n   * @returns {Array<{slug:string, kind:string}>}\n   */\n  function relatedGenres(slug, kinds) {\n    if (!data || !slug || !data.genres[slug]) return [];\n    var rows = parseGenreRelated(data.genres[slug]);\n    if (!kinds || !kinds.length) return rows;\n    var allow = {};\n    var ki;\n    for (ki = 0; ki < kinds.length; ki++) allow[kinds[ki]] = true;\n    return rows.filter(function (r) {\n      return allow[r.kind];\n    });\n  }\n\n  /**\n   * Walk entity IDs \u2192 related product handles.\n   * entities: \"artist:\u2026\", \"genre:\u2026\", \"country:\u2026\", \"region:\u2026\", \"imprint:\u2026\", \"product:\u2026\"\n   * Country/region walks add member products; product seeds expand their countries+regions.\n   * Celtic is region-only (never country:celtic).\n   */\n  function expand(entities, depth) {\n    if (!data) return [];\n    var d = depth == null ? 1 : depth;\n    var handles = {};\n    var artistQueue = [];\n    var genreQueue = [];\n    var countryQueue = [];\n    var regionQueue = [];\n    var imprintQueue = [];\n    var i;\n    var list = entities || [];\n\n    for (i = 0; i < list.length; i++) {\n      var raw = list[i];\n      if (!raw) continue;\n      var parts = entityParts(raw);\n      var kind = parts.kind;\n      var key = parts.key;\n      if (!kind) {\n        if (data.products[raw]) {\n          handles[raw] = true;\n          continue;\n        }\n        if (data.artists[raw]) {\n          kind = 'artist';\n          key = raw;\n        } else if (data.genres[raw]) {\n          kind = 'genre';\n          key = raw;\n        } else if (data.countries && data.countries[raw]) {\n          kind = 'country';\n          key = raw;\n        } else if (data.regions && data.regions[raw]) {\n          kind = 'region';\n          key = raw;\n        } else if (data.imprints[raw]) {\n          kind = 'imprint';\n          key = raw;\n        } else {\n          continue;\n        }\n      }\n      if (kind === 'product') {\n        handles[key] = true;\n        if (data.products[key]) {\n          var prod = data.products[key];\n          var pci;\n          if (prod.c) {\n            for (pci = 0; pci < prod.c.length; pci++) {\n              if (prod.c[pci] && prod.c[pci] !== 'celtic') {\n                countryQueue.push(prod.c[pci]);\n              }\n            }\n          }\n          if (prod.rg) {\n            for (pci = 0; pci < prod.rg.length; pci++) {\n              if (prod.rg[pci]) regionQueue.push(prod.rg[pci]);\n            }\n          }\n        }\n      } else if (kind === 'artist') {\n        artistQueue.push(key);\n      } else if (kind === 'genre') {\n        genreQueue.push(key);\n      } else if (kind === 'country') {\n        if (key !== 'celtic') countryQueue.push(key);\n      } else if (kind === 'region') {\n        regionQueue.push(key);\n      } else if (kind === 'imprint') {\n        imprintQueue.push(key);\n      }\n    }\n\n    function addProducts(arr) {\n      if (!arr) return;\n      for (var j = 0; j < arr.length; j++) handles[arr[j]] = true;\n    }\n\n    var a;\n    for (i = 0; i < artistQueue.length; i++) {\n      a = data.artists[artistQueue[i]];\n      if (!a) continue;\n      addProducts(a.p);\n      // Related artists only \u2014 do NOT dump every product in the artist's\n      // genres (blues+jazz on Coltrane pulled the entire Sahara/blues catalog).\n      if (d >= 1 && a.r) {\n        for (var r = 0; r < a.r.length; r++) {\n          var related = data.artists[a.r[r]];\n          if (related) addProducts(related.p);\n        }\n      }\n    }\n\n    var seenGenre = {};\n    for (i = 0; i < genreQueue.length; i++) {\n      seenGenre[genreQueue[i]] = true;\n    }\n    for (i = 0; i < genreQueue.length; i++) {\n      var genre = data.genres[genreQueue[i]];\n      if (!genre) continue;\n      addProducts(genre.p);\n      if (d >= 1 && genre.a) {\n        for (var ai = 0; ai < genre.a.length; ai++) {\n          var art = data.artists[genre.a[ai]];\n          if (art) addProducts(art.p);\n        }\n      }\n      if (d >= 1 && genre.r) {\n        var rels = parseGenreRelated(genre);\n        var ri;\n        for (ri = 0; ri < rels.length; ri++) {\n          var relSlug = rels[ri].slug;\n          var relKind = rels[ri].kind;\n          if (!relSlug || seenGenre[relSlug]) continue;\n          var relNode = data.genres[relSlug];\n          if (!relNode) continue;\n          seenGenre[relSlug] = true;\n          addProducts(relNode.p);\n          if (d >= 2 && (relKind === 'p' || relKind === 'c') && relNode.a) {\n            for (var rai = 0; rai < relNode.a.length; rai++) {\n              var rart = data.artists[relNode.a[rai]];\n              if (rart) addProducts(rart.p);\n            }\n          }\n        }\n      }\n    }\n\n    var seenCountry = {};\n    for (i = 0; i < countryQueue.length; i++) {\n      var cslug = countryQueue[i];\n      if (!cslug || cslug === 'celtic' || seenCountry[cslug]) continue;\n      seenCountry[cslug] = true;\n      var cnode = data.countries && data.countries[cslug];\n      if (cnode) addProducts(cnode.p);\n    }\n\n    var seenRegion = {};\n    for (i = 0; i < regionQueue.length; i++) {\n      var rslug = regionQueue[i];\n      if (!rslug || seenRegion[rslug]) continue;\n      seenRegion[rslug] = true;\n      var rnode = data.regions && data.regions[rslug];\n      if (!rnode) continue;\n      addProducts(rnode.p);\n      // Member countries \u2192 their products\n      if (d >= 1 && rnode.c) {\n        var mci;\n        for (mci = 0; mci < rnode.c.length; mci++) {\n          var mc = rnode.c[mci];\n          if (!mc || mc === 'celtic' || seenCountry[mc]) continue;\n          seenCountry[mc] = true;\n          var mcnode = data.countries && data.countries[mc];\n          if (mcnode) addProducts(mcnode.p);\n        }\n      }\n    }\n\n    for (i = 0; i < imprintQueue.length; i++) {\n      var imp = data.imprints[imprintQueue[i]];\n      if (imp) addProducts(imp.p);\n    }\n\n    return Object.keys(handles);\n  }\n\n  /**\n   * True when query is only a given-name stub of a longer personal name\n   * (\"eric\" \u2192 \"eric clapton\", \"john\" \u2192 \"johnny cash\"). Too weak to claim\n   * Similar-to / affinity identity \u2014 surnames and mononyms stay OK.\n   */\n  function isWeakGivenNamePrefix(queryNorm, nameNorm) {\n    if (!queryNorm || !nameNorm || queryNorm === nameNorm) return false;\n    var qParts = queryNorm.split(' ');\n    var nParts = nameNorm.split(' ');\n    if (qParts.length !== 1 || nParts.length < 2) return false;\n    // Exact first token, or stub of first token (\"john\" / \"johnny\").\n    return (\n      nParts[0] === qParts[0] || nParts[0].indexOf(qParts[0]) === 0\n    );\n  }\n\n  function scoreNameMatch(queryNorm, nameNorm) {\n    if (!queryNorm || !nameNorm) return 0;\n    if (nameNorm === queryNorm) return 100;\n    if (nameNorm.indexOf(queryNorm) === 0) {\n      // \"eric\" prefix of \"eric clapton\" \u2014 keep as a weak hint only.\n      if (isWeakGivenNamePrefix(queryNorm, nameNorm)) return 45;\n      return 80;\n    }\n    if ((' ' + nameNorm).indexOf(' ' + queryNorm) >= 0) return 60;\n    if (nameNorm.indexOf(queryNorm) >= 0) return 40;\n    // token prefix: each query token starts a name token\n    var qTokens = queryNorm.split(' ');\n    var nTokens = nameNorm.split(' ');\n    var hit = 0;\n    for (var qi = 0; qi < qTokens.length; qi++) {\n      var qt = qTokens[qi];\n      for (var ni = 0; ni < nTokens.length; ni++) {\n        if (nTokens[ni].indexOf(qt) === 0) {\n          hit++;\n          break;\n        }\n      }\n    }\n    if (hit === qTokens.length) return 50;\n    if (hit > 0) return 20 + hit * 5;\n    return 0;\n  }\n\n  /**\n   * Country / colloquial query \u2192 genre slug (style fallback when no country node).\n   * Prefer country:* entities when data.countries is present.\n   * Never treat Celtic as a country.\n   */\n  var QUERY_ALIASES = {\n    cuba: 'afro-cuban-son',\n    cuban: 'afro-cuban-son',\n    'afro cuban': 'afro-cuban-son',\n    'afro-cuban': 'afro-cuban-son',\n    'son cubano': 'afro-cuban-son',\n    tuareg: 'tuareg',\n    taureg: 'tuareg',\n    touareg: 'tuareg',\n    sahara: 'desert-blues-sahara',\n    'desert blues': 'desert-blues-sahara',\n    desert: 'desert-blues-sahara',\n    gnawa: 'gnawa',\n    morocco: 'gnawa',\n    moroccan: 'gnawa',\n    wedding: 'gnawa',\n    'wedding music': 'gnawa',\n    brazil: 'brazilian',\n    brasil: 'brazilian',\n    argentina: 'tango',\n    jamaica: 'reggae-dancehall-ragga',\n    // Short forms for compound genre slugs\n    klezmer: 'klezmer-jewish',\n    jewish: 'klezmer-jewish',\n    fado: 'fado-portuguese',\n    portuguese: 'fado-portuguese',\n    reggae: 'reggae-dancehall-ragga',\n    dancehall: 'reggae-dancehall-ragga',\n    ragga: 'reggae-dancehall-ragga',\n    bollywood: 'bollywood-filmi',\n    filmi: 'bollywood-filmi',\n    gypsy: 'gypsy-roma',\n    roma: 'gypsy-roma',\n    raga: 'indian-classical-raga'\n  };\n\n  var QUERY_COUNTRY_ALIASES = {\n    mali: 'mali',\n    malian: 'mali',\n    bamako: 'mali',\n    cuba: 'cuba',\n    cuban: 'cuba',\n    brazil: 'brazil',\n    brasil: 'brazil',\n    brazilian: 'brazil',\n    jamaica: 'jamaica',\n    jamaican: 'jamaica',\n    usa: 'usa',\n    america: 'usa',\n    american: 'usa',\n    mississippi: 'usa',\n    china: 'china',\n    japan: 'japan',\n    japanese: 'japan',\n    india: 'india',\n    indian: 'india',\n    scotland: 'scotland',\n    scottish: 'scotland',\n    ireland: 'ireland',\n    irish: 'ireland',\n    wales: 'wales',\n    welsh: 'wales',\n    england: 'england',\n    english: 'england',\n    peru: 'peru',\n    senegal: 'senegal',\n    ghana: 'ghana',\n    nigeria: 'nigeria',\n    ethiopia: 'ethiopia',\n    morocco: 'morocco',\n    egypt: 'egypt',\n    france: 'france',\n    paris: 'france',\n    italy: 'italy',\n    spain: 'spain',\n    portugal: 'portugal',\n    greece: 'greece',\n    turkey: 'turkey',\n    palestine: 'palestine',\n    afghanistan: 'afghanistan',\n    cambodia: 'cambodia',\n    madagascar: 'madagascar',\n    hungary: 'hungary',\n    argentina: 'argentina'\n  };\n\n  /**\n   * Fuzzy/prefix link of free text \u2192 entity ids with scores.\n   * @returns {Array<{id: string, score: number}>}\n   */\n  /**\n   * Exact genre query \u2192 slug (e.g. \"Jazz\" / \"jazz\" \u2192 \"jazz\").\n   * Only exact slug or exact display-name matches \u2014 no substring aliases\n   * (\"india\" must not become indian-classical-raga).\n   * @returns {string|null}\n   */\n  function exactGenreFromQuery(text) {\n    if (!data || !data.genres) return null;\n    var q = normalize(text);\n    if (!q || q.length < 2) return null;\n    if (data.genres[q]) return q;\n    // Colloquial / spelling aliases (Taureg \u2192 tuareg).\n    var aliasSlug = QUERY_ALIASES[q];\n    if (aliasSlug && data.genres[aliasSlug]) return aliasSlug;\n    var slug;\n    for (slug in data.genres) {\n      if (!Object.prototype.hasOwnProperty.call(data.genres, slug)) continue;\n      var node = data.genres[slug];\n      var name = normalize((node && node.n) || '');\n      if (name && name === q) return slug;\n    }\n    // Common short forms that equal the controlled label's distinctive token.\n    if (q === 'rare groove' && data.genres['psychedelic-rare-groove']) {\n      return 'psychedelic-rare-groove';\n    }\n    if (q === 'desert blues' && data.genres['desert-blues-sahara']) {\n      return 'desert-blues-sahara';\n    }\n    if (q === 'indian classical' && data.genres['indian-classical-raga']) {\n      return 'indian-classical-raga';\n    }\n    // Distinctive first token of compound slug: \"klezmer\" \u2192 klezmer-jewish.\n    // Only when exactly one genre owns that first token (avoid \"world\").\n    if (q.length >= 4 && q.indexOf(' ') === -1) {\n      var tokenHits = [];\n      for (slug in data.genres) {\n        if (!Object.prototype.hasOwnProperty.call(data.genres, slug)) continue;\n        if (slug === q || slug.split('-')[0] === q) tokenHits.push(slug);\n      }\n      if (tokenHits.length === 1) return tokenHits[0];\n      if (tokenHits.length > 1) {\n        // Prefer exact slug match already handled; else longest slug\n        // with most products as weak tie-break.\n        tokenHits.sort(function (a, b) {\n          var pa = (data.genres[a].p || []).length;\n          var pb = (data.genres[b].p || []).length;\n          return pb - pa || b.length - a.length;\n        });\n        // Ambiguous head token (\"world\") \u2014 do not guess.\n        if (tokenHits[0].split('-')[0] !== 'world') return tokenHits[0];\n      }\n    }\n    // Typo tolerance: Taureg \u2192 tuareg (LCS \u2265 0.8, length \u2265 5).\n    if (q.length >= 5) {\n      var bestSlug = null;\n      var bestRatio = 0;\n      for (slug in data.genres) {\n        if (!Object.prototype.hasOwnProperty.call(data.genres, slug)) continue;\n        node = data.genres[slug];\n        var candidates = [\n          normalize(slug.replace(/-/g, ' ')),\n          normalize((node && node.n) || ''),\n          slug\n        ];\n        var ci;\n        for (ci = 0; ci < candidates.length; ci++) {\n          var cand = candidates[ci];\n          if (!cand || cand.length < 5) continue;\n          if (Math.abs(cand.length - q.length) > 3) continue;\n          var ratio = affinityLcsRatio(q, cand);\n          if (ratio >= 0.8 && ratio > bestRatio) {\n            bestRatio = ratio;\n            bestSlug = slug;\n          }\n        }\n      }\n      if (bestSlug) return bestSlug;\n    }\n    return null;\n  }\n\n  function linkQuery(text) {\n    if (!data) return [];\n    var q = normalize(text);\n    if (!q || q.length < 2) return [];\n    if (q === 'celtic' || q.indexOf('celtic') === 0) {\n      // Handled below as region:celtic only \u2014 do not early-return empty\n    }\n\n    var scored = [];\n    var slug;\n    var node;\n    var s;\n\n    // Country alias first (Rough Guide country intent).\n    // Emit even when the country node is sparse so style aliases / soft\n    // product scans can still fire for queries like \"wedding music Morocco\".\n    var countrySlug = QUERY_COUNTRY_ALIASES[q];\n    if (countrySlug && countrySlug !== 'celtic') {\n      if (data.countries && data.countries[countrySlug]) {\n        scored.push({ id: 'country:' + countrySlug, score: 100 });\n      } else {\n        scored.push({ id: 'country:' + countrySlug, score: 92 });\n      }\n    }\n\n    // Region phrases (Celtic, West Africa, Latin, \u2026) \u2014 never country:celtic\n    if (data.regions) {\n      if (q === 'celtic' || q === 'celtic music') {\n        if (data.regions.celtic) {\n          scored.push({ id: 'region:celtic', score: 100 });\n        }\n      } else {\n        for (slug in data.regions) {\n          if (!Object.prototype.hasOwnProperty.call(data.regions, slug)) continue;\n          node = data.regions[slug];\n          s = Math.max(\n            scoreNameMatch(q, normalize(node.n)),\n            scoreNameMatch(q, normalize(slug.replace(/-/g, ' ')))\n          );\n          if (s > 0) scored.push({ id: 'region:' + slug, score: s * 0.98 });\n        }\n      }\n    }\n\n    // Exact genre alias hit (style fallback)\n    var aliasSlug = QUERY_ALIASES[q];\n    if (aliasSlug && data.genres && data.genres[aliasSlug]) {\n      scored.push({ id: 'genre:' + aliasSlug, score: countrySlug ? 70 : 100 });\n    }\n\n    if (data.countries) {\n      for (slug in data.countries) {\n        if (!Object.prototype.hasOwnProperty.call(data.countries, slug)) continue;\n        if (slug === 'celtic') continue;\n        node = data.countries[slug];\n        s = Math.max(\n          scoreNameMatch(q, normalize(node.n)),\n          scoreNameMatch(q, normalize(slug.replace(/-/g, ' ')))\n        );\n        if (s > 0) scored.push({ id: 'country:' + slug, score: s });\n      }\n    }\n\n    for (slug in data.artists) {\n      if (!Object.prototype.hasOwnProperty.call(data.artists, slug)) continue;\n      node = data.artists[slug];\n      s = Math.max(\n        scoreNameMatch(q, normalize(node.n)),\n        scoreNameMatch(q, normalize(slug.replace(/-/g, ' ')))\n      );\n      if (s > 0) scored.push({ id: 'artist:' + slug, score: s });\n    }\n\n    for (slug in data.genres) {\n      if (!Object.prototype.hasOwnProperty.call(data.genres, slug)) continue;\n      node = data.genres[slug];\n      s = Math.max(\n        scoreNameMatch(q, normalize(node.n)),\n        scoreNameMatch(q, normalize(slug.replace(/-/g, ' ')))\n      );\n      // Genre typo: Taureg \u2192 tuareg when exact/prefix score is 0.\n      if (s === 0 && q.length >= 5) {\n        var gName = normalize((node && node.n) || '');\n        var gSlug = normalize(slug.replace(/-/g, ' '));\n        var gRatio = Math.max(\n          affinityLcsRatio(q, gSlug),\n          gName ? affinityLcsRatio(q, gName) : 0\n        );\n        if (gRatio >= 0.8) s = Math.round(gRatio * 90);\n      }\n      if (s > 0) scored.push({ id: 'genre:' + slug, score: s * 0.95 });\n    }\n\n    for (slug in data.imprints) {\n      if (!Object.prototype.hasOwnProperty.call(data.imprints, slug)) continue;\n      node = data.imprints[slug];\n      s = Math.max(\n        scoreNameMatch(q, normalize(node.n)),\n        scoreNameMatch(q, normalize(slug.replace(/-/g, ' ')))\n      );\n      if (s > 0) scored.push({ id: 'imprint:' + slug, score: s * 0.7 });\n    }\n\n    var handle;\n    for (handle in data.products) {\n      if (!Object.prototype.hasOwnProperty.call(data.products, handle)) continue;\n      node = data.products[handle];\n      s = Math.max(\n        scoreNameMatch(q, normalize(node.t)),\n        scoreNameMatch(q, normalize(handle.replace(/-/g, ' ')))\n      );\n      if (s >= 40) scored.push({ id: 'product:' + handle, score: s * 0.85 });\n    }\n\n    scored.sort(function (a, b) {\n      return b.score - a.score || (a.id < b.id ? -1 : 1);\n    });\n\n    var seen = {};\n    var out = [];\n    for (var i = 0; i < scored.length && out.length < 24; i++) {\n      if (seen[scored[i].id]) continue;\n      seen[scored[i].id] = true;\n      out.push(scored[i]);\n    }\n    return out;\n  }\n\n  /** Filler words stripped before multi-entity intent parse. */\n  var SEARCH_STOP = {\n    a: 1,\n    an: 1,\n    and: 1,\n    album: 1,\n    albums: 1,\n    by: 1,\n    find: 1,\n    for: 1,\n    from: 1,\n    get: 1,\n    in: 1,\n    like: 1,\n    me: 1,\n    music: 1,\n    of: 1,\n    or: 1,\n    record: 1,\n    records: 1,\n    release: 1,\n    releases: 1,\n    show: 1,\n    similar: 1,\n    some: 1,\n    song: 1,\n    songs: 1,\n    sound: 1,\n    sounds: 1,\n    the: 1,\n    to: 1,\n    want: 1,\n    with: 1\n  };\n\n  /**\n   * Best single entity hit for a phrase (prefers country/region/genre/artist).\n   * @returns {{id:string, score:number, kind:string}|null}\n   */\n  function bestEntityForPhrase(phrase, preferKinds) {\n    var linked = linkQuery(phrase) || [];\n    if (!linked.length) return null;\n    var prefer = preferKinds || null;\n    var i;\n    var hit;\n    if (prefer && prefer.length) {\n      for (i = 0; i < linked.length; i++) {\n        hit = linked[i];\n        if (!hit || !hit.id) continue;\n        var kind = String(hit.id).split(':')[0];\n        if (prefer.indexOf(kind) !== -1 && hit.score >= 40) {\n          return { id: hit.id, score: hit.score, kind: kind };\n        }\n      }\n    }\n    hit = linked[0];\n    if (!hit || !hit.id || !(hit.score >= 40)) return null;\n    return {\n      id: hit.id,\n      score: hit.score,\n      kind: String(hit.id).split(':')[0]\n    };\n  }\n\n  /**\n   * Parse natural queries into graph entities.\n   * Examples: \"desert blues like Tinariwen\", \"wedding music Morocco\".\n   * @returns {{\n   *   raw: string,\n   *   entities: Array<{id:string, score:number, kind:string, phrase:string}>,\n   *   like: {phrase:string, entities:Array}|null,\n   *   residual: string\n   * }}\n   */\n  function parseSearchIntent(text) {\n    var empty = {\n      raw: String(text || ''),\n      entities: [],\n      like: null,\n      residual: ''\n    };\n    if (!data) return empty;\n    var q = normalize(text);\n    if (!q || q.length < 2) return empty;\n\n    var likePhrase = '';\n    var likeRe =\n      /\\b(?:sounds?\\s+like|similar\\s+to|like|a\\s+la|\u00E0\\s+la)\\s+(.+)$/i;\n    var likeMatch = q.match(likeRe);\n    if (likeMatch && likeMatch[1]) {\n      likePhrase = normalize(likeMatch[1]);\n      q = normalize(q.replace(likeMatch[0], ' '));\n    }\n\n    var tokens = q.split(' ').filter(function (t) {\n      return t && !SEARCH_STOP[t];\n    });\n    var used = {};\n    var entities = [];\n    var seenId = {};\n\n    function take(phrase, ent) {\n      if (!ent || !ent.id || seenId[ent.id]) return false;\n      seenId[ent.id] = true;\n      entities.push({\n        id: ent.id,\n        score: ent.score,\n        kind: ent.kind,\n        phrase: phrase\n      });\n      return true;\n    }\n\n    // Greedy longest n-grams first (4 \u2192 1).\n    var maxLen = Math.min(4, tokens.length);\n    var len;\n    var i;\n    for (len = maxLen; len >= 1; len--) {\n      for (i = 0; i <= tokens.length - len; i++) {\n        var blocked = false;\n        var ti;\n        for (ti = i; ti < i + len; ti++) {\n          if (used[ti]) {\n            blocked = true;\n            break;\n          }\n        }\n        if (blocked) continue;\n        var phrase = tokens.slice(i, i + len).join(' ');\n        var prefer =\n          len >= 2\n            ? ['country', 'region', 'genre', 'artist']\n            : ['country', 'region', 'genre', 'artist', 'imprint'];\n        // Single short tokens need a stronger hit (avoid \"to\"/\"music\" leftovers).\n        var ent = bestEntityForPhrase(phrase, prefer);\n        if (!ent) continue;\n        if (len === 1 && ent.score < 50 && ent.kind === 'product') continue;\n        if (len === 1 && ent.score < 45) continue;\n        if (!take(phrase, ent)) continue;\n        for (ti = i; ti < i + len; ti++) used[ti] = true;\n      }\n    }\n\n    // Full-phrase fallback when nothing matched (keeps exactGenre / country aliases).\n    if (!entities.length) {\n      var full = bestEntityForPhrase(q, [\n        'country',\n        'region',\n        'genre',\n        'artist'\n      ]);\n      if (full) take(q, full);\n    }\n\n    var like = null;\n    if (likePhrase) {\n      var likeEnts = [];\n      var likeLane = null;\n      var likeHit = bestEntityForPhrase(likePhrase, [\n        'artist',\n        'product',\n        'genre'\n      ]);\n      if (likeHit) {\n        likeEnts.push({\n          id: likeHit.id,\n          score: likeHit.score,\n          kind: likeHit.kind,\n          phrase: likePhrase\n        });\n        if (likeHit.kind === 'artist') {\n          var likeSlug = String(likeHit.id).split(':').slice(1).join(':');\n          if (likeSlug && data.artists[likeSlug]) {\n            likeLane = laneFromCatalogArtist(likeSlug, data.artists[likeSlug]);\n          }\n        }\n      } else {\n        // OOV / unstocked: seed neighbour lane from catalog fuzzy, baked\n        // affinity, or (async) live MusicBrainz \u2014 never leave like.entities\n        // empty when a lane is known.\n        likeLane = resolveLikeLaneSync(likePhrase);\n        if (likeLane) injectLaneEntities(likeEnts, likeLane, likePhrase);\n      }\n      like = { phrase: likePhrase, entities: likeEnts, lane: likeLane };\n    }\n\n    var residualParts = [];\n    for (i = 0; i < tokens.length; i++) {\n      if (!used[i]) residualParts.push(tokens[i]);\n    }\n\n    return {\n      raw: String(text || ''),\n      entities: entities,\n      like: like,\n      residual: residualParts.join(' ')\n    };\n  }\n\n  /**\n   * Score a product handle against parsed search intent (entity overlap + emb).\n   */\n  function scoreHandleForIntent(handle, intent, seedEmbs) {\n    if (!data || !handle || !data.products[handle]) return 0;\n    var p = data.products[handle];\n    var score = 0;\n    var ents = (intent && intent.entities) || [];\n    var i;\n    var gset = {};\n    var cset = {};\n    var rgset = {};\n    if (p.g) {\n      for (i = 0; i < p.g.length; i++) gset[p.g[i]] = true;\n    }\n    if (p.c) {\n      for (i = 0; i < p.c.length; i++) cset[p.c[i]] = true;\n    }\n    if (p.rg) {\n      for (i = 0; i < p.rg.length; i++) rgset[p.rg[i]] = true;\n    }\n\n    for (i = 0; i < ents.length; i++) {\n      var ent = ents[i];\n      if (!ent || !ent.id) continue;\n      var parts = String(ent.id).split(':');\n      var kind = parts[0];\n      var key = parts.slice(1).join(':');\n      var w = ent.score >= 80 ? 1 : 0.7;\n      if (kind === 'genre' && gset[key]) score += 120 * w;\n      else if (kind === 'country' && cset[key]) score += 130 * w;\n      else if (kind === 'region' && rgset[key]) score += 110 * w;\n      else if (kind === 'artist' && p.a === key) score += 160 * w;\n      else if (\n        kind === 'artist' &&\n        data.artists[key] &&\n        data.artists[key].r &&\n        p.a &&\n        data.artists[key].r.indexOf(p.a) !== -1\n      ) {\n        // Related-artist edge \u2014 well below exact artist (160) so neighbours\n        // cannot outrank the named artist after engagement blend.\n        score += 70 * w;\n        // Same Rough Guide series (Jazz Legends) beats loose jazz co-tags\n        // (Edith Piaf, Indo-Jazz) when the query artist is from that series.\n        var seedPs = data.artists[key].p || [];\n        var seedTitle = '';\n        if (seedPs.length && data.products[seedPs[0]]) {\n          seedTitle = String(data.products[seedPs[0]].t || '');\n        }\n        var pTitle = String(p.t || '');\n        if (\n          /jazz legends/i.test(seedTitle) &&\n          /jazz legends/i.test(pTitle)\n        ) {\n          score += 45 * w;\n        }\n      }\n      else if (kind === 'imprint' && p.i === key) score += 70 * w;\n      else if (kind === 'product' && handle === key) score += 200;\n      else if (kind === 'genre') {\n        // Related genre soft match\n        var rel = relatedGenres(key);\n        var ri;\n        for (ri = 0; ri < rel.length; ri++) {\n          if (gset[rel[ri].slug]) {\n            score += (rel[ri].kind === 'c' || rel[ri].kind === 'p' ? 55 : 35) * w;\n            break;\n          }\n        }\n      }\n    }\n\n    // Thin-shelf densify: must score \u2265100 so discover's artist-only filter\n    // (related <100 dropped when exact artist is pinned) keeps the shelf.\n    if (intent && intent.densifyGenres && intent.densifyGenres.length) {\n      var dgi;\n      for (dgi = 0; dgi < intent.densifyGenres.length; dgi++) {\n        if (gset[intent.densifyGenres[dgi]]) {\n          score += 110;\n          break;\n        }\n      }\n    }\n    if (\n      intent &&\n      intent.densifyArtists &&\n      intent.densifyArtists.length &&\n      p.a &&\n      intent.densifyArtists.indexOf(p.a) !== -1\n    ) {\n      score += 105;\n    }\n    if (\n      intent &&\n      intent.densifyEmb &&\n      intent.densifyEmb.length &&\n      intent.densifyEmb.indexOf(handle) !== -1\n    ) {\n      score += 100;\n    }\n\n    // \"like Artist\" \u2014 boost products sharing genres with seed, or emb near seed.\n    if (intent && intent.like && intent.like.entities) {\n      var li;\n      for (li = 0; li < intent.like.entities.length; li++) {\n        var le = intent.like.entities[li];\n        if (!le) continue;\n        var lk = String(le.id).split(':');\n        if (lk[0] === 'artist' && p.a === lk[1]) score += 220;\n        if (lk[0] === 'product' && handle === lk[1]) score += 220;\n        if (lk[0] === 'genre' && gset[lk[1]]) score += 90;\n        if (lk[0] === 'artist' && data.artists[lk[1]] && data.artists[lk[1]].g) {\n          var ag = data.artists[lk[1]].g;\n          var ai;\n          for (ai = 0; ai < ag.length; ai++) {\n            if (gset[ag[ai]]) {\n              score += 90;\n              break;\n            }\n          }\n        }\n      }\n    }\n    // OOV like-lane (affinity / live MB) \u2014 seed artists + lane genres.\n    if (intent && intent.like && intent.like.lane) {\n      var lane = intent.like.lane;\n      if (lane.seeds && lane.seeds.length && p.a && lane.seeds.indexOf(p.a) !== -1) {\n        score += 160;\n      }\n      if (lane.g && lane.g.length) {\n        var lgi;\n        for (lgi = 0; lgi < lane.g.length; lgi++) {\n          if (gset[lane.g[lgi]]) {\n            score += 95;\n            break;\n          }\n        }\n      }\n    }\n\n    if (seedEmbs && seedEmbs.length) {\n      var pe = getProductEmbedding(handle);\n      if (pe && pe.length) {\n        var best = 0;\n        var si;\n        for (si = 0; si < seedEmbs.length; si++) {\n          var d = dotEmbedding(pe, seedEmbs[si]);\n          if (d > best) best = d;\n        }\n        if (best > 0) score += best * 80;\n      }\n    }\n\n    return score;\n  }\n\n  /**\n   * Genre seeds when a country has few country:* tags.\n   * Keep aligned with engagement COUNTRY_GENRE_BRIDGES (search densify).\n   */\n  var SEARCH_COUNTRY_GENRE_BRIDGES = {\n    india: ['indian-classical-raga', 'bollywood-filmi'],\n    cuba: ['afro-cuban-son', 'salsa'],\n    brazil: ['brazilian'],\n    jamaica: ['reggae-dancehall-ragga'],\n    mali: ['desert-blues-sahara', 'tuareg'],\n    argentina: ['tango'],\n    morocco: ['gnawa'],\n    portugal: ['fado-portuguese', 'flamenco'],\n    spain: ['flamenco', 'fado-portuguese'],\n    peru: ['cumbia'],\n    senegal: ['afrobeat'],\n    nigeria: ['afrobeat', 'highlife'],\n    ghana: ['highlife'],\n    turkey: ['arabic-middle-eastern']\n  };\n  var SEARCH_COUNTRY_ADJ_TOKENS = {\n    india: ['indian'],\n    brazil: ['brazilian', 'brasil'],\n    cuba: ['cuban', 'afro-cuban'],\n    jamaica: ['jamaican'],\n    mali: ['malian'],\n    senegal: ['senegalese'],\n    ghana: ['ghanaian'],\n    nigeria: ['nigerian'],\n    ethiopia: ['ethiopian', 'ethio'],\n    morocco: ['moroccan'],\n    portugal: ['portuguese', 'fado'],\n    spain: ['spanish', 'flamenco'],\n    argentina: ['argentinian', 'argentine', 'tango'],\n    peru: ['peruvian', 'andean'],\n    cambodia: ['cambodian'],\n    madagascar: ['malagasy'],\n    haiti: ['haitian'],\n    japan: ['japanese'],\n    turkey: ['turkish'],\n    'south-africa': ['south-african', 'mbaqanga']\n  };\n  var SEARCH_GENERIC_DENSIFY_GENRES = {\n    folk: 1,\n    jazz: 1,\n    blues: 1,\n    country: 1,\n    gospel: 1,\n    'gospel-spiritual': 1,\n    roots: 1,\n    acoustic: 1,\n    world: 1,\n    'world-music': 1,\n    'world-compilation': 1,\n    'world-music-compilation': 1,\n    instrumental: 1,\n    vocals: 1,\n    pop: 1,\n    rock: 1,\n    classical: 1,\n    soundtrack: 1\n  };\n  var THIN_SHELF_MIN = 8;\n\n  function isGenericDensifyGenre(slug) {\n    return !!(slug && SEARCH_GENERIC_DENSIFY_GENRES[slug]);\n  }\n\n  /**\n   * Genre keys for a thin country query \u2014 explicit bridges + adjective\n   * slug/name match only. Never harvest co-tags from the country's few\n   * products (Cuban rare-groove comps also carry psychedelic/reggae).\n   */\n  function countryDensifyGenres(countrySlug) {\n    if (!countrySlug || !data || !data.genres) return [];\n    var out = [];\n    var seen = {};\n    function push(g) {\n      if (!g || seen[g] || isGenericDensifyGenre(g)) return;\n      if (!data.genres[g]) return;\n      // Noisy catch-all style tags \u2014 never densify countries through these.\n      if (\n        g === 'psychedelic-rare-groove' ||\n        (g === 'reggae-dancehall-ragga' && countrySlug !== 'jamaica')\n      ) {\n        return;\n      }\n      seen[g] = true;\n      out.push(g);\n    }\n    var bridges = SEARCH_COUNTRY_GENRE_BRIDGES[countrySlug] || [];\n    var bi;\n    for (bi = 0; bi < bridges.length; bi++) push(bridges[bi]);\n    var tokens = [countrySlug].concat(\n      SEARCH_COUNTRY_ADJ_TOKENS[countrySlug] || []\n    );\n    var slug;\n    for (slug in data.genres) {\n      if (!Object.prototype.hasOwnProperty.call(data.genres, slug)) continue;\n      if (isGenericDensifyGenre(slug)) continue;\n      var nameN = normalize(data.genres[slug].n || slug.replace(/-/g, ' '));\n      var slugN = normalize(slug.replace(/-/g, ' '));\n      var ti;\n      for (ti = 0; ti < tokens.length; ti++) {\n        var tok = normalize(tokens[ti]);\n        if (!tok || tok.length < 4) continue;\n        // Prefer whole-token genre matches (cuban \u2192 afro-cuban-son),\n        // not substring accidents inside unrelated slugs.\n        if (\n          slugN === tok ||\n          slugN.indexOf(tok + ' ') === 0 ||\n          slugN.indexOf(' ' + tok) !== -1 ||\n          nameN === tok ||\n          nameN.indexOf(tok + ' ') === 0 ||\n          nameN.indexOf(' ' + tok) !== -1 ||\n          slug === tok.replace(/\\s+/g, '-') ||\n          slug.indexOf(tok.replace(/\\s+/g, '-') + '-') === 0 ||\n          slug.indexOf('-' + tok.replace(/\\s+/g, '-')) !== -1\n        ) {\n          push(slug);\n          break;\n        }\n      }\n    }\n    return out.slice(0, 4);\n  }\n\n  function pushUniqueId(arr, id) {\n    if (!id || arr.indexOf(id) !== -1) return;\n    arr.push(id);\n  }\n\n  function pushUniqueGenre(list, g) {\n    if (!g || list.indexOf(g) !== -1) return;\n    if (!data.genres || !data.genres[g]) return;\n    list.push(g);\n  }\n\n  /**\n   * Sibling / child genres for densify (skip jazz/blues/folk/world dumps).\n   */\n  function densifySiblingGenres(genreSlug, out, limit) {\n    limit = limit != null ? limit : 4;\n    var rels = relatedGenres(genreSlug, ['c', 's']);\n    var i;\n    for (i = 0; i < rels.length && out.length < limit + 8; i++) {\n      if (isGenericDensifyGenre(rels[i].slug)) continue;\n      pushUniqueGenre(out, rels[i].slug);\n    }\n  }\n\n  /**\n   * Keep densify shelves tight: drop mega-comps with 5+ genre tags unless\n   * they also carry the queried country.\n   */\n  function densifyProductAllowed(handle, densifyGenres, countrySlug) {\n    if (!data || !data.products || !data.products[handle]) return false;\n    var p = data.products[handle];\n    var g = p.g || [];\n    var c = p.c || [];\n    if (countrySlug && c.indexOf(countrySlug) !== -1) return true;\n    // Tagged for a different country (lost-in-mali on brazilian lane) \u2014 skip.\n    if (countrySlug && c.length && c.indexOf(countrySlug) === -1) return false;\n    var hit = false;\n    var i;\n    if (densifyGenres && densifyGenres.length) {\n      for (i = 0; i < densifyGenres.length; i++) {\n        if (g.indexOf(densifyGenres[i]) !== -1) {\n          hit = true;\n          break;\n        }\n      }\n    } else {\n      hit = true;\n    }\n    if (!hit) return false;\n    // Multi-genre Rough Guide dumps (women-of-the-world, best-you've-never-heard).\n    if (g.length >= 4) return false;\n    return true;\n  }\n\n  /**\n   * Embedding neighbours of seed products \u2014 last resort when genre lanes are\n   * too sparse (Johnny Cash: only 3 country-tagged titles in the catalog).\n   */\n  function densifyEmbHandles(\n    seedProductHandles,\n    existingHandles,\n    limit,\n    preferGenres\n  ) {\n    limit = limit != null ? limit : 10;\n    if (!data || !data.products) return [];\n    var seeds = [];\n    var i;\n    for (i = 0; i < (seedProductHandles || []).length && seeds.length < 3; i++) {\n      var vec = getProductEmbedding(seedProductHandles[i]);\n      if (vec && vec.length) seeds.push(vec);\n    }\n    if (!seeds.length) return [];\n    var scored = [];\n    var h;\n    for (h in data.products) {\n      if (!Object.prototype.hasOwnProperty.call(data.products, h)) continue;\n      if (existingHandles[h]) continue;\n      var pe = getProductEmbedding(h);\n      if (!pe) continue;\n      var best = 0;\n      var si;\n      for (si = 0; si < seeds.length; si++) {\n        var d = dotEmbedding(pe, seeds[si]);\n        if (d > best) best = d;\n      }\n      var p = data.products[h];\n      var pg = (p && p.g) || [];\n      if (pg.length >= 5) continue;\n      var genreShare = false;\n      if (preferGenres && preferGenres.length) {\n        for (si = 0; si < preferGenres.length; si++) {\n          if (pg.indexOf(preferGenres[si]) !== -1) {\n            genreShare = true;\n            break;\n          }\n        }\n      }\n      // Shared lane genre only when preferGenres is set \u2014 never emb-pull\n      // Peru rare-groove into Cuba just because covers are similar.\n      if (preferGenres && preferGenres.length) {\n        if (genreShare && best >= 0.38) scored.push({ h: h, d: best + 0.05 });\n      } else if (best >= 0.55) {\n        scored.push({ h: h, d: best });\n      }\n    }\n    scored.sort(function (a, b) {\n      return b.d - a.d || (a.h < b.h ? -1 : 1);\n    });\n    var out = [];\n    for (i = 0; i < scored.length && out.length < limit; i++) {\n      out.push(scored[i].h);\n    }\n    return out;\n  }\n\n  /**\n   * When artist/country expand yields a tiny shelf, add neighbour artists,\n   * genre product pools + siblings, then emb neighbours \u2014 never dump\n   * generic jazz/blues/world-music pools (Coltrane / France / Belarus).\n   */\n  function densifyThinExpandIds(intent, expandIds, handleCount) {\n    if (!intent || !intent.entities || !intent.entities.length) return expandIds;\n    if (handleCount >= THIN_SHELF_MIN) return expandIds;\n    if (intent.like) return expandIds;\n\n    var artistOnly =\n      intent.entities.length > 0 &&\n      intent.entities.every(function (e) {\n        return e && String(e.id || '').indexOf('artist:') === 0;\n      });\n    var countryOnly =\n      intent.entities.length > 0 &&\n      intent.entities.every(function (e) {\n        return e && String(e.id || '').indexOf('country:') === 0;\n      });\n\n    if (artistOnly) {\n      var densifyArtists = [];\n      var densifyGenres = [];\n      var seedProducts = [];\n      var ai;\n      for (ai = 0; ai < intent.entities.length; ai++) {\n        var aSlug = String(intent.entities[ai].id).split(':').slice(1).join(':');\n        var anode = data.artists && data.artists[aSlug];\n        if (!anode) continue;\n        var seeds = (anode.r || []).slice();\n        var ag = (anode.g || []).filter(function (g) {\n          return !isGenericDensifyGenre(g);\n        });\n        // Prefer specific genres; fall back to the sole tag (Cash \u2192 country).\n        var laneG = ag.length ? ag : (anode.g || []).slice(0, 1);\n        if (seeds.length < 4 && laneG.length) {\n          var live = genreNeighborArtists(laneG, aSlug, 8);\n          var li;\n          for (li = 0; li < live.length; li++) {\n            if (seeds.indexOf(live[li]) === -1) seeds.push(live[li]);\n          }\n        }\n        var si;\n        for (si = 0; si < seeds.length && densifyArtists.length < 8; si++) {\n          if (seeds[si] && densifyArtists.indexOf(seeds[si]) === -1) {\n            densifyArtists.push(seeds[si]);\n            pushUniqueId(expandIds, 'artist:' + seeds[si]);\n          }\n        }\n        for (si = 0; si < laneG.length; si++) {\n          pushUniqueGenre(densifyGenres, laneG[si]);\n          // Genre product pool (depth 0 later) \u2014 fills when no neighbour artists.\n          pushUniqueId(expandIds, 'genre:' + laneG[si]);\n          // Only close siblings (c/s); skip brazilian/tango fan-out for salsa\n          // when the artist lane is already salsa \u2014 keep afro-cuban only.\n          if (laneG[si] === 'salsa' || laneG[si] === 'afro-cuban-son') {\n            pushUniqueGenre(densifyGenres, 'afro-cuban-son');\n            pushUniqueGenre(densifyGenres, 'salsa');\n          } else {\n            densifySiblingGenres(laneG[si], densifyGenres, 3);\n          }\n        }\n        for (si = 0; si < densifyGenres.length; si++) {\n          pushUniqueId(expandIds, 'genre:' + densifyGenres[si]);\n        }\n        if (anode.p) {\n          for (si = 0; si < anode.p.length; si++) seedProducts.push(anode.p[si]);\n        }\n      }\n      if (densifyArtists.length) intent.densifyArtists = densifyArtists;\n      if (densifyGenres.length) intent.densifyGenres = densifyGenres;\n      if (seedProducts.length) intent.densifySeedProducts = seedProducts;\n      return expandIds;\n    }\n\n    if (countryOnly) {\n      // Bridges + adjective matches only \u2014 no sibling genre fan-out\n      // (brazilian siblings pulled Mali/world comps into Cuba).\n      var densifyG = [];\n      var seedProducts = [];\n      var ci;\n      for (ci = 0; ci < intent.entities.length; ci++) {\n        var cSlug = String(intent.entities[ci].id).split(':').slice(1).join(':');\n        var cg = countryDensifyGenres(cSlug);\n        var cgi;\n        for (cgi = 0; cgi < cg.length; cgi++) {\n          pushUniqueGenre(densifyG, cg[cgi]);\n        }\n        var cnode = data.countries && data.countries[cSlug];\n        if (cnode && cnode.p) {\n          for (cgi = 0; cgi < cnode.p.length; cgi++) {\n            seedProducts.push(cnode.p[cgi]);\n          }\n        }\n      }\n      if (densifyG.length) intent.densifyGenres = densifyG;\n      if (seedProducts.length) intent.densifySeedProducts = seedProducts;\n      return expandIds;\n    }\n\n    return expandIds;\n  }\n\n  /**\n   * Graph-powered candidate search for natural-language queries.\n   * @param {string} text\n   * @param {{limit?:number, seedHandles?:string[], likeLane?:object}} [opts]\n   * @returns {{\n   *   intent: object,\n   *   handles: string[],\n   *   scores: Object.<string, number>,\n   *   seeded: boolean\n   * }}\n   */\n  function graphSearch(text, opts) {\n    opts = opts || {};\n    var limit = opts.limit != null ? opts.limit : 48;\n    var intent = parseSearchIntent(text);\n    var scores = {};\n    var handles = {};\n    var seeded = false;\n\n    if (!data) {\n      return { intent: intent, handles: [], scores: scores, seeded: false };\n    }\n\n    // Inject async-resolved OOV lane (live MB / late affinity) into intent.\n    if (opts.likeLane && opts.likeLane.g && opts.likeLane.g.length) {\n      if (!intent.like) {\n        intent.like = { phrase: '', entities: [], lane: opts.likeLane };\n      } else {\n        intent.like.lane = opts.likeLane;\n        if (!intent.like.entities || !intent.like.entities.length) {\n          intent.like.entities = [];\n          injectLaneEntities(\n            intent.like.entities,\n            opts.likeLane,\n            intent.like.phrase || ''\n          );\n        }\n      }\n    }\n\n    var expandIds = [];\n    var ei;\n    for (ei = 0; ei < intent.entities.length; ei++) {\n      expandIds.push(intent.entities[ei].id);\n      // Soft-expand related genres one hop for style queries\n      var eParts = String(intent.entities[ei].id).split(':');\n      if (eParts[0] === 'genre') {\n        var rels = relatedGenres(eParts[1], ['c', 's']);\n        var rj;\n        for (rj = 0; rj < rels.length && rj < 4; rj++) {\n          expandIds.push('genre:' + rels[rj].slug);\n        }\n      }\n    }\n    if (intent.like && intent.like.entities) {\n      for (ei = 0; ei < intent.like.entities.length; ei++) {\n        expandIds.push(intent.like.entities[ei].id);\n      }\n    }\n    // Tight OOV lane: expand seed artists + lane genres (depth 1 via expand).\n    // Do not expand countries alone \u2014 that dumps unrelated comps.\n    if (intent.like && intent.like.lane) {\n      var laneExpand = intent.like.lane;\n      var lxi;\n      if (laneExpand.seeds) {\n        for (lxi = 0; lxi < laneExpand.seeds.length; lxi++) {\n          expandIds.push('artist:' + laneExpand.seeds[lxi]);\n        }\n      }\n      if (laneExpand.g) {\n        for (lxi = 0; lxi < laneExpand.g.length; lxi++) {\n          expandIds.push('genre:' + laneExpand.g[lxi]);\n        }\n      }\n    }\n\n    var seedHandles = opts.seedHandles || [];\n    if (seedHandles.length) seeded = true;\n    for (ei = 0; ei < seedHandles.length; ei++) {\n      if (seedHandles[ei]) expandIds.push('product:' + seedHandles[ei]);\n    }\n\n    if (expandIds.length) {\n      var expanded = expand(expandIds, 1) || [];\n      for (ei = 0; ei < expanded.length; ei++) handles[expanded[ei]] = true;\n    }\n\n    // Thin artist / country: densify into a usable shelf.\n    var handleCount = Object.keys(handles).length;\n    densifyThinExpandIds(intent, expandIds, handleCount);\n    var densifyCountrySlug = '';\n    if (\n      intent.entities.length === 1 &&\n      String(intent.entities[0].id || '').indexOf('country:') === 0\n    ) {\n      densifyCountrySlug = String(intent.entities[0].id).split(':').slice(1).join(':');\n    }\n    if (intent.densifyArtists && intent.densifyArtists.length) {\n      var artistDensifyIds = [];\n      for (ei = 0; ei < intent.densifyArtists.length; ei++) {\n        artistDensifyIds.push('artist:' + intent.densifyArtists[ei]);\n      }\n      var artistDensified = expand(artistDensifyIds, 1) || [];\n      for (ei = 0; ei < artistDensified.length; ei++) {\n        if (\n          densifyProductAllowed(\n            artistDensified[ei],\n            intent.densifyGenres,\n            densifyCountrySlug\n          )\n        ) {\n          handles[artistDensified[ei]] = true;\n        }\n      }\n    }\n    if (intent.densifyGenres && intent.densifyGenres.length) {\n      // Depth 0 only \u2014 genre.p, never genre.a dump (Coltrane/Cuba purity).\n      var genreDensifyIds = [];\n      for (ei = 0; ei < intent.densifyGenres.length; ei++) {\n        genreDensifyIds.push('genre:' + intent.densifyGenres[ei]);\n      }\n      var genreDensified = expand(genreDensifyIds, 0) || [];\n      for (ei = 0; ei < genreDensified.length; ei++) {\n        if (\n          densifyProductAllowed(\n            genreDensified[ei],\n            intent.densifyGenres,\n            densifyCountrySlug\n          )\n        ) {\n          handles[genreDensified[ei]] = true;\n        }\n      }\n    }\n    // Last resort: embedding neighbours of the thin seed product(s).\n    // Require a densify genre lane \u2014 otherwise France/Piaf emb-dumps jazz.\n    if (\n      Object.keys(handles).length < THIN_SHELF_MIN &&\n      intent.densifySeedProducts &&\n      intent.densifySeedProducts.length &&\n      intent.densifyGenres &&\n      intent.densifyGenres.length\n    ) {\n      var embExtra = densifyEmbHandles(\n        intent.densifySeedProducts,\n        handles,\n        THIN_SHELF_MIN,\n        intent.densifyGenres\n      );\n      for (ei = 0; ei < embExtra.length; ei++) {\n        handles[embExtra[ei]] = true;\n      }\n      if (embExtra.length) intent.densifyEmb = embExtra;\n    }\n\n    // Seed embs from like-artist products or explicit seeds\n    var seedEmbs = [];\n    function pushEmb(h) {\n      var vec = getProductEmbedding(h);\n      if (vec && vec.length) seedEmbs.push(vec);\n    }\n    for (ei = 0; ei < seedHandles.length && seedEmbs.length < 4; ei++) {\n      pushEmb(seedHandles[ei]);\n    }\n    if (intent.like && intent.like.entities) {\n      for (ei = 0; ei < intent.like.entities.length; ei++) {\n        var lid = intent.like.entities[ei].id;\n        var lp = String(lid).split(':');\n        if (lp[0] === 'product') pushEmb(lp[1]);\n        if (lp[0] === 'artist' && data.artists[lp[1]] && data.artists[lp[1]].p) {\n          var ap = data.artists[lp[1]].p;\n          var api;\n          for (api = 0; api < ap.length && seedEmbs.length < 4; api++) {\n            pushEmb(ap[api]);\n          }\n        }\n      }\n    }\n    if (intent.like && intent.like.lane && intent.like.lane.seeds) {\n      for (ei = 0; ei < intent.like.lane.seeds.length && seedEmbs.length < 4; ei++) {\n        var seedSlug = intent.like.lane.seeds[ei];\n        if (data.artists[seedSlug] && data.artists[seedSlug].p) {\n          var sap = data.artists[seedSlug].p;\n          if (sap[0]) pushEmb(sap[0]);\n        }\n      }\n    }\n\n    // Always score expanded set; if empty but we have genre/country entities,\n    // expand alone should have filled \u2014 if still empty, nothing to rank.\n    var ranked = [];\n    var h;\n    // Artist-only queries: keep the artist + related; drop zero-score noise.\n    var artistOnly =\n      intent.entities.length > 0 &&\n      intent.entities.every(function (e) {\n        return e && String(e.id || '').indexOf('artist:') === 0;\n      }) &&\n      !intent.like;\n    for (h in handles) {\n      if (!Object.prototype.hasOwnProperty.call(handles, h)) continue;\n      var sc = scoreHandleForIntent(h, intent, seedEmbs);\n      if (sc > 0) {\n        scores[h] = sc;\n        ranked.push(h);\n      } else if (!artistOnly && seedEmbs.length) {\n        // Soft keep when we have embedding seeds (like-X) and emb overlap.\n        var peSoft = getProductEmbedding(h);\n        var embSoft = 0;\n        var si;\n        for (si = 0; si < seedEmbs.length; si++) {\n          var dSoft = dotEmbedding(peSoft, seedEmbs[si]);\n          if (dSoft > embSoft) embSoft = dSoft;\n        }\n        if (embSoft >= 0.35) {\n          scores[h] = Math.round(embSoft * 40);\n          ranked.push(h);\n        }\n      }\n    }\n\n    // If intent linked entities / OOV like-lane but expand was empty\n    // (e.g. country missing), scan products for soft field matches.\n    var hasLikeLane = !!(intent.like && intent.like.lane && intent.like.lane.g);\n    if (!ranked.length && (intent.entities.length || hasLikeLane)) {\n      for (h in data.products) {\n        if (!Object.prototype.hasOwnProperty.call(data.products, h)) continue;\n        var soft = scoreHandleForIntent(h, intent, seedEmbs);\n        if (soft >= 50) {\n          scores[h] = soft;\n          ranked.push(h);\n        }\n      }\n    }\n\n    ranked.sort(function (a, b) {\n      return (scores[b] || 0) - (scores[a] || 0) || (a < b ? -1 : 1);\n    });\n    if (ranked.length > limit) ranked = ranked.slice(0, limit);\n\n    return {\n      intent: intent,\n      handles: ranked,\n      scores: scores,\n      seeded: seeded\n    };\n  }\n\n  /**\n   * Build a slim discover card payload from a graph product handle.\n   */\n  function productCard(handle) {\n    if (!data || !handle || !data.products[handle]) return null;\n    var p = data.products[handle];\n    var artistName = '';\n    if (p.a && data.artists[p.a] && data.artists[p.a].n) {\n      artistName = data.artists[p.a].n;\n    } else if (p.a) {\n      artistName = String(p.a).replace(/-/g, ' ');\n    }\n    var root = shopRoot();\n    if (root.slice(-1) !== '/') root += '/';\n    return {\n      handle: handle,\n      title: p.t || handle,\n      artist: artistName,\n      imprint: p.i || '',\n      url: root + 'products/' + encodeURIComponent(handle),\n      image: getProductImage(handle) || null,\n      genres: Array.isArray(p.g) ? p.g.slice() : []\n    };\n  }\n\n  function shopRoot() {\n    return window.Shopify && window.Shopify.routes && window.Shopify.routes.root\n      ? window.Shopify.routes.root\n      : '/';\n  }\n\n  var imageCache = {};\n\n  function normalizeImageUrl(src) {\n    if (!src || src === 'NULL') return null;\n    var s = String(src);\n    if (s.indexOf('//') === 0) s = 'https:' + s;\n    return s;\n  }\n\n  function withImageWidth(url, width) {\n    if (!url) return null;\n    var w = width || 200;\n    var s = normalizeImageUrl(url);\n    if (!s) return null;\n    if (/_[0-9]+x(\\.|[?])/.test(s)) {\n      return s.replace(/_[0-9]+x/, '_' + w + 'x');\n    }\n    // Avoid double-insert if already sized via CDN path\n    if (s.indexOf('_' + w + 'x.') !== -1) return s;\n    return s.replace(/(\\.(jpg|jpeg|png|webp|gif))(\\?|$)/i, '_' + w + 'x$1$3');\n  }\n\n  function extractProductImage(prod) {\n    if (!prod) return null;\n    var src =\n      (prod.featured_image &&\n        (typeof prod.featured_image === 'string'\n          ? prod.featured_image\n          : prod.featured_image.src)) ||\n      (prod.images &&\n        prod.images[0] &&\n        (typeof prod.images[0] === 'string'\n          ? prod.images[0]\n          : prod.images[0].src)) ||\n      (prod.media &&\n        prod.media[0] &&\n        (prod.media[0].src ||\n          (prod.media[0].preview_image && prod.media[0].preview_image.src))) ||\n      null;\n    return withImageWidth(normalizeImageUrl(src), 200);\n  }\n\n  /** Cached product image URL, or null until hydrateImages fills it. '' = failed. */\n  function getProductImage(handle) {\n    if (!handle) return null;\n    // Prefer warm cache, but never let a failed '' block baked graph covers.\n    if (Object.prototype.hasOwnProperty.call(imageCache, handle) && imageCache[handle]) {\n      return imageCache[handle];\n    }\n    // Baked graph field \u2014 instant Dig deeper / For you covers without product.js hydrate.\n    if (data && data.products && data.products[handle] && data.products[handle].img) {\n      var baked =\n        withImageWidth(normalizeImageUrl(data.products[handle].img), 200) ||\n        data.products[handle].img;\n      imageCache[handle] = baked;\n      return baked;\n    }\n    if (Object.prototype.hasOwnProperty.call(imageCache, handle)) {\n      return imageCache[handle] || null;\n    }\n    return null;\n  }\n\n  function hasImageCacheEntry(handle) {\n    if (!handle) return false;\n    if (Object.prototype.hasOwnProperty.call(imageCache, handle)) return true;\n    return !!(data && data.products && data.products[handle] && data.products[handle].img);\n  }\n\n  function searchImageByTitle(title, preferHandle) {\n    if (!title) return Promise.reject(new Error('no title'));\n    var root = shopRoot();\n    var url =\n      root +\n      'search?type=product&q=' +\n      encodeURIComponent(title) +\n      '*&view=json';\n    return fetch(url, { credentials: 'same-origin' })\n      .then(function (res) {\n        if (!res.ok) throw new Error('search ' + res.status);\n        return res.json();\n      })\n      .then(function (payload) {\n        var results = (payload && payload.results) || [];\n        var i;\n        var titleL = String(title).toLowerCase();\n        for (i = 0; i < results.length; i++) {\n          if (preferHandle && results[i].handle === preferHandle) {\n            return withImageWidth(\n              normalizeImageUrl(results[i].thumbnail || results[i].image),\n              200\n            );\n          }\n        }\n        for (i = 0; i < results.length; i++) {\n          if (String(results[i].title || '').toLowerCase() === titleL) {\n            return withImageWidth(\n              normalizeImageUrl(results[i].thumbnail || results[i].image),\n              200\n            );\n          }\n        }\n        for (i = 0; i < results.length; i++) {\n          var img = results[i].thumbnail || results[i].image;\n          if (img && img !== 'NULL') {\n            return withImageWidth(normalizeImageUrl(img), 200);\n          }\n        }\n        return null;\n      });\n  }\n\n  function fetchImageForHandle(handle) {\n    var root = shopRoot();\n    var title =\n      data && data.products && data.products[handle] && data.products[handle].t\n        ? data.products[handle].t\n        : '';\n    return fetch(root + 'products/' + encodeURIComponent(handle) + '.js', {\n      credentials: 'same-origin'\n    })\n      .then(function (res) {\n        if (!res.ok) throw new Error('img ' + res.status);\n        return res.json();\n      })\n      .then(function (prod) {\n        var src = extractProductImage(prod);\n        if (!src) throw new Error('no img field');\n        return src;\n      })\n      .catch(function () {\n        return searchImageByTitle(title, handle);\n      });\n  }\n\n  /**\n   * Fetch images for missing covers. Marks failures as '' so callers can skip blanks.\n   * Concurrency-limited so live search fetches aren't starved.\n   */\n  function hydrateImages(handles) {\n    var list = [];\n    var i;\n    for (i = 0; i < (handles || []).length; i++) {\n      var h = handles[i];\n      if (h && !hasImageCacheEntry(h)) list.push(h);\n    }\n    if (!list.length) return Promise.resolve();\n\n    var CONCURRENCY = 8;\n    var idx = 0;\n\n    function next() {\n      if (idx >= list.length) return Promise.resolve();\n      var handle = list[idx++];\n      return fetchImageForHandle(handle)\n        .then(function (src) {\n          imageCache[handle] = src || '';\n        })\n        .catch(function () {\n          imageCache[handle] = '';\n        })\n        .then(next);\n    }\n\n    var workers = [];\n    for (i = 0; i < Math.min(CONCURRENCY, list.length); i++) {\n      workers.push(next());\n    }\n    return Promise.all(workers);\n  }\n\n  /** Warm graph on first search focus (lazy \u2014 not on every page paint). */\n  function armLazyTriggers() {\n    if (window.__wmnGraphArmed) return;\n    window.__wmnGraphArmed = true;\n\n    function warm() {\n      ensureLoaded().catch(function () {\n        /* silent \u2014 rankers degrade without graph */\n      });\n    }\n\n    document.addEventListener(\n      'focusin',\n      function (ev) {\n        var t = ev.target;\n        if (!t) return;\n        if (\n          t.matches &&\n          t.matches(\n            'input[type=\"search\"], input[name=\"q\"], .search-input, #search-field, [data-wmn-search]'\n          )\n        ) {\n          warm();\n        }\n      },\n      true\n    );\n\n    document.addEventListener('wmn:graph-prefetch', warm);\n\n    // Prefetch during idle so first search focus is instant.\n    if (window.requestIdleCallback) {\n      window.requestIdleCallback(warm, { timeout: 2500 });\n    } else {\n      setTimeout(warm, 1500);\n    }\n  }\n\n  armLazyTriggers();\n\n  /**\n   * Minimal sync SHA-256 (hash-trigram-v1 must match bake_catalog_embeddings.py).\n   */\n  function sha256Hex(str) {\n    function rotr(n, x) {\n      return (x >>> n) | (x << (32 - n));\n    }\n    var K = [\n      0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,\n      0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\n      0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,\n      0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n      0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,\n      0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n      0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,\n      0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n      0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,\n      0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n      0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n    ];\n    var bytes = [];\n    var i;\n    for (i = 0; i < str.length; i++) {\n      var c = str.charCodeAt(i);\n      if (c < 0x80) bytes.push(c);\n      else if (c < 0x800) {\n        bytes.push(0xc0 | (c >> 6), 0x80 | (c & 0x3f));\n      } else {\n        bytes.push(\n          0xe0 | (c >> 12),\n          0x80 | ((c >> 6) & 0x3f),\n          0x80 | (c & 0x3f)\n        );\n      }\n    }\n    var bitLen = bytes.length * 8;\n    bytes.push(0x80);\n    while (bytes.length % 64 !== 56) bytes.push(0);\n    for (i = 7; i >= 0; i--) bytes.push((bitLen / Math.pow(2, i * 8)) & 0xff);\n\n    var H = [\n      0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c,\n      0x1f83d9ab, 0x5be0cd19\n    ];\n    var w = new Array(64);\n    var chunk;\n    for (chunk = 0; chunk < bytes.length; chunk += 64) {\n      for (i = 0; i < 16; i++) {\n        var j = chunk + i * 4;\n        w[i] =\n          (bytes[j] << 24) |\n          (bytes[j + 1] << 16) |\n          (bytes[j + 2] << 8) |\n          bytes[j + 3];\n      }\n      for (i = 16; i < 64; i++) {\n        var s0 =\n          rotr(7, w[i - 15]) ^ rotr(18, w[i - 15]) ^ (w[i - 15] >>> 3);\n        var s1 =\n          rotr(17, w[i - 2]) ^ rotr(19, w[i - 2]) ^ (w[i - 2] >>> 10);\n        w[i] = (w[i - 16] + s0 + w[i - 7] + s1) | 0;\n      }\n      var a = H[0],\n        b = H[1],\n        c2 = H[2],\n        d = H[3],\n        e = H[4],\n        f = H[5],\n        g = H[6],\n        h = H[7];\n      for (i = 0; i < 64; i++) {\n        var S1 = rotr(6, e) ^ rotr(11, e) ^ rotr(25, e);\n        var ch = (e & f) ^ (~e & g);\n        var t1 = (h + S1 + ch + K[i] + w[i]) | 0;\n        var S0 = rotr(2, a) ^ rotr(13, a) ^ rotr(22, a);\n        var maj = (a & b) ^ (a & c2) ^ (b & c2);\n        var t2 = (S0 + maj) | 0;\n        h = g;\n        g = f;\n        f = e;\n        e = (d + t1) | 0;\n        d = c2;\n        c2 = b;\n        b = a;\n        a = (t1 + t2) | 0;\n      }\n      H[0] = (H[0] + a) | 0;\n      H[1] = (H[1] + b) | 0;\n      H[2] = (H[2] + c2) | 0;\n      H[3] = (H[3] + d) | 0;\n      H[4] = (H[4] + e) | 0;\n      H[5] = (H[5] + f) | 0;\n      H[6] = (H[6] + g) | 0;\n      H[7] = (H[7] + h) | 0;\n    }\n    var hex = '';\n    for (i = 0; i < 8; i++) {\n      var v = (H[i] >>> 0).toString(16);\n      while (v.length < 8) v = '0' + v;\n      hex += v;\n    }\n    return hex;\n  }\n\n  function hashBucket(token, dim) {\n    var h = sha256Hex(token);\n    return parseInt(h.slice(0, 8), 16) % dim;\n  }\n\n  function hashSign(token) {\n    var h = sha256Hex('s:' + token);\n    return parseInt(h.charAt(0), 16) % 2 === 0 ? 1 : -1;\n  }\n\n  /**\n   * Same recipe as bake_catalog_embeddings.py (hash-trigram-v1).\n   * @returns {number[]|null}\n   */\n  function embedText(text) {\n    var dim = (data && data.emb && data.emb.d) || 64;\n    var vec = new Array(dim);\n    var i;\n    for (i = 0; i < dim; i++) vec[i] = 0;\n    var normed = normalize(text);\n    if (!normed) return vec;\n    var words = normed.split(' ');\n    var wi;\n    for (wi = 0; wi < words.length; wi++) {\n      var w = words[wi];\n      if (!w) continue;\n      var tok = 'w:' + w;\n      vec[hashBucket(tok, dim)] += hashSign(tok);\n      if (w.length >= 3) {\n        var padded = '^' + w + '$';\n        var ti;\n        for (ti = 0; ti < padded.length - 2; ti++) {\n          var tg = 't:' + padded.slice(ti, ti + 3);\n          vec[hashBucket(tg, dim)] += hashSign(tg);\n        }\n      }\n    }\n    var n2 = 0;\n    for (i = 0; i < dim; i++) n2 += vec[i] * vec[i];\n    n2 = Math.sqrt(n2) || 1;\n    for (i = 0; i < dim; i++) vec[i] /= n2;\n    return vec;\n  }\n\n  var affinityCache = null;\n  var affinityPromise = null;\n  var liveAffinityCache = Object.create(null);\n  var liveAffinityInflight = Object.create(null);\n\n  function affinityUrl() {\n    var meta = document.querySelector('meta[name=\"wmn-artist-affinity-url\"]');\n    if (meta && meta.getAttribute('content')) return meta.getAttribute('content');\n    // Derive from catalog-graph asset URL when possible\n    var src = graphUrl() || '';\n    if (src && src.indexOf('wmn-catalog-graph.json') !== -1) {\n      return src.replace('wmn-catalog-graph.json', 'wmn-artist-affinity.json');\n    }\n    return null;\n  }\n\n  var PREFS_PROXY_FALLBACK = 'https://wmn-prefs-sync.vercel.app';\n\n  function prefsProxyBase() {\n    try {\n      var meta = document.querySelector('meta[name=\"wmn-prefs-sync-proxy\"]');\n      var u = meta && meta.getAttribute('content');\n      if (u) return String(u).replace(/\\/$/, '');\n    } catch (e) {\n      /* ignore */\n    }\n    // Live MB affinity must work for anonymous search even when the\n    // prefs-sync meta is absent (setting only used to be logged-in).\n    return PREFS_PROXY_FALLBACK;\n  }\n\n  /** Affinity-shaped lane from an in-catalog artist node. */\n  function laneFromCatalogArtist(slug, node) {\n    if (!node) return null;\n    var g = (node.g || []).slice();\n    if (!g.length) return null;\n    var seeds = (node.r || []).slice(0, 8);\n    if (seeds.length < 4) {\n      var live = genreNeighborArtists(g, slug, 8);\n      var li;\n      for (li = 0; li < live.length; li++) {\n        if (seeds.indexOf(live[li]) === -1) seeds.push(live[li]);\n      }\n      if (seeds.length > 8) seeds = seeds.slice(0, 8);\n    }\n    return {\n      n: node.n || slug,\n      g: g,\n      c: countriesForArtist(slug),\n      seeds: seeds,\n      exclude: slug,\n      src: 'catalog-artist'\n    };\n  }\n\n  /** Push catalog-backed genre/artist ids from a like-lane into like.entities. */\n  function injectLaneEntities(likeEnts, lane, phrase) {\n    if (!likeEnts || !lane) return;\n    var seen = {};\n    var i;\n    for (i = 0; i < likeEnts.length; i++) {\n      if (likeEnts[i] && likeEnts[i].id) seen[likeEnts[i].id] = true;\n    }\n    function push(id, score, kind) {\n      if (!id || seen[id]) return;\n      seen[id] = true;\n      likeEnts.push({\n        id: id,\n        score: score,\n        kind: kind,\n        phrase: phrase || ''\n      });\n    }\n    if (lane.exclude) push('artist:' + lane.exclude, 95, 'artist');\n    if (lane.seeds) {\n      for (i = 0; i < lane.seeds.length; i++) {\n        var s = lane.seeds[i];\n        if (data && data.artists && data.artists[s]) {\n          push('artist:' + s, 80, 'artist');\n        }\n      }\n    }\n    if (lane.g) {\n      for (i = 0; i < lane.g.length; i++) {\n        var gs = lane.g[i];\n        if (data && data.genres && data.genres[gs]) {\n          push('genre:' + gs, 70, 'genre');\n        } else {\n          // Genre slug may still expand via expand() even without a node.\n          push('genre:' + gs, 65, 'genre');\n        }\n      }\n    }\n  }\n\n  /**\n   * Sync OOV \"like X\" lane: catalog artist \u2192 baked affinity \u2192 live cache.\n   * Returns row or null when known-miss; undefined when not yet resolvable.\n   */\n  function resolveLikeLaneSync(phrase) {\n    var q = normalize(phrase);\n    if (!q || q.length < 2) return null;\n    try {\n      if (\n        window.wmnQueryGuard &&\n        typeof window.wmnQueryGuard.isBlocked === 'function' &&\n        window.wmnQueryGuard.isBlocked(q)\n      ) {\n        return null;\n      }\n    } catch (eGuard) {\n      /* ignore */\n    }\n    var catalogHit = findCatalogArtist(q);\n    if (catalogHit && catalogHit.score >= 50) {\n      var catLane = laneFromCatalogArtist(catalogHit.slug, catalogHit.node);\n      if (catLane) return catLane;\n    }\n    var affHit = lookupAffinity(q, affinityCache);\n    if (affHit && affHit.row && affHit.row.g && affHit.row.g.length) {\n      return {\n        n: affHit.row.n || affHit.key,\n        g: affHit.row.g.slice(),\n        c: Array.isArray(affHit.row.c) ? affHit.row.c.slice() : [],\n        seeds: Array.isArray(affHit.row.seeds) ? affHit.row.seeds.slice() : [],\n        src: affHit.row.src || 'affinity'\n      };\n    }\n    if (Object.prototype.hasOwnProperty.call(liveAffinityCache, q)) {\n      return liveAffinityCache[q];\n    }\n    return undefined;\n  }\n\n  /**\n   * Resolve \"like X\" neighbour lane (catalog \u2192 baked affinity \u2192 live MB).\n   * Rock/pop primaries return null (no_lane) \u2014 caller keeps apology / genre-only.\n   */\n  function resolveLikeLane(phrase) {\n    var q = normalize(phrase);\n    if (!q || q.length < 2) return Promise.resolve(null);\n    return ensureAffinity().then(function () {\n      var sync = resolveLikeLaneSync(phrase);\n      if (sync !== undefined) return sync;\n      return fetchLiveAffinity(phrase);\n    });\n  }\n\n  /**\n   * Live MusicBrainz lane for OOV queries missing baked affinity.\n   * Returns affinity-shaped row { n, g, c, mbid, src } or null.\n   */\n  function fetchLiveAffinity(query) {\n    var q = normalize(query);\n    if (!q || q.length < 2) return Promise.resolve(null);\n    try {\n      if (\n        window.wmnQueryGuard &&\n        typeof window.wmnQueryGuard.isBlocked === 'function' &&\n        window.wmnQueryGuard.isBlocked(q)\n      ) {\n        liveAffinityCache[q] = null;\n        return Promise.resolve(null);\n      }\n    } catch (eGuard) {\n      /* ignore */\n    }\n    if (Object.prototype.hasOwnProperty.call(liveAffinityCache, q)) {\n      return Promise.resolve(liveAffinityCache[q]);\n    }\n    if (liveAffinityInflight[q]) return liveAffinityInflight[q];\n    var base = prefsProxyBase();\n    if (!base || typeof fetch !== 'function') {\n      liveAffinityCache[q] = null;\n      return Promise.resolve(null);\n    }\n    var url =\n      base +\n      '/mb-affinity?v=7&q=' +\n      encodeURIComponent(String(query || '').trim());\n    liveAffinityInflight[q] = fetch(url, { credentials: 'omit' })\n      .then(function (res) {\n        // 404 no_lane is a real answer \u2014 cache it. Other errors must retry.\n        if (!res) throw new Error('mb-affinity empty');\n        if (res.status === 404) {\n          liveAffinityCache[q] = null;\n          return null;\n        }\n        if (!res.ok) throw new Error('mb-affinity ' + res.status);\n        return res.json();\n      })\n      .then(function (json) {\n        if (json == null) return null;\n        var row = null;\n        if (\n          json &&\n          json.ok !== false &&\n          Array.isArray(json.g) &&\n          json.g.length\n        ) {\n          row = {\n            n: json.n || query,\n            g: json.g.slice(),\n            c: Array.isArray(json.c) ? json.c.slice() : [],\n            seeds: Array.isArray(json.seeds) ? json.seeds.slice() : [],\n            mbid: json.mbid || '',\n            src: json.src || 'musicbrainz-live'\n          };\n          // Live MB \"eric\" \u2192 Eric Clapton \u2014 same given-name stub rule as affinity.\n          if (isWeakGivenNamePrefix(q, normalize(row.n || ''))) {\n            row = null;\n          }\n        }\n        liveAffinityCache[q] = row;\n        return row;\n      })\n      .catch(function () {\n        // Transient network/5xx \u2014 do not poison the session cache.\n        return null;\n      })\n      .then(function (row) {\n        delete liveAffinityInflight[q];\n        return row;\n      });\n    return liveAffinityInflight[q];\n  }\n\n  function ensureAffinity() {\n    if (affinityCache) return Promise.resolve(affinityCache);\n    if (affinityPromise) return affinityPromise;\n    var url = affinityUrl();\n    if (!url || typeof fetch !== 'function') {\n      affinityCache = { artists: {} };\n      return Promise.resolve(affinityCache);\n    }\n    affinityPromise = fetch(url, { credentials: 'same-origin' })\n      .then(function (res) {\n        if (!res.ok) throw new Error('affinity ' + res.status);\n        return res.json();\n      })\n      .then(function (json) {\n        affinityCache = json && json.artists ? json : { artists: {} };\n        affinityPromise = null;\n        return affinityCache;\n      })\n      .catch(function () {\n        affinityCache = { artists: {} };\n        affinityPromise = null;\n        return affinityCache;\n      });\n    return affinityPromise;\n  }\n\n  function affinityLcsRatio(a, b) {\n    a = String(a || '');\n    b = String(b || '');\n    if (!a || !b) return 0;\n    if (a === b) return 1;\n    if (Math.abs(a.length - b.length) > 3) return 0;\n    var m = a.length;\n    var n = b.length;\n    var prev = new Array(n + 1);\n    var i;\n    var j;\n    for (j = 0; j <= n; j++) prev[j] = 0;\n    for (i = 1; i <= m; i++) {\n      var cur = [0];\n      for (j = 1; j <= n; j++) {\n        cur[j] =\n          a.charAt(i - 1) === b.charAt(j - 1)\n            ? prev[j - 1] + 1\n            : Math.max(prev[j], cur[j - 1]);\n      }\n      prev = cur;\n    }\n    return prev[n] / Math.max(m, n);\n  }\n\n  function lookupAffinity(queryNorm, aff) {\n    if (!aff || !aff.artists || !queryNorm) return null;\n    if (aff.artists[queryNorm]) {\n      return { key: queryNorm, row: aff.artists[queryNorm] };\n    }\n    // Prefix / contained key (e.g. \"tinariwen live\")\n    var best = null;\n    var bestLen = 0;\n    var k;\n    for (k in aff.artists) {\n      if (!Object.prototype.hasOwnProperty.call(aff.artists, k)) continue;\n      if (queryNorm === k || queryNorm.indexOf(k) === 0 || k.indexOf(queryNorm) === 0) {\n        // Block given-name stub expansion: \"eric\" must not become \"eric clapton\".\n        if (\n          k.indexOf(queryNorm) === 0 &&\n          queryNorm !== k &&\n          isWeakGivenNamePrefix(queryNorm, k)\n        ) {\n          continue;\n        }\n        if (queryNorm.length < 4 && k.indexOf(queryNorm) === 0 && queryNorm !== k) {\n          continue;\n        }\n        if (k.length > bestLen) {\n          bestLen = k.length;\n          best = { key: k, row: aff.artists[k] };\n        }\n      }\n    }\n    if (best) return best;\n    // Typo tolerance: Tiniwaren \u2192 Tinariwen via LCS (edit distance alone is 4).\n    if (queryNorm.length < 6) return null;\n    var bestRatio = 0;\n    for (k in aff.artists) {\n      if (!Object.prototype.hasOwnProperty.call(aff.artists, k)) continue;\n      if (k.length < 6) continue;\n      var ratio = affinityLcsRatio(queryNorm, k);\n      if (ratio >= 0.75 && ratio > bestRatio) {\n        bestRatio = ratio;\n        best = { key: k, row: aff.artists[k] };\n      }\n    }\n    return best;\n  }\n\n  /**\n   * Best in-catalog artist for a normalized query name.\n   * @returns {{ slug: string, node: object, score: number }|null}\n   */\n  function findCatalogArtist(queryNorm) {\n    if (!data || !data.artists || !queryNorm) return null;\n    var best = null;\n    var bestScore = 0;\n    var slug;\n    for (slug in data.artists) {\n      if (!Object.prototype.hasOwnProperty.call(data.artists, slug)) continue;\n      var node = data.artists[slug];\n      var nameN = normalize(node.n);\n      var slugN = normalize(slug.replace(/-/g, ' '));\n      var s = Math.max(\n        scoreNameMatch(queryNorm, nameN),\n        scoreNameMatch(queryNorm, slugN)\n      );\n      // Charlie Patton \u2192 Charley Patton (catalog spelling).\n      if (s < 50 && queryNorm.length >= 8) {\n        var ratio = Math.max(\n          affinityLcsRatio(queryNorm, nameN),\n          affinityLcsRatio(queryNorm, slugN)\n        );\n        if (ratio >= 0.88) s = Math.round(ratio * 95);\n      }\n      if (s <= bestScore) continue;\n      // Identity only: skip given-name stubs and mid-name token hits\n      // (\"john\" inside \"Bob Brozman, John McSherry\u2026\").\n      if (\n        isWeakGivenNamePrefix(queryNorm, nameN) ||\n        isWeakGivenNamePrefix(queryNorm, slugN)\n      ) {\n        continue;\n      }\n      if (\n        queryNorm.indexOf(' ') === -1 &&\n        nameN !== queryNorm &&\n        slugN !== queryNorm &&\n        nameN.indexOf(queryNorm) !== 0 &&\n        slugN.indexOf(queryNorm) !== 0\n      ) {\n        continue;\n      }\n      bestScore = s;\n      best = { slug: slug, node: node, score: s };\n    }\n    return bestScore >= 50 ? best : null;\n  }\n\n  /** Countries appearing on an artist's products. */\n  function countriesForArtist(slug) {\n    var out = [];\n    var seen = {};\n    var node = data && data.artists && data.artists[slug];\n    if (!node || !node.p) return out;\n    var i;\n    for (i = 0; i < node.p.length; i++) {\n      var p = data.products[node.p[i]];\n      if (!p || !p.c) continue;\n      var j;\n      for (j = 0; j < p.c.length; j++) {\n        var c = p.c[j];\n        if (c && c !== 'celtic' && !seen[c]) {\n          seen[c] = true;\n          out.push(c);\n        }\n      }\n    }\n    return out;\n  }\n\n  /**\n   * Mean of an artist's product embeddings (catalog-native query vector).\n   * Falls back to null when no baked embs exist.\n   */\n  function artistEmbeddingCentroid(slug) {\n    var node = data && data.artists && data.artists[slug];\n    if (!node || !node.p || !node.p.length) return null;\n    var acc = null;\n    var n = 0;\n    var i;\n    for (i = 0; i < node.p.length; i++) {\n      var pe = getProductEmbedding(node.p[i]);\n      if (!pe || !pe.length) continue;\n      if (!acc) {\n        acc = pe.slice();\n      } else {\n        var d;\n        for (d = 0; d < pe.length; d++) acc[d] += pe[d];\n      }\n      n++;\n    }\n    if (!n || !acc) return null;\n    var n2 = 0;\n    for (i = 0; i < acc.length; i++) {\n      acc[i] /= n;\n      n2 += acc[i] * acc[i];\n    }\n    n2 = Math.sqrt(n2) || 1;\n    for (i = 0; i < acc.length; i++) acc[i] /= n2;\n    return acc;\n  }\n\n  /**\n   * Live genre-neighbour artists when artists.*.r is sparse.\n   * Prefer specific genres over world-music catch-alls.\n   */\n  function genreNeighborArtists(genres, excludeSlug, limit) {\n    limit = limit != null ? limit : 8;\n    var GENERIC = {\n      'world-music': 1,\n      'world-music-compilation': 1,\n      'world-compilation': 1\n    };\n    var specific = [];\n    var i;\n    for (i = 0; i < (genres || []).length; i++) {\n      if (!GENERIC[genres[i]]) specific.push(genres[i]);\n    }\n    var lane = specific.length ? specific : genres || [];\n    if (!lane.length || !data.artists) return [];\n    var scored = [];\n    var slug;\n    for (slug in data.artists) {\n      if (!Object.prototype.hasOwnProperty.call(data.artists, slug)) continue;\n      if (slug === excludeSlug) continue;\n      var ag = data.artists[slug].g || [];\n      var shared = 0;\n      var gi;\n      for (gi = 0; gi < lane.length; gi++) {\n        if (ag.indexOf(lane[gi]) !== -1) shared++;\n      }\n      if (!shared) continue;\n      scored.push({\n        slug: slug,\n        score: shared / lane.length + (data.artists[slug].r && data.artists[slug].r.length ? 0.05 : 0)\n      });\n    }\n    scored.sort(function (a, b) {\n      return b.score - a.score || (a.slug < b.slug ? -1 : 1);\n    });\n    var out = [];\n    for (i = 0; i < scored.length && out.length < limit; i++) {\n      out.push(scored[i].slug);\n    }\n    return out;\n  }\n\n  /**\n   * Similar catalogue artists/releases for a query with no exact hits.\n   *\n   * Resolution order:\n   *   1. Strong in-catalog artist (\u226570) \u2192 artists.*.g / *.r + product-emb centroid\n   *   2. OOV affinity JSON (MusicBrainz-baked)\n   *   3. Weaker catalog artist (\u226550)\n   *   4. Pure embedding neighbours\n   *\n   * @returns {{\n   *   similarTo: string,\n   *   handles: string[],\n   *   scores: Object.<string,number>,\n   *   reason: string,\n   *   genres: string[]\n   * }|null}\n   */\n  function similarToQuery(text, opts) {\n    opts = opts || {};\n    if (!data || !data.products) return null;\n    var q = normalize(text);\n    if (!q || q.length < 2) return null;\n    var limit = opts.limit != null ? opts.limit : 24;\n    var aff = affinityCache;\n    var hit = lookupAffinity(q, aff);\n    // Injected live MusicBrainz row (after baked miss).\n    if (!hit && opts.liveRow && opts.liveRow.g && opts.liveRow.g.length) {\n      hit = { key: q, row: opts.liveRow };\n    }\n    var catalogHit = findCatalogArtist(q);\n\n    var genres = [];\n    var countries = [];\n    var seedArtists = [];\n    var excludeArtist = null;\n    var similarTo = text;\n    var reason = 'embed';\n    var qEmb = null;\n    var fromCatalog = false;\n\n    // Prefer catalog graph when the artist is actually in our catalogue.\n    if (catalogHit && catalogHit.score >= 70) {\n      fromCatalog = true;\n      reason = 'catalog-artist';\n      excludeArtist = catalogHit.slug;\n      similarTo = catalogHit.node.n || catalogHit.slug;\n      genres = (catalogHit.node.g || []).slice();\n      countries = countriesForArtist(catalogHit.slug);\n      seedArtists = (catalogHit.node.r || []).slice();\n      if (seedArtists.length < 4) {\n        var live = genreNeighborArtists(genres, catalogHit.slug, 8);\n        var li;\n        for (li = 0; li < live.length; li++) {\n          if (seedArtists.indexOf(live[li]) === -1) seedArtists.push(live[li]);\n        }\n      }\n      if (seedArtists.length > 8) seedArtists = seedArtists.slice(0, 8);\n      qEmb = artistEmbeddingCentroid(catalogHit.slug);\n    } else if (hit && hit.row) {\n      reason =\n        hit.row.src === 'musicbrainz-live' ? 'musicbrainz-live' : 'affinity';\n      similarTo = hit.row.n || hit.key;\n      genres = (hit.row.g || []).slice();\n      countries = (hit.row.c || []).slice();\n      seedArtists = (hit.row.seeds || []).slice();\n    } else if (catalogHit) {\n      fromCatalog = true;\n      reason = 'catalog-artist';\n      excludeArtist = catalogHit.slug;\n      similarTo = catalogHit.node.n || catalogHit.slug;\n      genres = (catalogHit.node.g || []).slice();\n      countries = countriesForArtist(catalogHit.slug);\n      seedArtists = (catalogHit.node.r || []).slice();\n      if (seedArtists.length < 4) {\n        var liveWeak = genreNeighborArtists(genres, catalogHit.slug, 8);\n        var lwi;\n        for (lwi = 0; lwi < liveWeak.length; lwi++) {\n          if (seedArtists.indexOf(liveWeak[lwi]) === -1) {\n            seedArtists.push(liveWeak[lwi]);\n          }\n        }\n      }\n      if (seedArtists.length > 8) seedArtists = seedArtists.slice(0, 8);\n      qEmb = artistEmbeddingCentroid(catalogHit.slug);\n    }\n\n    // No catalog artist and no affinity lane \u2192 refuse random emb neighbours\n    // (Guns N' Roses \u2192 Steve Tilston / Blues Divas). UI shows the empty message.\n    if (!fromCatalog && !hit) {\n      return null;\n    }\n\n    // Prefer specific genres for lane filtering.\n    var GENERIC_G = {\n      'world-music': 1,\n      'world-music-compilation': 1,\n      'world-compilation': 1\n    };\n    var i;\n    var laneGenres = [];\n    for (i = 0; i < genres.length; i++) {\n      if (!GENERIC_G[genres[i]]) laneGenres.push(genres[i]);\n    }\n    // Jazz Legends: drop blues co-tag. Sahara/Tuareg: drop generic blues \u2014\n    // desert-blues\u2192blues relatedness otherwise dumps delta / Charley Patton.\n    if (laneGenres.indexOf('jazz') !== -1 && laneGenres.indexOf('blues') !== -1) {\n      laneGenres = laneGenres.filter(function (g) {\n        return g !== 'blues';\n      });\n    }\n    if (\n      (laneGenres.indexOf('tuareg') !== -1 ||\n        laneGenres.indexOf('desert-blues-sahara') !== -1) &&\n      laneGenres.indexOf('blues') !== -1\n    ) {\n      laneGenres = laneGenres.filter(function (g) {\n        return g !== 'blues';\n      });\n    }\n    if (!laneGenres.length) laneGenres = genres.slice();\n\n    // Affinity + catalog: seed artists + lane-genre products only (depth 0).\n    // Never walk genre relatedness (desert-blues \u2192 blues \u2192 whole US catalog).\n    var expandIds = [];\n    var tightLane = fromCatalog || !!hit;\n    for (i = 0; i < seedArtists.length; i++) {\n      expandIds.push('artist:' + seedArtists[i]);\n    }\n    if (tightLane) {\n      for (i = 0; i < laneGenres.length; i++) {\n        expandIds.push('genre:' + laneGenres[i]);\n      }\n    } else {\n      for (i = 0; i < laneGenres.length; i++) expandIds.push('genre:' + laneGenres[i]);\n      for (i = 0; i < countries.length; i++) {\n        if (countries[i] && countries[i] !== 'celtic') {\n          expandIds.push('country:' + countries[i]);\n        }\n      }\n    }\n\n    var handles = {};\n    if (expandIds.length) {\n      var expanded = expand(expandIds, 0) || [];\n      for (i = 0; i < expanded.length; i++) handles[expanded[i]] = true;\n    }\n\n    // Query vector: artist product-emb centroid when catalog-native, else text hash.\n    if (!qEmb) {\n      var embQuery = q;\n      if (laneGenres.length || seedArtists.length) {\n        embQuery =\n          q +\n          ' ' +\n          laneGenres.join(' ').replace(/-/g, ' ') +\n          ' ' +\n          seedArtists.join(' ').replace(/-/g, ' ');\n      }\n      qEmb = embedText(embQuery);\n    }\n\n    var scores = {};\n    var h;\n    var minEmb = fromCatalog ? 0.08 : hit ? 0.1 : 0.18;\n    var ownProducts = {};\n    if (excludeArtist && data.artists[excludeArtist] && data.artists[excludeArtist].p) {\n      var op = data.artists[excludeArtist].p;\n      for (i = 0; i < op.length; i++) ownProducts[op[i]] = true;\n    }\n\n    for (h in data.products) {\n      if (!Object.prototype.hasOwnProperty.call(data.products, h)) continue;\n      // Similar-to should surface neighbours, not the matched artist's own titles.\n      if (ownProducts[h]) continue;\n      var pe = getProductEmbedding(h);\n      var emb = pe ? dotEmbedding(qEmb, pe) : 0;\n      var bonus = 0;\n      var p = data.products[h];\n      var isSeed = seedArtists.length && p && p.a && seedArtists.indexOf(p.a) !== -1;\n      if (isSeed) bonus += 0.5;\n      var genreHit = false;\n      if (laneGenres.length && p && p.g) {\n        var gi;\n        for (gi = 0; gi < p.g.length; gi++) {\n          if (laneGenres.indexOf(p.g[gi]) !== -1) {\n            bonus += 0.3;\n            genreHit = true;\n            break;\n          }\n        }\n      }\n      var countryHit = false;\n      if (countries.length && p && p.c) {\n        for (gi = 0; gi < p.c.length; gi++) {\n          if (countries.indexOf(p.c[gi]) !== -1) {\n            bonus += 0.12;\n            countryHit = true;\n            break;\n          }\n        }\n      }\n      // Known lane (affinity / catalog): seed OR shared specific genre.\n      // Country alone is not enough (Rough Guide Mali comps without desert blues).\n      if (tightLane && !isSeed && !genreHit) continue;\n      // Multi-genre Rough Guide comps are tagged tuareg/desert-blues among\n      // 5\u201310 other genres \u2014 treat as compilation noise unless seed artist.\n      var genreCount = (p.g || []).length;\n      if (!isSeed && genreCount >= 4) continue;\n      if (!isSeed && !p.a && genreCount >= 3) continue;\n      // Pure embed: keep the bar high \u2014 no random Hlybini / Eva Quartet.\n      if (!tightLane && emb < minEmb) continue;\n      var total = emb + bonus;\n      if (isSeed || genreHit || handles[h] || total >= minEmb) {\n        if (!isSeed && p.g && p.g.length === 1 && GENERIC_G[p.g[0]]) {\n          total *= 0.4;\n        }\n        scores[h] = Math.round(total * 1000) / 1000;\n        handles[h] = true;\n      }\n    }\n\n    var ranked = Object.keys(handles);\n    if (!ranked.length) return null;\n    ranked.sort(function (a, b) {\n      return (scores[b] || 0) - (scores[a] || 0) || (a < b ? -1 : 1);\n    });\n    if (tightLane) {\n      ranked = ranked.filter(function (hh) {\n        return (scores[hh] || 0) >= 0.28;\n      });\n    } else if (reason === 'embed') {\n      ranked = ranked.filter(function (hh) {\n        return (scores[hh] || 0) >= 0.22;\n      });\n    }\n    if (!ranked.length) return null;\n    if (ranked.length > limit) ranked = ranked.slice(0, limit);\n\n    return {\n      similarTo: similarTo,\n      handles: ranked,\n      scores: scores,\n      reason: reason,\n      genres: genres,\n      countries: countries\n    };\n  }\n\n  /**\n   * Human label for a graph entity slug (genre / country / region / artist).\n   * Used by discover \u201Cwhy\u201D chrome: \u201CSimilar to Tinariwen \u00B7 Desert blues \u00B7 Mali\u201D.\n   */\n  function entityDisplayName(kind, slug) {\n    if (!slug) return '';\n    var key = String(slug);\n    var node = null;\n    if (data) {\n      if (kind === 'genre' && data.genres) node = data.genres[key];\n      else if (kind === 'country' && data.countries) node = data.countries[key];\n      else if (kind === 'region' && data.regions) node = data.regions[key];\n      else if (kind === 'artist' && data.artists) node = data.artists[key];\n    }\n    if (node && node.n) return String(node.n);\n    return key\n      .replace(/-/g, ' ')\n      .replace(/\\b\\w/g, function (c) {\n        return c.toUpperCase();\n      });\n  }\n\n  /**\n   * Decode products[h].e (base64 uint8) \u2192 float32-ish centered unit vector.\n   * Returns null if missing / bad.\n   */\n  function dequantEmbedding(b64) {\n    if (!b64 || typeof b64 !== 'string') return null;\n    var meta = (data && data.emb) || {};\n    var dim = meta.d || 64;\n    var zero = meta.zero != null ? meta.zero : 128;\n    var scale = meta.scale != null ? meta.scale : 127;\n    var raw;\n    try {\n      if (typeof atob !== 'function') return null;\n      var bin = atob(b64);\n      if (bin.length < dim) return null;\n      raw = bin;\n    } catch (e) {\n      return null;\n    }\n    var vec = new Array(dim);\n    var i;\n    var n2 = 0;\n    for (i = 0; i < dim; i++) {\n      var x = (raw.charCodeAt(i) - zero) / scale;\n      vec[i] = x;\n      n2 += x * x;\n    }\n    n2 = Math.sqrt(n2) || 1;\n    for (i = 0; i < dim; i++) vec[i] /= n2;\n    return vec;\n  }\n\n  function getProductEmbedding(handle) {\n    if (!handle || !data || !data.products) return null;\n    var p = data.products[handle];\n    if (!p || !p.e) return null;\n    return dequantEmbedding(p.e);\n  }\n\n  /** Spotify embed path if PDP has embed; else ''. Never invents URIs. */\n  function getSpotifyPath(handle) {\n    if (!handle || !data || !data.products) return '';\n    var p = data.products[handle];\n    var sp = p && p.sp ? String(p.sp) : '';\n    if (!/^(album|track|playlist|episode)\\/[A-Za-z0-9]+$/.test(sp)) return '';\n    return sp;\n  }\n\n  function dotEmbedding(a, b) {\n    if (!a || !b || a.length !== b.length) return 0;\n    var s = 0;\n    var i;\n    for (i = 0; i < a.length; i++) s += a[i] * b[i];\n    return s;\n  }\n\n  window.wmnCatalogGraph = {\n    ensureLoaded: ensureLoaded,\n    ensureAffinity: ensureAffinity,\n    fetchLiveAffinity: fetchLiveAffinity,\n    resolveLikeLane: resolveLikeLane,\n    resolveLikeLaneSync: resolveLikeLaneSync,\n    syncLiveProducts: syncLiveProducts,\n    resolveProduct: resolveProduct,\n    expand: expand,\n    relatedGenres: relatedGenres,\n    linkQuery: linkQuery,\n    exactGenreFromQuery: exactGenreFromQuery,\n    parseSearchIntent: parseSearchIntent,\n    graphSearch: graphSearch,\n    similarToQuery: similarToQuery,\n    entityDisplayName: entityDisplayName,\n    scoreHandleForIntent: scoreHandleForIntent,\n    productCard: productCard,\n    embedText: embedText,\n    getProductImage: getProductImage,\n    hasImageCacheEntry: hasImageCacheEntry,\n    hydrateImages: hydrateImages,\n    getProductEmbedding: getProductEmbedding,\n    getSpotifyPath: getSpotifyPath,\n    dequantEmbedding: dequantEmbedding,\n    dotEmbedding: dotEmbedding,\n    getData: function () {\n      return data;\n    }\n  };\n})(window, document);\n"],
  "mappings": "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",
  "names": ["window", "document", "phrase", "ent", "h"]
}
