{
  "version": 3,
  "sources": ["/cdn/shop/t/20/assets/pvl-algo-canvas.js?cb=1787001135992"],
  "sourcesContent": ["/* Interactive canvas-evolution visual for the Prevolve algorithm.\n   Renders the real Grasshopper master-file history (nodes, wires, groups)\n   with autoplay + a draggable year timeline.\n   Usage: PvlAlgoCanvas.mount(rootEl, { dataUrl, fallbackVideo, autoplay }) */\nwindow.PvlAlgoCanvas = (function () {\n  \"use strict\";\n  const BG = \"#0a2010\";\n  const NODE_FILL = \"rgb(150,178,146)\";\n  // tiny nodes blend into the dark bg through antialiasing, so below the\n  // outline threshold they switch to bright mint and get a bg-colour rim\n  // pass that keeps touching components visually separate\n  const NODE_FILL_SMALL = \"rgb(170,229,166)\";\n  const NODE_EDGE = \"rgba(30,56,34,\";\n  const WIRE = \"112,162,120\";\n  const MONTHS = [\"\", \"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\",\n    \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n  const HOLD = 1.0, TWEEN = 1.35, HOLD_ENDS = 1.2; // seconds (ends get extra)\n  // tween choreography: exits fade first, survivors glide in a staggered\n  // wave, entrances fade in last\n  const EXIT_END = 0.3, ENTER_START = 0.7, STAG = 0.35, MOVE = 0.65;\n\n  function u16(s) {\n    const r = atob(s), n = r.length >> 1, a = new Uint16Array(n);\n    for (let i = 0; i < n; i++) a[i] = r.charCodeAt(i + i) | (r.charCodeAt(i + i + 1) << 8);\n    return a;\n  }\n  function u8(s) {\n    const r = atob(s), a = new Uint8Array(r.length);\n    for (let i = 0; i < r.length; i++) a[i] = r.charCodeAt(i);\n    return a;\n  }\n  function cum(a) {\n    let s = 0;\n    for (let i = 0; i < a.length; i++) { s = (s + a[i]) & 0xffff; a[i] = s; }\n    return a;\n  }\n  const ease = t => t * t * (3 - 2 * t);\n  const lerp = (a, b, t) => a + (b - a) * t;\n  const clamp = (v, a, b) => v < a ? a : v > b ? b : v;\n  function niceDate(d) {\n    return MONTHS[+d.slice(5, 7)] + \" \" + (+d.slice(8, 10)) + \", \" + d.slice(0, 4);\n  }\n  function fmt(n) { return Math.round(n).toLocaleString(\"en-US\"); }\n\n  function decode(data) {\n    for (const m of data.milestones) {\n      m.x = cum(u16(m.x)); m.y = cum(u16(m.y));\n      m.wa = cum(u16(m.wa)); m.wb = u16(m.wb);\n      m.g = u16(m.g); m.gc = u8(m.gc);\n      if (m.ma) { m.ma = u16(m.ma); m.mb = u16(m.mb); }\n    }\n    return data;\n  }\n\n  // classify wires + node maps for the tween i -> i+1 (cached per pair)\n  function pairInfo(data, i, cache) {\n    if (cache[i]) return cache[i];\n    const A = data.milestones[i], B = data.milestones[i + 1];\n    const mapAB = new Int32Array(A.n).fill(-1);\n    const mapBA = new Int32Array(B.n).fill(-1);\n    if (B.ma) for (let k = 0; k < B.ma.length; k++) {\n      mapAB[B.ma[k]] = B.mb[k]; mapBA[B.mb[k]] = B.ma[k];\n    }\n    const bset = new Set();\n    for (let k = 0; k < B.wa.length; k++) bset.add(B.wa[k] * 65536 + B.wb[k]);\n    const aset = new Set();\n    for (let k = 0; k < A.wa.length; k++) aset.add(A.wa[k] * 65536 + A.wb[k]);\n    const onlyA = [], shared = [], onlyB = [];\n    for (let k = 0; k < A.wa.length; k++) {\n      const s = mapAB[A.wa[k]], d = mapAB[A.wb[k]];\n      if (s >= 0 && d >= 0 && bset.has(s * 65536 + d)) shared.push(k);\n      else onlyA.push(k);\n    }\n    for (let k = 0; k < B.wa.length; k++) {\n      const s = mapBA[B.wa[k]], d = mapBA[B.wb[k]];\n      if (!(s >= 0 && d >= 0 && aset.has(s * 65536 + d))) onlyB.push(k);\n    }\n    // per-node glide stagger (deterministic hash of the node index)\n    const stag = new Float32Array(A.n);\n    for (let j = 0; j < A.n; j++) {\n      stag[j] = (((j * 2654435761) >>> 16) % 1000) / 1000 * STAG;\n    }\n    // when few components survive the transition (rewrites), staged phases\n    // would empty the canvas mid-tween; slide them toward a plain crossfade\n    const matched = B.ma ? B.ma.length : 0;\n    const ratio = matched / Math.max(1, Math.max(A.n, B.n));\n    const k = clamp(ratio / 0.5, 0, 1);\n    const info = {\n      exitEnd: lerp(0.85, EXIT_END, k),\n      enterStart: lerp(0.15, ENTER_START, k),\n      mapAB, mapBA, stag,\n      onlyA: Uint32Array.from(onlyA),\n      shared: Uint32Array.from(shared),\n      onlyB: Uint32Array.from(onlyB),\n      posA: new Float32Array(A.n * 2),\n      posB: new Float32Array(B.n * 2),\n    };\n    cache[i] = info;\n    return info;\n  }\n\n  // ga: real-space aspect of the quant box; quant units are anisotropic,\n  // so aspect corrections must happen in real terms\n  function adapt(v, aspect, ga) {\n    let [x0, y0, x1, y1] = v;\n    const w = x1 - x0, h = y1 - y0;\n    const realAspect = (w / h) * ga;\n    if (realAspect < aspect) {\n      const cx = (x0 + x1) / 2, nw = w * (aspect / realAspect);\n      x0 = cx - nw / 2; x1 = cx + nw / 2;\n    } else {\n      const cy = (y0 + y1) / 2, nh = h * (realAspect / aspect);\n      y0 = cy - nh / 2; y1 = cy + nh / 2;\n    }\n    return [x0, y0, x1, y1];\n  }\n\n  function mount(root, opts) {\n    opts = opts || {};\n    const doc = root.ownerDocument;\n    const el = (cls, tag, parent) => {\n      const e = doc.createElement(tag || \"div\");\n      e.className = cls; (parent || root).appendChild(e); return e;\n    };\n    const stage = el(\"pac-stage\");\n    const canvas = el(\"pac-canvas\", \"canvas\", stage);\n    const loading = el(\"pac-loading\", \"div\", stage);\n    loading.textContent = \"Loading the algorithm\u2026\";\n    const chrome = el(\"pac-chrome\");\n    const row = el(\"pac-row\", \"div\", chrome);\n    const when = el(\"pac-when\", \"div\", row);\n    const dateEl = el(\"pac-date\", \"span\", when);\n    const fileEl = el(\"pac-file\", \"span\", when);\n    const fileLbl = el(\"pac-file-label\", \"span\", fileEl);\n    fileLbl.textContent = \"MASTER FILE\";\n    const fileName = el(\"pac-file-name\", \"span\", fileEl);\n    const stats = el(\"pac-stats\", \"div\", row);\n    const nEl = el(\"pac-n\", \"span\", stats);\n    stats.appendChild(doc.createTextNode(\" components \u00B7 \"));\n    const wEl = el(\"pac-w\", \"span\", stats);\n    stats.appendChild(doc.createTextNode(\" wires\"));\n    const tlrow = el(\"pac-tlrow\", \"div\", chrome);\n    const play = el(\"pac-play\", \"button\", tlrow);\n    play.type = \"button\";\n    // setPlaying() keeps this in sync later; without an initial value the\n    // button has no accessible name until playback first toggles\n    play.setAttribute(\"aria-label\", \"Play timeline\");\n    play.innerHTML =\n      '<svg viewBox=\"0 0 16 16\" aria-hidden=\"true\"><path class=\"pac-ic-play\" d=\"M4 2.5v11l9-5.5z\"/><g class=\"pac-ic-pause\"><rect x=\"3.5\" y=\"2.5\" width=\"3.4\" height=\"11\" rx=\"1\"/><rect x=\"9.1\" y=\"2.5\" width=\"3.4\" height=\"11\" rx=\"1\"/></g></svg>';\n    const tl = el(\"pac-tl\", \"div\", tlrow);\n    tl.setAttribute(\"role\", \"slider\");\n    tl.setAttribute(\"tabindex\", \"0\");\n    tl.setAttribute(\"aria-label\", \"Algorithm timeline, 2017 to 2026\");\n    // role=\"slider\" requires a value from creation; the animation loop\n    // overwrites aria-valuenow/-valuetext every frame once running\n    tl.setAttribute(\"aria-valuemin\", \"0\");\n    tl.setAttribute(\"aria-valuemax\", \"1\");\n    tl.setAttribute(\"aria-valuenow\", \"0\");\n    tl.setAttribute(\"aria-valuetext\", \"2017\");\n    el(\"pac-track\", \"div\", tl);\n    const marker = el(\"pac-marker\", \"div\", tl);\n\n    const ctx = canvas.getContext(\"2d\");\n    const reduced = window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n    let data = null, pairCache = {}, S = 0, playing = false, visible = false;\n    let dpr = 1, cw = 0, ch = 0, cssW = 0, cssH = 0;\n    let cacheIdx = -1, cacheCanvas = null;\n    let rafId = 0, lastWall = 0, cycle = null, wallT = 0;\n    let wireStride = 1, emaDt = 16;\n\n    // ---------- timeline geometry ----------\n    let F0 = 2017, F1 = 2026.7, fr = [];\n    function tlBuild() {\n      fr = data.milestones.map(m => m.frac);\n      F0 = Math.floor(fr[0]); F1 = fr[fr.length - 1] + 0.15;\n      for (let yr = F0; yr <= Math.floor(F1); yr++) {\n        const t = el(\"pac-tick\", \"div\", tl);\n        t.style.left = (100 * (yr - F0) / (F1 - F0)) + \"%\";\n        const lab = el(yr % 3 === 2 ? \"pac-year\" : \"pac-year pac-year-minor\", \"span\", t);\n        lab.textContent = yr;\n      }\n      tl.setAttribute(\"aria-valuemin\", String(F0));\n      tl.setAttribute(\"aria-valuemax\", \"2026\");\n    }\n    const fracOfS = (s, eased) => {\n      const i = clamp(Math.floor(s), 0, fr.length - 2);\n      let t = clamp(s - i, 0, 1);\n      if (eased) t = ease(t);\n      return lerp(fr[i], fr[i + 1], t);\n    };\n    function sOfFrac(f) {\n      f = clamp(f, fr[0], fr[fr.length - 1]);\n      let i = 0;\n      while (i < fr.length - 2 && fr[i + 1] < f) i++;\n      return i + (f - fr[i]) / (fr[i + 1] - fr[i]);\n    }\n\n    // ---------- drawing ----------\n    function viewOf(i) { return adapt(data.milestones[i].view, cw / ch, data.ga); }\n\n    // density factor: 1 on desktop-scale canvases, shrinking as css pixels\n    // per drawn item fall, so small screens don't stack into mush. `per` is\n    // the css-px\u00B2-per-item where dropping starts (calibrated to the shipped\n    // 1280x636 desktop stage, 2026 graph); sizeLo caps the extra\n    // narrow-canvas dampening (wire runs span the same graph in far fewer\n    // pixels on phones).\n    function densF(count, per, lo, sizeLo) {\n      const f = Math.sqrt((cssW * cssH) / (((count || 1) * per)));\n      const sizeF = clamp(cssW / 1000, sizeLo === undefined ? 0.8 : sizeLo, 1);\n      return clamp(f * sizeF, lo, 1);\n    }\n\n    function drawGroups(c, m, mul, sx, sy, x0, y0) {\n      const a = 0.11 * mul * densF(m.g.length >> 2, 390, 0.6, 1);\n      if (a < 0.02) return;\n      const pad = 6 * dpr * (cssW / 1280), rad = 5 * dpr * (cssW / 1280);\n      const g = m.g, gc = m.gc;\n      for (let k = 0; k < g.length; k += 4) {\n        const gx0 = (g[k] - x0) * sx - pad, gy0 = (g[k + 1] - y0) * sy - pad;\n        const gx1 = (g[k + 2] - x0) * sx + pad, gy1 = (g[k + 3] - y0) * sy + pad;\n        if (gx1 < 0 || gx0 > cw || gy1 < 0 || gy0 > ch) continue;\n        const ci = (k >> 2) * 3;\n        const col = gc[ci] + \",\" + gc[ci + 1] + \",\" + gc[ci + 2];\n        c.beginPath();\n        if (c.roundRect) c.roundRect(gx0, gy0, gx1 - gx0, gy1 - gy0, rad);\n        else c.rect(gx0, gy0, gx1 - gx0, gy1 - gy0);\n        c.fillStyle = \"rgba(\" + col + \",\" + a + \")\";\n        c.fill();\n        c.strokeStyle = \"rgba(\" + col + \",\" + (a * 1.5 + 0.02) + \")\";\n        c.lineWidth = dpr;\n        c.stroke();\n      }\n    }\n\n    function drawWireSet(c, wa, wb, list, pos, pos2, mul) {\n      const alpha = 0.24 * mul;\n      if (alpha < 0.02 || !list.length) return;\n      c.beginPath();\n      const stride = wireStride;\n      for (let q = 0; q < list.length; q += stride) {\n        const k = list[q];\n        const s2 = wa[k] * 2, d2 = wb[k] * 2;\n        c.moveTo(pos[s2], pos[s2 + 1]);\n        c.lineTo(pos2[d2], pos2[d2 + 1]);\n      }\n      c.strokeStyle = \"rgba(\" + WIRE + \",\" + alpha + \")\";\n      c.lineWidth = dpr;\n      c.stroke();\n    }\n\n    function nodeSize(view, n) {\n      const scale = cssW / (view[2] - view[0]);\n      // when nodes get scarce css room, let them shrink further so they\n      // read as texture instead of merging into blobs\n      const perNode = (cssW * cssH) / (n || 1);\n      const minPx = perNode < 8 ? 1 : perNode < 12 ? 1.5 : 2;\n      const fw = Math.round(clamp(scale * data.nw, minPx, 9) * dpr);\n      const fh = Math.round(clamp(scale * data.nh, minPx, 5) * dpr);\n      return [Math.max(1, fw), Math.max(1, fh)];\n    }\n\n    function drawNodes(c, pos, from, to, fw, fh, alpha, outline) {\n      if (alpha < 0.02) return;\n      c.globalAlpha = alpha;\n      const small = fw < 4 * dpr;\n      const hx = fw >> 1, hy = fh >> 1;\n      if (small && alpha >= 0.99) {\n        // snap to a grid one px coarser than the node: guarantees a 1px\n        // bg seam between touching components at zero extra draw calls\n        const gx = fw + 1, gy = fh + 1;\n        c.fillStyle = NODE_FILL_SMALL;\n        for (let j = from; j < to; j++) {\n          c.fillRect(((pos[j * 2] - hx) / gx | 0) * gx,\n            ((pos[j * 2 + 1] - hy) / gy | 0) * gy, fw, fh);\n        }\n      } else {\n        c.fillStyle = small ? NODE_FILL_SMALL : NODE_FILL;\n        for (let j = from; j < to; j++) {\n          c.fillRect((pos[j * 2] | 0) - hx, (pos[j * 2 + 1] | 0) - hy, fw, fh);\n        }\n      }\n      if (outline && fw >= 4 && fh >= 3 && !small) {\n        c.strokeStyle = NODE_EDGE + \"1)\";\n        c.lineWidth = dpr;\n        for (let j = from; j < to; j++) {\n          c.strokeRect((pos[j * 2] | 0) - hx + 0.5, (pos[j * 2 + 1] | 0) - hy + 0.5, fw - 1, fh - 1);\n        }\n      }\n      c.globalAlpha = 1;\n    }\n\n    function fillPos(m, view, out) {\n      const sx = cw / (view[2] - view[0]), sy = ch / (view[3] - view[1]);\n      const x0 = view[0], y0 = view[1];\n      for (let j = 0; j < m.n; j++) {\n        out[j * 2] = (m.x[j] - x0) * sx;\n        out[j * 2 + 1] = (m.y[j] - y0) * sy;\n      }\n      return [sx, sy, x0, y0];\n    }\n\n    function drawStatic(i) {\n      if (cacheIdx === i && cacheCanvas &&\n        cacheCanvas.width === cw && cacheCanvas.height === ch) {\n        ctx.drawImage(cacheCanvas, 0, 0);\n        return;\n      }\n      const m = data.milestones[i];\n      const off = doc.createElement(\"canvas\");\n      off.width = cw; off.height = ch;\n      const c = off.getContext(\"2d\");\n      c.fillStyle = BG; c.fillRect(0, 0, cw, ch);\n      const view = viewOf(i);\n      const pos = new Float32Array(m.n * 2);\n      const [sx, sy, x0, y0] = fillPos(m, view, pos);\n      drawGroups(c, m, 1, sx, sy, x0, y0);\n      drawWireSet(c, m.wa, m.wb, allWires(m), pos, pos,\n        densF(m.wa.length, 37, 0.45));\n      const [fw, fh] = nodeSize(view, m.n);\n      drawNodes(c, pos, 0, m.n, fw, fh, 1, true);\n      ctx.drawImage(off, 0, 0);\n      cacheIdx = i; cacheCanvas = off;\n    }\n\n    const allCache = {};\n    function allWires(m) {\n      const key = m.date;\n      if (!allCache[key]) {\n        const a = new Uint32Array(m.wa.length);\n        for (let k = 0; k < a.length; k++) a[k] = k;\n        allCache[key] = a;\n      }\n      return allCache[key];\n    }\n\n    function drawTween(i, te) {\n      const A = data.milestones[i], B = data.milestones[i + 1];\n      const info = pairInfo(data, i, pairCache);\n      const view = [0, 1, 2, 3].map(k => lerp(viewOf(i)[k], viewOf(i + 1)[k], te));\n      ctx.fillStyle = BG; ctx.fillRect(0, 0, cw, ch);\n      const sx = cw / (view[2] - view[0]), sy = ch / (view[3] - view[1]);\n      const x0 = view[0], y0 = view[1];\n      const pa = info.posA, pb = info.posB, mapAB = info.mapAB;\n      const stag = info.stag;\n      // choreography phases within the tween (crossfade-ish on rewrites)\n      const exitA = 1 - clamp(te / info.exitEnd, 0, 1);\n      const enterB = clamp((te - info.enterStart) / (1 - info.enterStart), 0, 1);\n      for (let j = 0; j < A.n; j++) {\n        const bj = mapAB[j];\n        let xx, yy;\n        if (bj >= 0) {\n          const tt = ease(clamp((te - stag[j]) / MOVE, 0, 1));\n          xx = lerp(A.x[j], B.x[bj], tt); yy = lerp(A.y[j], B.y[bj], tt);\n        } else { xx = A.x[j]; yy = A.y[j]; }\n        pa[j * 2] = (xx - x0) * sx; pa[j * 2 + 1] = (yy - y0) * sy;\n      }\n      const mapBA = info.mapBA;\n      for (let j = 0; j < B.n; j++) {\n        const aj = mapBA[j];\n        if (aj >= 0) { pb[j * 2] = pa[aj * 2]; pb[j * 2 + 1] = pa[aj * 2 + 1]; }\n        else { pb[j * 2] = (B.x[j] - x0) * sx; pb[j * 2 + 1] = (B.y[j] - y0) * sy; }\n      }\n      // groups hand over around the midpoint so the two generations don't\n      // stack their fills (part of what read as splotch mid-morph)\n      drawGroups(ctx, A, clamp(1 - te / 0.45, 0, 1), sx, sy, x0, y0);\n      drawGroups(ctx, B, clamp((te - 0.55) / 0.45, 0, 1), sx, sy, x0, y0);\n      const wf = densF(Math.max(A.wa.length, B.wa.length), 37, 0.45);\n      drawWireSet(ctx, A.wa, A.wb, info.onlyA, pa, pa, exitA * wf);\n      drawWireSet(ctx, B.wa, B.wb, info.onlyB, pb, pb, enterB * wf);\n      drawWireSet(ctx, A.wa, A.wb, info.shared, pa, pa, wf);\n      const [fw, fh] = nodeSize(view, Math.max(A.n, B.n));\n      // matched nodes (full alpha) vs exits/entrances: split via map sign\n      const small = fw < 4 * dpr;\n      const fill = small ? NODE_FILL_SMALL : NODE_FILL;\n      const hx = fw >> 1, hy = fh >> 1;\n      ctx.globalAlpha = 1;\n      ctx.fillStyle = fill;\n      for (let j = 0; j < A.n; j++) {\n        if (mapAB[j] >= 0)\n          ctx.fillRect((pa[j * 2] | 0) - hx, (pa[j * 2 + 1] | 0) - hy, fw, fh);\n      }\n      ctx.globalAlpha = exitA;\n      if (ctx.globalAlpha >= 0.02) for (let j = 0; j < A.n; j++) {\n        if (mapAB[j] < 0)\n          ctx.fillRect((pa[j * 2] | 0) - hx, (pa[j * 2 + 1] | 0) - hy, fw, fh);\n      }\n      ctx.globalAlpha = enterB;\n      if (ctx.globalAlpha >= 0.02) for (let j = 0; j < B.n; j++) {\n        if (mapBA[j] < 0)\n          ctx.fillRect((pb[j * 2] | 0) - hx, (pb[j * 2 + 1] | 0) - hy, fw, fh);\n      }\n      ctx.globalAlpha = 1;\n    }\n\n    function updateChrome(sVal, eased, markerFrac) {\n      const i = clamp(Math.floor(sVal), 0, data.milestones.length - 2);\n      const t = clamp(sVal - i, 0, 1);\n      const te = eased ? ease(t) : t;\n      const A = data.milestones[i], B = data.milestones[i + 1];\n      const cur = te < 0.5 ? A : B;\n      dateEl.textContent = niceDate(cur.date);\n      fileName.textContent = cur.name;\n      nEl.textContent = fmt(lerp(A.tn || A.n, B.tn || B.n, te));\n      wEl.textContent = fmt(lerp(A.w, B.w, te));\n      const f = markerFrac !== undefined ? markerFrac : lerp(fr[i], fr[i + 1], te);\n      marker.style.left = (100 * (f - F0) / (F1 - F0)) + \"%\";\n      tl.setAttribute(\"aria-valuenow\", String(Math.round(f * 10) / 10));\n      tl.setAttribute(\"aria-valuetext\", niceDate(cur.date));\n    }\n\n    function render(sVal, eased, markerFrac) {\n      const i = clamp(Math.floor(sVal), 0, data.milestones.length - 1);\n      const t = sVal - i;\n      if (i >= data.milestones.length - 1 || t < 0.002) drawStatic(i);\n      else if (t > 0.998) drawStatic(i + 1);\n      else drawTween(i, eased ? ease(t) : t);\n      updateChrome(sVal, eased, markerFrac);\n    }\n\n    // ---------- autoplay ----------\n    function buildCycle() {\n      const N = data.milestones.length;\n      const seg = [];\n      for (let i = 0; i < N; i++) {\n        seg.push({ hold: true, i, dur: HOLD + (i === 0 || i === N - 1 ? HOLD_ENDS : 0) });\n        if (i < N - 1) seg.push({ hold: false, i, dur: TWEEN });\n      }\n      let acc = 0;\n      for (const s of seg) { s.t0 = acc; acc += s.dur; }\n      // marker crawl spans: during a hold the ticker doesn't stop, it crawls\n      // through a small slice of the year axis around the milestone\n      const frs = data.milestones.map(m => m.frac);\n      const eps = frs.map((f, i) => {\n        const prev = i > 0 ? frs[i] - frs[i - 1] : Infinity;\n        const next = i < frs.length - 1 ? frs[i + 1] - frs[i] : Infinity;\n        return Math.min(prev, next) * 0.1;\n      });\n      cycle = { seg, total: acc, frs, eps };\n    }\n    // marker position over cycle wall-time: slow crawl through holds,\n    // eased fast sweep through tweens\n    function mfAtWall(w) {\n      w = w % cycle.total;\n      const N = data.milestones.length;\n      const { frs, eps } = cycle;\n      for (const s of cycle.seg) {\n        if (w < s.t0 + s.dur) {\n          const t = (w - s.t0) / s.dur;\n          if (s.hold) {\n            const a = s.i === 0 ? frs[0] : frs[s.i] - eps[s.i];\n            const b = s.i === N - 1 ? frs[N - 1] : frs[s.i] + eps[s.i];\n            return lerp(a, b, t);\n          }\n          return lerp(frs[s.i] + eps[s.i], frs[s.i + 1] - eps[s.i + 1], ease(t));\n        }\n      }\n      return frs[0];\n    }\n    function sAtWall(w) {\n      w = w % cycle.total;\n      for (const s of cycle.seg) {\n        if (w < s.t0 + s.dur) {\n          return s.hold ? s.i : s.i + (w - s.t0) / s.dur;\n        }\n      }\n      return 0;\n    }\n\n    function frame(now) {\n      rafId = 0;\n      const dt = Math.min(0.1, (now - lastWall) / 1000 || 0);\n      lastWall = now;\n      if (playing && visible) {\n        wallT += dt;\n        S = sAtWall(wallT);\n        const t0 = performance.now();\n        render(S, true, mfAtWall(wallT));\n        const cost = performance.now() - t0;\n        emaDt = emaDt * 0.9 + cost * 0.1;\n        wireStride = emaDt > 70 ? 3 : emaDt > 45 ? 2 : 1;\n        schedule();\n      } else {\n        render(S, true);\n      }\n    }\n    function schedule() { if (!rafId) rafId = requestAnimationFrame(frame); }\n\n    function setPlaying(p) {\n      playing = p;\n      root.classList.toggle(\"pac-paused\", !p);\n      play.setAttribute(\"aria-label\", p ? \"Pause timeline\" : \"Play timeline\");\n      if (p) {\n        // resume the cycle from the current position\n        wallT = wallOfS(S);\n        lastWall = performance.now();\n        schedule();\n      }\n    }\n    function wallOfS(sVal) {\n      const i = clamp(Math.floor(sVal), 0, data.milestones.length - 1);\n      const t = sVal - i;\n      for (const s of cycle.seg) {\n        if (s.hold && s.i === i && t < 0.002) return s.t0;\n        if (!s.hold && s.i === i && t >= 0.002) return s.t0 + t * s.dur;\n      }\n      return 0;\n    }\n\n    // ---------- engagement ping ----------\n    // one scrub event per mount (with the year grabbed) + play/pause taps,\n    // to whatever analytics the page carries; must never break the visual\n    let scrubbed = false;\n    function track(name, detail) {\n      try {\n        const p = Object.assign({ path: location.pathname }, detail);\n        if (window.Shopify && Shopify.analytics && Shopify.analytics.publish)\n          Shopify.analytics.publish(name, p);\n        if (window.gtag) gtag(\"event\", name, p);\n      } catch (e) { /* analytics only */ }\n    }\n    function trackScrub() {\n      if (scrubbed || !data) return;\n      scrubbed = true;\n      track(\"algo_canvas_scrub\", { year: Math.floor(fracOfS(S, false)) });\n    }\n\n    // ---------- interaction ----------\n    function seekFromEvent(ev) {\n      const r = tl.getBoundingClientRect();\n      const f = F0 + clamp((ev.clientX - r.left) / r.width, 0, 1) * (F1 - F0);\n      S = sOfFrac(f);\n      render(S, false);\n    }\n    let dragging = false;\n    tl.addEventListener(\"pointerdown\", ev => {\n      dragging = true;\n      setPlaying(false);\n      seekFromEvent(ev);\n      try { tl.setPointerCapture(ev.pointerId); } catch (e) { /* synthetic */ }\n      ev.preventDefault();\n    });\n    tl.addEventListener(\"pointermove\", ev => { if (dragging) seekFromEvent(ev); });\n    tl.addEventListener(\"pointerup\", () => {\n      if (dragging) trackScrub();\n      dragging = false;\n    });\n    tl.addEventListener(\"pointercancel\", () => { dragging = false; });\n    tl.addEventListener(\"keydown\", ev => {\n      const N = data ? data.milestones.length : 0;\n      if (!N) return;\n      let target = null;\n      if (ev.key === \"ArrowRight\") target = clamp(Math.floor(S + 1.002), 0, N - 1);\n      if (ev.key === \"ArrowLeft\") target = clamp(Math.ceil(S - 1.002), 0, N - 1);\n      if (ev.key === \"Home\") target = 0;\n      if (ev.key === \"End\") target = N - 1;\n      if (target === null) return;\n      ev.preventDefault();\n      setPlaying(false);\n      S = target;\n      render(S, false);\n      trackScrub();\n    });\n    play.addEventListener(\"click\", () => {\n      setPlaying(!playing);\n      track(\"algo_canvas_\" + (playing ? \"play\" : \"pause\"), {});\n    });\n\n    // ---------- lifecycle ----------\n    let retryTimer = 0;\n    function resize() {\n      const r = stage.getBoundingClientRect();\n      if (!r.width) {\n        // background tabs may not have layout yet; try again shortly\n        if (!retryTimer) retryTimer = setTimeout(() => { retryTimer = 0; resize(); }, 400);\n        return;\n      }\n      // phones get full native resolution (3x screens looked blurry at the\n      // 2x cap); the cap stays for large desktop canvases where the pixel\n      // count would explode\n      dpr = Math.min(window.devicePixelRatio || 1, r.width <= 768 ? 3 : 2);\n      cssW = r.width; cssH = r.height;\n      cw = Math.round(r.width * dpr); ch = Math.round(r.height * dpr);\n      if (canvas.width !== cw || canvas.height !== ch) {\n        canvas.width = cw; canvas.height = ch;\n        cacheIdx = -1; cacheCanvas = null;\n        if (data) render(S, true);\n      }\n    }\n    new ResizeObserver(resize).observe(stage);\n\n    const io = new IntersectionObserver(entries => {\n      visible = entries[0].isIntersecting;\n      if (visible && data) schedule();\n    }, { threshold: 0.25 });\n    io.observe(root);\n    doc.addEventListener(\"visibilitychange\", () => {\n      if (!doc.hidden && data) schedule();\n    });\n\n    function fail() {\n      if (opts.fallbackVideo) {\n        root.textContent = \"\";\n        const v = doc.createElement(\"video\");\n        v.src = opts.fallbackVideo;\n        v.autoplay = true; v.muted = true; v.loop = true;\n        v.playsInline = true; v.className = \"pac-fallback\";\n        root.appendChild(v);\n      } else {\n        loading.textContent = \"The interactive view could not load.\";\n      }\n    }\n\n    // phones get the sampled payload: same 17 milestones, fewer nodes and\n    // wires (deterministic by guid, so morph matching still works), which\n    // both halves the download and keeps small canvases legible\n    const wantMobile = opts.dataUrlMobile &&\n      window.matchMedia(\"(max-width: 768px)\").matches;\n    let loadStarted = false;\n    function loadData() {\n      if (loadStarted) return;\n      loadStarted = true;\n      fetch(wantMobile ? opts.dataUrlMobile : opts.dataUrl)\n        .then(r => { if (!r.ok) throw new Error(r.status); return r.json(); })\n        .then(d => {\n          data = decode(d);\n          buildCycle();\n          tlBuild();\n          loading.remove();\n          resize();\n          if (reduced || opts.autoplay === false) {\n            S = data.milestones.length - 1;\n            setPlaying(false);\n            render(S, false);\n          } else {\n            setPlaying(true);\n          }\n        })\n        .catch(fail);\n    }\n    // the payload is ~0.5-1MB; don't pay for it until the section is close\n    // to the viewport (one screen of lead so it's ready by the time it shows)\n    if (\"IntersectionObserver\" in window) {\n      const loadIo = new IntersectionObserver(entries => {\n        if (entries.some(e => e.isIntersecting)) {\n          loadIo.disconnect();\n          loadData();\n        }\n      }, { rootMargin: \"100% 0px\" });\n      loadIo.observe(root);\n    } else {\n      loadData();\n    }\n\n    function seek(sVal, eased) {\n      if (!data) return;\n      S = clamp(sVal, 0, data.milestones.length - 1);\n      render(S, !!eased);\n    }\n    return {\n      setPlaying, seek, resize,\n      mfAt: w => (cycle ? mfAtWall(w) : null),\n      get canvas() { return canvas; },\n      get state() { return { S, playing, loaded: !!data }; },\n    };\n  }\n\n  return { mount };\n})();\n"],
  "mappings": "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",
  "names": ["k"]
}
