{
  "version": 3,
  "sources": ["/cdn/shop/t/31/assets/aq3d-twoside.js?nocache=9582"],
  "sourcesContent": ["/* Aquamentor: Two-Sided Print Setup fee (Dan 2026-10-10). Generated by tools/build.py --web (tools/web_build.py); rebuild, do not edit in the theme.\n   Rule: while any cart line prints 2+ sides (\"Sides to print\" = \"2 (...)\" from the 3D bridge, or an Easify \"Print a second side\" tick),\n   the cart holds exactly ONE setup line with quantity 1; when the last such line goes, the setup line goes too.\n   Config: window.AQ3D_TWOSIDE_CFG (snippets/aq3d-twoside.liquid): section setting variant id > Liquid handle lookup > /products/<handle>.js. */\n(function () {\n  if (window.__aq3dTwosideLoaded) return;\n  window.__aq3dTwosideLoaded = true;\n  var cfgs = window.AQ3D_TWOSIDE_CFG || [], cfg = { variant: '', handle: 'second-side-print-setup', price: '' }, i;\n  for (i = 0; i < cfgs.length; i++) if (cfgs[i] && cfgs[i].explicit && cfgs[i].variant) { cfg.variant = String(cfgs[i].variant); break; }\n  for (i = 0; i < cfgs.length; i++) {\n    var c = cfgs[i] || {};\n    if (!cfg.variant && c.variant) cfg.variant = String(c.variant);\n    if (c.handle && (i === 0 || c.explicit)) cfg.handle = String(c.handle);\n    if (!cfg.price && c.price) cfg.price = String(c.price);\n  }\n  cfg.variant = cfg.variant.replace(/\\D/g, '');\n  var root = (window.Shopify && Shopify.routes && Shopify.routes.root) || '/';\n  var nativeFetch = window.fetch.bind(window);\n  var api = window.aq3dTwoside = { active: !!cfg.variant, price: cfg.price, variant: cfg.variant, handle: cfg.handle, reconcile: function () { return reconcile(); } };\n\n  var vidP = null;\n  function variantId() {                              // '' = no setup product: the whole feature stays off\n    if (vidP) return vidP;\n    if (cfg.variant) return (vidP = Promise.resolve(cfg.variant));\n    vidP = nativeFetch(root + 'products/' + encodeURIComponent(cfg.handle) + '.js', { credentials: 'same-origin', headers: { Accept: 'application/json' } })\n      .then(function (r) { return r.ok ? r.json() : null; })\n      .then(function (p) {\n        var v = p && p.variants && p.variants[0]; if (!v) return '';\n        cfg.variant = api.variant = String(v.id); api.active = true;\n        if (!cfg.price && typeof v.price === 'number') api.price = cfg.price = '$' + (v.price % 100 ? (v.price / 100).toFixed(2) : String(v.price / 100));\n        return cfg.variant;\n      }, function () { return ''; });\n    return vidP;\n  }\n  function isSetup(it) { return (cfg.variant && String(it.variant_id) === cfg.variant) || (!!cfg.handle && it.handle === cfg.handle); }\n  function sidesOf(it) {                              // number of printed sides this line asks for (0 = unknown / one side)\n    var p = it.properties || {}, n = 0;\n    for (var k in p) {\n      if (!Object.prototype.hasOwnProperty.call(p, k)) continue;\n      var key = String(k).trim().toLowerCase(), v = p[k] == null ? '' : String(p[k]).trim();\n      if (key === 'sides to print') { var m = /^(\\d+)/.exec(v); if (m) n = Math.max(n, +m[1]); }\n      else if (key === 'print a second side' && v && !/^(no|false|0|off|none)$/i.test(v)) n = Math.max(n, 2);\n    }\n    return n;\n  }\n  function post(path, body) {\n    return nativeFetch(root + path, { method: 'POST', credentials: 'same-origin', headers: { 'Content-Type': 'application/json', Accept: 'application/json', 'X-Requested-With': 'XMLHttpRequest' }, body: JSON.stringify(body) })\n      .then(function (r) { if (!r.ok) throw new Error(path + ' ' + r.status); return r.json(); });\n  }\n  function getCart() {\n    return nativeFetch(root + 'cart.js', { credentials: 'same-origin', headers: { Accept: 'application/json' }, cache: 'no-store' })\n      .then(function (r) { if (!r.ok) throw new Error('cart.js ' + r.status); return r.json(); });\n  }\n  // One pass: read the cart, decide, make the smallest change. Returns true when the cart changed.\n  function pass() {\n    return getCart().then(function (cart) {\n      var items = cart.items || [], need = false, setup = [];\n      for (var j = 0; j < items.length; j++) {\n        if (isSetup(items[j])) setup.push(items[j]); else if (sidesOf(items[j]) >= 2) need = true;\n      }\n      if (!need && !setup.length) return false;\n      if (need && setup.length === 1 && setup[0].quantity === 1) return false;\n      var ops = [];\n      if (!need) setup.forEach(function (s) { ops.push({ id: s.key, quantity: 0 }); });   // last two-sided line gone: drop the fee\n      else if (setup.length) setup.forEach(function (s, k) {                               // keep one line at qty 1, drop duplicates\n        var q = k === 0 ? 1 : 0; if (s.quantity !== q) ops.push({ id: s.key, quantity: q });\n      });\n      if (ops.length) return ops.reduce(function (pr, op) { return pr.then(function () { return post('cart/change.js', op); }); }, Promise.resolve()).then(function () { return true; });\n      return variantId().then(function (vid) {\n        if (!vid) return false;\n        return post('cart/add.js', { items: [{ id: +vid, quantity: 1, properties: { _aq3d_auto: 'two-sided setup' } }] }).then(function () { return true; });\n      });\n    });\n  }\n  // Easify may add this same product itself (its $35 option, qty = units): the pass treats those lines like any other setup line and\n  // sets the first one to qty 1 / drops the rest. If something keeps re-adding, each pass only resets it; after 8 changes in 20 s\n  // the script stops changing the cart for this page view rather than ping-pong with another app.\n  var busy = null, again = false, timer = null, edits = [];\n  function reconcile() {\n    if (busy) { again = true; return busy; }\n    var now = Date.now(); edits = edits.filter(function (t) { return now - t < 20000; });\n    if (edits.length >= 8) { if (window.console) console.warn('aq3d two-sided setup: too many cart changes, pausing'); return Promise.resolve(); }\n    var changed = false;\n    busy = pass().then(function (ch) { changed = ch; }, function (e) { if (window.console) console.warn('aq3d two-sided setup:', e && e.message || e); })\n      .then(function () {\n        busy = null;\n        if (changed) { edits.push(Date.now()); refreshUi(); }\n        if (again || changed) { again = false; return reconcile(); }   // re-check after our own change: converges in one extra read\n      });\n    return busy;\n  }\n  function schedule() { clearTimeout(timer); timer = setTimeout(reconcile, 250); }\n  // Taiga: <cart-items> (cart page + drawer) re-renders the main-cart section; header blip listens to cart:update.\n  function refreshUi() {\n    var els = document.querySelectorAll('cart-items'), done = false;\n    if (els.length) {\n      nativeFetch(root + 'cart?section_id=main-cart', { credentials: 'same-origin' }).then(function (r) { return r.text(); }).then(function (html) {\n        var doc = new DOMParser().parseFromString(html, 'text/html');\n        for (var k = 0; k < els.length; k++) if (typeof els[k].updateCartSections === 'function') { els[k].updateCartSections(doc); done = true; }\n        if (!done && /\\/cart\\/?$/.test(location.pathname)) location.reload();\n      }, function () {});\n    } else if (/\\/cart\\/?$/.test(location.pathname)) location.reload();\n    try { document.dispatchEvent(new CustomEvent('aq3d:twoside', { detail: {} })); } catch (e) {}\n    try { document.dispatchEvent(new CustomEvent('cart:update', { detail: { aq3d: true } })); } catch (e) {}\n  }\n  // Watch every cart change made by the theme, Easify or anything else.\n  var CART_RE = /\\/cart\\/(add|change|update|clear)(\\.js|\\.json)?(\\?|$)/;\n  window.fetch = function (input, init) {\n    var url = typeof input === 'string' ? input : (input && input.url) || String(input || ''), pr = nativeFetch(input, init);\n    if (CART_RE.test(url)) pr.then(schedule, function () {});\n    return pr;\n  };\n  var xo = XMLHttpRequest.prototype.open;\n  XMLHttpRequest.prototype.open = function (m, url) {\n    if (CART_RE.test(String(url || ''))) this.addEventListener('loadend', schedule);\n    return xo.apply(this, arguments);\n  };\n  ['ajaxProduct:added', 'cart:update', 'cart:updated', 'cart:refresh'].forEach(function (ev) {\n    document.addEventListener(ev, function (e) { if (!(e.detail && e.detail.aq3d)) schedule(); });\n  });\n  window.addEventListener('pageshow', schedule);\n  if (!cfg.variant && document.querySelector('iframe[data-aq3d]')) variantId();   // product page note needs to know the fee exists\n  schedule();\n})();\n"],
  "mappings": "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",
  "names": []
}
