{
  "version": 3,
  "sources": ["/cdn/shop/t/25/assets/joydrape-configurator-v2.js?t=1784624642000"],
  "sourcesContent": ["/**\n * JoyDrape Premium Custom Configurator - Shopify Theme Asset\n * Self-contained client controller. Handles UI, transitions, calculations, and checkout.\n */\n\n(function() {\n  console.log('[JoyDrape] configurator.js loaded, readyState=', document.readyState);\n  // 1. Handles-to-Template Registry Map\n  const HANDLES_MAP = {\n    \"sheer-linen-curtains-5\": \"tem3\",\n    \"lithe-sheer\": \"tem3\",\n    \"rope-sheer-line-curtains\": \"tem3\",\n    \"polishhed-mirrored-heat-insulation-sheer-curtains\": \"tem3\",\n    \"linen-curtains\": \"tem3\",\n    \"loaft-cotton-blend-linen-curtains\": \"tem3\",\n    \"mirrored-sheer-curtains-thickened-sunscreen\": \"tem3\",\n    \"chiffon-chiffon-yarn-sheer-curtains\": \"tem3\",\n    \"lfluffy-100-blackout-curtains\": \"tem3\",\n    \"bmdena-natural-beige-linen-textured-sheer-curtains\": \"tem3\",\n    \"query-natural-linen-textured-curtains-with-vertical-stripes\": \"tem3\",\n    \"chenilles-beige-striped-linen-curtains\": \"tem3\",\n    \"stripe-linen-curtains\": \"tem3\",\n    \"bluestrip-linen-curtains\": \"tem3\",\n    \"uniform-classic-striped-linen-blend-curtains\": \"tem3\",\n    \"line-dark-patterned-linen-blend-curtains\": \"tem3\",\n    \"languids-openwork-linen-blend-curtains\": \"tem3\",\n    \"light-linen-blend-curtains\": \"tem3\",\n    \"mint-solid-linen-blend-curtains\": \"tem3\",\n    \"thick-linen-blend-curtains\": \"tem3\",\n    \"fabric-heavyweight-textured-chenille-curtains\": \"tem3\",\n    \"timeless-natural-blend-curtains\": \"tem3\",\n    \"wheat-heavyweight-waffle-textured-linen-blend-curtains\": \"tem3\",\n    \"lcasua-natural-linen-blend-curtains\": \"tem3\",\n    \"pincheck-100-blackout-cream-style-curtains\": \"tem3\",\n    \"velvet-luxury-velvet-curtains\": \"tem3\",\n    \"velvet-mid-century-modern-curtains\": \"tem3\",\n    \"twill-heavyweight-solid-color-blackout-curtains\": \"tem3\",\n    \"checkered-linen-color-blocked-waffle-chenille-drapes\": \"tem3\",\n    \"art-micro-velvet-cotton-linen-texture-high-blackout-curtains\": \"tem3\",\n    \"revers-100-blackout-faux-linen-curtains\": \"tem3\",\n    \"stripe-two-tone-vertical-striped-linen-blend-curtains\": \"tem3\",\n    \"colorful-95-blackout-luxurious-gold-foil-curtains\": \"tem3\",\n    \"waffle-natural-cotton-linen-blend-curtains\": \"tem3\",\n    \"s-hopsack-pure-white-striped-cotton-sheer-curtains\": \"tem3\",\n    \"c-fluff\": \"tem3\",\n    \"warpft-high-blackout-chenille-curtains\": \"tem3\",\n    \"btimeless-light-filtering-cotton-linen-textured-curtains\": \"tem3\",\n    \"colorful-semi-sheer-linen-textured-curtains\": \"tem3\",\n    \"line-white-plush-feel-semi-sheer-curtains\": \"tem3\",\n    \"fluffy-100-blackout-chenille-curtains\": \"tem3\",\n    \"linetrie-sheer-linen-vertical-stripe-curtains\": \"tem3\",\n    \"streak-geometric-striped-linen-curtains\": \"tem3\",\n    \"grid-classic-check-sheer-curtains-1\": \"tem3\",\n    \"crossl-semi-blackout-linen-textured-curtains\": \"tem3\",\n    \"morandi-cotton-linen-textured-blackout-curtains\": \"tem3\",\n    \"candy-cotton-linen-blend-blackout-curtains\": \"tem3\",\n    \"durable-white-sheer-curtains\": \"tem3\",\n    \"coarse-vintage-style-blackout-curtains\": \"tem3\",\n    \"length-linen-blend-semi-blackout-curtains\": \"tem3\",\n    \"solid-100-blackout-curtain-lining\": \"tem3\",\n    \"pchill-light-filtering-linen-textured-curtains\": \"tem3\",\n    \"l-loose-cordless-striped-linen-blend-roman-shades\": \"tem8\",\n    \"l-lfluffy-cordless-100-blackout-faux-linen-roman-shades\": \"tem8\",\n    \"l-bluestrip-cordless-striped-linen-blend-roman-shade\": \"tem8\",\n    \"l-light-cordless-solid-linen-blend-roman-shades\": \"tem8\",\n    \"l-linetrie-striped-linen-gauze-roman-shades\": \"tem8\",\n    \"l-terra-cordless-soft-hued-light-filtering-roman-shades\": \"tem8\",\n    \"l-dawn-cordless-light-filtering-faux-linen-roman-shades\": \"tem8\",\n    \"l-btimeless-cordless-faux-linen-light-filtering-roman-shades\": \"tem8\",\n    \"l-mint-semi-blackout-cotton-linen-blend-roman-shades\": \"tem8\",\n    \"l-lramie-cordless-ramie-roman-shades\": \"tem205720\",\n    \"l-lseren-refined-ramie-cordless-roman-shades\": \"tem205720\",\n    \"l-lira-cordless-charcoal-ramie-roman-shades\": \"tem205720\",\n    \"l-lnestia-cordless-fine-linen-roman-shades\": \"tem205720\",\n    \"j-volo-cordless-faux-linen-light-filtering-roller-shades\": \"tem205858\",\n    \"j-lino-cordless-faux-linen-blackout-roller-shades\": \"tem205858\",\n    \"j-sun-cordless-white-light-filtering-roller-shades\": \"tem205858\",\n    \"j-solaris-cordless-blackout-solar-roller-shades\": \"tem205858\",\n    \"f-cellula-cordless-light-filtering-cellular-shades\": \"tem205858\",\n    \"f-alterlight-day-night-cellular-shades\": \"tem205858\",\n    \"b-alterna-cordless-blackout-zebra-shades\": \"tem205858\",\n    \"b-strio-cordless-light-filtering-zebra-shades\": \"tem205858\",\n    \"x-lume-corded-shangri-la-blinds-series\": \"tem205864\",\n    \"x-hush-pure-white-corded-shangri-la-blinds\": \"tem205864\",\n    \"x-veil-linen-texture-shangri-la-shades\": \"tem205864\",\n    \"x-tulle\": \"tem205864\",\n    \"b-vitalu-corded-blackout-aluminum-blinds\": \"tem205864\",\n    \"p-double-decorative-curtain-rod-with-rings\": \"tem208608\",\n    \"p-single-decorative-curtain-rod\": \"tem208608\",\n    \"c-query-light-filtering-linen-textured-cafe-curtains\": \"tem209612\",\n    \"c-lithe-sheer-cafe-curtains\": \"tem209612\",\n    \"c-hopsack-white-sheer-vertical-stripe-cafe-curtains\": \"tem209612\",\n    \"c-rope-sheer-vertical-textured-cafe-curtains\": \"tem209612\",\n    \"c-stripe-dual-hue-vertical-textured-cafe-curtains\": \"tem209612\",\n    \"c-stripe-cotton-linen-blend-striped-cafe-curtains\": \"tem209612\",\n    \"c-btimeless-light-filtering-cross-weave-cafe-curtains\": \"tem209612\",\n    \"c-uniform-vertical-striped-semi-sheer-cafe-curtains\": \"tem209612\",\n    \"p-1-2-cafe-curtain-rod-door-curtain-rod\": \"tem209676\"\n  };\n\n  // 2. Options Definitions Configurations\n  /* CONFIG_START */\n  const TEMPLATE_CONFIGS = {\n    tem3: {\n      title: \"product-width2.5%+heigh0.5%\",\n      steps: [\n        {\n          key: \"headerStyle\",\n          label: \"Header Style\",\n          type: \"image_radio\",\n          required: true,\n          values: [\n            {\n              value: \"Pinch Pleat - Double\",\n              priceText: \"+100%\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/19a1tii-Pinch-Pleat---Double-ymq.jpg\",\n              description: \"Classic, structured look with double folds sewn together\\nHung on curtain rings or tracks using drapery pins/hooks\\nWidth is custom-tailored and fixed (cannot be stretched flat)\\n2.0x Fullness is built-in\",\n              measureDescription: \"Width = Custom-tailored fixed width (typically rod width * 2.0 / number of panels)\\nLength = Measure from the bottom of the rings/hooks to the floor + Bottom\\nDifferent Bottom Measurement:\\n\u2022 1/2\\\" Above the Floor: -1/2\\\"\\n\u2022 Kiss the Floor: 0\\n\u2022 Puddling: +2\\\"\"\n            },\n            {\n              value: \"Pinch Pleat - Triple\",\n              priceText: \"+150%\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/1c09eoc-Pinch-Pleat---Triple-ymq.jpg\",\n              description: \"Traditional, high-end look with triple folds pinched together\\nProvides luxurious fullness and deep, uniform pleats\\nHung on rings or tracks using drapery pins/hooks\\n2.5x Fullness is built-in\",\n              measureDescription: \"Width = Custom-tailored fixed width (typically rod width * 2.5 / number of panels)\\nLength = Measure from the bottom of the rings/hooks to the floor + Bottom\\nDifferent Bottom Measurement:\\n\u2022 1/2\\\" Above the Floor: -1/2\\\"\\n\u2022 Kiss the Floor: 0\\n\u2022 Puddling: +2\\\"\"\n            },\n            {\n              value: \"Grommet Top\",\n              priceText: \"+$0.00\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/1qor76t-Grommet-Top-ymq.jpg\",\n              description: \"Opens and closes easily\\nGrommet is 1 5/8 inches in inner diameter\\nHang with a rod, rod diameter \u2A7D 1 1/2 inches\\nCurtains extend 1 1/8 inches above the rod\\n2.0x Fullness is recommended\\nNote: Grommets are available in four colors: silver, black, bronze, and gold. And only the silver grommet is rustproof.\",\n              measureDescription: \"Width = Rod/Track Width * Fullness/Number of Panels (2.0x Fullness is recommended)\\nLength = 1.5 inches + Measure from the very top of the rod to the floor + Bottom\\nDifferent Bottom Measurement:\\n\u2022 1/2\\\" Above the Floor: -1/2\\\"\\n\u2022 Kiss the Floor: 0\\n\u2022 Puddling: +2\\\"\\nNote: For more puddling, add a longer bottom.\"\n            },\n            {\n              value: \"Back Tab\",\n              priceText: \"+$0.00\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/1i619so-Back-Tab-ymq.jpg\",\n              description: \"Hidden tabs on the back side create clean, elegant lines\\nSlides onto the curtain rod directly, no rings required\\nCreates soft, natural folds for a tailored look\\nFits curtain rods up to 1.5 inches in diameter\\n1.5x - 2.0x Fullness is recommended\",\n              measureDescription: \"Width = Rod/Track Width * Fullness/Number of Panels (1.5x - 2.0x Fullness is recommended)\\nLength = Measure from the top of the rod to the floor + Bottom\\nDifferent Bottom Measurement:\\n\u2022 1/2\\\" Above the Floor: -1/2\\\"\\n\u2022 Kiss the Floor: 0\\n\u2022 Puddling: +2\\\"\\nNote: For back tabs, the drape length goes from the rod to the floor.\"\n            },\n            {\n              value: \"Euro Pleat - Double\",\n              priceText: \"+100%\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/qpuvli-Euro-Pleat---Double-ymq.jpg\",\n              description: \"Hand-made with 2-fold pinch pleats on the header top\\nGives a clean, contemporary tailormade appearance\\nHung on tracks or rings with adjustable hooks\\n2.0x Fullness is built-in\",\n              measureDescription: \"Width = Custom-tailored fixed width (typically rod width * 2.0 / number of panels)\\nLength = Measure from the bottom of the rings/hooks to the floor + Bottom\\nDifferent Bottom Measurement:\\n\u2022 1/2\\\" Above the Floor: -1/2\\\"\\n\u2022 Kiss the Floor: 0\\n\u2022 Puddling: +2\\\"\"\n            },\n            {\n              value: \"Euro Pleat - Triple\",\n              priceText: \"+150%\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/km5k7s-Euro_Pleat_-_Triple-ymq.jpg\",\n              description: \"Hand-made with 3-fold pinch pleats on the header top\\nGives a luxurious, classic custom drapery look\\nHung on tracks or rings with adjustable hooks\\n2.5x Fullness is built-in\",\n              measureDescription: \"Width = Custom-tailored fixed width (typically rod width * 2.5 / number of panels)\\nLength = Measure from the bottom of the rings/hooks to the floor + Bottom\\nDifferent Bottom Measurement:\\n\u2022 1/2\\\" Above the Floor: -1/2\\\"\\n\u2022 Kiss the Floor: 0\\n\u2022 Puddling: +2\\\"\"\n            },\n            {\n              value: \"Rod Pocket\",\n              priceText: \"+$0.00\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/1m6i9ly-Rod-Pocket-ymq.jpg\",\n              description: \"Casual, gathered look where the rod slides through a pocket\\nBest for stationary panels, as sliding can be tight\\nPocket fits curtain rods up to 1.5 inches in diameter\\n1.5x - 2.0x Fullness is recommended\",\n              measureDescription: \"Width = Rod/Track Width * Fullness/Number of Panels (1.5x - 2.0x Fullness is recommended)\\nLength = Pocket height + header extension + Measure from top of rod to the floor + Bottom\\nDifferent Bottom Measurement:\\n\u2022 1/2\\\" Above the Floor: -1/2\\\"\\n\u2022 Kiss the Floor: 0\\n\u2022 Puddling: +2\\\"\"\n            },\n            {\n              value: \"Tab Top\",\n              priceText: \"+$0.00\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/1xpr8a4-Tab-Top-ymq.jpg\",\n              description: \"Exposed fabric loops on top for a relaxed, breezy feel\\nSlides onto the rod directly, no rings needed\\nFits curtain rods up to 1.5 inches in diameter\\n1.5x - 2.0x Fullness is recommended\",\n              measureDescription: \"Width = Rod/Track Width * Fullness/Number of Panels (1.5x - 2.0x Fullness is recommended)\\nLength = Measure from top of rod to the floor + Bottom\\nDifferent Bottom Measurement:\\n\u2022 1/2\\\" Above the Floor: -1/2\\\"\\n\u2022 Kiss the Floor: 0\\n\u2022 Puddling: +2\\\"\"\n            }\n          ],\n          default: \"Grommet Top\",\n          helpBoxes: [\n            {\n              style: \"text\",\n              content: [\n                {\n                  type: \"text\",\n                  text: \"Pick your curtain header type below.\"\n                },\n                {\n                  type: \"link\",\n                  text: \"Explore different curtain header types\",\n                  url: \"#header-guidelines\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          key: \"width\",\n          label: \"Width (inch)\",\n          type: \"dropdown_select\",\n          required: true,\n          values: [\n            {\n              value: \"12\",\n              priceText: \"+-70%\"\n            },\n            {\n              value: \"13\",\n              priceText: \"+-67.5%\"\n            },\n            {\n              value: \"14\",\n              priceText: \"+-65%\"\n            },\n            {\n              value: \"15\",\n              priceText: \"+-62.5%\"\n            },\n            {\n              value: \"16\",\n              priceText: \"+-60%\"\n            },\n            {\n              value: \"17\",\n              priceText: \"+-57.5%\"\n            },\n            {\n              value: \"18\",\n              priceText: \"+-55%\"\n            },\n            {\n              value: \"19\",\n              priceText: \"+-52.5%\"\n            },\n            {\n              value: \"20\",\n              priceText: \"+-50%\"\n            },\n            {\n              value: \"21\",\n              priceText: \"+-47.5%\"\n            },\n            {\n              value: \"22\",\n              priceText: \"+-45%\"\n            },\n            {\n              value: \"23\",\n              priceText: \"+-42.5%\"\n            },\n            {\n              value: \"24\",\n              priceText: \"+-40%\"\n            },\n            {\n              value: \"25\",\n              priceText: \"+-37.5%\"\n            },\n            {\n              value: \"26\",\n              priceText: \"+-35%\"\n            },\n            {\n              value: \"27\",\n              priceText: \"+-32.5%\"\n            },\n            {\n              value: \"28\",\n              priceText: \"+-30%\"\n            },\n            {\n              value: \"29\",\n              priceText: \"+-27.5%\"\n            },\n            {\n              value: \"30\",\n              priceText: \"+-25%\"\n            },\n            {\n              value: \"31\",\n              priceText: \"+-22.5%\"\n            },\n            {\n              value: \"32\",\n              priceText: \"+-20%\"\n            },\n            {\n              value: \"33\",\n              priceText: \"+-17.5%\"\n            },\n            {\n              value: \"34\",\n              priceText: \"+-15%\"\n            },\n            {\n              value: \"35\",\n              priceText: \"+-12.5%\"\n            },\n            {\n              value: \"36\",\n              priceText: \"+-10%\"\n            },\n            {\n              value: \"37\",\n              priceText: \"+-7.5%\"\n            },\n            {\n              value: \"38\",\n              priceText: \"+-5%\"\n            },\n            {\n              value: \"39\",\n              priceText: \"+-2.5%\"\n            },\n            {\n              value: \"40\",\n              priceText: \"Free\"\n            },\n            {\n              value: \"41\",\n              priceText: \"+2.5%\"\n            },\n            {\n              value: \"42\",\n              priceText: \"+5%\"\n            },\n            {\n              value: \"43\",\n              priceText: \"+7.5%\"\n            },\n            {\n              value: \"44\",\n              priceText: \"+10%\"\n            },\n            {\n              value: \"45\",\n              priceText: \"+12.5%\"\n            },\n            {\n              value: \"46\",\n              priceText: \"+15%\"\n            },\n            {\n              value: \"47\",\n              priceText: \"+17.5%\"\n            },\n            {\n              value: \"48\",\n              priceText: \"+20%\"\n            },\n            {\n              value: \"49\",\n              priceText: \"+22.5%\"\n            },\n            {\n              value: \"50\",\n              priceText: \"+25%\"\n            },\n            {\n              value: \"51\",\n              priceText: \"+27.5%\"\n            },\n            {\n              value: \"52\",\n              priceText: \"+30%\"\n            },\n            {\n              value: \"53\",\n              priceText: \"+32.5%\"\n            },\n            {\n              value: \"54\",\n              priceText: \"+35%\"\n            },\n            {\n              value: \"55\",\n              priceText: \"+37.5%\"\n            },\n            {\n              value: \"56\",\n              priceText: \"+40%\"\n            },\n            {\n              value: \"57\",\n              priceText: \"+42.5%\"\n            },\n            {\n              value: \"58\",\n              priceText: \"+45%\"\n            },\n            {\n              value: \"59\",\n              priceText: \"+47.5%\"\n            },\n            {\n              value: \"60\",\n              priceText: \"+50%\"\n            },\n            {\n              value: \"61\",\n              priceText: \"+52.5%\"\n            },\n            {\n              value: \"62\",\n              priceText: \"+55%\"\n            },\n            {\n              value: \"63\",\n              priceText: \"+57.5%\"\n            },\n            {\n              value: \"64\",\n              priceText: \"+60%\"\n            },\n            {\n              value: \"65\",\n              priceText: \"+62.5%\"\n            },\n            {\n              value: \"66\",\n              priceText: \"+65%\"\n            },\n            {\n              value: \"67\",\n              priceText: \"+67.5%\"\n            },\n            {\n              value: \"68\",\n              priceText: \"+70%\"\n            },\n            {\n              value: \"69\",\n              priceText: \"+72.5%\"\n            },\n            {\n              value: \"70\",\n              priceText: \"+75%\"\n            },\n            {\n              value: \"71\",\n              priceText: \"+77.5%\"\n            },\n            {\n              value: \"72\",\n              priceText: \"+80%\"\n            },\n            {\n              value: \"73\",\n              priceText: \"+82.5%\"\n            },\n            {\n              value: \"74\",\n              priceText: \"+85%\"\n            },\n            {\n              value: \"75\",\n              priceText: \"+87.5%\"\n            },\n            {\n              value: \"76\",\n              priceText: \"+90%\"\n            },\n            {\n              value: \"77\",\n              priceText: \"+92.5%\"\n            },\n            {\n              value: \"78\",\n              priceText: \"+95%\"\n            },\n            {\n              value: \"79\",\n              priceText: \"+97.5%\"\n            },\n            {\n              value: \"80\",\n              priceText: \"+100%\"\n            },\n            {\n              value: \"81\",\n              priceText: \"+102.5%\"\n            },\n            {\n              value: \"82\",\n              priceText: \"+105%\"\n            },\n            {\n              value: \"83\",\n              priceText: \"+107.5%\"\n            },\n            {\n              value: \"84\",\n              priceText: \"+110%\"\n            },\n            {\n              value: \"85\",\n              priceText: \"+112.5%\"\n            },\n            {\n              value: \"86\",\n              priceText: \"+115%\"\n            },\n            {\n              value: \"87\",\n              priceText: \"+117.5%\"\n            },\n            {\n              value: \"88\",\n              priceText: \"+120%\"\n            },\n            {\n              value: \"89\",\n              priceText: \"+122.5%\"\n            },\n            {\n              value: \"90\",\n              priceText: \"+125%\"\n            },\n            {\n              value: \"91\",\n              priceText: \"+127.5%\"\n            },\n            {\n              value: \"92\",\n              priceText: \"+130%\"\n            },\n            {\n              value: \"93\",\n              priceText: \"+132.5%\"\n            },\n            {\n              value: \"94\",\n              priceText: \"+135%\"\n            },\n            {\n              value: \"95\",\n              priceText: \"+137.5%\"\n            },\n            {\n              value: \"96\",\n              priceText: \"+140%\"\n            },\n            {\n              value: \"97\",\n              priceText: \"+142.5%\"\n            },\n            {\n              value: \"98\",\n              priceText: \"+145%\"\n            },\n            {\n              value: \"99\",\n              priceText: \"+147.5%\"\n            },\n            {\n              value: \"100\",\n              priceText: \"+150%\"\n            },\n            {\n              value: \"101\",\n              priceText: \"+152.5%\"\n            },\n            {\n              value: \"102\",\n              priceText: \"+155%\"\n            },\n            {\n              value: \"103\",\n              priceText: \"+157.5%\"\n            },\n            {\n              value: \"104\",\n              priceText: \"+160%\"\n            },\n            {\n              value: \"105\",\n              priceText: \"+162.5%\"\n            },\n            {\n              value: \"106\",\n              priceText: \"+165%\"\n            },\n            {\n              value: \"107\",\n              priceText: \"+167.5%\"\n            },\n            {\n              value: \"108\",\n              priceText: \"+170%\"\n            },\n            {\n              value: \"109\",\n              priceText: \"+172.5%\"\n            },\n            {\n              value: \"110\",\n              priceText: \"+175%\"\n            },\n            {\n              value: \"111\",\n              priceText: \"+177.5%\"\n            },\n            {\n              value: \"112\",\n              priceText: \"+180%\"\n            },\n            {\n              value: \"113\",\n              priceText: \"+182.5%\"\n            },\n            {\n              value: \"114\",\n              priceText: \"+185%\"\n            },\n            {\n              value: \"115\",\n              priceText: \"+187.5%\"\n            },\n            {\n              value: \"116\",\n              priceText: \"+190%\"\n            },\n            {\n              value: \"117\",\n              priceText: \"+192.5%\"\n            },\n            {\n              value: \"118\",\n              priceText: \"+195%\"\n            },\n            {\n              value: \"119\",\n              priceText: \"+197.5%\"\n            },\n            {\n              value: \"120\",\n              priceText: \"+200%\"\n            },\n            {\n              value: \"121\",\n              priceText: \"+202.5%\"\n            },\n            {\n              value: \"122\",\n              priceText: \"+205%\"\n            },\n            {\n              value: \"123\",\n              priceText: \"+207.5%\"\n            },\n            {\n              value: \"124\",\n              priceText: \"+210%\"\n            },\n            {\n              value: \"125\",\n              priceText: \"+212.5%\"\n            },\n            {\n              value: \"126\",\n              priceText: \"+215%\"\n            },\n            {\n              value: \"127\",\n              priceText: \"+217.5%\"\n            },\n            {\n              value: \"128\",\n              priceText: \"+220%\"\n            },\n            {\n              value: \"129\",\n              priceText: \"+222.5%\"\n            },\n            {\n              value: \"130\",\n              priceText: \"+225%\"\n            },\n            {\n              value: \"131\",\n              priceText: \"+227.5%\"\n            },\n            {\n              value: \"132\",\n              priceText: \"+230%\"\n            },\n            {\n              value: \"133\",\n              priceText: \"+232.5%\"\n            },\n            {\n              value: \"134\",\n              priceText: \"+235%\"\n            },\n            {\n              value: \"135\",\n              priceText: \"+237.5%\"\n            },\n            {\n              value: \"136\",\n              priceText: \"+240%\"\n            },\n            {\n              value: \"137\",\n              priceText: \"+242.5%\"\n            },\n            {\n              value: \"138\",\n              priceText: \"+245%\"\n            },\n            {\n              value: \"139\",\n              priceText: \"+247.5%\"\n            },\n            {\n              value: \"140\",\n              priceText: \"+250%\"\n            },\n            {\n              value: \"141\",\n              priceText: \"+252.5%\"\n            },\n            {\n              value: \"142\",\n              priceText: \"+255%\"\n            },\n            {\n              value: \"143\",\n              priceText: \"+257.5%\"\n            },\n            {\n              value: \"144\",\n              priceText: \"+260%\"\n            },\n            {\n              value: \"145\",\n              priceText: \"+262.5%\"\n            },\n            {\n              value: \"146\",\n              priceText: \"+265%\"\n            },\n            {\n              value: \"147\",\n              priceText: \"+267.5%\"\n            },\n            {\n              value: \"148\",\n              priceText: \"+270%\"\n            },\n            {\n              value: \"149\",\n              priceText: \"+272.5%\"\n            },\n            {\n              value: \"150\",\n              priceText: \"+275%\"\n            },\n            {\n              value: \"151\",\n              priceText: \"+277.5%\"\n            },\n            {\n              value: \"152\",\n              priceText: \"+280%\"\n            },\n            {\n              value: \"153\",\n              priceText: \"+282.5%\"\n            },\n            {\n              value: \"154\",\n              priceText: \"+285%\"\n            },\n            {\n              value: \"155\",\n              priceText: \"+287.5%\"\n            },\n            {\n              value: \"156\",\n              priceText: \"+290%\"\n            },\n            {\n              value: \"157\",\n              priceText: \"+292.5%\"\n            },\n            {\n              value: \"158\",\n              priceText: \"+295%\"\n            },\n            {\n              value: \"159\",\n              priceText: \"+297.5%\"\n            },\n            {\n              value: \"160\",\n              priceText: \"+300%\"\n            },\n            {\n              value: \"161\",\n              priceText: \"+302.5%\"\n            },\n            {\n              value: \"162\",\n              priceText: \"+305%\"\n            },\n            {\n              value: \"163\",\n              priceText: \"+307.5%\"\n            },\n            {\n              value: \"164\",\n              priceText: \"+310%\"\n            },\n            {\n              value: \"165\",\n              priceText: \"+312.5%\"\n            },\n            {\n              value: \"166\",\n              priceText: \"+315%\"\n            },\n            {\n              value: \"167\",\n              priceText: \"+317.5%\"\n            },\n            {\n              value: \"168\",\n              priceText: \"+320%\"\n            },\n            {\n              value: \"169\",\n              priceText: \"+322.5%\"\n            },\n            {\n              value: \"170\",\n              priceText: \"+325%\"\n            },\n            {\n              value: \"171\",\n              priceText: \"+327.5%\"\n            },\n            {\n              value: \"172\",\n              priceText: \"+330%\"\n            },\n            {\n              value: \"173\",\n              priceText: \"+332.5%\"\n            },\n            {\n              value: \"174\",\n              priceText: \"+335%\"\n            },\n            {\n              value: \"175\",\n              priceText: \"+337.5%\"\n            },\n            {\n              value: \"176\",\n              priceText: \"+340%\"\n            },\n            {\n              value: \"177\",\n              priceText: \"+342.5%\"\n            },\n            {\n              value: \"178\",\n              priceText: \"+345%\"\n            },\n            {\n              value: \"179\",\n              priceText: \"+347.5%\"\n            },\n            {\n              value: \"180\",\n              priceText: \"+350%\"\n            },\n            {\n              value: \"181\",\n              priceText: \"+352.5%\"\n            },\n            {\n              value: \"182\",\n              priceText: \"+355%\"\n            },\n            {\n              value: \"183\",\n              priceText: \"+357.5%\"\n            },\n            {\n              value: \"184\",\n              priceText: \"+360%\"\n            },\n            {\n              value: \"185\",\n              priceText: \"+362.5%\"\n            },\n            {\n              value: \"186\",\n              priceText: \"+365%\"\n            },\n            {\n              value: \"187\",\n              priceText: \"+367.5%\"\n            },\n            {\n              value: \"188\",\n              priceText: \"+370%\"\n            },\n            {\n              value: \"189\",\n              priceText: \"+372.5%\"\n            },\n            {\n              value: \"190\",\n              priceText: \"+375%\"\n            },\n            {\n              value: \"191\",\n              priceText: \"+377.5%\"\n            },\n            {\n              value: \"192\",\n              priceText: \"+380%\"\n            },\n            {\n              value: \"193\",\n              priceText: \"+382.5%\"\n            },\n            {\n              value: \"194\",\n              priceText: \"+385%\"\n            },\n            {\n              value: \"195\",\n              priceText: \"+387.5%\"\n            },\n            {\n              value: \"196\",\n              priceText: \"+390%\"\n            },\n            {\n              value: \"197\",\n              priceText: \"+392.5%\"\n            },\n            {\n              value: \"198\",\n              priceText: \"+395%\"\n            },\n            {\n              value: \"199\",\n              priceText: \"+397.5%\"\n            },\n            {\n              value: \"200\",\n              priceText: \"+400%\"\n            },\n            {\n              value: \"201\",\n              priceText: \"+402.5%\"\n            },\n            {\n              value: \"202\",\n              priceText: \"+405%\"\n            },\n            {\n              value: \"203\",\n              priceText: \"+407.5%\"\n            },\n            {\n              value: \"204\",\n              priceText: \"+410%\"\n            },\n            {\n              value: \"205\",\n              priceText: \"+412.5%\"\n            },\n            {\n              value: \"206\",\n              priceText: \"+415%\"\n            },\n            {\n              value: \"207\",\n              priceText: \"+417.5%\"\n            },\n            {\n              value: \"208\",\n              priceText: \"+420%\"\n            },\n            {\n              value: \"209\",\n              priceText: \"+422.5%\"\n            },\n            {\n              value: \"210\",\n              priceText: \"+425%\"\n            },\n            {\n              value: \"211\",\n              priceText: \"+427.5%\"\n            },\n            {\n              value: \"212\",\n              priceText: \"+430%\"\n            },\n            {\n              value: \"213\",\n              priceText: \"+432.5%\"\n            },\n            {\n              value: \"214\",\n              priceText: \"+435%\"\n            },\n            {\n              value: \"215\",\n              priceText: \"+437.5%\"\n            },\n            {\n              value: \"216\",\n              priceText: \"+440%\"\n            },\n            {\n              value: \"217\",\n              priceText: \"+442.5%\"\n            },\n            {\n              value: \"218\",\n              priceText: \"+445%\"\n            },\n            {\n              value: \"219\",\n              priceText: \"+447.5%\"\n            },\n            {\n              value: \"220\",\n              priceText: \"+450%\"\n            },\n            {\n              value: \"221\",\n              priceText: \"+452.5%\"\n            },\n            {\n              value: \"222\",\n              priceText: \"+455%\"\n            },\n            {\n              value: \"223\",\n              priceText: \"+457.5%\"\n            },\n            {\n              value: \"224\",\n              priceText: \"+460%\"\n            },\n            {\n              value: \"225\",\n              priceText: \"+462.5%\"\n            },\n            {\n              value: \"226\",\n              priceText: \"+465%\"\n            },\n            {\n              value: \"227\",\n              priceText: \"+467.5%\"\n            },\n            {\n              value: \"228\",\n              priceText: \"+470%\"\n            },\n            {\n              value: \"229\",\n              priceText: \"+472.5%\"\n            },\n            {\n              value: \"230\",\n              priceText: \"+475%\"\n            },\n            {\n              value: \"231\",\n              priceText: \"+477.5%\"\n            },\n            {\n              value: \"232\",\n              priceText: \"+480%\"\n            },\n            {\n              value: \"233\",\n              priceText: \"+482.5%\"\n            },\n            {\n              value: \"234\",\n              priceText: \"+485%\"\n            },\n            {\n              value: \"235\",\n              priceText: \"+487.5%\"\n            },\n            {\n              value: \"236\",\n              priceText: \"+490%\"\n            },\n            {\n              value: \"237\",\n              priceText: \"+492.5%\"\n            },\n            {\n              value: \"238\",\n              priceText: \"+495%\"\n            },\n            {\n              value: \"239\",\n              priceText: \"+497.5%\"\n            },\n            {\n              value: \"240\",\n              priceText: \"+500%\"\n            }\n          ],\n          default: \"12\",\n          helpBoxes: [\n            {\n              style: \"info_tip\",\n              content: [\n                {\n                  type: \"link\",\n                  text: \"View the measurement guide\",\n                  url: \"#size-guidelines\"\n                }\n              ],\n              icon: \"\uD83D\uDD27\"\n            },\n            {\n              style: \"alert\",\n              content: [\n                {\n                  type: \"text\",\n                  text: \"Measurements are for one curtain panel. If you\u2019d like a pair, select a quantity of 2.  <br>Pleated and Ripple Fold styles include built-in fullness; other header styles do not.\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          key: \"height\",\n          label: \"Height (inch)\",\n          type: \"dropdown_select\",\n          required: true,\n          values: [\n            {\n              value: \"12\",\n              priceText: \"Free\"\n            },\n            {\n              value: \"13\",\n              priceText: \"+0.52%\"\n            },\n            {\n              value: \"14\",\n              priceText: \"+1.04%\"\n            },\n            {\n              value: \"15\",\n              priceText: \"+1.56%\"\n            },\n            {\n              value: \"16\",\n              priceText: \"+2.08%\"\n            },\n            {\n              value: \"17\",\n              priceText: \"+2.6%\"\n            },\n            {\n              value: \"18\",\n              priceText: \"+3.12%\"\n            },\n            {\n              value: \"19\",\n              priceText: \"+3.64%\"\n            },\n            {\n              value: \"20\",\n              priceText: \"+4.16%\"\n            },\n            {\n              value: \"21\",\n              priceText: \"+4.68%\"\n            },\n            {\n              value: \"22\",\n              priceText: \"+5.2%\"\n            },\n            {\n              value: \"23\",\n              priceText: \"+5.72%\"\n            },\n            {\n              value: \"24\",\n              priceText: \"+6.24%\"\n            },\n            {\n              value: \"25\",\n              priceText: \"+6.76%\"\n            },\n            {\n              value: \"26\",\n              priceText: \"+7.28%\"\n            },\n            {\n              value: \"27\",\n              priceText: \"+7.8%\"\n            },\n            {\n              value: \"28\",\n              priceText: \"+8.32%\"\n            },\n            {\n              value: \"29\",\n              priceText: \"+8.84%\"\n            },\n            {\n              value: \"30\",\n              priceText: \"+9.36%\"\n            },\n            {\n              value: \"31\",\n              priceText: \"+9.88%\"\n            },\n            {\n              value: \"32\",\n              priceText: \"+10.4%\"\n            },\n            {\n              value: \"33\",\n              priceText: \"+10.92%\"\n            },\n            {\n              value: \"34\",\n              priceText: \"+11.44%\"\n            },\n            {\n              value: \"35\",\n              priceText: \"+11.96%\"\n            },\n            {\n              value: \"36\",\n              priceText: \"+12.48%\"\n            },\n            {\n              value: \"37\",\n              priceText: \"+13%\"\n            },\n            {\n              value: \"38\",\n              priceText: \"+13.52%\"\n            },\n            {\n              value: \"39\",\n              priceText: \"+14.04%\"\n            },\n            {\n              value: \"40\",\n              priceText: \"+14.56%\"\n            },\n            {\n              value: \"41\",\n              priceText: \"+15.08%\"\n            },\n            {\n              value: \"42\",\n              priceText: \"+15.6%\"\n            },\n            {\n              value: \"43\",\n              priceText: \"+16.12%\"\n            },\n            {\n              value: \"44\",\n              priceText: \"+16.64%\"\n            },\n            {\n              value: \"45\",\n              priceText: \"+17.16%\"\n            },\n            {\n              value: \"46\",\n              priceText: \"+17.68%\"\n            },\n            {\n              value: \"47\",\n              priceText: \"+18.2%\"\n            },\n            {\n              value: \"48\",\n              priceText: \"+18.72%\"\n            },\n            {\n              value: \"49\",\n              priceText: \"+19.24%\"\n            },\n            {\n              value: \"50\",\n              priceText: \"+19.76%\"\n            },\n            {\n              value: \"51\",\n              priceText: \"+20.28%\"\n            },\n            {\n              value: \"52\",\n              priceText: \"+20.8%\"\n            },\n            {\n              value: \"53\",\n              priceText: \"+21.32%\"\n            },\n            {\n              value: \"54\",\n              priceText: \"+21.84%\"\n            },\n            {\n              value: \"55\",\n              priceText: \"+22.36%\"\n            },\n            {\n              value: \"56\",\n              priceText: \"+22.88%\"\n            },\n            {\n              value: \"57\",\n              priceText: \"+23.4%\"\n            },\n            {\n              value: \"58\",\n              priceText: \"+23.92%\"\n            },\n            {\n              value: \"59\",\n              priceText: \"+24.44%\"\n            },\n            {\n              value: \"60\",\n              priceText: \"+24.96%\"\n            },\n            {\n              value: \"61\",\n              priceText: \"+25.48%\"\n            },\n            {\n              value: \"62\",\n              priceText: \"+26%\"\n            },\n            {\n              value: \"63\",\n              priceText: \"+26.52%\"\n            },\n            {\n              value: \"64\",\n              priceText: \"+27.04%\"\n            },\n            {\n              value: \"65\",\n              priceText: \"+27.56%\"\n            },\n            {\n              value: \"66\",\n              priceText: \"+28.08%\"\n            },\n            {\n              value: \"67\",\n              priceText: \"+28.6%\"\n            },\n            {\n              value: \"68\",\n              priceText: \"+29.12%\"\n            },\n            {\n              value: \"69\",\n              priceText: \"+29.64%\"\n            },\n            {\n              value: \"70\",\n              priceText: \"+30.16%\"\n            },\n            {\n              value: \"71\",\n              priceText: \"+30.68%\"\n            },\n            {\n              value: \"72\",\n              priceText: \"+31.2%\"\n            },\n            {\n              value: \"73\",\n              priceText: \"+31.72%\"\n            },\n            {\n              value: \"74\",\n              priceText: \"+32.24%\"\n            },\n            {\n              value: \"75\",\n              priceText: \"+32.76%\"\n            },\n            {\n              value: \"76\",\n              priceText: \"+33.28%\"\n            },\n            {\n              value: \"77\",\n              priceText: \"+33.8%\"\n            },\n            {\n              value: \"78\",\n              priceText: \"+34.32%\"\n            },\n            {\n              value: \"79\",\n              priceText: \"+34.84%\"\n            },\n            {\n              value: \"80\",\n              priceText: \"+35.36%\"\n            },\n            {\n              value: \"81\",\n              priceText: \"+35.88%\"\n            },\n            {\n              value: \"82\",\n              priceText: \"+36.4%\"\n            },\n            {\n              value: \"83\",\n              priceText: \"+36.92%\"\n            },\n            {\n              value: \"84\",\n              priceText: \"+37.44%\"\n            },\n            {\n              value: \"85\",\n              priceText: \"+37.96%\"\n            },\n            {\n              value: \"86\",\n              priceText: \"+38.48%\"\n            },\n            {\n              value: \"87\",\n              priceText: \"+39%\"\n            },\n            {\n              value: \"88\",\n              priceText: \"+39.52%\"\n            },\n            {\n              value: \"89\",\n              priceText: \"+40.04%\"\n            },\n            {\n              value: \"90\",\n              priceText: \"+40.56%\"\n            },\n            {\n              value: \"91\",\n              priceText: \"+41.08%\"\n            },\n            {\n              value: \"92\",\n              priceText: \"+41.6%\"\n            },\n            {\n              value: \"93\",\n              priceText: \"+42.12%\"\n            },\n            {\n              value: \"94\",\n              priceText: \"+42.64%\"\n            },\n            {\n              value: \"95\",\n              priceText: \"+43.16%\"\n            },\n            {\n              value: \"96\",\n              priceText: \"+43.68%\"\n            },\n            {\n              value: \"97\",\n              priceText: \"+44.2%\"\n            },\n            {\n              value: \"98\",\n              priceText: \"+44.72%\"\n            },\n            {\n              value: \"99\",\n              priceText: \"+45.24%\"\n            },\n            {\n              value: \"100\",\n              priceText: \"+45.76%\"\n            },\n            {\n              value: \"101\",\n              priceText: \"+46.28%\"\n            },\n            {\n              value: \"102\",\n              priceText: \"+46.8%\"\n            },\n            {\n              value: \"103\",\n              priceText: \"+47.32%\"\n            },\n            {\n              value: \"104\",\n              priceText: \"+49.42%\"\n            },\n            {\n              value: \"105\",\n              priceText: \"+51.52%\"\n            },\n            {\n              value: \"106\",\n              priceText: \"+53.62%\"\n            },\n            {\n              value: \"107\",\n              priceText: \"+55.72%\"\n            },\n            {\n              value: \"108\",\n              priceText: \"+57.82%\"\n            },\n            {\n              value: \"109\",\n              priceText: \"+59.92%\"\n            },\n            {\n              value: \"110\",\n              priceText: \"+62.02%\"\n            },\n            {\n              value: \"111\",\n              priceText: \"+64.12%\"\n            },\n            {\n              value: \"112\",\n              priceText: \"+66.22%\"\n            },\n            {\n              value: \"113\",\n              priceText: \"+68.32%\"\n            },\n            {\n              value: \"114\",\n              priceText: \"+70.42%\"\n            },\n            {\n              value: \"115\",\n              priceText: \"+72.52%\"\n            },\n            {\n              value: \"116\",\n              priceText: \"+74.62%\"\n            },\n            {\n              value: \"117\",\n              priceText: \"+76.72%\"\n            },\n            {\n              value: \"118\",\n              priceText: \"+78.82%\"\n            },\n            {\n              value: \"119\",\n              priceText: \"+80.92%\"\n            },\n            {\n              value: \"120\",\n              priceText: \"+83.02%\"\n            },\n            {\n              value: \"121\",\n              priceText: \"+85.12%\"\n            },\n            {\n              value: \"122\",\n              priceText: \"+87.22%\"\n            },\n            {\n              value: \"123\",\n              priceText: \"+89.32%\"\n            },\n            {\n              value: \"124\",\n              priceText: \"+91.42%\"\n            },\n            {\n              value: \"125\",\n              priceText: \"+93.52%\"\n            },\n            {\n              value: \"126\",\n              priceText: \"+95.62%\"\n            },\n            {\n              value: \"127\",\n              priceText: \"+97.72%\"\n            },\n            {\n              value: \"128\",\n              priceText: \"+99.82%\"\n            },\n            {\n              value: \"129\",\n              priceText: \"+101.92%\"\n            },\n            {\n              value: \"130\",\n              priceText: \"+104.02%\"\n            },\n            {\n              value: \"131\",\n              priceText: \"+106.12%\"\n            },\n            {\n              value: \"132\",\n              priceText: \"+108.22%\"\n            },\n            {\n              value: \"133\",\n              priceText: \"+110.32%\"\n            },\n            {\n              value: \"134\",\n              priceText: \"+112.42%\"\n            },\n            {\n              value: \"135\",\n              priceText: \"+114.52%\"\n            },\n            {\n              value: \"136\",\n              priceText: \"+116.62%\"\n            },\n            {\n              value: \"137\",\n              priceText: \"+118.72%\"\n            },\n            {\n              value: \"138\",\n              priceText: \"+120.82%\"\n            },\n            {\n              value: \"139\",\n              priceText: \"+122.92%\"\n            },\n            {\n              value: \"140\",\n              priceText: \"+125.02%\"\n            },\n            {\n              value: \"141\",\n              priceText: \"+127.12%\"\n            },\n            {\n              value: \"142\",\n              priceText: \"+129.22%\"\n            },\n            {\n              value: \"143\",\n              priceText: \"+131.32%\"\n            },\n            {\n              value: \"144\",\n              priceText: \"+133.42%\"\n            },\n            {\n              value: \"145\",\n              priceText: \"+135.52%\"\n            },\n            {\n              value: \"146\",\n              priceText: \"+137.62%\"\n            },\n            {\n              value: \"147\",\n              priceText: \"+139.72%\"\n            },\n            {\n              value: \"148\",\n              priceText: \"+141.82%\"\n            },\n            {\n              value: \"149\",\n              priceText: \"+143.92%\"\n            },\n            {\n              value: \"150\",\n              priceText: \"+146.02%\"\n            },\n            {\n              value: \"151\",\n              priceText: \"+148.12%\"\n            },\n            {\n              value: \"152\",\n              priceText: \"+150.22%\"\n            },\n            {\n              value: \"153\",\n              priceText: \"+152.32%\"\n            },\n            {\n              value: \"154\",\n              priceText: \"+154.42%\"\n            },\n            {\n              value: \"155\",\n              priceText: \"+156.52%\"\n            },\n            {\n              value: \"156\",\n              priceText: \"+158.62%\"\n            },\n            {\n              value: \"157\",\n              priceText: \"+160.72%\"\n            },\n            {\n              value: \"158\",\n              priceText: \"+162.82%\"\n            },\n            {\n              value: \"159\",\n              priceText: \"+164.92%\"\n            },\n            {\n              value: \"160\",\n              priceText: \"+167.02%\"\n            },\n            {\n              value: \"161\",\n              priceText: \"+169.12%\"\n            },\n            {\n              value: \"162\",\n              priceText: \"+171.22%\"\n            },\n            {\n              value: \"163\",\n              priceText: \"+173.32%\"\n            },\n            {\n              value: \"164\",\n              priceText: \"+175.42%\"\n            },\n            {\n              value: \"165\",\n              priceText: \"+177.52%\"\n            },\n            {\n              value: \"166\",\n              priceText: \"+179.62%\"\n            },\n            {\n              value: \"167\",\n              priceText: \"+181.72%\"\n            },\n            {\n              value: \"168\",\n              priceText: \"+183.82%\"\n            },\n            {\n              value: \"169\",\n              priceText: \"+185.92%\"\n            },\n            {\n              value: \"170\",\n              priceText: \"+188.02%\"\n            },\n            {\n              value: \"171\",\n              priceText: \"+190.12%\"\n            },\n            {\n              value: \"172\",\n              priceText: \"+192.22%\"\n            },\n            {\n              value: \"173\",\n              priceText: \"+194.32%\"\n            },\n            {\n              value: \"174\",\n              priceText: \"+196.42%\"\n            },\n            {\n              value: \"175\",\n              priceText: \"+198.52%\"\n            },\n            {\n              value: \"176\",\n              priceText: \"+200.62%\"\n            },\n            {\n              value: \"177\",\n              priceText: \"+202.72%\"\n            },\n            {\n              value: \"178\",\n              priceText: \"+204.82%\"\n            },\n            {\n              value: \"179\",\n              priceText: \"+206.92%\"\n            },\n            {\n              value: \"180\",\n              priceText: \"+209.02%\"\n            },\n            {\n              value: \"181\",\n              priceText: \"+211.12%\"\n            },\n            {\n              value: \"182\",\n              priceText: \"+213.22%\"\n            },\n            {\n              value: \"183\",\n              priceText: \"+215.32%\"\n            },\n            {\n              value: \"184\",\n              priceText: \"+217.42%\"\n            },\n            {\n              value: \"185\",\n              priceText: \"+219.52%\"\n            },\n            {\n              value: \"186\",\n              priceText: \"+221.62%\"\n            },\n            {\n              value: \"187\",\n              priceText: \"+223.72%\"\n            },\n            {\n              value: \"188\",\n              priceText: \"+225.82%\"\n            },\n            {\n              value: \"189\",\n              priceText: \"+227.92%\"\n            },\n            {\n              value: \"190\",\n              priceText: \"+230.02%\"\n            },\n            {\n              value: \"191\",\n              priceText: \"+232.12%\"\n            },\n            {\n              value: \"192\",\n              priceText: \"+234.22%\"\n            },\n            {\n              value: \"193\",\n              priceText: \"+236.32%\"\n            },\n            {\n              value: \"194\",\n              priceText: \"+238.42%\"\n            },\n            {\n              value: \"195\",\n              priceText: \"+240.52%\"\n            },\n            {\n              value: \"196\",\n              priceText: \"+242.62%\"\n            },\n            {\n              value: \"197\",\n              priceText: \"+244.72%\"\n            },\n            {\n              value: \"198\",\n              priceText: \"+246.82%\"\n            },\n            {\n              value: \"199\",\n              priceText: \"+248.92%\"\n            },\n            {\n              value: \"200\",\n              priceText: \"+251.02%\"\n            },\n            {\n              value: \"201\",\n              priceText: \"+253.12%\"\n            },\n            {\n              value: \"202\",\n              priceText: \"+255.22%\"\n            },\n            {\n              value: \"203\",\n              priceText: \"+257.32%\"\n            },\n            {\n              value: \"204\",\n              priceText: \"+259.42%\"\n            },\n            {\n              value: \"205\",\n              priceText: \"+261.52%\"\n            },\n            {\n              value: \"206\",\n              priceText: \"+263.62%\"\n            },\n            {\n              value: \"207\",\n              priceText: \"+265.72%\"\n            },\n            {\n              value: \"208\",\n              priceText: \"+267.82%\"\n            },\n            {\n              value: \"209\",\n              priceText: \"+269.92%\"\n            },\n            {\n              value: \"210\",\n              priceText: \"+272.02%\"\n            },\n            {\n              value: \"211\",\n              priceText: \"+274.12%\"\n            },\n            {\n              value: \"212\",\n              priceText: \"+276.22%\"\n            },\n            {\n              value: \"213\",\n              priceText: \"+278.32%\"\n            },\n            {\n              value: \"214\",\n              priceText: \"+280.42%\"\n            },\n            {\n              value: \"215\",\n              priceText: \"+282.52%\"\n            },\n            {\n              value: \"216\",\n              priceText: \"+284.62%\"\n            },\n            {\n              value: \"217\",\n              priceText: \"+286.72%\"\n            },\n            {\n              value: \"218\",\n              priceText: \"+288.82%\"\n            },\n            {\n              value: \"219\",\n              priceText: \"+290.92%\"\n            },\n            {\n              value: \"220\",\n              priceText: \"+293.02%\"\n            },\n            {\n              value: \"221\",\n              priceText: \"+295.12%\"\n            },\n            {\n              value: \"222\",\n              priceText: \"+297.22%\"\n            },\n            {\n              value: \"223\",\n              priceText: \"+299.32%\"\n            },\n            {\n              value: \"224\",\n              priceText: \"+301.42%\"\n            },\n            {\n              value: \"225\",\n              priceText: \"+303.52%\"\n            },\n            {\n              value: \"226\",\n              priceText: \"+305.62%\"\n            },\n            {\n              value: \"227\",\n              priceText: \"+307.72%\"\n            },\n            {\n              value: \"228\",\n              priceText: \"+309.82%\"\n            },\n            {\n              value: \"229\",\n              priceText: \"+311.92%\"\n            },\n            {\n              value: \"230\",\n              priceText: \"+314.02%\"\n            },\n            {\n              value: \"231\",\n              priceText: \"+316.12%\"\n            },\n            {\n              value: \"232\",\n              priceText: \"+318.22%\"\n            },\n            {\n              value: \"233\",\n              priceText: \"+320.32%\"\n            },\n            {\n              value: \"234\",\n              priceText: \"+322.42%\"\n            },\n            {\n              value: \"235\",\n              priceText: \"+324.52%\"\n            },\n            {\n              value: \"236\",\n              priceText: \"+326.62%\"\n            },\n            {\n              value: \"237\",\n              priceText: \"+328.72%\"\n            },\n            {\n              value: \"238\",\n              priceText: \"+330.82%\"\n            },\n            {\n              value: \"239\",\n              priceText: \"+332.92%\"\n            },\n            {\n              value: \"240\",\n              priceText: \"+335.02%\"\n            },\n            {\n              value: \"241\",\n              priceText: \"+337.12%\"\n            },\n            {\n              value: \"242\",\n              priceText: \"+339.22%\"\n            },\n            {\n              value: \"243\",\n              priceText: \"+341.32%\"\n            },\n            {\n              value: \"244\",\n              priceText: \"+343.42%\"\n            },\n            {\n              value: \"245\",\n              priceText: \"+345.52%\"\n            },\n            {\n              value: \"246\",\n              priceText: \"+347.62%\"\n            },\n            {\n              value: \"247\",\n              priceText: \"+349.72%\"\n            },\n            {\n              value: \"248\",\n              priceText: \"+351.82%\"\n            },\n            {\n              value: \"249\",\n              priceText: \"+353.92%\"\n            },\n            {\n              value: \"250\",\n              priceText: \"+356.02%\"\n            },\n            {\n              value: \"251\",\n              priceText: \"+358.12%\"\n            },\n            {\n              value: \"252\",\n              priceText: \"+360.22%\"\n            },\n            {\n              value: \"253\",\n              priceText: \"+362.32%\"\n            },\n            {\n              value: \"254\",\n              priceText: \"+364.42%\"\n            },\n            {\n              value: \"255\",\n              priceText: \"+366.52%\"\n            },\n            {\n              value: \"256\",\n              priceText: \"+368.62%\"\n            },\n            {\n              value: \"257\",\n              priceText: \"+370.72%\"\n            },\n            {\n              value: \"258\",\n              priceText: \"+372.82%\"\n            },\n            {\n              value: \"259\",\n              priceText: \"+374.92%\"\n            },\n            {\n              value: \"260\",\n              priceText: \"+377.02%\"\n            },\n            {\n              value: \"261\",\n              priceText: \"+379.12%\"\n            },\n            {\n              value: \"262\",\n              priceText: \"+381.22%\"\n            },\n            {\n              value: \"263\",\n              priceText: \"+383.32%\"\n            },\n            {\n              value: \"264\",\n              priceText: \"+385.42%\"\n            },\n            {\n              value: \"265\",\n              priceText: \"+387.52%\"\n            },\n            {\n              value: \"266\",\n              priceText: \"+389.62%\"\n            },\n            {\n              value: \"267\",\n              priceText: \"+391.72%\"\n            },\n            {\n              value: \"268\",\n              priceText: \"+393.82%\"\n            },\n            {\n              value: \"269\",\n              priceText: \"+395.92%\"\n            },\n            {\n              value: \"270\",\n              priceText: \"+398.02%\"\n            },\n            {\n              value: \"271\",\n              priceText: \"+400.12%\"\n            },\n            {\n              value: \"272\",\n              priceText: \"+402.22%\"\n            },\n            {\n              value: \"273\",\n              priceText: \"+404.32%\"\n            },\n            {\n              value: \"274\",\n              priceText: \"+406.42%\"\n            },\n            {\n              value: \"275\",\n              priceText: \"+408.52%\"\n            },\n            {\n              value: \"276\",\n              priceText: \"+410.62%\"\n            },\n            {\n              value: \"277\",\n              priceText: \"+412.72%\"\n            },\n            {\n              value: \"278\",\n              priceText: \"+414.82%\"\n            },\n            {\n              value: \"279\",\n              priceText: \"+416.92%\"\n            },\n            {\n              value: \"280\",\n              priceText: \"+419.02%\"\n            },\n            {\n              value: \"281\",\n              priceText: \"+421.12%\"\n            },\n            {\n              value: \"282\",\n              priceText: \"+423.22%\"\n            },\n            {\n              value: \"283\",\n              priceText: \"+425.32%\"\n            },\n            {\n              value: \"284\",\n              priceText: \"+427.42%\"\n            },\n            {\n              value: \"285\",\n              priceText: \"+429.52%\"\n            },\n            {\n              value: \"286\",\n              priceText: \"+431.62%\"\n            },\n            {\n              value: \"287\",\n              priceText: \"+433.72%\"\n            },\n            {\n              value: \"288\",\n              priceText: \"+435.82%\"\n            },\n            {\n              value: \"289\",\n              priceText: \"+437.92%\"\n            },\n            {\n              value: \"290\",\n              priceText: \"+440.02%\"\n            },\n            {\n              value: \"291\",\n              priceText: \"+442.12%\"\n            },\n            {\n              value: \"292\",\n              priceText: \"+444.22%\"\n            },\n            {\n              value: \"293\",\n              priceText: \"+446.32%\"\n            },\n            {\n              value: \"294\",\n              priceText: \"+448.42%\"\n            },\n            {\n              value: \"295\",\n              priceText: \"+450.52%\"\n            },\n            {\n              value: \"296\",\n              priceText: \"+452.62%\"\n            },\n            {\n              value: \"297\",\n              priceText: \"+454.72%\"\n            },\n            {\n              value: \"298\",\n              priceText: \"+456.82%\"\n            },\n            {\n              value: \"299\",\n              priceText: \"+458.92%\"\n            },\n            {\n              value: \"300\",\n              priceText: \"+461.02%\"\n            }\n          ],\n          default: \"12\"\n        },\n        {\n          key: \"lining\",\n          label: \"Lining Backing\",\n          type: \"image_radio\",\n          required: false,\n          values: [\n            {\n              value: \"Unlined\",\n              priceText: \"Free\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/unlined__center.jpg?v=1740991045\"\n            },\n            {\n              value: \"50% Lining\",\n              priceText: \"+$31.00\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/white_lining_200x200_bb39234c-6382-4b35-942a-5381fdfba258.jpg?v=1740991138\"\n            },\n            {\n              value: \"90% Lining\",\n              priceText: \"+$32.00\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/u70kw-white_lining_200x200_b58-ymq.jpg\"\n            },\n            {\n              value: \"100% Lining\",\n              priceText: \"+$32.00\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/2024black_lining2_200x200_crop_center_705d352a-3c2f-40c8-a496-935fb7c44296.jpg?v=1740991932\"\n            }\n          ],\n          default: \"Unlined\",\n          helpBoxes: [\n            {\n              style: \"text\",\n              content: [\n                {\n                  type: \"text\",\n                  text: \"Backing blocks light and provides thermal insulation.\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          key: \"tieback\",\n          label: \"Matching Tiebacks\",\n          type: \"image_radio\",\n          required: false,\n          values: [\n            {\n              value: \"No Need\",\n              priceText: \"Free\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/a01x7q-no-ymq.jpg\"\n            },\n            {\n              value: \"Yes need the matching tieback\",\n              priceText: \"+$3.00\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/esng2t-yes-ymq.jpg\"\n            }\n          ],\n          default: \"No Need\",\n          helpBoxes: [\n            {\n              style: \"text\",\n              content: [\n                {\n                  type: \"text\",\n                  text: \"Matching fabric tiebacks to hold your curtains.\"\n                }\n              ]\n            }\n          ]\n        }\n      ],\n      tailoringDays: \"7-10\",\n      shippingDays: \"7-10\",\n      widgets: {\n        topBadges: [\n          {\n            text: \"FULL CUSTOM\",\n            bgColor: \"#727b4e\",\n            textColor: \"#ffffff\"\n          },\n          {\n            text: \"SAVE 25%\",\n            bgColor: \"#e49e6d\",\n            textColor: \"#ffffff\"\n          }\n        ],\n        sellingPoints: [\n          {\n            text: \"PET & CHILD SAFE\",\n            icon: \"Shield\"\n          },\n          {\n            text: \"ECO-FRIENDLY FABRIC\",\n            icon: \"Leaf\"\n          },\n          {\n            text: \"DURABLE FLAX BLEND\",\n            icon: \"Tag\"\n          }\n        ]\n      }\n    },\n    tem8: {\n      title: \"Roman+5Blinds_ Motorized-Lining\",\n      steps: [\n        {\n          key: \"mountType\",\n          label: \"Mount Type\",\n          type: \"image_radio\",\n          required: true,\n          values: [\n            {\n              value: \"Inside\",\n              priceText: \"Free\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/blinds1_37d72e6f-5606-48bb-ab9f-e015c516b700.png?v=1743388646\",\n              description: \"To mount the window shades within your sash.\\nCreating a streamlined, crisp look in a simple way.\\nMaximize your space without hiding your beautiful window trim.\\n*For Roman shades, we recommend a minimum window depth of 2 inches to ensure the entire shade fits within the window frame. However, since the mounting brackets for Roman shades are relatively small in size, if you don\u2019t mind a portion of the shade extending beyond the frame, a minimum depth of 1 1/4 inches is acceptable.\\n\\n*Please note that an inside mount is designed to ensure the roller shade fits within the window frame. As a result, there may be approximately 1/4\\\" light gaps on each side. If you\u2019re concerned about light leakage, we recommend choosing an outside mount.\\n\\nFor other types of shades, like bamboo shades and roller shades, the headrail size changes and will have its own frame depth requirement.\",\n              measureDescription: \"Width = Window Recess Width (take the narrowest measurement of top, middle, and bottom)\\nHeight = Window Recess Height (take the longest measurement of left, middle, and right)\\nDeduction: We will automatically make a 1/4 inch deduction on width for a clean fit.\\nMinimum Depth: 2 inches for a fully recessed inside mount.\\nNote: If your window frame depth is less than 2 inches, a portion of the shade will protrude.\",\n              measureImage: \"https://cdn.shopify.com/s/files/1/0821/4573/8996/files/Inside_center.webp?v=1780648133\"\n            },\n            {\n              value: \"Outside\",\n              priceText: \"Free\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/blinds2_f6aef208-5c53-466d-bc3f-0786a563c5cf.png?v=1743388646\",\n              description: \"A method to install the shades outside your window casing.\\nAchieve a flawless look. Covering your casing aesthetically.\\nAllow minimal light to sneak in through the gaps around the edges.\\n*Outside mount is versatile for different window types, no minimum depth is required. Ideal for any room with shallow sashes or deep window sills.\\n\\nFor other types of shades, such as bamboo shades and roller shades, the headrail size changes, and they will have their own outside mount height space requirements.\",\n              measureDescription: \"Width = Window Frame Width + 4 inches (adding 2 inches overlap on each side for better coverage)\\nHeight = Window Frame Height + 4 inches (or add more if you want the shade to mount higher)\\nNote: Outside mount requires no minimum window depth and is ideal for blocking 100% of light.\",\n              measureImage: \"https://cdn.shopify.com/s/files/1/0821/4573/8996/files/outside_center.webp?v=1780648147\"\n            }\n          ],\n          default: \"Inside\",\n          helpBoxes: [\n            {\n              style: \"text\",\n              content: [\n                {\n                  type: \"text\",\n                  text: \"Inside window frame or outside on the wall mount.\"\n                },\n                {\n                  type: \"link\",\n                  text: \"Learn more about different mount type\",\n                  url: \"#mount-guidelines\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          key: \"liftType\",\n          label: \"Lift Control System\",\n          type: \"image_radio\",\n          required: true,\n          values: [\n            {\n              value: \"Cordless(Manual)\",\n              priceText: \"+$39.00\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/Cordless.png?v=1743393019\",\n              description: \"All of our Cordless Shades feature an advanced spring system with the following advantages:\\n\\nSmooth operation \u2013 Effortlessly glide without any snags or resistance.\\nConvenient control \u2013 Stop the shades at any position with a simple pull, offering flexibility and ease.\\nDurable quality \u2013 Built to last, these shades are designed for over five years of reliable use under normal conditions.\"\n            },\n            {\n              value: \"Cordless(Motorized)\",\n              priceText: \"+$138.00\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/Motorized.png?v=1743393019\",\n              description: \"Our Motorized Shades come with a remote control as standard. The number of remotes provided will correspond to the number of rooms in your order. Before shipment, we\u2019ll pre-program each remote so it can control all motorized shades in a single room.\\n\\n1. Single shade, just install the battery and you're ready to use, the shade and the remote are ready matched\u3002\\n2. Several shades, install the battery, and adjust the remote channel with the number on the shade's top tag.\\n\\nIf you use a smart speaker such as Alexa or HomePod, our motorized shades can be connected directly for voice control.\\n\\nTypically, all motorized shades in one room are grouped under a single remote. Based on the number of shades, we\u2019ll select a remote with the appropriate number of channels. Our remotes can support up to 15 channels, allowing control of up to 15 individual shades.\\n\\nYou can operate all shades simultaneously or select an individual channel to control a specific shade on its own.\\n\\nAll our remotes use Radio Frequency (RF) technology, which means they work through walls and don\u2019t require line-of-sight.\\n\\nPlease note that the appearance of the remote may vary depending on the product. For specific details, refer to the images on the product page.\\n\\nIf you have any special requests or questions, feel free to reach out to our customer service team.\"\n            }\n          ],\n          default: \"Cordless(Manual)\",\n          helpBoxes: [\n            {\n              style: \"text\",\n              content: [\n                {\n                  type: \"link\",\n                  text: \"Learn more about different Lift Control\",\n                  url: \"#step-guidelines-liftType\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          key: \"width\",\n          label: \"Width (inch)\",\n          type: \"dropdown_select\",\n          required: true,\n          showFractions: true,\n          values: [\n            {\n              value: \"20\",\n              priceText: \"+$43.10\"\n            },\n            {\n              value: \"21\",\n              priceText: \"+$46.20\"\n            },\n            {\n              value: \"22\",\n              priceText: \"+$49.30\"\n            },\n            {\n              value: \"23\",\n              priceText: \"+$52.40\"\n            },\n            {\n              value: \"24\",\n              priceText: \"+$55.50\"\n            },\n            {\n              value: \"25\",\n              priceText: \"+$58.60\"\n            },\n            {\n              value: \"26\",\n              priceText: \"+$61.70\"\n            },\n            {\n              value: \"27\",\n              priceText: \"+$64.80\"\n            },\n            {\n              value: \"28\",\n              priceText: \"+$67.90\"\n            },\n            {\n              value: \"29\",\n              priceText: \"+$71.00\"\n            },\n            {\n              value: \"30\",\n              priceText: \"+$74.10\"\n            },\n            {\n              value: \"31\",\n              priceText: \"+$77.20\"\n            },\n            {\n              value: \"32\",\n              priceText: \"+$80.30\"\n            },\n            {\n              value: \"33\",\n              priceText: \"+$83.40\"\n            },\n            {\n              value: \"34\",\n              priceText: \"+$86.50\"\n            },\n            {\n              value: \"35\",\n              priceText: \"+$89.60\"\n            },\n            {\n              value: \"36\",\n              priceText: \"+$92.70\"\n            },\n            {\n              value: \"37\",\n              priceText: \"+$95.80\"\n            },\n            {\n              value: \"38\",\n              priceText: \"+$98.90\"\n            },\n            {\n              value: \"39\",\n              priceText: \"+$102.00\"\n            },\n            {\n              value: \"40\",\n              priceText: \"+$105.10\"\n            },\n            {\n              value: \"41\",\n              priceText: \"+$108.20\"\n            },\n            {\n              value: \"42\",\n              priceText: \"+$111.30\"\n            },\n            {\n              value: \"43\",\n              priceText: \"+$114.40\"\n            },\n            {\n              value: \"44\",\n              priceText: \"+$117.50\"\n            },\n            {\n              value: \"45\",\n              priceText: \"+$120.60\"\n            },\n            {\n              value: \"46\",\n              priceText: \"+$123.70\"\n            },\n            {\n              value: \"47\",\n              priceText: \"+$126.80\"\n            },\n            {\n              value: \"48\",\n              priceText: \"+$129.90\"\n            },\n            {\n              value: \"49\",\n              priceText: \"+$133.00\"\n            },\n            {\n              value: \"50\",\n              priceText: \"+$136.10\"\n            },\n            {\n              value: \"51\",\n              priceText: \"+$139.20\"\n            },\n            {\n              value: \"52\",\n              priceText: \"+$142.30\"\n            },\n            {\n              value: \"53\",\n              priceText: \"+$145.40\"\n            },\n            {\n              value: \"54\",\n              priceText: \"+$148.50\"\n            },\n            {\n              value: \"55\",\n              priceText: \"+$151.60\"\n            },\n            {\n              value: \"56\",\n              priceText: \"+$154.70\"\n            },\n            {\n              value: \"57\",\n              priceText: \"+$157.80\"\n            },\n            {\n              value: \"58\",\n              priceText: \"+$160.90\"\n            },\n            {\n              value: \"59\",\n              priceText: \"+$164.00\"\n            },\n            {\n              value: \"60\",\n              priceText: \"+$167.10\"\n            },\n            {\n              value: \"61\",\n              priceText: \"+$170.20\"\n            },\n            {\n              value: \"62\",\n              priceText: \"+$173.30\"\n            },\n            {\n              value: \"63\",\n              priceText: \"+$176.40\"\n            },\n            {\n              value: \"64\",\n              priceText: \"+$179.50\"\n            },\n            {\n              value: \"65\",\n              priceText: \"+$182.60\"\n            },\n            {\n              value: \"66\",\n              priceText: \"+$185.70\"\n            },\n            {\n              value: \"67\",\n              priceText: \"+$188.80\"\n            },\n            {\n              value: \"68\",\n              priceText: \"+$191.90\"\n            },\n            {\n              value: \"69\",\n              priceText: \"+$195.00\"\n            },\n            {\n              value: \"70\",\n              priceText: \"+$198.10\"\n            },\n            {\n              value: \"71\",\n              priceText: \"+$201.20\"\n            },\n            {\n              value: \"72\",\n              priceText: \"+$204.30\"\n            },\n            {\n              value: \"73\",\n              priceText: \"+$207.40\"\n            },\n            {\n              value: \"74\",\n              priceText: \"+$210.50\"\n            },\n            {\n              value: \"75\",\n              priceText: \"+$213.60\"\n            }\n          ],\n          default: \"20\",\n          helpBoxes: [\n            {\n              style: \"text\",\n              content: [\n                {\n                  type: \"text\",\n                  text: \"Input the width and length of your desired shades.\"\n                },\n                {\n                  type: \"link\",\n                  text: \"Check out the measurement guide\",\n                  url: \"#size-guidelines\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          key: \"height\",\n          label: \"Height (inch)\",\n          type: \"dropdown_select\",\n          required: true,\n          showFractions: true,\n          values: [\n            {\n              value: \"20\",\n              priceText: \"+$24.90\"\n            },\n            {\n              value: \"21\",\n              priceText: \"+$26.80\"\n            },\n            {\n              value: \"22\",\n              priceText: \"+$28.70\"\n            },\n            {\n              value: \"23\",\n              priceText: \"+$30.60\"\n            },\n            {\n              value: \"24\",\n              priceText: \"+$32.50\"\n            },\n            {\n              value: \"25\",\n              priceText: \"+$34.40\"\n            },\n            {\n              value: \"26\",\n              priceText: \"+$36.30\"\n            },\n            {\n              value: \"27\",\n              priceText: \"+$38.20\"\n            },\n            {\n              value: \"28\",\n              priceText: \"+$40.10\"\n            },\n            {\n              value: \"29\",\n              priceText: \"+$42.00\"\n            },\n            {\n              value: \"30\",\n              priceText: \"+$43.90\"\n            },\n            {\n              value: \"31\",\n              priceText: \"+$45.80\"\n            },\n            {\n              value: \"32\",\n              priceText: \"+$47.70\"\n            },\n            {\n              value: \"33\",\n              priceText: \"+$49.60\"\n            },\n            {\n              value: \"34\",\n              priceText: \"+$51.50\"\n            },\n            {\n              value: \"35\",\n              priceText: \"+$53.40\"\n            },\n            {\n              value: \"36\",\n              priceText: \"+$55.30\"\n            },\n            {\n              value: \"37\",\n              priceText: \"+$57.20\"\n            },\n            {\n              value: \"38\",\n              priceText: \"+$59.10\"\n            },\n            {\n              value: \"39\",\n              priceText: \"+$61.00\"\n            },\n            {\n              value: \"40\",\n              priceText: \"+$62.90\"\n            },\n            {\n              value: \"41\",\n              priceText: \"+$64.80\"\n            },\n            {\n              value: \"42\",\n              priceText: \"+$66.70\"\n            },\n            {\n              value: \"45\",\n              priceText: \"+$72.40\"\n            },\n            {\n              value: \"60\",\n              priceText: \"+$100.90\"\n            },\n            {\n              value: \"61\",\n              priceText: \"+$102.80\"\n            },\n            {\n              value: \"62\",\n              priceText: \"+$104.70\"\n            },\n            {\n              value: \"63\",\n              priceText: \"+$106.60\"\n            },\n            {\n              value: \"64\",\n              priceText: \"+$108.50\"\n            },\n            {\n              value: \"65\",\n              priceText: \"+$110.40\"\n            },\n            {\n              value: \"66\",\n              priceText: \"+$112.30\"\n            },\n            {\n              value: \"67\",\n              priceText: \"+$114.20\"\n            },\n            {\n              value: \"68\",\n              priceText: \"+$116.10\"\n            },\n            {\n              value: \"69\",\n              priceText: \"+$118.00\"\n            },\n            {\n              value: \"70\",\n              priceText: \"+$119.90\"\n            },\n            {\n              value: \"71\",\n              priceText: \"+$121.80\"\n            },\n            {\n              value: \"72\",\n              priceText: \"+$123.70\"\n            },\n            {\n              value: \"73\",\n              priceText: \"+$125.60\"\n            },\n            {\n              value: \"74\",\n              priceText: \"+$127.50\"\n            },\n            {\n              value: \"75\",\n              priceText: \"+$129.40\"\n            },\n            {\n              value: \"76\",\n              priceText: \"+$131.30\"\n            },\n            {\n              value: \"77\",\n              priceText: \"+$133.20\"\n            },\n            {\n              value: \"78\",\n              priceText: \"+$135.10\"\n            },\n            {\n              value: \"79\",\n              priceText: \"+$137.00\"\n            },\n            {\n              value: \"80\",\n              priceText: \"+$138.90\"\n            },\n            {\n              value: \"81\",\n              priceText: \"+$140.80\"\n            },\n            {\n              value: \"82\",\n              priceText: \"+$142.70\"\n            },\n            {\n              value: \"83\",\n              priceText: \"+$144.60\"\n            },\n            {\n              value: \"84\",\n              priceText: \"+$146.50\"\n            },\n            {\n              value: \"85\",\n              priceText: \"+$148.40\"\n            },\n            {\n              value: \"86\",\n              priceText: \"+$150.30\"\n            }\n          ],\n          default: \"20\"\n        },\n        {\n          key: \"lining\",\n          label: \"Shade Lining\",\n          type: \"image_radio\",\n          required: true,\n          values: [\n            {\n              value: \"Unlined\",\n              priceText: \"Free\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/unlined.png?v=1743390736&width=600&height=600\"\n            },\n            {\n              value: \"Privacy Lining\",\n              priceText: \"+$50.00\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/Privacy-Lining.png?v=1743390736&width=600&height=600\"\n            },\n            {\n              value: \"Blackout Lining\",\n              priceText: \"+$60.00\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/Blackout-Lining.png?v=1743390736&width=600&height=600\"\n            }\n          ],\n          default: \"Unlined\"\n        }\n      ]\n    },\n    tem205720: {\n      title: \"Malian+4Blinds_ Motorized-Lining\",\n      steps: [\n        {\n          key: \"mountType\",\n          label: \"Mount Type\",\n          type: \"image_radio\",\n          required: true,\n          values: [\n            {\n              value: \"Inside\",\n              priceText: \"Free\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/blinds1_37d72e6f-5606-48bb-ab9f-e015c516b700.png?v=1743388646\",\n              measureDescription: \"Width = Window Recess Width (take the narrowest measurement of top, middle, and bottom)\\nHeight = Window Recess Height (take the longest measurement of left, middle, and right)\\nDeduction: We will automatically make a 1/4 inch deduction on width for a clean fit.\\nMinimum Depth: 2 inches for a fully recessed inside mount.\\nNote: If your window frame depth is less than 2 inches, a portion of the shade will protrude.\",\n              measureImage: \"https://cdn.shopify.com/s/files/1/0821/4573/8996/files/Inside_center.webp?v=1780648133\"\n            },\n            {\n              value: \"Outside\",\n              priceText: \"Free\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/blinds2_f6aef208-5c53-466d-bc3f-0786a563c5cf.png?v=1743388646\",\n              measureDescription: \"Width = Window Frame Width + 4 inches (adding 2 inches overlap on each side for better coverage)\\nHeight = Window Frame Height + 4 inches (or add more if you want the shade to mount higher)\\nNote: Outside mount requires no minimum window depth and is ideal for blocking 100% of light.\",\n              measureImage: \"https://cdn.shopify.com/s/files/1/0821/4573/8996/files/outside_center.webp?v=1780648147\"\n            }\n          ],\n          default: \"Inside\",\n          helpText: undefined,\n          helpBoxes: [\n            {\n              style: \"text\",\n              content: [\n                {\n                  type: \"text\",\n                  text: \"Inside window frame or outside on the wall mount.\"\n                },\n                {\n                  type: \"link\",\n                  text: \"Learn more about different mount type\",\n                  url: \"#mount-guidelines\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          key: \"liftType\",\n          label: \"Lift Control\",\n          type: \"image_radio\",\n          required: true,\n          values: [\n            {\n              value: \" Cordless(Manual)\",\n              priceText: \"+$50.00\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/Cordless.png?v=1743393019\",\n              description: \"All of our Cordless Shades feature an advanced spring system with the following advantages:\\n\\nSmooth operation \u2013 Effortlessly glide without any snags or resistance.\\nConvenient control \u2013 Stop the shades at any position with a simple pull, offering flexibility and ease.\\nDurable quality \u2013 Built to last, these shades are designed for over five years of reliable use under normal conditions.\"\n            },\n            {\n              value: \"Cordless(Motorized)\",\n              priceText: \"+$98.00\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/Motorized.png?v=1743393019\",\n              description: \"Our Motorized Shades come with a remote control as standard. The number of remotes provided will correspond to the number of rooms in your order. Before shipment, we\u2019ll pre-program each remote so it can control all motorized shades in a single room.\\n\\n1. Single shade, just install the battery and you're ready to use, the shade and the remote are ready matched\u3002\\n2. Several shades, install the battery, and adjust the remote channel with the number on the shade's top tag.\\n\\nIf you use a smart speaker such as Alexa or HomePod, our motorized shades can be connected directly for voice control.\\n\\nTypically, all motorized shades in one room are grouped under a single remote. Based on the number of shades, we\u2019ll select a remote with the appropriate number of channels. Our remotes can support up to 15 channels, allowing control of up to 15 individual shades.\\n\\nYou can operate all shades simultaneously or select an individual channel to control a specific shade on its own.\\n\\nAll our remotes use Radio Frequency (RF) technology, which means they work through walls and don\u2019t require line-of-sight.\\n\\nPlease note that the appearance of the remote may vary depending on the product. For specific details, refer to the images on the product page.\\n\\nIf you have any special requests or questions, feel free to reach out to our customer service team.\"\n            }\n          ],\n          default: \" Cordless(Manual)\",\n          helpBoxes: [\n            {\n              style: \"text\",\n              content: [\n                {\n                  type: \"link\",\n                  text: \"Learn more about different Lift Control\",\n                  url: \"#step-guidelines-liftType\"\n                }\n              ]\n            }\n          ],\n          helpText: undefined\n        },\n        {\n          key: \"width\",\n          label: \"Width (inch)\",\n          type: \"dropdown_select\",\n          required: true,\n          showFractions: true,\n          values: [\n            {\n              value: \"20\",\n              priceText: \"+$44.00\"\n            },\n            {\n              value: \"21\",\n              priceText: \"+$45.00\"\n            },\n            {\n              value: \"22\",\n              priceText: \"+$46.00\"\n            },\n            {\n              value: \"23\",\n              priceText: \"+$47.00\"\n            },\n            {\n              value: \"24\",\n              priceText: \"+$48.00\"\n            },\n            {\n              value: \"25\",\n              priceText: \"+$49.00\"\n            },\n            {\n              value: \"26\",\n              priceText: \"+$50.00\"\n            },\n            {\n              value: \"27\",\n              priceText: \"+$51.00\"\n            },\n            {\n              value: \"28\",\n              priceText: \"+$52.00\"\n            },\n            {\n              value: \"29\",\n              priceText: \"+$53.00\"\n            },\n            {\n              value: \"30\",\n              priceText: \"+$54.00\"\n            },\n            {\n              value: \"31\",\n              priceText: \"+$56.00\"\n            },\n            {\n              value: \"32\",\n              priceText: \"+$58.00\"\n            },\n            {\n              value: \"33\",\n              priceText: \"+$60.00\"\n            },\n            {\n              value: \"34\",\n              priceText: \"+$62.00\"\n            },\n            {\n              value: \"35\",\n              priceText: \"+$64.00\"\n            },\n            {\n              value: \"36\",\n              priceText: \"+$66.00\"\n            },\n            {\n              value: \"37\",\n              priceText: \"+$68.00\"\n            },\n            {\n              value: \"38\",\n              priceText: \"+$70.00\"\n            },\n            {\n              value: \"39\",\n              priceText: \"+$72.00\"\n            },\n            {\n              value: \"40\",\n              priceText: \"+$74.00\"\n            },\n            {\n              value: \"41\",\n              priceText: \"+$77.00\"\n            },\n            {\n              value: \"42\",\n              priceText: \"+$80.00\"\n            },\n            {\n              value: \"43\",\n              priceText: \"+$83.00\"\n            },\n            {\n              value: \"44\",\n              priceText: \"+$86.00\"\n            },\n            {\n              value: \"45\",\n              priceText: \"+$89.00\"\n            },\n            {\n              value: \"46\",\n              priceText: \"+$92.00\"\n            },\n            {\n              value: \"47\",\n              priceText: \"+$95.00\"\n            },\n            {\n              value: \"48\",\n              priceText: \"+$98.00\"\n            },\n            {\n              value: \"49\",\n              priceText: \"+$101.00\"\n            },\n            {\n              value: \"50\",\n              priceText: \"+$104.00\"\n            },\n            {\n              value: \"51\",\n              priceText: \"+$107.00\"\n            },\n            {\n              value: \"52\",\n              priceText: \"+$110.00\"\n            },\n            {\n              value: \"53\",\n              priceText: \"+$113.00\"\n            },\n            {\n              value: \"54\",\n              priceText: \"+$116.00\"\n            },\n            {\n              value: \"55\",\n              priceText: \"+$119.00\"\n            },\n            {\n              value: \"56\",\n              priceText: \"+$122.00\"\n            },\n            {\n              value: \"57\",\n              priceText: \"+$125.00\"\n            },\n            {\n              value: \"58\",\n              priceText: \"+$128.00\"\n            },\n            {\n              value: \"59\",\n              priceText: \"+$131.00\"\n            },\n            {\n              value: \"60\",\n              priceText: \"+$134.00\"\n            },\n            {\n              value: \"61\",\n              priceText: \"+$137.00\"\n            },\n            {\n              value: \"62\",\n              priceText: \"+$140.00\"\n            },\n            {\n              value: \"63\",\n              priceText: \"+$143.00\"\n            },\n            {\n              value: \"64\",\n              priceText: \"+$146.00\"\n            },\n            {\n              value: \"65\",\n              priceText: \"+$149.00\"\n            },\n            {\n              value: \"66\",\n              priceText: \"+$152.00\"\n            },\n            {\n              value: \"67\",\n              priceText: \"+$155.00\"\n            },\n            {\n              value: \"68\",\n              priceText: \"+$158.00\"\n            },\n            {\n              value: \"69\",\n              priceText: \"+$161.00\"\n            },\n            {\n              value: \"70\",\n              priceText: \"+$164.00\"\n            },\n            {\n              value: \"71\",\n              priceText: \"+$167.00\"\n            },\n            {\n              value: \"72\",\n              priceText: \"+$170.00\"\n            },\n            {\n              value: \"73\",\n              priceText: \"+$173.00\"\n            },\n            {\n              value: \"74\",\n              priceText: \"+$176.00\"\n            },\n            {\n              value: \"75\",\n              priceText: \"+$179.00\"\n            }\n          ],\n          default: \"20\",\n          helpBoxes: [\n            {\n              style: \"text\",\n              content: [\n                {\n                  type: \"text\",\n                  text: \"Input the width and length of your desired shades.\"\n                },\n                {\n                  type: \"link\",\n                  text: \"Check out the measurement guide\",\n                  url: \"#size-guidelines\"\n                }\n              ]\n            }\n          ],\n          helpText: undefined\n        },\n        {\n          key: \"height\",\n          label: \"Height (inch)\",\n          type: \"dropdown_select\",\n          required: true,\n          showFractions: true,\n          values: [\n            {\n              value: \"29\",\n              priceText: \"+$39.00\"\n            },\n            {\n              value: \"30\",\n              priceText: \"+$40.00\"\n            },\n            {\n              value: \"31\",\n              priceText: \"+$41.00\"\n            },\n            {\n              value: \"32\",\n              priceText: \"+$42.00\"\n            },\n            {\n              value: \"33\",\n              priceText: \"+$43.00\"\n            },\n            {\n              value: \"34\",\n              priceText: \"+$44.00\"\n            },\n            {\n              value: \"35\",\n              priceText: \"+$45.00\"\n            },\n            {\n              value: \"36\",\n              priceText: \"+$46.00\"\n            },\n            {\n              value: \"37\",\n              priceText: \"+$47.00\"\n            },\n            {\n              value: \"38\",\n              priceText: \"+$48.00\"\n            },\n            {\n              value: \"39\",\n              priceText: \"+$49.00\"\n            },\n            {\n              value: \"40\",\n              priceText: \"+$50.00\"\n            },\n            {\n              value: \"41\",\n              priceText: \"+$51.00\"\n            },\n            {\n              value: \"42\",\n              priceText: \"+$52.00\"\n            },\n            {\n              value: \"43\",\n              priceText: \"+$53.00\"\n            },\n            {\n              value: \"44\",\n              priceText: \"+$54.00\"\n            },\n            {\n              value: \"45\",\n              priceText: \"+$55.00\"\n            },\n            {\n              value: \"46\",\n              priceText: \"+$56.00\"\n            },\n            {\n              value: \"47\",\n              priceText: \"+$57.00\"\n            },\n            {\n              value: \"48\",\n              priceText: \"+$58.00\"\n            },\n            {\n              value: \"49\",\n              priceText: \"+$59.00\"\n            },\n            {\n              value: \"50\",\n              priceText: \"+$60.00\"\n            },\n            {\n              value: \"51\",\n              priceText: \"+$61.00\"\n            },\n            {\n              value: \"52\",\n              priceText: \"+$62.00\"\n            },\n            {\n              value: \"53\",\n              priceText: \"+$63.00\"\n            },\n            {\n              value: \"54\",\n              priceText: \"+$64.00\"\n            },\n            {\n              value: \"55\",\n              priceText: \"+$65.00\"\n            },\n            {\n              value: \"56\",\n              priceText: \"+$66.00\"\n            },\n            {\n              value: \"57\",\n              priceText: \"+$67.00\"\n            },\n            {\n              value: \"58\",\n              priceText: \"+$68.00\"\n            },\n            {\n              value: \"59\",\n              priceText: \"+$69.00\"\n            },\n            {\n              value: \"60\",\n              priceText: \"+$70.00\"\n            },\n            {\n              value: \"61\",\n              priceText: \"+$71.00\"\n            },\n            {\n              value: \"62\",\n              priceText: \"+$72.00\"\n            },\n            {\n              value: \"63\",\n              priceText: \"+$73.00\"\n            },\n            {\n              value: \"64\",\n              priceText: \"+$74.00\"\n            },\n            {\n              value: \"65\",\n              priceText: \"+$75.00\"\n            },\n            {\n              value: \"66\",\n              priceText: \"+$76.00\"\n            },\n            {\n              value: \"67\",\n              priceText: \"+$77.00\"\n            },\n            {\n              value: \"68\",\n              priceText: \"+$78.00\"\n            },\n            {\n              value: \"69\",\n              priceText: \"+$79.00\"\n            },\n            {\n              value: \"70\",\n              priceText: \"+$80.00\"\n            },\n            {\n              value: \"71\",\n              priceText: \"+$81.00\"\n            },\n            {\n              value: \"72\",\n              priceText: \"+$82.00\"\n            },\n            {\n              value: \"73\",\n              priceText: \"+$83.00\"\n            },\n            {\n              value: \"74\",\n              priceText: \"+$84.00\"\n            },\n            {\n              value: \"75\",\n              priceText: \"+$85.00\"\n            },\n            {\n              value: \"76\",\n              priceText: \"+$86.00\"\n            },\n            {\n              value: \"77\",\n              priceText: \"+$87.00\"\n            },\n            {\n              value: \"78\",\n              priceText: \"+$88.00\"\n            },\n            {\n              value: \"79\",\n              priceText: \"+$89.00\"\n            },\n            {\n              value: \"80\",\n              priceText: \"+$90.00\"\n            }\n          ],\n          default: \"29\"\n        },\n        {\n          key: \"edgeBinding\",\n          label: \"Edge Binding Decorative Options\",\n          type: \"image_radio\",\n          required: false,\n          values: [\n            {\n              value: \"No Edge Binding\",\n              priceText: \"Free\",\n              image: \"https://cdn.shopify.com/s/files/1/0821/4573/8996/files/8e6b3f2b00.png?v=1780884128\"\n            },\n            {\n              value: \"brown edge\",\n              priceText: \"Free\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/1eakees-20260108172504_67_606-ymq.jpg\"\n            },\n            {\n              value: \"Coffee edge\",\n              priceText: \"Free\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/brkx4b-20260108172502_66_606-ymq.jpg\"\n            },\n            {\n              value: \"dark edge\",\n              priceText: \"Free\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/gncdwt-20260108172500_64_606-ymq.jpg\"\n            }\n          ],\n          default: \"No Edge Binding\"\n        }\n      ]\n    },\n    tem205858: {\n      title: \"Roller Shades+3.5_ Motorized-Lining-copy\",\n      steps: [\n        {\n          key: \"mountType\",\n          label: \"Mount Type\",\n          type: \"image_radio\",\n          required: true,\n          values: [\n            {\n              value: \"Inside\",\n              priceText: \"Free\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/blinds1_37d72e6f-5606-48bb-ab9f-e015c516b700.png?v=1743388646\",\n              measureDescription: \"Width = Window Recess Width (take the narrowest measurement of top, middle, and bottom)\\nHeight = Window Recess Height (take the longest measurement of left, middle, and right)\\nDeduction: We will automatically make a 1/4 inch deduction on width for a clean fit.\\nMinimum Depth: 2 inches for a fully recessed inside mount.\\nNote: If your window frame depth is less than 2 inches, a portion of the shade will protrude.\",\n              measureImage: \"https://cdn.shopify.com/s/files/1/0821/4573/8996/files/Inside_center.webp?v=1780648133\"\n            },\n            {\n              value: \"Outside\",\n              priceText: \"Free\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/blinds2_f6aef208-5c53-466d-bc3f-0786a563c5cf.png?v=1743388646\",\n              measureDescription: \"Width = Window Frame Width + 4 inches (adding 2 inches overlap on each side for better coverage)\\nHeight = Window Frame Height + 4 inches (or add more if you want the shade to mount higher)\\nNote: Outside mount requires no minimum window depth and is ideal for blocking 100% of light.\",\n              measureImage: \"https://cdn.shopify.com/s/files/1/0821/4573/8996/files/outside_center.webp?v=1780648147\"\n            }\n          ],\n          default: \"Inside\",\n          helpText: undefined,\n          helpBoxes: [\n            {\n              style: \"text\",\n              content: [\n                {\n                  type: \"text\",\n                  text: \"Inside window frame or outside on the wall mount.\"\n                },\n                {\n                  type: \"link\",\n                  text: \"Learn more about different mount type\",\n                  url: \"#mount-guidelines\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          key: \"liftType\",\n          label: \"Lift Type\",\n          type: \"image_radio\",\n          required: true,\n          values: [\n            {\n              value: \" Cordless(Manual)\",\n              priceText: \"+$40.00\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/Cordless.png?v=1743393019\",\n              description: \"All of our Cordless Shades feature an advanced spring system with the following advantages:\\n\\nSmooth operation \u2013 Effortlessly glide without any snags or resistance.\\nConvenient control \u2013 Stop the shades at any position with a simple pull, offering flexibility and ease.\\nDurable quality \u2013 Built to last, these shades are designed for over five years of reliable use under normal conditions.\"\n            },\n            {\n              value: \"Cordless(Motorized)\",\n              priceText: \"+$139.00\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/Motorized.png?v=1743393019\",\n              description: \"Our Motorized Shades come with a remote control as standard. The number of remotes provided will correspond to the number of rooms in your order. Before shipment, we\u2019ll pre-program each remote so it can control all motorized shades in a single room.\\n\\n1. Single shade, just install the battery and you're ready to use, the shade and the remote are ready matched\u3002\\n2. Several shades, install the battery, and adjust the remote channel with the number on the shade's top tag.\\n\\nIf you use a smart speaker such as Alexa or HomePod, our motorized shades can be connected directly for voice control.\\n\\nTypically, all motorized shades in one room are grouped under a single remote. Based on the number of shades, we\u2019ll select a remote with the appropriate number of channels. Our remotes can support up to 15 channels, allowing control of up to 15 individual shades.\\n\\nYou can operate all shades simultaneously or select an individual channel to control a specific shade on its own.\\n\\nAll our remotes use Radio Frequency (RF) technology, which means they work through walls and don\u2019t require line-of-sight.\\n\\nPlease note that the appearance of the remote may vary depending on the product. For specific details, refer to the images on the product page.\\n\\nIf you have any special requests or questions, feel free to reach out to our customer service team.\"\n            }\n          ],\n          default: \" Cordless(Manual)\",\n          helpBoxes: [\n            {\n              style: \"text\",\n              content: [\n                {\n                  type: \"link\",\n                  text: \"Learn more about different Lift Control\",\n                  url: \"#step-guidelines-liftType\"\n                }\n              ]\n            }\n          ],\n          helpText: undefined\n        },\n        {\n          key: \"width\",\n          label: \"Width (inch)\",\n          type: \"dropdown_select\",\n          required: true,\n          values: [\n            {\n              value: \"20\",\n              priceText: \"+$2.00\"\n            },\n            {\n              value: \"21\",\n              priceText: \"+$4.00\"\n            },\n            {\n              value: \"22\",\n              priceText: \"+$6.00\"\n            },\n            {\n              value: \"23\",\n              priceText: \"+$8.00\"\n            },\n            {\n              value: \"24\",\n              priceText: \"+$10.00\"\n            },\n            {\n              value: \"25\",\n              priceText: \"+$12.00\"\n            },\n            {\n              value: \"26\",\n              priceText: \"+$14.00\"\n            },\n            {\n              value: \"27\",\n              priceText: \"+$16.00\"\n            },\n            {\n              value: \"28\",\n              priceText: \"+$18.00\"\n            },\n            {\n              value: \"29\",\n              priceText: \"+$20.00\"\n            },\n            {\n              value: \"30\",\n              priceText: \"+$22.00\"\n            },\n            {\n              value: \"31\",\n              priceText: \"+$24.00\"\n            },\n            {\n              value: \"32\",\n              priceText: \"+$26.00\"\n            },\n            {\n              value: \"33\",\n              priceText: \"+$28.00\"\n            },\n            {\n              value: \"34\",\n              priceText: \"+$30.00\"\n            },\n            {\n              value: \"35\",\n              priceText: \"+$32.00\"\n            },\n            {\n              value: \"36\",\n              priceText: \"+$34.00\"\n            },\n            {\n              value: \"37\",\n              priceText: \"+$36.00\"\n            },\n            {\n              value: \"38\",\n              priceText: \"+$38.00\"\n            },\n            {\n              value: \"39\",\n              priceText: \"+$40.00\"\n            },\n            {\n              value: \"40\",\n              priceText: \"+$42.00\"\n            },\n            {\n              value: \"41\",\n              priceText: \"+$44.00\"\n            },\n            {\n              value: \"42\",\n              priceText: \"+$46.00\"\n            },\n            {\n              value: \"43\",\n              priceText: \"+$48.00\"\n            },\n            {\n              value: \"44\",\n              priceText: \"+$50.00\"\n            },\n            {\n              value: \"45\",\n              priceText: \"+$52.00\"\n            },\n            {\n              value: \"46\",\n              priceText: \"+$54.00\"\n            },\n            {\n              value: \"47\",\n              priceText: \"+$56.00\"\n            },\n            {\n              value: \"48\",\n              priceText: \"+$58.00\"\n            },\n            {\n              value: \"49\",\n              priceText: \"+$60.00\"\n            },\n            {\n              value: \"50\",\n              priceText: \"+$62.00\"\n            },\n            {\n              value: \"51\",\n              priceText: \"+$64.00\"\n            },\n            {\n              value: \"52\",\n              priceText: \"+$66.00\"\n            },\n            {\n              value: \"53\",\n              priceText: \"+$68.00\"\n            },\n            {\n              value: \"54\",\n              priceText: \"+$70.00\"\n            },\n            {\n              value: \"55\",\n              priceText: \"+$72.00\"\n            },\n            {\n              value: \"56\",\n              priceText: \"+$74.00\"\n            },\n            {\n              value: \"57\",\n              priceText: \"+$76.00\"\n            },\n            {\n              value: \"58\",\n              priceText: \"+$78.00\"\n            },\n            {\n              value: \"59\",\n              priceText: \"+$80.00\"\n            },\n            {\n              value: \"60\",\n              priceText: \"+$82.00\"\n            },\n            {\n              value: \"61\",\n              priceText: \"+$84.00\"\n            },\n            {\n              value: \"62\",\n              priceText: \"+$86.00\"\n            },\n            {\n              value: \"63\",\n              priceText: \"+$88.00\"\n            },\n            {\n              value: \"64\",\n              priceText: \"+$90.00\"\n            },\n            {\n              value: \"65\",\n              priceText: \"+$92.00\"\n            },\n            {\n              value: \"66\",\n              priceText: \"+$94.00\"\n            },\n            {\n              value: \"67\",\n              priceText: \"+$96.00\"\n            },\n            {\n              value: \"68\",\n              priceText: \"+$98.00\"\n            },\n            {\n              value: \"69\",\n              priceText: \"+$100.00\"\n            },\n            {\n              value: \"70\",\n              priceText: \"+$102.00\"\n            },\n            {\n              value: \"71\",\n              priceText: \"+$104.00\"\n            },\n            {\n              value: \"72\",\n              priceText: \"+$106.00\"\n            },\n            {\n              value: \"73\",\n              priceText: \"+$108.00\"\n            },\n            {\n              value: \"74\",\n              priceText: \"+$110.00\"\n            },\n            {\n              value: \"75\",\n              priceText: \"+$112.00\"\n            }\n          ],\n          default: \"20\",\n          helpBoxes: [\n            {\n              style: \"text\",\n              content: [\n                {\n                  type: \"text\",\n                  text: \"Input the width and length of your desired shades.\"\n                },\n                {\n                  type: \"link\",\n                  text: \"Check out the measurement guide\",\n                  url: \"#size-guidelines\"\n                }\n              ]\n            }\n          ],\n          helpText: undefined,\n          showFractions: true\n        },\n        {\n          key: \"height\",\n          label: \"Height (inch)\",\n          type: \"dropdown_select\",\n          required: true,\n          values: [\n            {\n              value: \"20\",\n              priceText: \"+$1.50\"\n            },\n            {\n              value: \"21\",\n              priceText: \"+$3.00\"\n            },\n            {\n              value: \"22\",\n              priceText: \"+$4.50\"\n            },\n            {\n              value: \"23\",\n              priceText: \"+$6.00\"\n            },\n            {\n              value: \"24\",\n              priceText: \"+$7.50\"\n            },\n            {\n              value: \"25\",\n              priceText: \"+$9.00\"\n            },\n            {\n              value: \"26\",\n              priceText: \"+$10.50\"\n            },\n            {\n              value: \"27\",\n              priceText: \"+$12.00\"\n            },\n            {\n              value: \"28\",\n              priceText: \"+$13.50\"\n            },\n            {\n              value: \"29\",\n              priceText: \"+$15.00\"\n            },\n            {\n              value: \"30\",\n              priceText: \"+$16.50\"\n            },\n            {\n              value: \"31\",\n              priceText: \"+$18.00\"\n            },\n            {\n              value: \"32\",\n              priceText: \"+$19.50\"\n            },\n            {\n              value: \"33\",\n              priceText: \"+$21.00\"\n            },\n            {\n              value: \"34\",\n              priceText: \"+$22.50\"\n            },\n            {\n              value: \"35\",\n              priceText: \"+$24.00\"\n            },\n            {\n              value: \"36\",\n              priceText: \"+$25.50\"\n            },\n            {\n              value: \"37\",\n              priceText: \"+$27.00\"\n            },\n            {\n              value: \"38\",\n              priceText: \"+$28.50\"\n            },\n            {\n              value: \"39\",\n              priceText: \"+$30.00\"\n            },\n            {\n              value: \"40\",\n              priceText: \"+$31.50\"\n            },\n            {\n              value: \"41\",\n              priceText: \"+$33.00\"\n            },\n            {\n              value: \"42\",\n              priceText: \"+$34.50\"\n            },\n            {\n              value: \"43\",\n              priceText: \"+$36.00\"\n            },\n            {\n              value: \"44\",\n              priceText: \"+$37.50\"\n            },\n            {\n              value: \"45\",\n              priceText: \"+$39.00\"\n            },\n            {\n              value: \"46\",\n              priceText: \"+$40.50\"\n            },\n            {\n              value: \"47\",\n              priceText: \"+$42.00\"\n            },\n            {\n              value: \"48\",\n              priceText: \"+$43.50\"\n            },\n            {\n              value: \"49\",\n              priceText: \"+$45.00\"\n            },\n            {\n              value: \"50\",\n              priceText: \"+$46.50\"\n            },\n            {\n              value: \"51\",\n              priceText: \"+$48.00\"\n            },\n            {\n              value: \"52\",\n              priceText: \"+$49.50\"\n            },\n            {\n              value: \"53\",\n              priceText: \"+$51.00\"\n            },\n            {\n              value: \"54\",\n              priceText: \"+$52.50\"\n            },\n            {\n              value: \"55\",\n              priceText: \"+$54.00\"\n            },\n            {\n              value: \"56\",\n              priceText: \"+$55.50\"\n            },\n            {\n              value: \"57\",\n              priceText: \"+$57.00\"\n            },\n            {\n              value: \"58\",\n              priceText: \"+$58.50\"\n            },\n            {\n              value: \"59\",\n              priceText: \"+$60.00\"\n            },\n            {\n              value: \"60\",\n              priceText: \"+$61.50\"\n            },\n            {\n              value: \"61\",\n              priceText: \"+$63.00\"\n            },\n            {\n              value: \"62\",\n              priceText: \"+$64.50\"\n            },\n            {\n              value: \"63\",\n              priceText: \"+$66.00\"\n            },\n            {\n              value: \"64\",\n              priceText: \"+$67.50\"\n            },\n            {\n              value: \"65\",\n              priceText: \"+$69.00\"\n            },\n            {\n              value: \"66\",\n              priceText: \"+$70.50\"\n            },\n            {\n              value: \"67\",\n              priceText: \"+$72.00\"\n            },\n            {\n              value: \"68\",\n              priceText: \"+$73.50\"\n            },\n            {\n              value: \"69\",\n              priceText: \"+$75.00\"\n            },\n            {\n              value: \"70\",\n              priceText: \"+$76.50\"\n            },\n            {\n              value: \"71\",\n              priceText: \"+$78.00\"\n            },\n            {\n              value: \"72\",\n              priceText: \"+$79.50\"\n            },\n            {\n              value: \"73\",\n              priceText: \"+$81.00\"\n            },\n            {\n              value: \"74\",\n              priceText: \"+$82.50\"\n            },\n            {\n              value: \"75\",\n              priceText: \"+$84.00\"\n            },\n            {\n              value: \"76\",\n              priceText: \"+$85.50\"\n            },\n            {\n              value: \"77\",\n              priceText: \"+$87.00\"\n            },\n            {\n              value: \"78\",\n              priceText: \"+$88.50\"\n            },\n            {\n              value: \"79\",\n              priceText: \"+$90.00\"\n            },\n            {\n              value: \"80\",\n              priceText: \"+$91.50\"\n            },\n            {\n              value: \"81\",\n              priceText: \"+$93.00\"\n            },\n            {\n              value: \"82\",\n              priceText: \"+$94.50\"\n            },\n            {\n              value: \"83\",\n              priceText: \"+$96.00\"\n            },\n            {\n              value: \"84\",\n              priceText: \"+$97.50\"\n            },\n            {\n              value: \"85\",\n              priceText: \"+$99.00\"\n            },\n            {\n              value: \"86\",\n              priceText: \"+$100.50\"\n            }\n          ],\n          default: \"20\",\n          showFractions: true\n        }\n      ]\n    },\n    tem205864: {\n      title: \"Shangri-La Shades+3.5_ Motorized-NOLining\",\n      steps: [\n        {\n          key: \"mountType\",\n          label: \"Mount Type\",\n          type: \"image_radio\",\n          required: true,\n          values: [\n            {\n              value: \"Inside\",\n              priceText: \"Free\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/blinds1_37d72e6f-5606-48bb-ab9f-e015c516b700.png?v=1743388646\"\n            },\n            {\n              value: \"Outside\",\n              priceText: \"Free\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/blinds2_f6aef208-5c53-466d-bc3f-0786a563c5cf.png?v=1743388646\"\n            }\n          ],\n          default: \"Inside\"\n        },\n        {\n          key: \"liftType\",\n          label: \"Control Mechanism\",\n          type: \"image_radio\",\n          required: true,\n          values: [\n            {\n              value: \"Cord Lift\",\n              priceText: \"Free\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/1p3rfob-ifX19-ymq.jpg\"\n            },\n            {\n              value: \"Cordless(Motorized)\",\n              priceText: \"+$98.00\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/Motorized.png?v=1743393019\"\n            }\n          ],\n          default: \"Cord Lift\"\n        },\n        {\n          key: \"width\",\n          label: \"Width (inch)\",\n          type: \"dropdown_select\",\n          required: true,\n          showFractions: true,\n          values: [\n            {\n              value: \"20\",\n              priceText: \"+$2.00\"\n            },\n            {\n              value: \"21\",\n              priceText: \"+$4.00\"\n            },\n            {\n              value: \"22\",\n              priceText: \"+$6.00\"\n            },\n            {\n              value: \"23\",\n              priceText: \"+$8.00\"\n            },\n            {\n              value: \"24\",\n              priceText: \"+$10.00\"\n            },\n            {\n              value: \"25\",\n              priceText: \"+$12.00\"\n            },\n            {\n              value: \"26\",\n              priceText: \"+$14.00\"\n            },\n            {\n              value: \"27\",\n              priceText: \"+$16.00\"\n            },\n            {\n              value: \"28\",\n              priceText: \"+$18.00\"\n            },\n            {\n              value: \"29\",\n              priceText: \"+$20.00\"\n            },\n            {\n              value: \"30\",\n              priceText: \"+$22.00\"\n            },\n            {\n              value: \"31\",\n              priceText: \"+$24.00\"\n            },\n            {\n              value: \"32\",\n              priceText: \"+$26.00\"\n            },\n            {\n              value: \"33\",\n              priceText: \"+$28.00\"\n            },\n            {\n              value: \"34\",\n              priceText: \"+$30.00\"\n            },\n            {\n              value: \"35\",\n              priceText: \"+$32.00\"\n            },\n            {\n              value: \"36\",\n              priceText: \"+$34.00\"\n            },\n            {\n              value: \"37\",\n              priceText: \"+$36.00\"\n            },\n            {\n              value: \"38\",\n              priceText: \"+$38.00\"\n            },\n            {\n              value: \"39\",\n              priceText: \"+$40.00\"\n            },\n            {\n              value: \"40\",\n              priceText: \"+$42.00\"\n            },\n            {\n              value: \"41\",\n              priceText: \"+$44.00\"\n            },\n            {\n              value: \"42\",\n              priceText: \"+$46.00\"\n            },\n            {\n              value: \"43\",\n              priceText: \"+$48.00\"\n            },\n            {\n              value: \"44\",\n              priceText: \"+$50.00\"\n            },\n            {\n              value: \"45\",\n              priceText: \"+$52.00\"\n            },\n            {\n              value: \"46\",\n              priceText: \"+$54.00\"\n            },\n            {\n              value: \"47\",\n              priceText: \"+$56.00\"\n            },\n            {\n              value: \"48\",\n              priceText: \"+$58.00\"\n            },\n            {\n              value: \"49\",\n              priceText: \"+$60.00\"\n            },\n            {\n              value: \"50\",\n              priceText: \"+$62.00\"\n            },\n            {\n              value: \"51\",\n              priceText: \"+$64.00\"\n            },\n            {\n              value: \"52\",\n              priceText: \"+$66.00\"\n            },\n            {\n              value: \"53\",\n              priceText: \"+$68.00\"\n            },\n            {\n              value: \"54\",\n              priceText: \"+$70.00\"\n            },\n            {\n              value: \"55\",\n              priceText: \"+$72.00\"\n            },\n            {\n              value: \"56\",\n              priceText: \"+$74.00\"\n            },\n            {\n              value: \"57\",\n              priceText: \"+$76.00\"\n            },\n            {\n              value: \"58\",\n              priceText: \"+$78.00\"\n            },\n            {\n              value: \"59\",\n              priceText: \"+$80.00\"\n            },\n            {\n              value: \"60\",\n              priceText: \"+$82.00\"\n            },\n            {\n              value: \"61\",\n              priceText: \"+$84.00\"\n            },\n            {\n              value: \"62\",\n              priceText: \"+$86.00\"\n            },\n            {\n              value: \"63\",\n              priceText: \"+$88.00\"\n            },\n            {\n              value: \"64\",\n              priceText: \"+$90.00\"\n            },\n            {\n              value: \"65\",\n              priceText: \"+$92.00\"\n            },\n            {\n              value: \"66\",\n              priceText: \"+$94.00\"\n            },\n            {\n              value: \"67\",\n              priceText: \"+$96.00\"\n            },\n            {\n              value: \"68\",\n              priceText: \"+$98.00\"\n            },\n            {\n              value: \"69\",\n              priceText: \"+$100.00\"\n            },\n            {\n              value: \"70\",\n              priceText: \"+$102.00\"\n            },\n            {\n              value: \"71\",\n              priceText: \"+$104.00\"\n            },\n            {\n              value: \"72\",\n              priceText: \"+$106.00\"\n            },\n            {\n              value: \"73\",\n              priceText: \"+$108.00\"\n            },\n            {\n              value: \"74\",\n              priceText: \"+$110.00\"\n            },\n            {\n              value: \"75\",\n              priceText: \"+$112.00\"\n            }\n          ],\n          default: \"20\"\n        },\n        {\n          key: \"height\",\n          label: \"Height (inch)\",\n          type: \"dropdown_select\",\n          required: true,\n          showFractions: true,\n          values: [\n            {\n              value: \"20\",\n              priceText: \"+$1.50\"\n            },\n            {\n              value: \"21\",\n              priceText: \"+$3.00\"\n            },\n            {\n              value: \"22\",\n              priceText: \"+$4.50\"\n            },\n            {\n              value: \"23\",\n              priceText: \"+$6.00\"\n            },\n            {\n              value: \"24\",\n              priceText: \"+$7.50\"\n            },\n            {\n              value: \"25\",\n              priceText: \"+$9.00\"\n            },\n            {\n              value: \"26\",\n              priceText: \"+$10.50\"\n            },\n            {\n              value: \"27\",\n              priceText: \"+$12.00\"\n            },\n            {\n              value: \"28\",\n              priceText: \"+$13.50\"\n            },\n            {\n              value: \"29\",\n              priceText: \"+$15.00\"\n            },\n            {\n              value: \"30\",\n              priceText: \"+$16.50\"\n            },\n            {\n              value: \"31\",\n              priceText: \"+$18.00\"\n            },\n            {\n              value: \"32\",\n              priceText: \"+$19.50\"\n            },\n            {\n              value: \"33\",\n              priceText: \"+$21.00\"\n            },\n            {\n              value: \"34\",\n              priceText: \"+$22.50\"\n            },\n            {\n              value: \"35\",\n              priceText: \"+$24.00\"\n            },\n            {\n              value: \"36\",\n              priceText: \"+$25.50\"\n            },\n            {\n              value: \"37\",\n              priceText: \"+$27.00\"\n            },\n            {\n              value: \"38\",\n              priceText: \"+$28.50\"\n            },\n            {\n              value: \"39\",\n              priceText: \"+$30.00\"\n            },\n            {\n              value: \"40\",\n              priceText: \"+$31.50\"\n            },\n            {\n              value: \"41\",\n              priceText: \"+$33.00\"\n            },\n            {\n              value: \"42\",\n              priceText: \"+$34.50\"\n            },\n            {\n              value: \"43\",\n              priceText: \"+$36.00\"\n            },\n            {\n              value: \"44\",\n              priceText: \"+$37.50\"\n            },\n            {\n              value: \"45\",\n              priceText: \"+$39.00\"\n            },\n            {\n              value: \"46\",\n              priceText: \"+$40.50\"\n            },\n            {\n              value: \"47\",\n              priceText: \"+$42.00\"\n            },\n            {\n              value: \"48\",\n              priceText: \"+$43.50\"\n            },\n            {\n              value: \"49\",\n              priceText: \"+$45.00\"\n            },\n            {\n              value: \"50\",\n              priceText: \"+$46.50\"\n            },\n            {\n              value: \"51\",\n              priceText: \"+$48.00\"\n            },\n            {\n              value: \"52\",\n              priceText: \"+$49.50\"\n            },\n            {\n              value: \"53\",\n              priceText: \"+$51.00\"\n            },\n            {\n              value: \"54\",\n              priceText: \"+$52.50\"\n            },\n            {\n              value: \"55\",\n              priceText: \"+$54.00\"\n            },\n            {\n              value: \"56\",\n              priceText: \"+$55.50\"\n            },\n            {\n              value: \"57\",\n              priceText: \"+$57.00\"\n            },\n            {\n              value: \"58\",\n              priceText: \"+$58.50\"\n            },\n            {\n              value: \"59\",\n              priceText: \"+$60.00\"\n            },\n            {\n              value: \"60\",\n              priceText: \"+$61.50\"\n            },\n            {\n              value: \"61\",\n              priceText: \"+$63.00\"\n            },\n            {\n              value: \"62\",\n              priceText: \"+$64.50\"\n            },\n            {\n              value: \"63\",\n              priceText: \"+$66.00\"\n            },\n            {\n              value: \"64\",\n              priceText: \"+$67.50\"\n            },\n            {\n              value: \"65\",\n              priceText: \"+$69.00\"\n            },\n            {\n              value: \"66\",\n              priceText: \"+$70.50\"\n            },\n            {\n              value: \"67\",\n              priceText: \"+$72.00\"\n            },\n            {\n              value: \"68\",\n              priceText: \"+$73.50\"\n            },\n            {\n              value: \"69\",\n              priceText: \"+$75.00\"\n            },\n            {\n              value: \"70\",\n              priceText: \"+$76.50\"\n            },\n            {\n              value: \"71\",\n              priceText: \"+$78.00\"\n            },\n            {\n              value: \"72\",\n              priceText: \"+$79.50\"\n            },\n            {\n              value: \"73\",\n              priceText: \"+$81.00\"\n            },\n            {\n              value: \"74\",\n              priceText: \"+$82.50\"\n            },\n            {\n              value: \"75\",\n              priceText: \"+$84.00\"\n            },\n            {\n              value: \"76\",\n              priceText: \"+$85.50\"\n            },\n            {\n              value: \"77\",\n              priceText: \"+$87.00\"\n            },\n            {\n              value: \"78\",\n              priceText: \"+$88.50\"\n            },\n            {\n              value: \"79\",\n              priceText: \"+$90.00\"\n            },\n            {\n              value: \"80\",\n              priceText: \"+$91.50\"\n            },\n            {\n              value: \"81\",\n              priceText: \"+$93.00\"\n            },\n            {\n              value: \"82\",\n              priceText: \"+$94.50\"\n            },\n            {\n              value: \"83\",\n              priceText: \"+$96.00\"\n            },\n            {\n              value: \"84\",\n              priceText: \"+$97.50\"\n            },\n            {\n              value: \"85\",\n              priceText: \"+$99.00\"\n            },\n            {\n              value: \"86\",\n              priceText: \"+$100.50\"\n            }\n          ],\n          default: \"20\"\n        },\n        {\n          key: \"cordLoopPosition\",\n          label: \"Cord Loop Side\",\n          type: \"image_radio\",\n          required: false,\n          helpText: \"Only applicable for manual Cord Lift shades.\",\n          values: [\n            {\n              value: \"Left\",\n              priceText: \"Free\",\n              image: \"https://joydrape-configurator-admin.vercel.app/cord_lift_left.png\"\n            },\n            {\n              value: \"Right\",\n              priceText: \"Free\",\n              image: \"https://joydrape-configurator-admin.vercel.app/cord_lift_right.png\"\n            }\n          ],\n          default: \"Right\"\n        }\n      ]\n    },\n    tem208608: {\n      title: \"curtain rod\",\n      steps: [\n        {\n          key: \"color\",\n          label: \"Rod Color\",\n          type: \"image_radio\",\n          required: false,\n          values: [\n            {\n              value: \"Black\",\n              priceText: \"Free\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/5mvhdg-1a36-ymq.jpg\"\n            },\n            {\n              value: \"White\",\n              priceText: \"Free\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/ctvujv-unnamed-_7_-ymq.jpg\"\n            }\n          ],\n          default: \"Black\"\n        },\n        {\n          key: \"diameter\",\n          label: \"Diameter Thickness\",\n          type: \"image_radio\",\n          required: false,\n          values: [\n            {\n              value: \"0.87\\\"\",\n              priceText: \"Free\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/5mvhdg-1a36-ymq.jpg\"\n            },\n            {\n              value: \"1 1/8\\\"\",\n              priceText: \"Free\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/5mvhdg-1a36-ymq.jpg\"\n            }\n          ],\n          default: \"0.87\\\"\"\n        },\n        {\n          key: \"length\",\n          label: \"Rod Length Includes Finials\",\n          type: \"size_input\",\n          required: true,\n          singleInput: true,\n          inputLabel: \"Length (inches)\",\n          minL: 10,\n          maxL: 236,\n          defaultL: 80,\n          showFractions: true\n        },\n        {\n          key: \"finialHead\",\n          label: \"Finial Style\",\n          type: \"image_radio\",\n          required: false,\n          helpText: \"Visual changes based on rod color selection.\",\n          values: [\n            {\n              value: \"spherical\",\n              priceText: \"Free\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/5mvhdg-1a36-ymq.jpg\"\n            },\n            {\n              value: \"Hollow sphere\",\n              priceText: \"Free\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/1wtje50-2e8c964e-ymq.jpg\"\n            },\n            {\n              value: \"Openwork art\",\n              priceText: \"Free\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/1ukiq2z-5065ea516-ymq.jpg\"\n            }\n          ],\n          default: \"spherical\"\n        }\n      ]\n    },\n    tem209612: {\n      title: \"Cafe Curtains\",\n      steps: [\n        {\n          key: \"headerStyle\",\n          label: \"Header Style\",\n          type: \"image_radio\",\n          required: true,\n          values: [\n            {\n              value: \"Pinch Pleat - Double\",\n              priceText: \"+100%\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/19a1tii-Pinch-Pleat---Double-ymq.jpg\"\n            },\n            {\n              value: \"Pinch Pleat - Triple\",\n              priceText: \"+150%\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/1c09eoc-Pinch-Pleat---Triple-ymq.jpg\"\n            },\n            {\n              value: \"Rod Pocket\",\n              priceText: \"$0 USD\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/1m6i9ly-Rod-Pocket-ymq.jpg\"\n            }\n          ],\n          default: \"Rod Pocket\"\n        },\n        {\n          key: \"width\",\n          label: \"Width (inch)\",\n          type: \"dropdown_select\",\n          required: true,\n          values: [\n            {\n              value: \"20\",\n              priceText: \"-50%\"\n            },\n            {\n              value: \"21\",\n              priceText: \"-47.5%\"\n            },\n            {\n              value: \"22\",\n              priceText: \"-45%\"\n            },\n            {\n              value: \"23\",\n              priceText: \"-42.5%\"\n            },\n            {\n              value: \"24\",\n              priceText: \"-40%\"\n            },\n            {\n              value: \"25\",\n              priceText: \"-37.5%\"\n            },\n            {\n              value: \"26\",\n              priceText: \"-35%\"\n            },\n            {\n              value: \"27\",\n              priceText: \"-32.5%\"\n            },\n            {\n              value: \"28\",\n              priceText: \"-30%\"\n            },\n            {\n              value: \"29\",\n              priceText: \"-27.5%\"\n            },\n            {\n              value: \"30\",\n              priceText: \"-25%\"\n            },\n            {\n              value: \"31\",\n              priceText: \"-22.5%\"\n            },\n            {\n              value: \"32\",\n              priceText: \"-20%\"\n            },\n            {\n              value: \"33\",\n              priceText: \"-17.5%\"\n            },\n            {\n              value: \"34\",\n              priceText: \"-15%\"\n            },\n            {\n              value: \"35\",\n              priceText: \"-12.5%\"\n            },\n            {\n              value: \"36\",\n              priceText: \"-10%\"\n            },\n            {\n              value: \"37\",\n              priceText: \"-7.5%\"\n            },\n            {\n              value: \"38\",\n              priceText: \"-5%\"\n            },\n            {\n              value: \"39\",\n              priceText: \"-2.5%\"\n            },\n            {\n              value: \"40\",\n              priceText: \"Free\"\n            },\n            {\n              value: \"41\",\n              priceText: \"+2.5%\"\n            },\n            {\n              value: \"42\",\n              priceText: \"+5%\"\n            },\n            {\n              value: \"43\",\n              priceText: \"+7.5%\"\n            },\n            {\n              value: \"44\",\n              priceText: \"+10%\"\n            },\n            {\n              value: \"45\",\n              priceText: \"+12.5%\"\n            },\n            {\n              value: \"46\",\n              priceText: \"+15%\"\n            },\n            {\n              value: \"47\",\n              priceText: \"+17.5%\"\n            },\n            {\n              value: \"48\",\n              priceText: \"+20%\"\n            },\n            {\n              value: \"49\",\n              priceText: \"+22.5%\"\n            },\n            {\n              value: \"50\",\n              priceText: \"+25%\"\n            },\n            {\n              value: \"51\",\n              priceText: \"+27.5%\"\n            },\n            {\n              value: \"52\",\n              priceText: \"+30%\"\n            },\n            {\n              value: \"53\",\n              priceText: \"+32.5%\"\n            },\n            {\n              value: \"54\",\n              priceText: \"+35%\"\n            },\n            {\n              value: \"55\",\n              priceText: \"+37.5%\"\n            },\n            {\n              value: \"56\",\n              priceText: \"+40%\"\n            },\n            {\n              value: \"57\",\n              priceText: \"+42.5%\"\n            },\n            {\n              value: \"58\",\n              priceText: \"+45%\"\n            },\n            {\n              value: \"59\",\n              priceText: \"+47.5%\"\n            },\n            {\n              value: \"60\",\n              priceText: \"+50%\"\n            },\n            {\n              value: \"61\",\n              priceText: \"+52.5%\"\n            },\n            {\n              value: \"62\",\n              priceText: \"+55%\"\n            },\n            {\n              value: \"63\",\n              priceText: \"+57.5%\"\n            },\n            {\n              value: \"64\",\n              priceText: \"+60%\"\n            },\n            {\n              value: \"65\",\n              priceText: \"+62.5%\"\n            },\n            {\n              value: \"66\",\n              priceText: \"+65%\"\n            },\n            {\n              value: \"67\",\n              priceText: \"+67.5%\"\n            },\n            {\n              value: \"68\",\n              priceText: \"+70%\"\n            },\n            {\n              value: \"69\",\n              priceText: \"+72.5%\"\n            },\n            {\n              value: \"70\",\n              priceText: \"+75%\"\n            }\n          ],\n          default: \"20\"\n        },\n        {\n          key: \"height\",\n          label: \"Height (inch)\",\n          type: \"dropdown_select\",\n          required: true,\n          values: [\n            {\n              value: \"12\",\n              priceText: \"Free\"\n            },\n            {\n              value: \"13\",\n              priceText: \"+0.52%\"\n            },\n            {\n              value: \"14\",\n              priceText: \"+1.04%\"\n            },\n            {\n              value: \"15\",\n              priceText: \"+1.56%\"\n            },\n            {\n              value: \"16\",\n              priceText: \"+2.08%\"\n            },\n            {\n              value: \"17\",\n              priceText: \"+2.6%\"\n            },\n            {\n              value: \"18\",\n              priceText: \"+3.12%\"\n            },\n            {\n              value: \"19\",\n              priceText: \"+3.64%\"\n            },\n            {\n              value: \"20\",\n              priceText: \"+4.16%\"\n            },\n            {\n              value: \"21\",\n              priceText: \"+4.68%\"\n            },\n            {\n              value: \"22\",\n              priceText: \"+5.2%\"\n            },\n            {\n              value: \"23\",\n              priceText: \"+5.72%\"\n            },\n            {\n              value: \"24\",\n              priceText: \"+6.24%\"\n            },\n            {\n              value: \"25\",\n              priceText: \"+6.76%\"\n            },\n            {\n              value: \"26\",\n              priceText: \"+7.28%\"\n            },\n            {\n              value: \"27\",\n              priceText: \"+7.8%\"\n            },\n            {\n              value: \"28\",\n              priceText: \"+8.32%\"\n            },\n            {\n              value: \"29\",\n              priceText: \"+8.84%\"\n            },\n            {\n              value: \"30\",\n              priceText: \"+9.36%\"\n            },\n            {\n              value: \"31\",\n              priceText: \"+9.88%\"\n            },\n            {\n              value: \"32\",\n              priceText: \"+10.4%\"\n            },\n            {\n              value: \"33\",\n              priceText: \"+10.92%\"\n            },\n            {\n              value: \"34\",\n              priceText: \"+11.44%\"\n            },\n            {\n              value: \"35\",\n              priceText: \"+11.96%\"\n            },\n            {\n              value: \"36\",\n              priceText: \"+12.48%\"\n            },\n            {\n              value: \"37\",\n              priceText: \"+13%\"\n            },\n            {\n              value: \"38\",\n              priceText: \"+13.52%\"\n            },\n            {\n              value: \"39\",\n              priceText: \"+14.04%\"\n            },\n            {\n              value: \"40\",\n              priceText: \"+14.56%\"\n            },\n            {\n              value: \"41\",\n              priceText: \"+15.08%\"\n            },\n            {\n              value: \"42\",\n              priceText: \"+15.6%\"\n            },\n            {\n              value: \"43\",\n              priceText: \"+16.12%\"\n            },\n            {\n              value: \"44\",\n              priceText: \"+16.64%\"\n            },\n            {\n              value: \"45\",\n              priceText: \"+17.16%\"\n            },\n            {\n              value: \"46\",\n              priceText: \"+17.68%\"\n            },\n            {\n              value: \"47\",\n              priceText: \"+18.2%\"\n            },\n            {\n              value: \"48\",\n              priceText: \"+18.72%\"\n            },\n            {\n              value: \"49\",\n              priceText: \"+19.24%\"\n            },\n            {\n              value: \"50\",\n              priceText: \"+19.76%\"\n            },\n            {\n              value: \"51\",\n              priceText: \"+20.28%\"\n            },\n            {\n              value: \"52\",\n              priceText: \"+20.8%\"\n            },\n            {\n              value: \"53\",\n              priceText: \"+21.32%\"\n            },\n            {\n              value: \"54\",\n              priceText: \"+21.84%\"\n            },\n            {\n              value: \"55\",\n              priceText: \"+22.36%\"\n            },\n            {\n              value: \"56\",\n              priceText: \"+22.88%\"\n            },\n            {\n              value: \"57\",\n              priceText: \"+23.4%\"\n            },\n            {\n              value: \"58\",\n              priceText: \"+23.92%\"\n            },\n            {\n              value: \"59\",\n              priceText: \"+24.44%\"\n            },\n            {\n              value: \"60\",\n              priceText: \"+24.96%\"\n            },\n            {\n              value: \"61\",\n              priceText: \"+25.48%\"\n            },\n            {\n              value: \"62\",\n              priceText: \"+26%\"\n            },\n            {\n              value: \"63\",\n              priceText: \"+26.52%\"\n            },\n            {\n              value: \"64\",\n              priceText: \"+27.04%\"\n            },\n            {\n              value: \"65\",\n              priceText: \"+27.56%\"\n            },\n            {\n              value: \"66\",\n              priceText: \"+28.08%\"\n            },\n            {\n              value: \"67\",\n              priceText: \"+28.6%\"\n            },\n            {\n              value: \"68\",\n              priceText: \"+29.12%\"\n            },\n            {\n              value: \"69\",\n              priceText: \"+29.64%\"\n            },\n            {\n              value: \"70\",\n              priceText: \"+30.16%\"\n            }\n          ],\n          default: \"12\"\n        },\n        {\n          key: \"lining\",\n          label: \"Lining Backing\",\n          type: \"image_radio\",\n          required: false,\n          values: [\n            {\n              value: \"Unlined\",\n              priceText: \"Free\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/unlined__center.jpg?v=1740991045\"\n            },\n            {\n              value: \"50% Lining\",\n              priceText: \"+50%\",\n              image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/white_lining_200x200_bb39234c-6382-4b35-942a-5381fdfba258.jpg?v=1740991138\"\n            }\n          ],\n          default: \"Unlined\"\n        }\n      ]\n    },\n    tem209676: {\n    title: \"Cafe Curtain Rods\",\n    steps: [\n        {\n            key: \"width\",\n            label: \"Rod Width\",\n            type: \"size_input\",\n            required: true,\n            singleInput: true,\n            inputLabel: \"Width\",\n            minW: 10,\n            maxW: 55,\n            showFractions: true,\n            helpText: \"The width fraction rounds down to the nearest because the 2 ends can adjust to meet the width, but a bit longer can't be put in. For example, a 20 3/4\\\" width orders a 20 1/2\\\" rod.\",\n            values: [\n                {\n                    value: \"10\",\n                    priceText: \"+$1.00\"\n                },\n                {\n                    value: \"11\",\n                    priceText: \"+$2.00\"\n                },\n                {\n                    value: \"12\",\n                    priceText: \"+$3.00\"\n                },\n                {\n                    value: \"13\",\n                    priceText: \"+$4.00\"\n                },\n                {\n                    value: \"14\",\n                    priceText: \"+$5.00\"\n                },\n                {\n                    value: \"15\",\n                    priceText: \"+$6.00\"\n                },\n                {\n                    value: \"16\",\n                    priceText: \"+$7.00\"\n                },\n                {\n                    value: \"17\",\n                    priceText: \"+$8.00\"\n                },\n                {\n                    value: \"18\",\n                    priceText: \"+$9.00\"\n                },\n                {\n                    value: \"19\",\n                    priceText: \"+$10.00\"\n                },\n                {\n                    value: \"20\",\n                    priceText: \"+$11.00\"\n                },\n                {\n                    value: \"21\",\n                    priceText: \"+$12.00\"\n                },\n                {\n                    value: \"22\",\n                    priceText: \"+$13.00\"\n                },\n                {\n                    value: \"23\",\n                    priceText: \"+$14.00\"\n                },\n                {\n                    value: \"24\",\n                    priceText: \"+$15.00\"\n                },\n                {\n                    value: \"25\",\n                    priceText: \"+$16.00\"\n                },\n                {\n                    value: \"26\",\n                    priceText: \"+$17.00\"\n                },\n                {\n                    value: \"27\",\n                    priceText: \"+$18.00\"\n                },\n                {\n                    value: \"28\",\n                    priceText: \"+$10.00\"\n                },\n                {\n                    value: \"29\",\n                    priceText: \"+$20.00\"\n                },\n                {\n                    value: \"30\",\n                    priceText: \"+$21.00\"\n                },\n                {\n                    value: \"31\",\n                    priceText: \"+$22.00\"\n                },\n                {\n                    value: \"32\",\n                    priceText: \"+$23.00\"\n                },\n                {\n                    value: \"33\",\n                    priceText: \"+$24.00\"\n                },\n                {\n                    value: \"34\",\n                    priceText: \"+$25.00\"\n                },\n                {\n                    value: \"35\",\n                    priceText: \"+$26.00\"\n                },\n                {\n                    value: \"36\",\n                    priceText: \"+$27.00\"\n                },\n                {\n                    value: \"37\",\n                    priceText: \"+$28.00\"\n                },\n                {\n                    value: \"38\",\n                    priceText: \"+$29.00\"\n                },\n                {\n                    value: \"39\",\n                    priceText: \"+$30.00\"\n                },\n                {\n                    value: \"40\",\n                    priceText: \"+$31.00\"\n                },\n                {\n                    value: \"41\",\n                    priceText: \"+$32.00\"\n                },\n                {\n                    value: \"42\",\n                    priceText: \"+$33.00\"\n                },\n                {\n                    value: \"43\",\n                    priceText: \"+$34.00\"\n                },\n                {\n                    value: \"44\",\n                    priceText: \"+$35.00\"\n                },\n                {\n                    value: \"45\",\n                    priceText: \"+$36.00\"\n                },\n                {\n                    value: \"46\",\n                    priceText: \"+$37.00\"\n                },\n                {\n                    value: \"47\",\n                    priceText: \"+$38.00\"\n                },\n                {\n                    value: \"48\",\n                    priceText: \"+$39.00\"\n                },\n                {\n                    value: \"49\",\n                    priceText: \"+$40.00\"\n                },\n                {\n                    value: \"50\",\n                    priceText: \"+$41.00\"\n                },\n                {\n                    value: \"51\",\n                    priceText: \"+$42.00\"\n                },\n                {\n                    value: \"52\",\n                    priceText: \"+$43.00\"\n                },\n                {\n                    value: \"53\",\n                    priceText: \"+$44.00\"\n                },\n                {\n                    value: \"54\",\n                    priceText: \"+$45.00\"\n                },\n                {\n                    value: \"55\",\n                    priceText: \"+$46.00\"\n                },\n                {\n                    value: \"56\",\n                    priceText: \"+$47.00\"\n                },\n                {\n                    value: \"57\",\n                    priceText: \"+$48.00\"\n                },\n                {\n                    value: \"58\",\n                    priceText: \"+$49.00\"\n                },\n                {\n                    value: \"59\",\n                    priceText: \"+$50.00\"\n                },\n                {\n                    value: \"60\",\n                    priceText: \"+$51.00\"\n                },\n                {\n                    value: \"61\",\n                    priceText: \"+$52.00\"\n                },\n                {\n                    value: \"62\",\n                    priceText: \"+$53.00\"\n                },\n                {\n                    value: \"63\",\n                    priceText: \"+$54.00\"\n                },\n                {\n                    value: \"64\",\n                    priceText: \"+$55.00\"\n                },\n                {\n                    value: \"65\",\n                    priceText: \"+$56.00\"\n                },\n                {\n                    value: \"66\",\n                    priceText: \"+$57.00\"\n                },\n                {\n                    value: \"67\",\n                    priceText: \"+$58.00\"\n                },\n                {\n                    value: \"68\",\n                    priceText: \"+$59.00\"\n                },\n                {\n                    value: \"69\",\n                    priceText: \"+$60.00\"\n                },\n                {\n                    value: \"70\",\n                    priceText: \"+$61.00\"\n                },\n                {\n                    value: \"71\",\n                    priceText: \"+$62.00\"\n                },\n                {\n                    value: \"72\",\n                    priceText: \"+$63.00\"\n                },\n                {\n                    value: \"73\",\n                    priceText: \"+$64.00\"\n                },\n                {\n                    value: \"74\",\n                    priceText: \"+$65.00\"\n                },\n                {\n                    value: \"75\",\n                    priceText: \"+$66.00\"\n                },\n                {\n                    value: \"76\",\n                    priceText: \"+$67.00\"\n                },\n                {\n                    value: \"77\",\n                    priceText: \"+$68.00\"\n                },\n                {\n                    value: \"78\",\n                    priceText: \"+$69.00\"\n                },\n                {\n                    value: \"79\",\n                    priceText: \"+$70.00\"\n                },\n                {\n                    value: \"80\",\n                    priceText: \"+$71.00\"\n                }\n            ],\n            default: \"10\"\n        },\n        {\n            key: \"mountingType\",\n            label: \"Mounting Type\",\n            type: \"image_radio\",\n            required: true,\n            values: [\n                {\n                    value: \"Inside Mount\",\n                    priceText: \"Free\",\n                    image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/13buevg-85_606-ymq.jpg\",\n                    description: \"When installing inside, your window frame sides should provide a flat width of 1 inch, and the window frame board should be more than 3/4\\\" thick to allow nails to enter.\"\n                },\n                {\n                    value: \"Outside Mount\",\n                    priceText: \"+$10.00\",\n                    image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/1d5j8dv-86_606-ymq.jpg\",\n                    description: \"For outside installations, your window frame should provide a flat width of 1 inch and the frame wood should be more than 3/4\\\" thick to allow nails to enter.\"\n                }\n            ],\n            default: \"Inside Mount\"\n        },\n        {\n            key: \"ringOption\",\n            label: \"Ring Option\",\n            type: \"image_radio\",\n            required: true,\n            values: [\n                {\n                    value: \"No Rings\",\n                    priceText: \"Free\",\n                    image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/oamp95-81_606-ymq.jpg\"\n                },\n                {\n                    value: \"8 PCS Rings\",\n                    priceText: \"+$10.00\",\n                    image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/8kiiig-82_606-ymq.jpg\"\n                },\n                {\n                    value: \"16 PCS Rings\",\n                    priceText: \"+$20.00\",\n                    image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/1jj8fiu-83_606-ymq.jpg\"\n                },\n                {\n                    value: \"24 PCS Rings\",\n                    priceText: \"+$30.00\",\n                    image: \"https://cdn.shopify.com/s/files/1/0648/2771/9841/files/l4al73-84_606-ymq.jpg\"\n                }\n            ],\n            default: \"No Rings\"\n        }\n    ]\n}\n  };\n  /* CONFIG_END */\n\n  // 3. Local Surcharge Pricing Logic\n  const localPricing = {\n    tem3: (basePrice, selections) => {\n      const hasWidth = selections.width !== undefined && selections.width !== null && selections.width !== '' && !isNaN(parseFloat(selections.width));\n      const hasHeight = selections.height !== undefined && selections.height !== null && selections.height !== '' && !isNaN(parseFloat(selections.height));\n\n      const header = selections.headerStyle || 'Grommet Top';\n      const lining = selections.lining || 'Unlined';\n      const tieback = selections.tieback || 'No Need';\n\n      let sizePct = 0;\n      if (hasWidth && hasHeight) {\n        const width = Math.floor(parseFloat(selections.width));\n        const height = Math.floor(parseFloat(selections.height));\n        const widthPct = (width - 40) * 2.5;\n        const heightPct = height <= 103 ? (height - 12) * 0.52 : 47.32 + (height - 103) * 2.1;\n        sizePct = widthPct + heightPct;\n      }\n\n      const sizePrice = basePrice * (1 + sizePct / 100);\n\n      let headerPct = 0;\n      if (header === 'Pinch Pleat - Double') headerPct = 100;\n      else if (header === 'Pinch Pleat - Triple') headerPct = 150;\n      else if (header === 'Euro Pleat - Double') headerPct = 100;\n      else if (header === 'Euro Pleat - Triple') headerPct = 150;\n\n      let liningPct = 0;\n      if (lining === '50% Lining') liningPct = 30;\n      else if (lining === '90% Lining') liningPct = 44;\n      else if (lining === '100% Lining') liningPct = 58;\n\n      const tiebackUsd = (tieback.includes('Yes') || tieback.includes('Matching') || tieback === 'Yes need the matching tieback') ? 3.00 : 0.00;\n      \n      const headerSurcharge = sizePrice * (headerPct / 100);\n      const liningSurcharge = sizePrice * (liningPct / 100);\n      \n      const surchargeUsd = (sizePrice - basePrice) + headerSurcharge + liningSurcharge;\n\n      let k = 1.0;\n      if (hasWidth && hasHeight) {\n        const width = Math.floor(parseFloat(selections.width));\n        const height = Math.floor(parseFloat(selections.height));\n        const wDiff = Math.max(0, width - 40) / 10;\n        const hDiff = Math.max(0, height - 12) / 24;\n        const progress = Math.min(1.0, wDiff + hDiff);\n        k = 1.0 + 0.20 * progress;\n      }\n\n      const pricePerItem = Math.max(0, (basePrice + surchargeUsd) * k);\n\n      return {\n        pricePerItem: pricePerItem,\n        surcharge: Math.max(0, pricePerItem - basePrice),\n        flatSurcharge: tiebackUsd\n      };\n    },\n    tem8: (basePrice, selections) => {\n      const widthVal = selections.width;\n      const heightVal = selections.height;\n      const liningVal = selections.lining;\n      const liftVal = selections.liftType;\n\n      const widthUsd = (widthVal !== undefined && widthVal !== null) ? 40.00 + (Math.floor(parseFloat(widthVal)) - 19) * 3.1 : 0;\n      const heightUsd = (heightVal !== undefined && heightVal !== null) ? 23.00 + (Math.floor(parseFloat(heightVal)) - 19) * 1.9 : 0;\n\n      let liningUsd = 0;\n      if (liningVal) {\n        if (liningVal.includes('Privacy')) liningUsd = 50.00;\n        else if (liningVal.includes('Blackout')) liningUsd = 60.00;\n      }\n\n      let liftUsd = 0;\n      if (liftVal) {\n        if (liftVal.includes('Motorized')) liftUsd = 138.00;\n        else if (liftVal.includes('Manual')) liftUsd = 39.00;\n      }\n\n      const surcharge = widthUsd + heightUsd + liningUsd + liftUsd;\n      return { pricePerItem: basePrice + surcharge, surcharge };\n    },\n    tem205720: (basePrice, selections) => {\n      const widthVal = selections.width;\n      const heightVal = selections.height;\n      const liftVal = selections.liftType;\n\n      let widthUsd = 0;\n      if (widthVal !== undefined && widthVal !== null) {\n        const width = Math.floor(parseFloat(widthVal));\n        if (width <= 30) widthUsd = 44 + (width - 20) * 1.0;\n        else if (width <= 40) widthUsd = 54 + (width - 30) * 2.0;\n        else widthUsd = 74 + (width - 40) * 3.0;\n      }\n\n      const heightUsd = (heightVal !== undefined && heightVal !== null) ? 29.00 + (Math.floor(parseFloat(heightVal)) - 19) * 1.0 : 0;\n      let liftUsd = 0;\n      if (liftVal) {\n        if (liftVal.includes('Motorized')) liftUsd = 98.00;\n        else if (liftVal.includes('Manual')) liftUsd = 50.00;\n      }\n\n      const surcharge = widthUsd + heightUsd + liftUsd;\n      return { pricePerItem: basePrice + surcharge, surcharge };\n    },\n    tem205858: (basePrice, selections) => {\n      const widthVal = selections.width;\n      const heightVal = selections.height;\n      const liftVal = selections.liftType;\n\n      const widthUsd = (widthVal !== undefined && widthVal !== null) ? (Math.floor(parseFloat(widthVal)) - 19) * 2.0 : 0;\n      const heightUsd = (heightVal !== undefined && heightVal !== null) ? (Math.floor(parseFloat(heightVal)) - 19) * 1.5 : 0;\n      let liftUsd = 0;\n      if (liftVal) {\n        if (liftVal.includes('Motorized')) liftUsd = 139.00;\n        else if (liftVal.includes('Manual') || liftVal.includes('Cordless')) liftUsd = 40.00;\n      }\n\n      const surcharge = widthUsd + heightUsd + liftUsd;\n      return { pricePerItem: basePrice + surcharge, surcharge };\n    },\n    tem205864: (basePrice, selections) => {\n      const widthVal = selections.width;\n      const heightVal = selections.height;\n      const liftVal = selections.liftType;\n\n      const widthUsd = (widthVal !== undefined && widthVal !== null) ? (Math.floor(parseFloat(widthVal)) - 19) * 2.0 : 0;\n      const heightUsd = (heightVal !== undefined && heightVal !== null) ? (Math.floor(parseFloat(heightVal)) - 19) * 1.5 : 0;\n      let liftUsd = 0;\n      if (liftVal) {\n        if (liftVal.includes('Motorized')) liftUsd = 98.00;\n      }\n\n      const surcharge = widthUsd + heightUsd + liftUsd;\n      return { pricePerItem: basePrice + surcharge, surcharge };\n    },\n    tem208608: (basePrice, selections) => {\n      const lengthVal = selections.length;\n      const surcharge = (lengthVal !== undefined && lengthVal !== null) ? (Math.floor(parseFloat(lengthVal)) - 9) * 1.5 : 0;\n      return { pricePerItem: basePrice + surcharge, surcharge };\n    },\n    tem209612: (basePrice, selections) => {\n      const hasWidth = selections.width !== undefined && selections.width !== null && selections.width !== '' && !isNaN(parseFloat(selections.width));\n      const hasHeight = selections.height !== undefined && selections.height !== null && selections.height !== '' && !isNaN(parseFloat(selections.height));\n\n      const header = selections.headerStyle || 'Rod Pocket';\n      const lining = selections.lining || 'Unlined';\n\n      let sizePct = 0;\n      if (hasWidth && hasHeight) {\n        const width = Math.floor(parseFloat(selections.width));\n        const height = Math.floor(parseFloat(selections.height));\n        const widthPct = (width - 40) * 2.5;\n        const heightPct = (height - 12) * 0.52;\n        sizePct = widthPct + heightPct;\n      }\n\n      const sizePrice = basePrice * (1 + sizePct / 100);\n\n      let headerPct = 0;\n      if (header.includes('Double')) headerPct = 100;\n      else if (header.includes('Triple')) headerPct = 150;\n\n      const headerSurcharge = sizePrice * (headerPct / 100);\n\n      const liningPct = lining.includes('50%') ? 50 : 0;\n      const liningSurcharge = sizePrice * (liningPct / 100);\n\n      const surchargeUsd = (sizePrice - basePrice) + headerSurcharge + liningSurcharge;\n\n      return {\n        pricePerItem: Math.max(0, basePrice + surchargeUsd),\n        surcharge: Math.max(0, surchargeUsd)\n      };\n    },\n    tem209676: (basePrice, selections) => {\n      const widthVal = selections.width;\n      const mountingVal = selections.mountingType;\n      const ringsVal = selections.ringOption;\n\n      let widthUsd = 0;\n      if (widthVal !== undefined && widthVal !== null && widthVal !== '') {\n        const width = Math.floor(parseFloat(widthVal));\n        if (!isNaN(width)) {\n          widthUsd = Math.round(Math.max(0, width - 10) * 1.40 * 100) / 100;\n        }\n      }\n\n      let mountingUsd = 0;\n      if (mountingVal && mountingVal.includes('Outside')) {\n        mountingUsd = 10.00;\n      }\n\n      let ringsUsd = 0;\n      if (ringsVal) {\n        if (ringsVal.includes('8 PCS')) ringsUsd = 10.00;\n        else if (ringsVal.includes('16 PCS')) ringsUsd = 20.00;\n        else if (ringsVal.includes('24 PCS')) ringsUsd = 30.00;\n      }\n\n      const surcharge = widthUsd + mountingUsd + ringsUsd;\n      return { pricePerItem: basePrice + surcharge, surcharge };\n    }\n  };\n\n  // Helper to find native color fieldset robustly\n  function findColorFieldset(container) {\n    if (!container) return null;\n    let fs = container.querySelector('fieldset[data-option-name=\"color\"]') || \n             container.querySelector('fieldset[data-option-name=\"Color\"]');\n    if (fs) return fs;\n    \n    const fieldsets = container.querySelectorAll('fieldset');\n    for (let i = 0; i < fieldsets.length; i++) {\n      const legend = fieldsets[i].querySelector('legend');\n      if (legend && legend.textContent.toLowerCase().includes('color')) {\n        return fieldsets[i];\n      }\n    }\n    return null;\n  }\n\n  // State Management\n  const state = {\n    templateId: \"tem3\",\n    product: null,\n    selectedVariantId: null,\n    checkoutEndpoint: \"\",\n    basePrice: 109.90,\n    compareAtPrice: null,\n    quantity: 1,\n    selections: {},\n    unit: \"in\",\n    activeStepIdx: 0,\n    validationErrors: {},\n    curtainsOpen: false,\n    roomTintOn: false,\n    lastCalculatedResult: null\n  };\n\n  let DOM = {};\n\n  // Setup DOM element lookups safely\n  function setupDOMReferences() {\n    // Use findOwnSection() to scope all DOM queries to this script's own section instance.\n    const section = findOwnSection();\n    const q = (id) => section ? section.querySelector(\"#\" + id) : document.getElementById(id);\n    DOM = {\n      section: section,\n      productTitle: q(\"productTitle\"),\n      accordionContainer: q(\"accordionContainer\"),\n      summaryTotalPrice: q(\"summaryTotalPrice\"),\n      summaryOriginalPrice: q(\"summaryOriginalPrice\"),\n      summarySavingsRow: q(\"summarySavingsRow\"),\n      summarySavingsBadge: q(\"summarySavingsBadge\"),\n      labelBasePrice: q(\"labelBasePrice\"),\n      labelSurcharge: q(\"labelSurcharge\"),\n      labelQty: q(\"labelQty\"),\n      qtyMinus: q(\"qtyMinus\"),\n      qtyPlus: q(\"qtyPlus\"),\n      productQty: q(\"productQty\"),\n      btnAddToCart: q(\"btnAddToCart\"),\n      toast: q(\"toastNotification\") || document.getElementById(\"toastNotification\"),\n      shipDate: q(\"shipDate\"),\n      purchasedDate: q(\"purchased-date\"),\n      processingDate: q(\"processing-date\"),\n      deliveryDate: q(\"delivery-date\"),\n      btnDrawCurtains: q(\"btnDrawCurtains\"),\n      btnToggleWallLight: q(\"btnToggleWallLight\"),\n      svg: q(\"visualizerSvg\"),\n      wallBg: q(\"wallBg\"),\n      blindsGroup: q(\"blindsGroup\"),\n      blindFabric: q(\"blindFabric\"),\n      rodGroup: q(\"rodGroup\"),\n      metalRod: q(\"metalRod\"),\n      leftFinial: q(\"leftFinial\"),\n      rightFinial: q(\"rightFinial\"),\n      leftCurtainFolds: q(\"leftCurtainFolds\"),\n      rightCurtainFolds: q(\"rightCurtainFolds\"),\n      leftCurtainHeader: q(\"leftCurtainHeader\"),\n      rightCurtainHeader: q(\"rightCurtainHeader\")\n    };\n  }\n\n  let toastTimeout = null;\n  function showToastNotice(title, message, type = 'success') {\n    if (!DOM.toast) return;\n\n    if (toastTimeout) {\n      clearTimeout(toastTimeout);\n    }\n\n    const toastIcon = DOM.toast.querySelector(\".toast-icon\");\n    const toastTitle = DOM.toast.querySelector(\".toast-title\");\n    const toastMsg = DOM.toast.querySelector(\".toast-message\");\n\n    if (toastTitle) toastTitle.textContent = title;\n    if (toastMsg) toastMsg.textContent = message;\n\n    if (type === 'error') {\n      DOM.toast.classList.add(\"status-error\");\n      if (toastIcon) toastIcon.innerHTML = \"\u26A0\uFE0F\";\n    } else {\n      DOM.toast.classList.remove(\"status-error\");\n      if (toastIcon) toastIcon.innerHTML = \"\u2713\";\n    }\n\n    DOM.toast.classList.add(\"show\");\n\n    toastTimeout = setTimeout(() => {\n      DOM.toast.classList.remove(\"show\");\n    }, 4000);\n  }\n\n  // Load and initial check\n  function init() {\n    setupDOMReferences();\n    if (!DOM.section) {\n      console.warn(\"[JoyDrape Configurator] Configurator container not found on page.\");\n      return;\n    }\n    const sectionId = DOM.section.dataset.sectionId || \"default\";\n    window.__jdInitializedSections = window.__jdInitializedSections || {};\n    if (window.__jdInitializedSections[sectionId]) {\n      console.log(`[JoyDrape] Configurator section \"${sectionId}\" already initialized, skipping duplicate.`);\n      return;\n    }\n    window.__jdInitializedSections[sectionId] = true;\n    window.state = state;\n\n    // Read product data injected by liquid\n    const dataEl = document.getElementById(\"joydrape-product-data\");\n    if (!dataEl) {\n      console.error(\"[JoyDrape Configurator] Product data JSON script element is missing.\");\n      return;\n    }\n\n    let parsedConfig;\n    try {\n      parsedConfig = JSON.parse(dataEl.textContent);\n    } catch (e) {\n      console.error(\"[JoyDrape Configurator] Error parsing product data JSON\", e);\n      return;\n    }\n\n    state.product = parsedConfig.product;\n    state.selectedVariantId = parsedConfig.selectedVariantId;\n    state.checkoutEndpoint = parsedConfig.checkoutEndpoint;\n    state.tailoringDays = parsedConfig.tailoringDays || \"7-10\";\n    state.shippingDays = parsedConfig.shippingDays || \"7-10\";\n    state.curtainMeasurementImg = parsedConfig.curtainMeasurementImg || \"\";\n\n\n    // Resolve template from active product handle\n    const handle = state.product.handle;\n    const resolvedTemplateId = HANDLES_MAP[handle];\n    if (!resolvedTemplateId) {\n      console.warn(`[JoyDrape Configurator] Handle \"${handle}\" is not mapped to a template. Using tem3 as default.`);\n      state.templateId = \"tem3\";\n    } else {\n      state.templateId = resolvedTemplateId;\n    }\n\n    // Hide default Shopify Buy / Variant Forms\n    hideDefaultBuyForms();\n\n    // Load active variant prices\n    updateBasePriceFromVariant(state.selectedVariantId);\n\n    // Setup variant selections listener on Shopify theme wrapper\n    setupShopifyVariantListener();\n    setupColorChangeListener();\n\n    // Bind local user controls\n    setupLocalControls();\n\n    // Intercept native dynamic checkout payment button clicks\n    setupNativeBuyButtonHijack();\n\n    // Initialize state selections\n    initializeSelections();\n\n    // Trigger visual updates\n    updateShipDate();\n    renderAccordion();\n    runPricingEngine();\n    updateVisualizerElements();\n    updateStorefrontWidgets();\n    window.openHelpDrawer = openHelpDrawer;\n    window.openLiningGuidelinesDrawer = openLiningGuidelinesDrawer;\n    window.openHeaderGuidelinesDrawer = openHeaderGuidelinesDrawer;\n    window.openGenericStepGuidelinesDrawer = openGenericStepGuidelinesDrawer;\n    window.openMountGuidelinesDrawer = openMountGuidelinesDrawer;\n    window.openSizeGuidelinesDrawer = openSizeGuidelinesDrawer;\n    initFreeSwatchesDrawer();\n    window.__jdDebug = { state, TEMPLATE_CONFIGS };\n  }\n\n  // Hide default product form and buttons to override theme behavior\n  function hideDefaultBuyForms() {\n    const selectors = [\n      '[id^=\"x-atc-button-\"]',\n      '.add_to_cart_button',\n      '.x-quantity-selector',\n      '.product-form__quantity',\n      '.product-form__buttons',\n      'button[name=\"add\"]',\n      '.product-form__submit',\n      '.sticky-add-to-cart',\n      '.sticky-atc',\n      '[id^=\"x-sticky-atc-\"]',\n      '[id^=\"Sticky-ATC-\"]',\n      '[id^=\"buy-buttons-\"]',\n      '[class*=\"sticky-add-to-cart\"]',\n      '.shopify-payment-button'\n    ];\n    \n    const applyHiding = () => {\n      selectors.forEach(sel => {\n        document.querySelectorAll(sel).forEach(el => {\n          // Never hide our custom configurator buttons or containers\n          if (el.closest('#joydrapeConfigurator') || el.id === 'btnAddToCart' || el.classList.contains('add-to-cart-btn')) {\n            return;\n          }\n          el.style.setProperty('display', 'none', 'important');\n        });\n      });\n    };\n\n    // Run immediately\n    applyHiding();\n\n    // Use MutationObserver for dynamic Ajax theme content reloads\n    if (!window.__jdHideObserver) {\n      window.__jdHideObserver = new MutationObserver(() => {\n        applyHiding();\n      });\n      window.__jdHideObserver.observe(document.body, {\n        childList: true,\n        subtree: true\n      });\n    }\n  }\n\n  // Intercept native dynamic checkout and add-to-cart clicks as a hard fallback\n  function setupNativeBuyButtonHijack() {\n    document.addEventListener('click', function(e) {\n      // Ignore clicks originating from inside our configurator\n      if (e.target.closest('#joydrapeConfigurator') || e.target.id === 'btnAddToCart') {\n        return;\n      }\n      \n      const paymentBtn = e.target.closest('.shopify-payment-button, [id^=\"x-payment-button-\"]');\n      if (paymentBtn) {\n        e.preventDefault();\n        e.stopPropagation();\n        handleCheckoutSubmit(true);\n        return;\n      }\n\n      const nativeAtcBtn = e.target.closest('button[name=\"add\"], .add_to_cart_button, .product-form__submit, [id^=\"x-atc-button-\"], .sticky-atc, [id^=\"x-sticky-atc-\"]');\n      if (nativeAtcBtn) {\n        e.preventDefault();\n        e.stopPropagation();\n        handleCheckoutSubmit(false);\n        return;\n      }\n    }, true); // useCapture = true is critical to intercept before Shopify scripts\n  }\n\n  // Find variant in list and update base price\n  function updateBasePriceFromVariant(variantId) {\n    if (!state.product || !state.product.variants) return;\n    const variant = state.product.variants.find(v => String(v.id) === String(variantId));\n    if (variant) {\n      state.selectedVariantId = variant.id;\n      state.basePrice = parseFloat(variant.price);\n      state.compareAtPrice = variant.compare_at_price ? parseFloat(variant.compare_at_price) : null;\n    }\n  }\n\n  // Listen to standard Shopify variant URL parameter changes or selector elements\n  function setupShopifyVariantListener() {\n    // 1. Monitor theme selectors\n    const variantSelects = document.querySelectorAll('select[name=\"id\"], .single-option-selector, input[name=\"id\"]');\n    variantSelects.forEach(select => {\n      select.addEventListener(\"change\", (e) => {\n        let val = e.target.value;\n        // If it's a multi-selector instead of variant ID select, retrieve actual active ID from form\n        const formIdInput = document.querySelector('form[action^=\"/cart/add\"] input[name=\"id\"], select[name=\"id\"]');\n        if (formIdInput) {\n          val = formIdInput.value;\n        }\n        if (val) {\n          updateBasePriceFromVariant(val);\n          if (state.product && state.product.variants) {\n            const v = state.product.variants.find(x => String(x.id) === String(val));\n            if (v) updateColorStepSummary(v.option1 || v.title);\n          }\n          runPricingEngine();\n        }\n      });\n    });\n\n    // 2. Poll URL for \"?variant=\" parameter updates (handles Ajax themes that rewrite history state)\n    let lastUrl = window.location.href;\n    setInterval(() => {\n      if (window.location.href !== lastUrl) {\n        lastUrl = window.location.href;\n        const urlParams = new URLSearchParams(window.location.search);\n        const variantId = urlParams.get(\"variant\");\n        if (variantId && String(variantId) !== String(state.selectedVariantId)) {\n          updateBasePriceFromVariant(variantId);\n          if (state.product && state.product.variants) {\n            const v = state.product.variants.find(x => String(x.id) === String(variantId));\n            if (v) updateColorStepSummary(v.option1 || v.title);\n          }\n          runPricingEngine();\n        }\n      }\n    }, 300);\n  }\n\n  // Setup local click controls\n  function setupLocalControls() {\n    DOM.qtyMinus.addEventListener(\"click\", () => {\n      if (state.quantity > 1) {\n        state.quantity--;\n        DOM.productQty.value = state.quantity;\n        runPricingEngine();\n      }\n    });\n\n    DOM.qtyPlus.addEventListener(\"click\", () => {\n      state.quantity++;\n      DOM.productQty.value = state.quantity;\n      runPricingEngine();\n    });\n\n    DOM.btnAddToCart.addEventListener(\"click\", handleCheckoutSubmit);\n\n    // Intercept hash-trigger links (e.g. for header guidelines drawer)\n    document.addEventListener(\"click\", (e) => {\n      const link = e.target.closest(\"a\");\n      if (link) {\n        const href = link.getAttribute(\"href\");\n        try {\n          if (href && href.includes(\"#header-guidelines\")) {\n            e.preventDefault();\n            window.openHeaderGuidelinesDrawer();\n          } else if (href && href.includes(\"#lining-guidelines\")) {\n            e.preventDefault();\n            window.openLiningGuidelinesDrawer();\n          } else if (href && (href.includes(\"#size-guidelines\") || href.includes(\"#measurement-guide\"))) {\n            e.preventDefault();\n            window.openSizeGuidelinesDrawer();\n          } else if (href && href.includes(\"#mount-guidelines\")) {\n            e.preventDefault();\n            window.openMountGuidelinesDrawer();\n          } else if (href && href.includes(\"#step-guidelines-\")) {\n            e.preventDefault();\n            const idx = href.indexOf(\"#step-guidelines-\");\n            const stepKey = href.substring(idx + 17);\n            window.openGenericStepGuidelinesDrawer(stepKey);\n          }\n        } catch (err) {\n          console.error(\"[JoyDrape Guidelines Click Interceptor Error]:\", err);\n        }\n      }\n    });\n\n    if (DOM.btnDrawCurtains) {\n      DOM.btnDrawCurtains.addEventListener(\"click\", () => {\n        state.curtainsOpen = !state.curtainsOpen;\n        DOM.btnDrawCurtains.textContent = state.curtainsOpen ? \"Draw Curtains Closed\" : \"Open Curtains\";\n        updateVisualizerDrawing();\n      });\n    }\n\n    if (DOM.btnToggleWallLight) {\n      DOM.btnToggleWallLight.addEventListener(\"click\", () => {\n        state.roomTintOn = !state.roomTintOn;\n        if (DOM.wallBg) {\n          DOM.wallBg.setAttribute(\"fill\", state.roomTintOn ? \"#ebdcd0\" : \"#fcfaf6\");\n        }\n      });\n    }\n\n    // Call it initially\n    stripPricesFromLabels();\n\n    // Setup observer to keep prices hidden even if modified by third-party apps (like YMQ)\n    const observer = new MutationObserver((mutations) => {\n      observer.disconnect();\n      stripPricesFromLabels();\n      observer.observe(document.body, {\n        childList: true,\n        subtree: true,\n        characterData: true\n      });\n    });\n    observer.observe(document.body, {\n      childList: true,\n      subtree: true,\n      characterData: true\n    });\n  }\n\n  function stripPricesFromLabels() {\n    // 1. Hide details (keep total price container visible)\n    \n    const basePriceEl = document.getElementById(\"labelBasePrice\");\n    if (basePriceEl) {\n      const parentDetail = basePriceEl.closest('.detail-item');\n      if (parentDetail) parentDetail.style.setProperty('display', 'none', 'important');\n    }\n    const surchargeEl = document.getElementById(\"labelSurcharge\");\n    if (surchargeEl) {\n      const parentDetail = surchargeEl.closest('.detail-item');\n      if (parentDetail) parentDetail.style.setProperty('display', 'none', 'important');\n    }\n\n    // 2. Hide option price tags\n    document.querySelectorAll('.card-price, .ymq-option-price, .ymq-surcharge, .ymq-price, .ymq_option_price').forEach(el => {\n      el.style.setProperty('display', 'none', 'important');\n    });\n\n    // 3. Strip parenthesized price text from names\n    const elements = document.querySelectorAll('.card-name, .option-card, .swatch-item, label');\n    elements.forEach(el => {\n      if (el.childNodes.length > 0) {\n        el.childNodes.forEach(node => {\n          if (node.nodeType === Node.TEXT_NODE) {\n            const originalText = node.textContent;\n            const cleanedText = originalText\n              .replace(/\\s*\\(\\s*[+-]?\\s*\\$?\\s*\\d+(\\.\\d+)?\\s*%?\\s*\\)/gi, '')\n              .replace(/\\s*\\(\\s*[+-]?\\s*Free\\s*\\)/gi, '')\n              .replace(/\\s*\\(\\s*Free\\s*\\)/gi, '');\n            if (originalText !== cleanedText) {\n              node.textContent = cleanedText;\n            }\n          }\n        });\n      }\n    });\n  }\n\n  // Load defaults for steps\n  function initializeSelections() {\n    const config = TEMPLATE_CONFIGS[state.templateId];\n    if (!config) return;\n\n    state.selections = {};\n    state.activeStepIdx = 0;\n    state.validationErrors = {};\n\n    config.steps.forEach(step => {\n      if (step.type === \"size_input\") {\n        if (step.singleInput) {\n          const defVal = step.default !== undefined ? parseFloat(step.default) : (step.defaultW !== undefined && step.defaultW !== null ? parseFloat(step.defaultW) : null);\n          state.selections[step.key] = (defVal !== null && !isNaN(defVal)) ? (state.unit === \"in\" ? defVal : Math.round(defVal * 2.54)) : null;\n          state.selections.fractionL = \"0\";\n        } else {\n          state.selections.width = null;\n          state.selections.height = null;\n          state.selections.fractionW = \"0/0\";\n          state.selections.fractionH = \"0/0\";\n          state.selections.sizeConfirmed = false;\n        }\n      } else {\n        if (step.key === \"color\") {\n          state.selections[step.key] = step.default !== undefined ? step.default : null;\n        } else if (state.templateId === \"tem209676\" && step.default !== undefined) {\n          state.selections[step.key] = step.default;\n        } else {\n          state.selections[step.key] = null;\n        }\n      }\n    });\n  }\n\n  function isStepValidMerged(stepOrPair) {\n    if (stepOrPair._combined) {\n      const w = state.selections.width;\n      const h = state.selections.height;\n      const hasErrors = state.validationErrors.width || state.validationErrors.height;\n      return !!(w && h && !hasErrors);\n    }\n    return isStepValid(stepOrPair);\n  }\n\n  function updateStepLockStates() {\n    if (!DOM.accordionContainer) return;\n    const steps = DOM.accordionContainer.querySelectorAll(\".accordion-step\");\n    const config = TEMPLATE_CONFIGS[state.templateId];\n    if (!config) return;\n\n    // Check if the COLOR step is prepended as first accordion step\n    const firstStep = steps[0];\n    const hasNativeColor = firstStep && \n                           firstStep.querySelector(\".step-label\") && \n                           firstStep.querySelector(\".step-label\").textContent.trim() === \"COLOR\";\n\n    const activeSteps = config.steps.filter(step => {\n      if (typeof step.condition === \"function\") {\n        return step.condition(state.selections);\n      }\n      return true;\n    });\n\n    const mergedSteps = [];\n    let skipNext = false;\n    activeSteps.forEach((step, idx) => {\n      if (skipNext) { skipNext = false; return; }\n      const nextStep = activeSteps[idx + 1];\n      if (\n        step.key === \"width\" && step.type === \"dropdown_select\" &&\n        nextStep && nextStep.key === \"height\" && nextStep.type === \"dropdown_select\"\n      ) {\n        mergedSteps.push({ _combined: true, widthStep: step, heightStep: nextStep });\n        skipNext = true;\n      } else {\n        mergedSteps.push(step);\n      }\n    });\n\n    steps.forEach((stepEl, idx) => {\n      const mergedIdx = hasNativeColor ? idx - 1 : idx;\n      if (hasNativeColor && idx === 0) {\n        stepEl.classList.remove(\"locked\");\n        return;\n      }\n\n      let isLocked = false;\n      for (let prevIdx = 0; prevIdx < mergedIdx; prevIdx++) {\n        const prev = mergedSteps[prevIdx];\n        const prevStep = prev._combined ? prev.widthStep : prev;\n        if (prevStep.required && !isStepValidMerged(prev)) {\n          isLocked = true;\n          break;\n        }\n      }\n      if (isLocked) {\n        stepEl.classList.add(\"locked\");\n      } else {\n        stepEl.classList.remove(\"locked\");\n      }\n    });\n  }\n\n  // \u2500\u2500 Curtarra-style SIZE Panel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  function renderSizePanelCurtarra(widthStep, heightStep, container, index, totalSteps) {\n    const isInches = state.unit !== \"cm\";\n    const fracs = [\"0\", \"1/8\", \"1/4\", \"3/8\", \"1/2\", \"5/8\", \"3/4\", \"7/8\"];\n\n    const wValues = widthStep.values || [];\n    const hValues = heightStep.values || [];\n\n    // Ensure fraction state is initialized (no longer using separate fraction selector UI)\n    if (!state.selections.fractionW) state.selections.fractionW = \"0/0\";\n    if (!state.selections.fractionH) state.selections.fractionH = \"0/0\";\n\n    // Extract boundaries based on the option configuration values\n    const numericWValues = wValues.map(v => parseFloat(v.value)).filter(v => !isNaN(v));\n    const minWInch = numericWValues.length ? Math.min(...numericWValues) : 40;\n    const maxWInch = numericWValues.length ? Math.max(...numericWValues) : 100;\n\n    const numericHValues = hValues.map(v => parseFloat(v.value)).filter(v => !isNaN(v));\n    const minHInch = numericHValues.length ? Math.min(...numericHValues) : 20;\n    const maxHInch = numericHValues.length ? Math.max(...numericHValues) : 120;\n\n    // Convert boundaries depending on active unit\n    const minW = isInches ? minWInch : Math.round(minWInch * 2.54);\n    const maxW = isInches ? maxWInch : Math.round(maxWInch * 2.54);\n\n    const minH = isInches ? minHInch : Math.round(minHInch * 2.54);\n    const maxH = isInches ? maxHInch : Math.round(maxHInch * 2.54);\n\n    // Initial input field values (kept empty if state values are null)\n    const widthInputValue = state.selections.width ? (isInches ? state.selections.width : Math.round(state.selections.width * 2.54)) : '';\n    const heightInputValue = state.selections.height ? (isInches ? state.selections.height : Math.round(state.selections.height * 2.54)) : '';\n\n    const isBlinds = widthStep.showFractions;\n    const svgMarkup = isBlinds ? `\n          <svg class=\"size-diagram-svg\" viewBox=\"0 0 220 260\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n            <!-- Double border window frame -->\n            <rect x=\"15\" y=\"15\" width=\"190\" height=\"230\" stroke=\"#333\" stroke-width=\"2\" fill=\"#fff\"/>\n            <rect x=\"20\" y=\"20\" width=\"180\" height=\"220\" stroke=\"#333\" stroke-width=\"1.5\" fill=\"#f8f9fa\"/>\n\n            <!-- T line (Top) -->\n            <line x1=\"20\" y1=\"60\" x2=\"200\" y2=\"60\" stroke=\"#333\" stroke-width=\"1.5\" marker-start=\"url(#arrowL)\" marker-end=\"url(#arrowR)\"/>\n            <circle cx=\"150\" cy=\"60\" r=\"10\" fill=\"white\" stroke=\"#333\" stroke-width=\"1.5\"/>\n            <text x=\"150\" y=\"64\" text-anchor=\"middle\" font-size=\"11\" font-family=\"Inter,sans-serif\" fill=\"#333\" font-weight=\"600\">T</text>\n\n            <!-- M line (Middle) -->\n            <line x1=\"20\" y1=\"130\" x2=\"200\" y2=\"130\" stroke=\"#333\" stroke-width=\"1.5\" marker-start=\"url(#arrowL)\" marker-end=\"url(#arrowR)\"/>\n            <circle cx=\"150\" cy=\"130\" r=\"10\" fill=\"white\" stroke=\"#333\" stroke-width=\"1.5\"/>\n            <text x=\"150\" y=\"134\" text-anchor=\"middle\" font-size=\"11\" font-family=\"Inter,sans-serif\" fill=\"#333\" font-weight=\"600\">M</text>\n\n            <!-- S line (Smallest/Bottom) -->\n            <line x1=\"20\" y1=\"200\" x2=\"200\" y2=\"200\" stroke=\"#333\" stroke-width=\"1.5\" marker-start=\"url(#arrowL)\" marker-end=\"url(#arrowR)\"/>\n            <circle cx=\"150\" cy=\"200\" r=\"10\" fill=\"white\" stroke=\"#333\" stroke-width=\"1.5\"/>\n            <text x=\"150\" y=\"204\" text-anchor=\"middle\" font-size=\"11\" font-family=\"Inter,sans-serif\" fill=\"#333\" font-weight=\"600\">S</text>\n\n            <!-- L line (Length) -->\n            <line x1=\"45\" y1=\"20\" x2=\"45\" y2=\"240\" stroke=\"#333\" stroke-width=\"1.5\" marker-start=\"url(#arrowU)\" marker-end=\"url(#arrowD)\"/>\n            <circle cx=\"45\" cy=\"90\" r=\"10\" fill=\"white\" stroke=\"#333\" stroke-width=\"1.5\"/>\n            <text x=\"45\" y=\"94\" text-anchor=\"middle\" font-size=\"11\" font-family=\"Inter,sans-serif\" fill=\"#333\" font-weight=\"600\">L</text>\n\n            <!-- Arrow markers -->\n            <defs>\n              <marker id=\"arrowL\" markerWidth=\"6\" markerHeight=\"6\" refX=\"3\" refY=\"3\" orient=\"auto\">\n                <path d=\"M6,0 L0,3 L6,6\" stroke=\"#333\" stroke-width=\"1\" fill=\"none\"/>\n              </marker>\n              <marker id=\"arrowR\" markerWidth=\"6\" markerHeight=\"6\" refX=\"3\" refY=\"3\" orient=\"auto\">\n                <path d=\"M0,0 L6,3 L0,6\" stroke=\"#333\" stroke-width=\"1\" fill=\"none\"/>\n              </marker>\n              <marker id=\"arrowU\" markerWidth=\"6\" markerHeight=\"6\" refX=\"3\" refY=\"3\" orient=\"auto\">\n                <path d=\"M0,6 L3,0 L6,6\" stroke=\"#333\" stroke-width=\"1\" fill=\"none\"/>\n              </marker>\n              <marker id=\"arrowD\" markerWidth=\"6\" markerHeight=\"6\" refX=\"3\" refY=\"3\" orient=\"auto\">\n                <path d=\"M0,0 L3,6 L6,0\" stroke=\"#333\" stroke-width=\"1\" fill=\"none\"/>\n              </marker>\n            </defs>\n          </svg>\n    ` : `\n          <svg class=\"size-diagram-svg\" viewBox=\"0 0 220 260\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n            <!-- Window frame behind -->\n            <rect x=\"35\" y=\"45\" width=\"150\" height=\"175\" stroke=\"#ccc\" stroke-width=\"1.5\" fill=\"#f4f8fa\" opacity=\"0.8\"/>\n            <line x1=\"35\" y1=\"132\" x2=\"185\" y2=\"132\" stroke=\"#ccc\" stroke-width=\"1.5\"/>\n            <line x1=\"110\" y1=\"45\" x2=\"110\" y2=\"220\" stroke=\"#ccc\" stroke-width=\"1.5\"/>\n\n            <!-- Curtain rod -->\n            <rect x=\"12\" y=\"24\" width=\"196\" height=\"5\" rx=\"2.5\" fill=\"#b0a090\"/>\n            <!-- Rings -->\n            ${[25, 33, 41, 49, 57, 86, 96, 106, 116, 126, 136, 146, 156, 166, 176, 186].map(x => `<circle cx=\"${x}\" cy=\"26.5\" r=\"4.5\" stroke=\"#888\" stroke-width=\"1\" fill=\"white\"/>`).join('')}\n\n            <!-- Left curtain panel folds (open/stacked) -->\n            <rect x=\"20\" y=\"29\" width=\"10\" height=\"195\" rx=\"3\" fill=\"#e8e0d5\" stroke=\"#c8bfb0\" stroke-width=\"0.5\"/>\n            <rect x=\"28\" y=\"29\" width=\"10\" height=\"195\" rx=\"3\" fill=\"#dfd6ca\" stroke=\"#c8bfb0\" stroke-width=\"0.5\"/>\n            <rect x=\"36\" y=\"29\" width=\"10\" height=\"195\" rx=\"3\" fill=\"#e8e0d5\" stroke=\"#c8bfb0\" stroke-width=\"0.5\"/>\n            <rect x=\"44\" y=\"29\" width=\"10\" height=\"195\" rx=\"3\" fill=\"#dfd6ca\" stroke=\"#c8bfb0\" stroke-width=\"0.5\"/>\n            <rect x=\"52\" y=\"29\" width=\"10\" height=\"195\" rx=\"3\" fill=\"#e8e0d5\" stroke=\"#c8bfb0\" stroke-width=\"0.5\"/>\n\n            <!-- Right curtain panel folds (closed/drawn across) -->\n            <rect x=\"80\" y=\"29\" width=\"12\" height=\"195\" rx=\"3\" fill=\"#e8e0d5\" stroke=\"#c8bfb0\" stroke-width=\"0.5\"/>\n            <rect x=\"90\" y=\"29\" width=\"12\" height=\"195\" rx=\"3\" fill=\"#dfd6ca\" stroke=\"#c8bfb0\" stroke-width=\"0.5\"/>\n            <rect x=\"100\" y=\"29\" width=\"12\" height=\"195\" rx=\"3\" fill=\"#e8e0d5\" stroke=\"#c8bfb0\" stroke-width=\"0.5\"/>\n            <rect x=\"110\" y=\"29\" width=\"12\" height=\"195\" rx=\"3\" fill=\"#dfd6ca\" stroke=\"#c8bfb0\" stroke-width=\"0.5\"/>\n            <rect x=\"120\" y=\"29\" width=\"12\" height=\"195\" rx=\"3\" fill=\"#e8e0d5\" stroke=\"#c8bfb0\" stroke-width=\"0.5\"/>\n            <rect x=\"130\" y=\"29\" width=\"12\" height=\"195\" rx=\"3\" fill=\"#dfd6ca\" stroke=\"#c8bfb0\" stroke-width=\"0.5\"/>\n            <rect x=\"140\" y=\"29\" width=\"12\" height=\"195\" rx=\"3\" fill=\"#e8e0d5\" stroke=\"#c8bfb0\" stroke-width=\"0.5\"/>\n            <rect x=\"150\" y=\"29\" width=\"12\" height=\"195\" rx=\"3\" fill=\"#dfd6ca\" stroke=\"#c8bfb0\" stroke-width=\"0.5\"/>\n            <rect x=\"160\" y=\"29\" width=\"12\" height=\"195\" rx=\"3\" fill=\"#e8e0d5\" stroke=\"#c8bfb0\" stroke-width=\"0.5\"/>\n            <rect x=\"170\" y=\"29\" width=\"12\" height=\"195\" rx=\"3\" fill=\"#dfd6ca\" stroke=\"#c8bfb0\" stroke-width=\"0.5\"/>\n            <rect x=\"180\" y=\"29\" width=\"12\" height=\"195\" rx=\"3\" fill=\"#e8e0d5\" stroke=\"#c8bfb0\" stroke-width=\"0.5\"/>\n\n            <!-- Width arrow & label (Right Panel Top Width Only) -->\n            <line x1=\"80\" y1=\"12\" x2=\"192\" y2=\"12\" stroke=\"#333\" stroke-width=\"1.5\" marker-start=\"url(#arrowL)\" marker-end=\"url(#arrowR)\"/>\n            <text x=\"136\" y=\"9\" text-anchor=\"middle\" font-size=\"11\" font-family=\"Inter,sans-serif\" fill=\"#333\" font-weight=\"600\">Width</text>\n\n            <!-- Height arrow & label (Drapery Length) -->\n            <line x1=\"202\" y1=\"29\" x2=\"202\" y2=\"224\" stroke=\"#333\" stroke-width=\"1.5\" marker-start=\"url(#arrowU)\" marker-end=\"url(#arrowD)\"/>\n            <text x=\"207\" y=\"126\" text-anchor=\"middle\" font-size=\"11\" font-family=\"Inter,sans-serif\" fill=\"#333\" font-weight=\"600\" transform=\"rotate(90,207,126)\">Length</text>\n\n            <!-- Arrow markers -->\n            <defs>\n              <marker id=\"arrowL\" markerWidth=\"6\" markerHeight=\"6\" refX=\"3\" refY=\"3\" orient=\"auto\">\n                <path d=\"M6,0 L0,3 L6,6\" stroke=\"#333\" stroke-width=\"1\" fill=\"none\"/>\n              </marker>\n              <marker id=\"arrowR\" markerWidth=\"6\" markerHeight=\"6\" refX=\"3\" refY=\"3\" orient=\"auto\">\n                <path d=\"M0,0 L6,3 L0,6\" stroke=\"#333\" stroke-width=\"1\" fill=\"none\"/>\n              </marker>\n              <marker id=\"arrowU\" markerWidth=\"6\" markerHeight=\"6\" refX=\"3\" refY=\"3\" orient=\"auto\">\n                <path d=\"M0,6 L3,0 L6,6\" stroke=\"#333\" stroke-width=\"1\" fill=\"none\"/>\n              </marker>\n              <marker id=\"arrowD\" markerWidth=\"6\" markerHeight=\"6\" refX=\"3\" refY=\"3\" orient=\"auto\">\n                <path d=\"M0,0 L3,6 L6,0\" stroke=\"#333\" stroke-width=\"1\" fill=\"none\"/>\n              </marker>\n            </defs>\n          </svg>\n    `;\n\n    const savedW = localStorage.getItem(\"joydrape_saved_width\");\n    const savedH = localStorage.getItem(\"joydrape_saved_height\");\n    const hasSaved = savedW && savedH;\n\n    // Custom size image and instructions configured by admin\n    const customSizeImage = widthStep.sizeImage || heightStep.sizeImage || \"\";\n    const customSizeInstruct = widthStep.sizeInstructions || heightStep.sizeInstructions || \"\";\n\n    const sizeVisualHtml = customSizeImage ? `\n      <img src=\"${customSizeImage}\" class=\"size-diagram-img\" style=\"max-width: 100%; height: auto; border-radius: 8px; display: block; margin: 0 auto; mix-blend-mode: multiply;\" alt=\"Measurement Diagram\">\n    ` : (isBlinds ? svgMarkup : `\n      <img src=\"${state.curtainMeasurementImg || '/shopify/curtain-measurement-diagram-2-3.png'}\" class=\"size-diagram-img\" style=\"max-width: 100%; height: auto; border-radius: 8px; display: block; margin: 0 auto; mix-blend-mode: multiply;\" alt=\"Measurement Diagram\">\n    `);\n\n    const sizeLinkHtml = `\n      <div style=\"text-align: center; margin-top: 10px; width: 100%;\">\n        <a href=\"https://joydrape.com/pages/shades-measurement-tool\" class=\"step-learn-more\" target=\"_blank\" style=\"font-size: 13px; font-weight: 500; text-decoration: none; display: inline-flex; align-items: center; gap: 4px;\">\n          Measurement tool <span style=\"font-size: 12px;\">\u2192</span>\n        </a>\n      </div>\n    `;\n\n    const sizeInstructHtml = customSizeInstruct ? `\n      <div class=\"size-diagram-instructions\" style=\"font-size: 12px; color: var(--color-text-muted); line-height: 1.4; text-align: center; margin-top: 10px; font-weight: 500; white-space: pre-line;\">\n        ${customSizeInstruct}\n      </div>\n    ` : '';\n\n    const panel = document.createElement(\"div\");\n    panel.className = \"size-panel-curtarra\";\n\n    let sizeFieldsHtml = \"\";\n    if (isInches && isBlinds) {\n      sizeFieldsHtml = `\n          <div class=\"size-fields-inputs-container\" style=\"display: flex; flex-direction: column; gap: 8px; width: 100%; margin-top: 6px;\">\n            <!-- Width Row Block -->\n            <div class=\"size-input-group size-input-row-block\" data-type=\"width\" style=\"display: flex; flex-direction: row; gap: 12px; width: 100%;\">\n              <div class=\"size-input-box-wrap\" style=\"flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px;\">\n                <label style=\"font-size: 11px; font-weight: 600; color: var(--color-text);\">Width</label>\n                <div class=\"size-input-field-wrap\" style=\"position: relative; display: flex; align-items: center; width: 100%;\">\n                  <input type=\"number\" class=\"stepper-input size-field-input\" value=\"${widthInputValue}\" min=\"${minW}\" max=\"${maxW}\" step=\"1\" style=\"width: 100%; height: 40px; padding: 8px 60px 8px 16px; border: 1.5px solid #eae4dc; border-radius: 8px; font-size: 16px; font-weight: 500; color: #333; outline: none; background: #fff; box-sizing: border-box; transition: border-color 0.2s ease;\">\n                  <span class=\"size-field-unit\" style=\"position: absolute; right: 16px; font-size: 11px; color: #888; font-weight: 500; pointer-events: none;\">inches</span>\n                </div>\n              </div>\n              <div class=\"size-fraction-box-wrap\" style=\"width: 90px; flex-shrink: 0; display: flex; flex-direction: column; gap: 2px;\">\n                <label style=\"font-size: 11px; font-weight: 600; color: var(--color-text);\">Eighths</label>\n                <select id=\"sizeSelectWFraction\" class=\"fraction-select\" style=\"width: 100%; height: 40px; padding: 0 12px; border: 1.5px solid #eae4dc; border-radius: 8px; font-size: 16px; font-weight: 500; color: #333; outline: none; background: #fff; cursor: pointer; box-sizing: border-box;\">\n                  ${fracs.map(f => `<option value=\"${f}\" ${state.selections.fractionW === f ? 'selected' : ''}>${f}</option>`).join('')}\n                </select>\n              </div>\n            </div>\n\n            <!-- Length Row Block -->\n            <div class=\"size-input-group size-input-row-block\" data-type=\"height\" style=\"display: flex; flex-direction: row; gap: 12px; width: 100%;\">\n              <div class=\"size-input-box-wrap\" style=\"flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px;\">\n                <label style=\"font-size: 11px; font-weight: 600; color: var(--color-text);\">Length</label>\n                <div class=\"size-input-field-wrap\" style=\"position: relative; display: flex; align-items: center; width: 100%;\">\n                  <input type=\"number\" class=\"stepper-input size-field-input\" value=\"${heightInputValue}\" min=\"${minH}\" max=\"${maxH}\" step=\"1\" style=\"width: 100%; height: 40px; padding: 8px 60px 8px 16px; border: 1.5px solid #eae4dc; border-radius: 8px; font-size: 16px; font-weight: 500; color: #333; outline: none; background: #fff; box-sizing: border-box; transition: border-color 0.2s ease;\">\n                  <span class=\"size-field-unit\" style=\"position: absolute; right: 16px; font-size: 11px; color: #888; font-weight: 500; pointer-events: none;\">inches</span>\n                </div>\n              </div>\n              <div class=\"size-fraction-box-wrap\" style=\"width: 90px; flex-shrink: 0; display: flex; flex-direction: column; gap: 2px;\">\n                <label style=\"font-size: 11px; font-weight: 600; color: var(--color-text);\">Eighths</label>\n                <select id=\"sizeSelectHFraction\" class=\"fraction-select\" style=\"width: 100%; height: 40px; padding: 0 12px; border: 1.5px solid #eae4dc; border-radius: 8px; font-size: 16px; font-weight: 500; color: #333; outline: none; background: #fff; cursor: pointer; box-sizing: border-box;\">\n                  ${fracs.map(f => `<option value=\"${f}\" ${state.selections.fractionH === f ? 'selected' : ''}>${f}</option>`).join('')}\n                </select>\n              </div>\n            </div>\n          </div>\n      `;\n    } else {\n      sizeFieldsHtml = `\n          <div class=\"size-fields-inputs-container\" style=\"display: flex; flex-direction: column; gap: 14px; width: 100%; margin-top: 10px;\">\n            <!-- Width Input Group -->\n            <div class=\"size-input-group\" data-type=\"width\" style=\"display: flex; flex-direction: column; gap: 6px; width: 100%;\">\n              <div class=\"size-input-field-wrap\" style=\"position: relative; display: flex; align-items: center; width: 100%;\">\n                <span class=\"size-field-label-inside\" style=\"position: absolute; left: 16px; font-size: 11px; font-weight: 500; color: #4a4a4a; pointer-events: none; text-transform: capitalize;\">Width</span>\n                <input type=\"number\" class=\"stepper-input size-field-input\" value=\"${widthInputValue}\" min=\"${minW}\" max=\"${maxW}\" step=\"${isInches ? '1' : '0.1'}\" style=\"width: 100%; height: 40px; padding: 8px 60px 8px 80px; text-align: center; border: 1.5px solid #eae4dc; border-radius: 8px; font-size: 16px; font-weight: 500; color: #333; outline: none; background: #fff; box-sizing: border-box; transition: border-color 0.2s ease;\">\n                <span class=\"size-field-unit\" style=\"position: absolute; right: 16px; font-size: 11px; color: #888; font-weight: 500; pointer-events: none;\">${isInches ? 'inches' : 'cm'}</span>\n              </div>\n            </div>\n\n            <!-- Length Input Group -->\n            <div class=\"size-input-group\" data-type=\"height\" style=\"display: flex; flex-direction: column; gap: 6px; width: 100%;\">\n              <div class=\"size-input-field-wrap\" style=\"position: relative; display: flex; align-items: center; width: 100%;\">\n                <span class=\"size-field-label-inside\" style=\"position: absolute; left: 16px; font-size: 11px; font-weight: 500; color: #4a4a4a; pointer-events: none; text-transform: capitalize;\">Length</span>\n                <input type=\"number\" class=\"stepper-input size-field-input\" value=\"${heightInputValue}\" min=\"${minH}\" max=\"${maxH}\" step=\"${isInches ? '1' : '0.1'}\" style=\"width: 100%; height: 40px; padding: 8px 60px 8px 80px; text-align: center; border: 1.5px solid #eae4dc; border-radius: 8px; font-size: 16px; font-weight: 500; color: #333; outline: none; background: #fff; box-sizing: border-box; transition: border-color 0.2s ease;\">\n                <span class=\"size-field-unit\" style=\"position: absolute; right: 16px; font-size: 11px; color: #888; font-weight: 500; pointer-events: none;\">${isInches ? 'inches' : 'cm'}</span>\n              </div>\n            </div>\n          </div>\n      `;\n    }\n\n    panel.innerHTML = `\n      <div class=\"size-panel-inner\">\n        <!-- Left: dynamic SVG diagram -->\n        <div class=\"size-diagram-wrap\">\n          ${sizeVisualHtml}\n          ${sizeLinkHtml}\n          ${sizeInstructHtml}\n        </div>\n\n        <!-- Right: unit toggle + inputs -->\n        <div class=\"size-inputs-wrap\">\n          <!-- Unit toggle pill and recall button -->\n          <div style=\"display: flex; justify-content: space-between; align-items: center; width: 100%; gap: 10px;\">\n            <div class=\"size-unit-toggle\">\n              <button type=\"button\" class=\"size-unit-btn ${isInches ? 'active' : ''}\" id=\"sizeUnitIn\">inches</button>\n              <button type=\"button\" class=\"size-unit-btn ${!isInches ? 'active' : ''}\" id=\"sizeUnitCm\">cm</button>\n            </div>\n            ${hasSaved ? `\n              <button type=\"button\" id=\"sizeUseSaved\" class=\"size-memory-btn\" style=\"padding: 6px 12px; border-radius: 100px; border: 1.5px solid var(--color-primary); background: transparent; color: var(--color-primary); font-size: 11px; font-weight: 600; cursor: pointer; transition: var(--transition-smooth); white-space: nowrap;\">Use Last Size</button>\n            ` : ''}\n          </div>\n\n          ${sizeFieldsHtml}\n\n          <!-- Hidden inputs (for compatibility) -->\n          <input type=\"number\" id=\"sizeInputW\" style=\"display: none;\" value=\"${widthInputValue}\">\n          <input type=\"number\" id=\"sizeInputH\" style=\"display: none;\" value=\"${heightInputValue}\">\n          \n          <div id=\"sizeErrorW\" class=\"size-error\" style=\"color: #d25a6a; font-size: 12px; font-weight: 500; text-align: center; margin-top: 2px; display: none;\"></div>\n          <div id=\"sizeErrorH\" class=\"size-error\" style=\"color: #d25a6a; font-size: 12px; font-weight: 500; text-align: center; margin-top: 2px; display: none;\"></div>\n\n\n\n          <!-- Confirm button -->\n          <button type=\"button\" class=\"size-confirm-btn\" id=\"sizeConfirmBtn\" style=\"margin-top: auto; width: 100%; padding: 12px; border: none; border-radius: 8px; background: var(--color-deep-brown); color: #fff; font-size: 14px; font-weight: 700; cursor: pointer; transition: var(--transition-smooth); text-transform: uppercase; letter-spacing: 0.5px;\">CONFIRM SIZE</button>\n        </div>\n      </div>\n    `;\n\n    // \u2500\u2500 Unit toggle \u2500\u2500\n    panel.querySelector(\"#sizeUnitIn\").addEventListener(\"click\", () => {\n      if (state.unit === \"in\") return;\n      state.unit = \"in\";\n      renderAccordion();\n    });\n    panel.querySelector(\"#sizeUnitCm\").addEventListener(\"click\", () => {\n      if (state.unit === \"cm\") return;\n      state.unit = \"cm\";\n      renderAccordion();\n    });\n\n    // \u2500\u2500 Validation and input listeners \u2500\u2500\n    const inputW = panel.querySelector(\"#sizeInputW\");\n    const inputH = panel.querySelector(\"#sizeInputH\");\n    const errorW = panel.querySelector(\"#sizeErrorW\");\n    const errorH = panel.querySelector(\"#sizeErrorH\");\n\n    function validateWidth() {\n      const rawVal = inputW.value.trim();\n      const visibleInputW = panel.querySelector('.size-input-group[data-type=\"width\"] .size-field-input');\n      if (rawVal === \"\") {\n        state.selections.width = null;\n        errorW.textContent = \"Please enter a width.\";\n        errorW.style.display = \"block\";\n        if (visibleInputW) visibleInputW.style.borderColor = \"#d25a6a\";\n        return false;\n      }\n      const val = parseFloat(rawVal);\n      if (isNaN(val) || val < minW || val > maxW) {\n        state.selections.width = null;\n        errorW.textContent = `Width must be between ${minW} and ${maxW} ${isInches ? 'inches' : 'cm'}.`;\n        errorW.style.display = \"block\";\n        if (visibleInputW) visibleInputW.style.borderColor = \"#d25a6a\";\n        return false;\n      }\n      errorW.style.display = \"none\";\n      if (visibleInputW) visibleInputW.style.borderColor = \"#eae4dc\";\n      \n      // Store in state as inches\n      state.selections.width = isInches ? val : parseFloat((val / 2.54).toFixed(2));\n      return true;\n    }\n\n    function validateHeight() {\n      const rawVal = inputH.value.trim();\n      const visibleInputH = panel.querySelector('.size-input-group[data-type=\"height\"] .size-field-input');\n      if (rawVal === \"\") {\n        state.selections.height = null;\n        errorH.textContent = \"Please enter a length.\";\n        errorH.style.display = \"block\";\n        if (visibleInputH) visibleInputH.style.borderColor = \"#d25a6a\";\n        return false;\n      }\n      const val = parseFloat(rawVal);\n      if (isNaN(val) || val < minH || val > maxH) {\n        state.selections.height = null;\n        errorH.textContent = `Length must be between ${minH} and ${maxH} ${isInches ? 'inches' : 'cm'}.`;\n        errorH.style.display = \"block\";\n        if (visibleInputH) visibleInputH.style.borderColor = \"#d25a6a\";\n        return false;\n      }\n      errorH.style.display = \"none\";\n      if (visibleInputH) visibleInputH.style.borderColor = \"#eae4dc\";\n      \n      // Store in state as inches\n      state.selections.height = isInches ? val : parseFloat((val / 2.54).toFixed(2));\n      return true;\n    }\n\n    inputW.addEventListener(\"input\", () => {\n      state.selections.sizeConfirmed = false;\n      if (validateWidth()) {\n        runPricingEngine();\n        updateVisualizerElements();\n      } else {\n        runPricingEngine();\n      }\n    });\n\n    inputH.addEventListener(\"input\", () => {\n      state.selections.sizeConfirmed = false;\n      if (validateHeight()) {\n        runPricingEngine();\n        updateVisualizerElements();\n      } else {\n        runPricingEngine();\n      }\n    });\n\n    // \u2500\u2500 Recall saved size \u2500\u2500\n    if (hasSaved) {\n      panel.querySelector(\"#sizeUseSaved\").addEventListener(\"click\", () => {\n        const w = parseFloat(savedW);\n        const h = parseFloat(savedH);\n        if (!isNaN(w) && !isNaN(h)) {\n          const wVal = isInches ? w : Math.round(w * 2.54);\n          const hVal = isInches ? h : Math.round(h * 2.54);\n          \n          inputW.value = wVal;\n          inputH.value = hVal;\n          \n          const isWValid = validateWidth();\n          const isHValid = validateHeight();\n          \n          if (isWValid && isHValid) {\n            state.selections.sizeConfirmed = true;\n            runPricingEngine();\n            updateVisualizerElements();\n            \n            // Automatically fold current step, expand next\n            if (index < totalSteps - 1) {\n              state.activeStepIdx = index + 1;\n            } else {\n              state.activeStepIdx = -1;\n            }\n            renderAccordion();\n          }\n        }\n      });\n    }\n\n    // \u2500\u2500 Confirm button \u2500\u2500\n    panel.querySelector(\"#sizeConfirmBtn\").addEventListener(\"click\", () => {\n      const isWValid = validateWidth();\n      const isHValid = validateHeight();\n      \n      if (!isWValid || !isHValid) {\n        return;\n      }\n\n      // Save size to localStorage (stored in inches)\n      localStorage.setItem(\"joydrape_saved_width\", state.selections.width);\n      localStorage.setItem(\"joydrape_saved_height\", state.selections.height);\n\n      state.selections.sizeConfirmed = true;\n      runPricingEngine();\n      updateVisualizerElements();\n\n      // Automatically fold current step, expand next\n      if (index < totalSteps - 1) {\n        state.activeStepIdx = index + 1;\n      } else {\n        state.activeStepIdx = -1;\n      }\n      renderAccordion();\n    });\n\n    // \u2500\u2500 Size Slider & Stepper Controls Logic \u2500\u2500\n    const initSizeSliders = () => {\n      const cards = panel.querySelectorAll(\".size-input-group, .size-slider-card\");\n      cards.forEach(card => {\n        const type = card.getAttribute(\"data-type\");\n        const isW = type === \"width\";\n        const inputEl = isW ? inputW : inputH;\n        const errorEl = isW ? errorW : errorH;\n        \n        const minVal = isW ? minW : minH;\n        const maxVal = isW ? maxW : maxH;\n        \n        const sliderInput = card.querySelector(\".size-slider-input\");\n        const textVal = card.querySelector(\".value-number\");\n        const stepperInput = card.querySelector(\".stepper-input\");\n        const btnMinus = card.querySelector(\".stepper-minus\");\n        const btnPlus = card.querySelector(\".stepper-plus\");\n\n        const updateDisplay = (val, clamp = true) => {\n          // Constrain if requested\n          if (clamp) {\n            val = Math.max(minVal, Math.min(maxVal, val));\n          }\n          \n          if (textVal) textVal.textContent = val;\n          if (sliderInput) sliderInput.value = Math.max(minVal, Math.min(maxVal, val));\n          if (stepperInput) stepperInput.value = val;\n          // For pricing: use floored integer when cm, so 33.3cm \u2192 price tier 33\n          inputEl.value = isInches ? val : Math.floor(val);\n          \n          // Trigger events so sizing logic & validation runs\n          inputEl.dispatchEvent(new Event(\"input\", { bubbles: true }));\n          inputEl.dispatchEvent(new Event(\"change\", { bubbles: true }));\n        };\n\n        // Initialize display value (only if inputEl.value is not empty)\n        if (inputEl.value) {\n          const initialVal = parseFloat(inputEl.value);\n          updateDisplay(initialVal, false);\n        } else {\n          if (stepperInput) stepperInput.value = \"\";\n        }\n\n        // Range Slider Event\n        if (sliderInput) {\n          sliderInput.addEventListener(\"input\", (e) => {\n            updateDisplay(parseInt(e.target.value) || minVal, true);\n          });\n\n          sliderInput.addEventListener(\"change\", (e) => {\n            isW ? validateWidth() : validateHeight();\n          });\n        }\n\n        // Stepper buttons Event (\u00B11 integer steps)\n        if (btnMinus) {\n          btnMinus.addEventListener(\"click\", () => {\n            const currentVal = Math.floor(parseFloat(stepperInput.value)) || minVal;\n            updateDisplay(currentVal - 1, true);\n            isW ? validateWidth() : validateHeight();\n          });\n        }\n\n        if (btnPlus) {\n          btnPlus.addEventListener(\"click\", () => {\n            const currentVal = Math.floor(parseFloat(stepperInput.value)) || minVal;\n            updateDisplay(currentVal + 1, true);\n            isW ? validateWidth() : validateHeight();\n          });\n        }\n\n        // Numeric input manual typing\n        if (stepperInput) {\n          stepperInput.addEventListener(\"input\", (e) => {\n            const rawVal = e.target.value.trim();\n            if (rawVal === \"\") {\n              inputEl.value = \"\";\n              inputEl.dispatchEvent(new Event(\"input\", { bubbles: true }));\n              inputEl.dispatchEvent(new Event(\"change\", { bubbles: true }));\n            } else {\n              let val = parseFloat(rawVal);\n              if (!isNaN(val)) {\n                // Manual typing should NOT clamp immediately\n                if (textVal) textVal.textContent = val;\n                if (sliderInput) sliderInput.value = Math.max(minVal, Math.min(maxVal, val));\n                // For pricing: floor cm values\n                inputEl.value = isInches ? val : Math.floor(val);\n                inputEl.dispatchEvent(new Event(\"input\", { bubbles: true }));\n                inputEl.dispatchEvent(new Event(\"change\", { bubbles: true }));\n              }\n            }\n          });\n\n          stepperInput.addEventListener(\"blur\", (e) => {\n            const rawVal = e.target.value.trim();\n            if (rawVal === \"\") {\n              inputEl.value = \"\";\n              inputEl.dispatchEvent(new Event(\"input\", { bubbles: true }));\n              inputEl.dispatchEvent(new Event(\"change\", { bubbles: true }));\n              isW ? validateWidth() : validateHeight();\n            } else {\n              const val = parseFloat(rawVal) || minVal;\n              updateDisplay(val, false); // Do NOT clamp on blur\n              isW ? validateWidth() : validateHeight();\n            }\n          });\n\n          stepperInput.addEventListener(\"keydown\", (e) => {\n            if (e.key === \"Enter\") {\n              const rawVal = stepperInput.value.trim();\n              if (rawVal === \"\") {\n                inputEl.value = \"\";\n                inputEl.dispatchEvent(new Event(\"input\", { bubbles: true }));\n                inputEl.dispatchEvent(new Event(\"change\", { bubbles: true }));\n                isW ? validateWidth() : validateHeight();\n              } else {\n                const val = parseFloat(rawVal) || minVal;\n                updateDisplay(val, false); // Do NOT clamp on Enter\n                isW ? validateWidth() : validateHeight();\n              }\n              stepperInput.blur();\n            }\n          });\n        }\n      });\n    };\n    \n    // Call initialization of sliders after rendering\n    initSizeSliders();\n\n    // \u2500\u2500 Fraction selects (Inches + Blinds mode only) \u2500\u2500\n    if (isInches && isBlinds) {\n      const fracWSelect = panel.querySelector(\"#sizeSelectWFraction\");\n      const fracHSelect = panel.querySelector(\"#sizeSelectHFraction\");\n      if (fracWSelect) {\n        fracWSelect.addEventListener(\"change\", (e) => {\n          state.selections.fractionW = e.target.value;\n          runPricingEngine();\n        });\n      }\n      if (fracHSelect) {\n        fracHSelect.addEventListener(\"change\", (e) => {\n          state.selections.fractionH = e.target.value;\n          runPricingEngine();\n        });\n      }\n    }\n\n    // Previous/Next nav buttons removed as requested\n    container.appendChild(panel);\n  }\n\n  // Find the native variant picker container (outside the configurator section)\n  function findVariantUpdateEl() {\n    const sectionId = DOM.section ? DOM.section.dataset.sectionId : null;\n    if (sectionId) {\n      const el = document.getElementById('variant-update-' + sectionId);\n      if (el) return el;\n    }\n    return document.querySelector('[id^=\"variant-update-\"]');\n  }\n\n  // Helper to dynamically update the COLOR step summary in accordion header and bottom summary\n  function updateColorStepSummary(colorName) {\n    if (!colorName) {\n      const variantUpdateEl = findVariantUpdateEl();\n      const picker = variantUpdateEl\n        ? (variantUpdateEl.closest('.x-variant-picker') || variantUpdateEl.closest('[x-data]') || variantUpdateEl)\n        : document;\n      const checked = picker.querySelector('fieldset[data-option-name=\"color\"] input:checked') ||\n                      picker.querySelector('input[name^=\"color\"]:checked') ||\n                      picker.querySelector('input[type=\"radio\"]:checked');\n      if (checked && checked.value) {\n        colorName = checked.value.trim();\n      } else if (picker.dataset && picker.dataset.option1) {\n        colorName = picker.dataset.option1.trim();\n      } else if (state.selectedVariantId && state.product && state.product.variants) {\n        const v = state.product.variants.find(x => String(x.id) === String(state.selectedVariantId));\n        if (v) colorName = (v.option1 || v.title).trim();\n      }\n    }\n    if (!colorName) return;\n\n    // Update COLOR step header in accordion\n    const colorHeaders = document.querySelectorAll('.accordion-step .accordion-header');\n    colorHeaders.forEach(hdr => {\n      const label = hdr.querySelector('.step-label');\n      if (label && label.textContent.trim() === 'COLOR') {\n        let summaryEl = hdr.querySelector('.step-summary');\n        if (summaryEl) {\n          summaryEl.textContent = colorName;\n        } else {\n          const left = hdr.querySelector('.accordion-header-left');\n          if (left) {\n            const s = document.createElement('span');\n            s.className = 'step-summary';\n            s.id = 'color-step-summary';\n            s.textContent = colorName;\n            left.appendChild(s);\n          }\n        }\n      }\n    });\n\n    if (typeof updateSelectedOptionsSummary === 'function') {\n      updateSelectedOptionsSummary();\n    }\n  }\n\n  // Setup robust listeners for color/variant changes\n  let _colorChangeListenerSetup = false;\n  function setupColorChangeListener() {\n    if (_colorChangeListenerSetup) return;\n    _colorChangeListenerSetup = true;\n\n    // 1. Delegated change event on document for any radio input change\n    document.addEventListener('change', (e) => {\n      if (e.target && (\n        e.target.matches('input[name^=\"color\"]') ||\n        e.target.matches('.x-variant-picker input[type=\"radio\"]') ||\n        e.target.matches('fieldset[data-option-name=\"color\"] input') ||\n        e.target.matches('input[type=\"radio\"][data-option-value-id]')\n      )) {\n        const val = e.target.value;\n        if (val) {\n          updateColorStepSummary(val);\n          const res = e.target.dataset.resource;\n          if (res) {\n            const scriptEl = document.querySelector(`script[data-resource=\"${res}\"]`);\n            if (scriptEl) {\n              try {\n                const vData = JSON.parse(scriptEl.textContent);\n                if (vData && vData.id) {\n                  updateBasePriceFromVariant(vData.id);\n                  runPricingEngine();\n                }\n              } catch (err) {}\n            }\n          }\n        }\n      }\n    }, true);\n\n    // 2. Delegated click event on swatch labels / images / buttons\n    document.addEventListener('click', (e) => {\n      const swatchEl = e.target.closest('label.color-watches, label[data-swatch], [id^=\"color-swatch-\"], .swatch-item, .swatch-large');\n      if (swatchEl) {\n        const forId = swatchEl.getAttribute('for');\n        const input = forId ? document.getElementById(forId) : swatchEl.querySelector('input');\n        const colorVal = swatchEl.getAttribute('aria-label') || (input ? input.value : null);\n        if (colorVal) {\n          updateColorStepSummary(colorVal);\n          setTimeout(() => updateColorStepSummary(colorVal), 50);\n          setTimeout(() => updateColorStepSummary(colorVal), 200);\n          setTimeout(() => updateColorStepSummary(colorVal), 500);\n        }\n      }\n    }, true);\n\n    // 3. Intercept dispatchEvent for Eurus theme custom events\n    try {\n      const origDispatch = document.dispatchEvent;\n      document.dispatchEvent = function(evt) {\n        if (evt && typeof evt.type === 'string' && evt.type.startsWith('eurus:product-')) {\n          if (evt.detail && evt.detail.currentVariant) {\n            const v = evt.detail.currentVariant;\n            const colorName = v.option1 || v.title;\n            if (colorName) updateColorStepSummary(colorName);\n            if (v.id) {\n              updateBasePriceFromVariant(v.id);\n              runPricingEngine();\n            }\n          } else {\n            setTimeout(updateColorStepSummary, 50);\n          }\n        }\n        return origDispatch.apply(this, arguments);\n      };\n    } catch (e) {}\n\n    // 4. MutationObserver on the variant picker container\n    try {\n      const targetNode = document.querySelector('.x-variant-picker') || document.querySelector('[id^=\"variant-update-\"]') || document.body;\n      if (targetNode) {\n        const observer = new MutationObserver((mutations) => {\n          for (const m of mutations) {\n            if (m.type === 'childList' || (m.type === 'attributes' && (m.attributeName === 'data-option1' || m.attributeName === 'checked' || m.attributeName === 'data-selected-variant'))) {\n              updateColorStepSummary();\n              break;\n            }\n          }\n        });\n        observer.observe(targetNode, { childList: true, subtree: true, attributes: true, attributeFilter: ['data-option1', 'checked', 'data-selected-variant'] });\n      }\n    } catch (e) {}\n  }\n\n  // Render Curtarra accordion steps\n  function renderAccordion() {\n    window.__jdLogs = window.__jdLogs || [];\n    // Before clearing, rescue the native variant picker node so it isn't destroyed\n    const variantUpdateEl = findVariantUpdateEl();\n    const variantPickerContainer = variantUpdateEl\n      ? (variantUpdateEl.closest('.x-variant-picker') || variantUpdateEl.closest('[x-data]') || variantUpdateEl)\n      : null;\n    const colorFieldset = findColorFieldset(variantPickerContainer);\n    const hasNativeColor = !!colorFieldset;\n\n    window.__jdLogs.push('[JoyDrape] variantUpdateEl=' + (variantUpdateEl ? variantUpdateEl.id : 'null') + ' pickerContainer=' + (variantPickerContainer ? variantPickerContainer.className : 'null') + ' hasNativeColor=' + hasNativeColor);\n\n    if (hasNativeColor && variantPickerContainer && variantPickerContainer.parentNode !== document.body) {\n      window.__jdLogs.push('[JoyDrape] parking pickerContainer off-screen, parent=' + variantPickerContainer.parentNode.className);\n      variantPickerContainer.style.display = 'none';\n      document.body.appendChild(variantPickerContainer);\n    }\n\n    DOM.accordionContainer.innerHTML = \"\";\n\n    const config = TEMPLATE_CONFIGS[state.templateId];\n    if (!config) return;\n\n    const activeSteps = config.steps.filter(step => {\n      if (typeof step.condition === \"function\") {\n        return step.condition(state.selections);\n      }\n      return true;\n    });\n\n    // Build a merged step list: consecutive width+height dropdown_select pairs become one combined SIZE step\n    const mergedSteps = [];\n    let skipNext = false;\n    activeSteps.forEach((step, idx) => {\n      if (skipNext) { skipNext = false; return; }\n      const nextStep = activeSteps[idx + 1];\n      if (\n        step.key === \"width\" && step.type === \"dropdown_select\" &&\n        nextStep && nextStep.key === \"height\" && nextStep.type === \"dropdown_select\"\n      ) {\n        mergedSteps.push({ _combined: true, widthStep: step, heightStep: nextStep });\n        skipNext = true;\n      } else {\n        mergedSteps.push(step);\n      }\n    });\n\n    // --- COLOR STEP: put native variant picker inside accordion container ---\n    if (hasNativeColor) {\n      if (state.colorStepExpanded === undefined) state.colorStepExpanded = true;\n\n      // Read current selected color name from the native input or selectedVariantId\n      let currentColorName = '';\n      const checkedInput = colorFieldset.querySelector('input[type=\"radio\"]:checked');\n      if (checkedInput && checkedInput.value) {\n        currentColorName = checkedInput.value;\n      } else if (state.selectedVariantId && state.product && state.product.variants) {\n        const v = state.product.variants.find(x => String(x.id) === String(state.selectedVariantId));\n        if (v) currentColorName = (v.option1 || v.title).trim();\n      }\n\n      const colorStepEl = document.createElement('div');\n      colorStepEl.className = 'accordion-step' + (state.colorStepExpanded ? ' active' : '');\n\n      const colorHeader = document.createElement('div');\n      colorHeader.className = 'accordion-header';\n      const hasSwatchTag = (state.product && state.product.tags) \n        ? state.product.tags.some(tag => {\n            const t = tag.toLowerCase();\n            return t === \"swatch\" || t === \"swatches\";\n          })\n        : [\"tem3\", \"tem8\", \"tem205720\"].includes(state.templateId); // Fallback to template if tags are missing due to cache\n      colorHeader.innerHTML = `\n        <div class=\"accordion-header-left\">\n          <span class=\"step-number\">1</span>\n          <span class=\"step-label\">COLOR</span>\n          ${currentColorName ? `<span class=\"step-summary\" id=\"color-step-summary\">${currentColorName}</span>` : ''}\n        </div>\n        <div class=\"accordion-header-right\" style=\"display: flex; align-items: center; gap: 12px; margin-left: auto;\">\n          ${hasSwatchTag ? '<a href=\"#\" class=\"order-free-swatches-link-header\" style=\"font-family: var(--font-body); font-size: 13px; font-weight: 600; color: #8c7865; text-decoration: underline; margin-right: 4px;\">Order Free Swatches</a>' : ''}\n          <span class=\"accordion-icon\" style=\"margin-left: 0 !important;\">${state.colorStepExpanded ? '\u25B2' : '\u25BC'}</span>\n        </div>\n      `;\n\n      const headerLink = colorHeader.querySelector(\".order-free-swatches-link-header\");\n      if (headerLink) {\n        headerLink.addEventListener(\"click\", (e) => {\n          e.preventDefault();\n          e.stopPropagation();\n          if (typeof window.openFreeSwatchesDrawer === \"function\") {\n            window.openFreeSwatchesDrawer();\n          }\n        });\n      }\n\n      const colorContent = document.createElement('div');\n      colorContent.className = 'accordion-content accordion-inner-content jd-color-content';\n      colorContent.style.display = state.colorStepExpanded ? 'block' : 'none';\n\n      // Strip all native borders/outlines from the variant picker and fieldset\n      const stripStyles = 'border:none!important;outline:none!important;box-shadow:none!important;padding:0!important;width:100%!important;';\n      variantUpdateEl.style.cssText += stripStyles;\n      colorFieldset.style.cssText += stripStyles;\n      // Strip legend border (Webkit renders a default border around fieldset via legend)\n      const legend = colorFieldset.querySelector('legend');\n      if (legend) legend.style.cssText += 'border:none!important;padding:0!important;margin:0!important;';\n\n      // Restore the native node into our accordion content\n      if (variantPickerContainer) {\n        variantPickerContainer.style.display = '';\n        colorContent.appendChild(variantPickerContainer);\n      } else {\n        variantUpdateEl.style.display = '';\n        colorContent.appendChild(variantUpdateEl);\n      }\n\n      colorStepEl.appendChild(colorHeader);\n      colorStepEl.appendChild(colorContent);\n      DOM.accordionContainer.appendChild(colorStepEl);\n\n      // Listen for color selection to update summary in header\n      colorFieldset.addEventListener('change', () => {\n        const sel = colorFieldset.querySelector('input[type=\"radio\"]:checked');\n        if (sel && sel.value) {\n          updateColorStepSummary(sel.value);\n        }\n      });\n\n      colorHeader.addEventListener('click', () => {\n        state.colorStepExpanded = !state.colorStepExpanded;\n        colorStepEl.classList.toggle('active', state.colorStepExpanded);\n        colorContent.style.display = state.colorStepExpanded ? 'block' : 'none';\n        colorHeader.querySelector('.accordion-icon').textContent = state.colorStepExpanded ? '\u25B2' : '\u25BC';\n      });\n    }\n\n    mergedSteps.forEach((stepOrPair, idx) => {\n      const isCombined = stepOrPair._combined;\n      const step = isCombined ? stepOrPair.widthStep : stepOrPair;\n      const isExpanded = idx === state.activeStepIdx;\n      \n      let isLocked = false;\n      for (let prevIdx = 0; prevIdx < idx; prevIdx++) {\n        const prev = mergedSteps[prevIdx];\n        const prevStep = prev._combined ? prev.widthStep : prev;\n        if (prevStep.required && !isStepValidMerged(prev)) {\n          isLocked = true;\n          break;\n        }\n      }\n\n      const stepEl = document.createElement(\"div\");\n      stepEl.className = `accordion-step ${isExpanded ? 'active' : ''} ${isLocked ? 'locked' : ''}`;\n      stepEl.dataset.index = idx;\n\n      let summaryText = \"\";\n      let headerLabel = isCombined ? \"SIZE\" : (step.key === \"headerStyle\" ? \"HEADER\" : step.label);\n      const stepNumber = hasNativeColor ? idx + 2 : idx + 1;\n\n      if (!isLocked && !isExpanded) {\n        if (isCombined) {\n          const w = state.selections.width;\n          const h = state.selections.height;\n          if (w && h) {\n            const unitLabel = state.unit === \"cm\" ? \"cm\" : '\"';\n            if (state.unit === \"cm\") {\n              const displayW = Math.round(w * 2.54);\n              const displayH = Math.round(h * 2.54);\n              summaryText = `${displayW}${unitLabel}W x ${displayH}${unitLabel}L`;\n            } else {\n              const fracW = (state.selections.fractionW && state.selections.fractionW !== \"0\" && state.selections.fractionW !== \"0/0\") ? ` ${state.selections.fractionW}` : \"\";\n              const fracH = (state.selections.fractionH && state.selections.fractionH !== \"0\" && state.selections.fractionH !== \"0/0\") ? ` ${state.selections.fractionH}` : \"\";\n              summaryText = `${w}${fracW}${unitLabel}W x ${h}${fracH}${unitLabel}L`;\n            }\n          } else {\n            summaryText = \"\";\n          }\n        } else if (step.type === \"size_input\") {\n          if (step.singleInput) {\n            const valL = state.selections[step.key];\n            if (valL !== undefined && valL !== null && valL !== \"\") {\n              const fracL = (state.selections.fractionL && state.selections.fractionL !== \"0\" && state.selections.fractionL !== \"0/0\") ? ` ${state.selections.fractionL}` : \"\";\n              summaryText = `${valL}${fracL} ${state.unit}`;\n            } else {\n              summaryText = \"\";\n            }\n          } else {\n            const w = state.selections.width;\n            const h = state.selections.height;\n            if (w !== undefined && w !== null && w !== \"\" && h !== undefined && h !== null && h !== \"\") {\n              const fracW = (state.selections.fractionW && state.selections.fractionW !== \"0\" && state.selections.fractionW !== \"0/0\") ? ` ${state.selections.fractionW}` : \"\";\n              const fracH = (state.selections.fractionH && state.selections.fractionH !== \"0\" && state.selections.fractionH !== \"0/0\") ? ` ${state.selections.fractionH}` : \"\";\n              summaryText = `${w}${fracW}w x ${h}${fracH}h ${state.unit}`;\n            } else {\n              summaryText = \"\";\n            }\n          }\n        } else {\n          summaryText = state.selections[step.key] || \"\";\n        }\n      }\n\n      // Check if help box exists (either single legacy format or multiple boxes)\n      let helpBoxes = [];\n      const targetStep = isCombined ? stepOrPair.widthStep : step;\n\n      if (targetStep.helpBoxes && Array.isArray(targetStep.helpBoxes)) {\n        helpBoxes = targetStep.helpBoxes.filter(box => box.content && box.content.length > 0);\n        if (targetStep.key === 'lining' && targetStep.label !== 'Shade Lining' && !targetStep.label.toLowerCase().includes('shade')) {\n          let hasLiningLink = false;\n          helpBoxes.forEach(box => {\n            if (box.content.some(item => item.type === 'link' && item.url && item.url.includes('#lining'))) {\n              hasLiningLink = true;\n            }\n          });\n          if (!hasLiningLink) {\n            if (helpBoxes.length > 0) {\n              helpBoxes[0].content.push({\n                type: 'link',\n                text: 'Learn more about different linings',\n                url: '#lining-guidelines'\n              });\n            } else {\n              helpBoxes.push({\n                style: 'text',\n                image: '',\n                content: [\n                  { type: 'text', text: 'Choose the desired lining type for your curtains below.' },\n                  { type: 'link', text: 'Learn more about different linings', url: '#lining-guidelines' }\n                ]\n              });\n            }\n          }\n        } else if (targetStep.key === 'mountType' || targetStep.key === 'mountingType') {\n          let hasMountLink = false;\n          helpBoxes.forEach(box => {\n            if (box.content.some(item => item.type === 'link' && item.url && (item.url.includes('#mount') || item.url.includes('#step-guidelines')))) {\n              hasMountLink = true;\n            }\n          });\n          if (!hasMountLink) {\n            if (helpBoxes.length > 0) {\n              helpBoxes[0].content.push({\n                type: 'link',\n                text: 'Learn more about different mount types',\n                url: '#mount-guidelines'\n              });\n            } else {\n              helpBoxes.push({\n                style: 'text',\n                image: '',\n                content: [\n                  { type: 'text', text: 'Choose the desired mounting option for your shades below.' },\n                  { type: 'link', text: 'Learn more about different mount types', url: '#mount-guidelines' }\n                ]\n              });\n            }\n          }\n        }\n      } else {\n        // Fallback to legacy single box config\n        let legacyContent = [];\n        if (targetStep.helpContent) {\n          legacyContent = targetStep.helpContent;\n        } else if (targetStep.helpItems) {\n          targetStep.helpItems.forEach(item => {\n            if (item.text) legacyContent.push({ type: 'text', text: item.text });\n            if (item.linkUrl) legacyContent.push({ type: 'link', text: item.linkText || 'Learn more', url: item.linkUrl });\n          });\n        } else if (targetStep.helpText && !targetStep.singleInput) {\n          legacyContent.push({ type: 'text', text: targetStep.helpText });\n          if (targetStep.learnMoreUrl) {\n            legacyContent.push({\n              type: 'link',\n              text: targetStep.learnMoreText || 'Learn more',\n              url: targetStep.learnMoreUrl\n            });\n          }\n        }\n        \n        if (targetStep.key === 'lining' && targetStep.label !== 'Shade Lining' && !targetStep.label.toLowerCase().includes('shade')) {\n          if (legacyContent.length === 0) {\n            legacyContent.push({ type: 'text', text: 'Choose the desired lining type for your curtains below.' });\n          }\n          const hasLiningLink = legacyContent.some(item => item.type === 'link' && item.url && item.url.includes('#lining'));\n          if (!hasLiningLink) {\n            legacyContent.push({\n              type: 'link',\n              text: 'Learn more about different linings',\n              url: '#lining-guidelines'\n            });\n          }\n        } else if (targetStep.key === 'mountType' || targetStep.key === 'mountingType') {\n          if (legacyContent.length === 0) {\n            legacyContent.push({ type: 'text', text: 'Choose the desired mounting option for your shades below.' });\n          }\n          const hasMountLink = legacyContent.some(item => item.type === 'link' && item.url && (item.url.includes('#mount') || item.url.includes('#step-guidelines')));\n          if (!hasMountLink) {\n            legacyContent.push({\n              type: 'link',\n              text: 'Learn more about different mount types',\n              url: '#mount-guidelines'\n            });\n          }\n        }\n\n        if (legacyContent.length > 0) {\n          helpBoxes.push({\n            style: targetStep.helpStyle || 'text',\n            image: targetStep.helpImage || '',\n            content: legacyContent\n          });\n        }\n      }\n\n      const hasHelp = helpBoxes.length > 0;\n\n      const headerEl = document.createElement(\"div\");\n      headerEl.className = \"accordion-header\";\n      headerEl.innerHTML = `\n        <div class=\"accordion-header-left\">\n          <span class=\"step-number\">${stepNumber}</span>\n          <span class=\"step-label\">${headerLabel}</span>\n          ${summaryText ? `<span class=\"step-summary\">${summaryText}</span>` : \"\"}\n        </div>\n        <span class=\"accordion-icon\">${isExpanded ? '\u25B2' : '\u25BC'}</span>\n      `;\n\n      headerEl.addEventListener(\"click\", () => {\n        if (!stepEl.classList.contains(\"locked\")) {\n          state.activeStepIdx = idx;\n          renderAccordion();\n        }\n      });\n\n      const contentEl = document.createElement(\"div\");\n      contentEl.className = \"accordion-content\";\n\n      const innerContentEl = document.createElement(\"div\");\n      innerContentEl.className = \"accordion-inner-content\";\n\n      // Render help box content directly inline inside the expanded step\n      if (hasHelp) {\n        helpBoxes.forEach(box => {\n          const helpStyle = box.style || 'text';\n          const helpImage = box.image || '';\n          \n          const helpBox = document.createElement(\"div\");\n          helpBox.className = `step-help-box style-${helpStyle}`;\n          helpBox.style.cssText = \"margin-bottom: 8px;\";\n          \n          let helpInnerHtml = \"\";\n          let contentHtml = \"\";\n          \n          box.content.forEach(item => {\n            if (item.type === 'link' && item.url) {\n              contentHtml += `<div class=\"step-help-line\"><a href=\"${item.url}\" class=\"step-learn-more\" target=\"_blank\">${item.text || 'Learn more'} <span style=\"font-size:12px;\">\u2192</span></a></div>`;\n            } else {\n              contentHtml += `<div class=\"step-help-line step-help-text\">${item.text || ''}</div>`;\n            }\n          });\n\n          if (helpStyle === 'alert') {\n            helpInnerHtml = `\n              <span class=\"step-help-icon\">\uD83D\uDCA1</span>\n              <div class=\"step-help-body\">\n                ${contentHtml}\n              </div>\n            `;\n          } else if (helpStyle === 'warning') {\n            helpInnerHtml = `\n              <span class=\"step-help-icon\">\u26A0\uFE0F</span>\n              <div class=\"step-help-body\">\n                ${contentHtml}\n              </div>\n            `;\n          } else if (helpStyle === 'info_tip') {\n            const helpIcon = box.icon || '\u2139\uFE0F';\n            helpInnerHtml = `\n              <span class=\"step-help-icon\">${helpIcon}</span>\n              <div class=\"step-help-body\">\n                ${contentHtml}\n              </div>\n            `;\n          } else if (helpStyle === 'collapsible') {\n            helpInnerHtml = `\n              <details style=\"width:100%\">\n                <summary>\uD83D\uDCD0 View Help Details (\u67E5\u770B\u8BF4\u660E)</summary>\n                <div class=\"step-help-body\">\n                  ${contentHtml}\n                </div>\n              </details>\n            `;\n          } else if (helpStyle === 'image_text' && helpImage) {\n            helpInnerHtml = `\n              <div class=\"step-help-img-wrap\" onclick=\"window.showHelpImageModal('${helpImage}')\">\n                <img src=\"${helpImage}\" class=\"step-help-img\" alt=\"Guide\">\n                <div class=\"step-help-img-zoom-hint\">\uD83D\uDD0D</div>\n              </div>\n              <div class=\"step-help-body\">\n                ${contentHtml}\n              </div>\n            `;\n          } else {\n            // Default text style\n            helpInnerHtml = `\n              <div class=\"step-help-body\">\n                ${contentHtml}\n              </div>\n            `;\n          }\n          \n          helpBox.innerHTML = helpInnerHtml;\n          innerContentEl.appendChild(helpBox);\n        });\n      }\n\n      if (isCombined) {\n        renderSizePanelCurtarra(stepOrPair.widthStep, stepOrPair.heightStep, innerContentEl, idx, mergedSteps.length);\n      } else {\n        renderStepInputs(step, innerContentEl, idx, mergedSteps.length);\n      }\n\n      contentEl.appendChild(innerContentEl);\n      stepEl.appendChild(headerEl);\n      stepEl.appendChild(contentEl);\n      DOM.accordionContainer.appendChild(stepEl);\n    });\n\n    // Also refresh options summary list\n    updateSelectedOptionsSummary();\n  }\n\n  // Draw appropriate inputs for accordion step\n  function renderStepInputs(step, container, index, totalSteps) {\n    if (step.type === \"dropdown_select\") {\n      const wrapper = document.createElement(\"div\");\n      wrapper.className = \"input-box\";\n      wrapper.style.width = \"100%\";\n      wrapper.innerHTML = `\n        <select id=\"select_${step.key}\" style=\"width: 100%; padding: 12px; border: 1px solid var(--color-border); border-radius: 8px; background-color: var(--color-surface); color: var(--color-text); outline: none; cursor: pointer; font-family: var(--font-body); font-size: 14px;\">\n          ${(step.values || []).map(val => {\n            const isSelected = state.selections[step.key] === val.value;\n            return `<option value=\"${val.value}\" ${isSelected ? 'selected' : ''}>${val.value}</option>`;\n          }).join('')}\n        </select>\n      `;\n\n      wrapper.querySelector(\"select\").addEventListener(\"change\", (e) => {\n        state.selections[step.key] = e.target.value;\n        runPricingEngine();\n        updateVisualizerElements();\n        \n        setTimeout(() => {\n          if (index === state.activeStepIdx) {\n            if (index < totalSteps - 1) {\n              state.activeStepIdx++;\n            } else {\n              state.activeStepIdx = -1;\n            }\n          }\n          renderAccordion();\n        }, 300);\n      });\n\n      container.appendChild(wrapper);\n    }\n    else if (step.type === \"radio\" || step.type === \"text_radio\") {\n      const wrapper = document.createElement(\"div\");\n      wrapper.className = \"radio-options-group\";\n      wrapper.style.display = \"flex\";\n      wrapper.style.gap = \"20px\";\n      wrapper.style.marginTop = \"8px\";\n      \n      step.values.forEach(val => {\n        const isChecked = state.selections[step.key] === val.value;\n        const label = document.createElement(\"label\");\n        label.style.display = \"inline-flex\";\n        label.style.alignItems = \"center\";\n        label.style.gap = \"6px\";\n        label.style.cursor = \"pointer\";\n        label.style.fontSize = \"14px\";\n        label.style.color = \"var(--color-text)\";\n        \n        label.innerHTML = `\n          <input type=\"radio\" name=\"${step.key}\" value=\"${val.value}\" ${isChecked ? 'checked' : ''} style=\"accent-color: var(--color-primary); cursor: pointer; width: 18px; height: 18px;\">\n          <span>${val.value}</span>\n        `;\n        \n        label.querySelector(\"input\").addEventListener(\"change\", (e) => {\n          state.selections[step.key] = e.target.value;\n          runPricingEngine();\n          updateVisualizerElements();\n          \n          setTimeout(() => {\n            if (index === state.activeStepIdx) {\n              if (index < totalSteps - 1) {\n                state.activeStepIdx++;\n              } else {\n                state.activeStepIdx = -1;\n              }\n            }\n            renderAccordion();\n          }, 300);\n        });\n        \n        wrapper.appendChild(label);\n      });\n      container.appendChild(wrapper);\n    }\n    else if (step.type === \"image_radio\") {\n      const grid = document.createElement(\"div\");\n      grid.className = \"options-grid\";\n      if (step.values && step.values.length === 2) {\n        grid.style.gridTemplateColumns = \"repeat(2, 1fr)\";\n      }\n\n      step.values.forEach(val => {\n        const isChecked = state.selections[step.key] === val.value;\n        const card = document.createElement(\"label\");\n        card.className = \"option-card\";\n        \n        // Show price/free text for tem209676 or cards with explicit priceText\n        const showPrice = (state.templateId === \"tem209676\" && val.priceText);\n\n        card.innerHTML = `\n          <input type=\"radio\" name=\"${step.key}\" value=\"${val.value}\" ${isChecked ? 'checked' : ''}>\n          <div class=\"card-body\">\n            <div class=\"card-img-wrapper\" style=\"background-image: url('${val.image || ''}')\">\n              ${!val.image ? `<div class=\"card-img-placeholder\"></div>` : \"\"}\n            </div>\n            <span class=\"card-name\">${val.value}</span>\n            ${showPrice ? `<span class=\"card-price\" style=\"display: block !important; font-size: 13px; font-weight: 600; color: #a07c50; margin-top: 4px; line-height: 1.2;\">${val.priceText}</span>` : \"\"}\n          </div>\n        `;\n\n        let isAdvancing = false;\n        const advanceToNext = (chosenVal) => {\n          if (isAdvancing) return;\n          isAdvancing = true;\n          state.selections[step.key] = chosenVal;\n          updateStepLockStates();\n          updateSelectedOptionsSummary();\n          runPricingEngine();\n          updateVisualizerElements();\n          \n          // \u9009\u5B8C\u6216\u518D\u6B21\u70B9\u51FB\u5F53\u524D\u9009\u4E2D\u7684\u9009\u9879\uFF0C\u5747\u81EA\u52A8\u8FDB\u5165\u4E0B\u4E00\u6B65\n          setTimeout(() => {\n            if (index < totalSteps - 1) {\n              state.activeStepIdx = index + 1;\n            } else {\n              state.activeStepIdx = -1;\n            }\n            renderAccordion();\n            isAdvancing = false;\n          }, 300);\n        };\n\n        const radioInput = card.querySelector(\"input\");\n        radioInput.addEventListener(\"change\", (e) => {\n          advanceToNext(e.target.value);\n        });\n\n        card.addEventListener(\"click\", () => {\n          // \u82E5\u70B9\u51FB\u5DF2\u662F\u9009\u4E2D\u72B6\u6001\u7684\u5361\u7247\uFF0Cinput \u4E0D\u4F1A\u89E6\u53D1 change\uFF0C\u56E0\u6B64\u76F4\u63A5\u8C03\u7528\u8FDB\u5165\u4E0B\u4E00\u6B65\n          if (state.selections[step.key] === val.value) {\n            advanceToNext(val.value);\n          }\n        });\n\n        grid.appendChild(card);\n      });\n      container.appendChild(grid);\n    }\n\n    else if (step.type === \"size_input\") {\n      const sizeContainer = document.createElement(\"div\");\n      sizeContainer.className = \"size-fields-container\";\n\n      if (step.singleInput) {\n        // Render Curtarra-style Note if helpText exists\n        if (step.helpText) {\n          const noteBox = document.createElement(\"div\");\n          noteBox.className = \"single-size-note\";\n          noteBox.style.cssText = \"display: flex; gap: 10px; align-items: flex-start; background: #faf6f0; border: 1px solid #ebd9c8; border-radius: 8px; padding: 12px 14px; margin-bottom: 16px;\";\n          noteBox.innerHTML = `\n            <span style=\"flex-shrink: 0; margin-top: 1px; color: #a07c50;\">\n              <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\n            </span>\n            <div style=\"font-size: 13px; line-height: 1.5; color: #4a4a4a;\">\n              <strong style=\"color: #2b2b2b; display: block; margin-bottom: 2px;\">PLEASE NOTE:</strong>\n              ${step.helpText.replace(/^PLEASE NOTE:\\s*/i, '')}\n            </div>\n          `;\n          sizeContainer.appendChild(noteBox);\n        }\n\n        // Unit selector pill\n        const unitRow = document.createElement(\"div\");\n        unitRow.style.cssText = \"display: flex; justify-content: flex-start; align-items: center; margin-bottom: 14px;\";\n        unitRow.innerHTML = `\n          <div class=\"size-unit-toggle\" style=\"display: inline-flex; background: #f4efe9; border-radius: 20px; padding: 3px; gap: 4px;\">\n            <button type=\"button\" class=\"size-unit-btn ${state.unit === 'in' ? 'active' : ''}\" id=\"btnUnitIn\" style=\"padding: 6px 18px; border: none; border-radius: 16px; font-size: 13px; font-weight: 600; cursor: pointer; background: ${state.unit === 'in' ? '#2c2724' : 'transparent'}; color: ${state.unit === 'in' ? '#fff' : '#666'}; transition: all 0.2s;\">inches</button>\n            <button type=\"button\" class=\"size-unit-btn ${state.unit === 'cm' ? 'active' : ''}\" id=\"btnUnitCm\" style=\"padding: 6px 18px; border: none; border-radius: 16px; font-size: 13px; font-weight: 600; cursor: pointer; background: ${state.unit === 'cm' ? '#2c2724' : 'transparent'}; color: ${state.unit === 'cm' ? '#fff' : '#666'}; transition: all 0.2s;\">cm</button>\n          </div>\n        `;\n\n        unitRow.querySelector(\"#btnUnitIn\").addEventListener(\"click\", () => {\n          if (state.unit !== \"in\") {\n            convertUnits(\"in\", step);\n            renderAccordion();\n          }\n        });\n\n        unitRow.querySelector(\"#btnUnitCm\").addEventListener(\"click\", () => {\n          if (state.unit !== \"cm\") {\n            convertUnits(\"cm\", step);\n            renderAccordion();\n          }\n        });\n\n        sizeContainer.appendChild(unitRow);\n\n        const hasFractions = step.showFractions && state.unit === \"in\";\n        const fracs = [\"0\", \"1/8\", \"1/4\", \"3/8\", \"1/2\", \"5/8\", \"3/4\", \"7/8\"];\n\n        const minL = state.unit === \"in\" ? (step.minL || step.minW || 10) : Math.round((step.minL || step.minW || 10) * 2.54);\n        const maxL = state.unit === \"in\" ? (step.maxL || step.maxW || 80) : Math.round((step.maxL || step.maxW || 80) * 2.54);\n        const valL = state.selections[step.key];\n\n        const rowBlock = document.createElement(\"div\");\n        rowBlock.className = \"size-input-row-block\";\n        rowBlock.style.cssText = \"display: flex; flex-direction: row; gap: 12px; width: 100%; align-items: flex-start;\";\n\n        const field = document.createElement(\"div\");\n        field.className = \"size-input-box-wrap\";\n        field.style.cssText = \"flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 6px;\";\n        field.innerHTML = `\n          <label style=\"font-size: 13px; font-weight: 600; color: #2b2b2b;\">${step.inputLabel || step.label || 'Width'}</label>\n          <div class=\"size-input-field-wrap\" style=\"position: relative; display: flex; align-items: center; width: 100%;\">\n            <input type=\"number\" id=\"manualLength\" class=\"stepper-input size-field-input\" min=\"${minL}\" max=\"${maxL}\" step=\"${state.unit === 'in' ? '1' : '0.1'}\" value=\"${valL !== null && valL !== undefined ? valL : ''}\" placeholder=\"Please enter the width\" style=\"width: 100%; height: 42px; padding: 8px 60px 8px 14px; border: 1.5px solid #eae4dc; border-radius: 8px; font-size: 15px; font-weight: 500; color: #2b2b2b; outline: none; background: #fff; box-sizing: border-box; transition: border-color 0.2s;\">\n            <span class=\"size-field-unit\" style=\"position: absolute; right: 14px; font-size: 12px; color: #888; font-weight: 500; pointer-events: none;\">${state.unit === 'cm' ? 'cm' : 'inches'}</span>\n          </div>\n          <div style=\"display: flex; justify-content: space-between; align-items: center; margin-top: 4px;\">\n            <span class=\"size-range-tip\" style=\"font-size: 11px; color: #888;\">Allowed Range: ${minL} to ${maxL} ${state.unit === 'cm' ? 'cm' : 'inches'}</span>\n            ${state.templateId === \"tem209676\" ? `<span id=\"widthSurchargeTag\" style=\"font-size: 12px; font-weight: 600; color: #a07c50;\">Surcharge: ${(!valL || valL <= 10) ? 'Free' : '+$' + (Math.round(Math.max(0, Math.floor(valL) - 10) * 1.40 * 100) / 100).toFixed(2)}</span>` : ''}\n          </div>\n          <div class=\"size-validation-error\" id=\"valErrorL\" style=\"color: #d9534f; font-size: 12px; display: none; margin-top: 4px;\"></div>\n        `;\n        rowBlock.appendChild(field);\n\n        let fracField = null;\n        if (hasFractions) {\n          fracField = document.createElement(\"div\");\n          fracField.className = \"size-fraction-box-wrap\";\n          fracField.style.cssText = \"width: 110px; flex-shrink: 0; display: flex; flex-direction: column; gap: 6px;\";\n          fracField.innerHTML = `\n            <label style=\"font-size: 13px; font-weight: 600; color: #2b2b2b;\">Eighths</label>\n            <div style=\"position: relative; width: 100%;\">\n              <select id=\"lengthFraction\" class=\"fraction-select\" style=\"width: 100%; height: 42px; padding: 0 12px; border: 1.5px solid #eae4dc; border-radius: 8px; font-size: 15px; font-weight: 500; color: #2b2b2b; outline: none; background: #fff; cursor: pointer; box-sizing: border-box;\">\n                ${fracs.map(f => `<option value=\"${f}\" ${(state.selections.fractionL === f || (!state.selections.fractionL && f === '0')) ? 'selected' : ''}>${f}</option>`).join('')}\n              </select>\n            </div>\n          `;\n          rowBlock.appendChild(fracField);\n        }\n\n        const inputEl = field.querySelector(\"input\");\n        inputEl.addEventListener(\"input\", (e) => {\n          const val = parseFloat(e.target.value);\n          const errorDiv = field.querySelector(\"#valErrorL\");\n          \n          if (isNaN(val) || val < minL || val > maxL) {\n            errorDiv.textContent = `Please enter a valid width between ${minL} and ${maxL} ${state.unit === 'cm' ? 'cm' : 'inches'}.`;\n            errorDiv.style.display = \"block\";\n            inputEl.style.borderColor = \"#d9534f\";\n            state.validationErrors.length = true;\n          } else {\n            errorDiv.style.display = \"none\";\n            inputEl.style.borderColor = \"#eae4dc\";\n            delete state.validationErrors.length;\n            state.selections[step.key] = state.unit === \"in\" ? val : parseFloat((val / 2.54).toFixed(1));\n            const surchargeTag = field.querySelector(\"#widthSurchargeTag\");\n            if (surchargeTag && state.templateId === \"tem209676\") {\n              const inVal = state.unit === \"in\" ? val : (val / 2.54);\n              surchargeTag.textContent = (inVal <= 10) ? 'Surcharge: Free' : 'Surcharge: +$' + (Math.round(Math.max(0, Math.floor(inVal) - 10) * 1.40 * 100) / 100).toFixed(2);\n            }\n            updateStepLockStates();\n            updateSelectedOptionsSummary();\n            runPricingEngine();\n            updateVisualizerElements();\n          }\n        });\n\n        if (hasFractions && fracField) {\n          fracField.querySelector(\"#lengthFraction\").addEventListener(\"change\", (e) => {\n            state.selections.fractionL = e.target.value;\n            updateSelectedOptionsSummary();\n            runPricingEngine();\n          });\n        }\n\n        sizeContainer.appendChild(rowBlock);\n\n        // Save & Continue Button\n        const continueBtn = document.createElement(\"button\");\n        continueBtn.type = \"button\";\n        continueBtn.id = \"btnContinueSize\";\n        continueBtn.style.cssText = \"margin-top: 18px; width: 100%; height: 44px; border: none; border-radius: 8px; background: #2c2724; color: #fff; font-size: 13px; font-weight: 700; cursor: pointer; transition: background 0.2s; text-transform: uppercase; letter-spacing: 0.5px;\";\n        continueBtn.textContent = \"Save & Continue\";\n        continueBtn.addEventListener(\"click\", () => {\n          const val = parseFloat(inputEl.value);\n          if (isNaN(val) || val < minL || val > maxL) {\n            const errorDiv = field.querySelector(\"#valErrorL\");\n            errorDiv.textContent = `Please enter a valid width between ${minL} and ${maxL} ${state.unit === 'cm' ? 'cm' : 'inches'}.`;\n            errorDiv.style.display = \"block\";\n            inputEl.style.borderColor = \"#d9534f\";\n            return;\n          }\n          state.selections[step.key] = state.unit === \"in\" ? val : parseFloat((val / 2.54).toFixed(1));\n          updateStepLockStates();\n          updateSelectedOptionsSummary();\n          runPricingEngine();\n          if (index < totalSteps - 1) {\n            state.activeStepIdx = index + 1;\n          } else {\n            state.activeStepIdx = -1;\n          }\n          renderAccordion();\n        });\n        sizeContainer.appendChild(continueBtn);\n      } else {\n        const unitRow = document.createElement(\"div\");\n        unitRow.style.cssText = \"display: flex; justify-content: flex-start; align-items: center; margin-bottom: 14px;\";\n        unitRow.innerHTML = `\n          <div class=\"size-unit-toggle\" style=\"display: inline-flex; background: #f4efe9; border-radius: 20px; padding: 3px; gap: 4px;\">\n            <button type=\"button\" class=\"size-unit-btn ${state.unit === 'in' ? 'active' : ''}\" id=\"btnUnitInDual\" style=\"padding: 6px 18px; border: none; border-radius: 16px; font-size: 13px; font-weight: 600; cursor: pointer; background: ${state.unit === 'in' ? '#2c2724' : 'transparent'}; color: ${state.unit === 'in' ? '#fff' : '#666'}; transition: all 0.2s;\">inches</button>\n            <button type=\"button\" class=\"size-unit-btn ${state.unit === 'cm' ? 'active' : ''}\" id=\"btnUnitCmDual\" style=\"padding: 6px 18px; border: none; border-radius: 16px; font-size: 13px; font-weight: 600; cursor: pointer; background: ${state.unit === 'cm' ? '#2c2724' : 'transparent'}; color: ${state.unit === 'cm' ? '#fff' : '#666'}; transition: all 0.2s;\">cm</button>\n          </div>\n        `;\n        unitRow.querySelector(\"#btnUnitInDual\").addEventListener(\"click\", () => {\n          if (state.unit !== \"in\") {\n            convertUnits(\"in\", step);\n            renderAccordion();\n          }\n        });\n        unitRow.querySelector(\"#btnUnitCmDual\").addEventListener(\"click\", () => {\n          if (state.unit !== \"cm\") {\n            convertUnits(\"cm\", step);\n            renderAccordion();\n          }\n        });\n        sizeContainer.appendChild(unitRow);\n\n        const minW = state.unit === \"in\" ? step.minW : Math.round(step.minW * 2.54);\n        const maxW = state.unit === \"in\" ? step.maxW : Math.round(step.maxW * 2.54);\n        const minH = state.unit === \"in\" ? step.minH : Math.round(step.minH * 2.54);\n        const maxH = state.unit === \"in\" ? step.maxH : Math.round(step.maxH * 2.54);\n\n        const valW = state.unit === \"in\" ? state.selections.width : Math.round(state.selections.width * 2.54);\n        const valH = state.unit === \"in\" ? state.selections.height : Math.round(state.selections.height * 2.54);\n\n        // Width row container\n        const widthRow = document.createElement(\"div\");\n        widthRow.className = \"size-input-row-block\";\n\n        const widthField = document.createElement(\"div\");\n        widthField.className = \"size-input-box-wrap\";\n        widthField.innerHTML = `\n          <label>Width</label>\n          <div class=\"input-wrap\">\n            <input type=\"number\" id=\"manualWidth\" min=\"${minW}\" max=\"${maxW}\" value=\"${valW}\">\n            <span class=\"input-unit\">${state.unit}</span>\n          </div>\n          <span class=\"size-range-tip\">Range: ${minW} - ${maxW} ${state.unit}</span>\n          <div class=\"size-validation-error\" id=\"valErrorW\" style=\"color:#d9534f; font-size:11px; display:none; margin-top:4px;\"></div>\n        `;\n        widthRow.appendChild(widthField);\n\n        if (hasFractions) {\n          const widthFracField = document.createElement(\"div\");\n          widthFracField.className = \"size-fraction-box-wrap\";\n          widthFracField.innerHTML = `\n            <label>Eighths</label>\n            <select id=\"widthFraction\" class=\"fraction-select\">\n              ${fracs.map(f => `<option value=\"${f}\" ${state.selections.fractionW === f ? 'selected' : ''}>${f}</option>`).join('')}\n            </select>\n          `;\n          widthRow.appendChild(widthFracField);\n        }\n\n        widthField.querySelector(\"input\").addEventListener(\"input\", (e) => {\n          const val = parseFloat(e.target.value);\n          const errorDiv = widthField.querySelector(\"#valErrorW\");\n          if (isNaN(val) || val < minW || val > maxW) {\n            errorDiv.textContent = `Must be ${minW} to ${maxW}.`;\n            errorDiv.style.display = \"block\";\n            state.validationErrors.width = true;\n          } else {\n            errorDiv.style.display = \"none\";\n            delete state.validationErrors.width;\n            state.selections.width = state.unit === \"in\" ? val : parseFloat((val / 2.54).toFixed(1));\n            runPricingEngine();\n            updateVisualizerElements();\n          }\n        });\n\n        if (hasFractions) {\n          widthRow.querySelector(\"#widthFraction\").addEventListener(\"change\", (e) => {\n            state.selections.fractionW = e.target.value;\n            runPricingEngine();\n          });\n        }\n\n        // Height row container\n        const heightRow = document.createElement(\"div\");\n        heightRow.className = \"size-input-row-block\";\n\n        const heightField = document.createElement(\"div\");\n        heightField.className = \"size-input-box-wrap\";\n        heightField.innerHTML = `\n          <label>Length</label>\n          <div class=\"input-wrap\">\n            <input type=\"number\" id=\"manualHeight\" min=\"${minH}\" max=\"${maxH}\" value=\"${valH}\">\n            <span class=\"input-unit\">${state.unit}</span>\n          </div>\n          <span class=\"size-range-tip\">Range: ${minH} - ${maxH} ${state.unit}</span>\n          <div class=\"size-validation-error\" id=\"valErrorH\" style=\"color:#d9534f; font-size:11px; display:none; margin-top:4px;\"></div>\n        `;\n        heightRow.appendChild(heightField);\n\n        if (hasFractions) {\n          const heightFracField = document.createElement(\"div\");\n          heightFracField.className = \"size-fraction-box-wrap\";\n          heightFracField.innerHTML = `\n            <label>Eighths</label>\n            <select id=\"heightFraction\" class=\"fraction-select\">\n              ${fracs.map(f => `<option value=\"${f}\" ${state.selections.fractionH === f ? 'selected' : ''}>${f}</option>`).join('')}\n            </select>\n          `;\n          heightRow.appendChild(heightFracField);\n        }\n\n        heightField.querySelector(\"input\").addEventListener(\"input\", (e) => {\n          const val = parseFloat(e.target.value);\n          const errorDiv = heightField.querySelector(\"#valErrorH\");\n          if (isNaN(val) || val < minH || val > maxH) {\n            errorDiv.textContent = `Must be ${minH} to ${maxH}.`;\n            errorDiv.style.display = \"block\";\n            state.validationErrors.height = true;\n          } else {\n            errorDiv.style.display = \"none\";\n            delete state.validationErrors.height;\n            state.selections.height = state.unit === \"in\" ? val : parseFloat((val / 2.54).toFixed(1));\n            runPricingEngine();\n            updateVisualizerElements();\n          }\n        });\n\n        if (hasFractions) {\n          heightRow.querySelector(\"#heightFraction\").addEventListener(\"change\", (e) => {\n            state.selections.fractionH = e.target.value;\n            runPricingEngine();\n          });\n        }\n\n        sizeContainer.appendChild(widthRow);\n        sizeContainer.appendChild(heightRow);\n      }\n      container.appendChild(sizeContainer);\n    }\n\n    else if (step.type === \"text_input\") {\n      const wrapper = document.createElement(\"div\");\n      wrapper.className = \"input-box\";\n      wrapper.innerHTML = `\n        <label>${step.label}</label>\n        <input type=\"text\" placeholder=\"${step.placeholder || ''}\" value=\"${state.selections[step.key] || ''}\">\n      `;\n\n      wrapper.querySelector(\"input\").addEventListener(\"input\", (e) => {\n        state.selections[step.key] = e.target.value;\n      });\n\n      container.appendChild(wrapper);\n    }\n\n    // Step Nav buttons removed as requested\n  }\n\n  function isStepValid(step) {\n    if (!step.required) return true;\n    if (step.type === \"size_input\") {\n      if (step.singleInput) {\n        return !state.validationErrors.length &&\n               state.selections[step.key] !== undefined &&\n               state.selections[step.key] !== null;\n      } else {\n        return !state.validationErrors.width && !state.validationErrors.height;\n      }\n    }\n    // null \u89C6\u4E3A\u672A\u9009\u62E9\uFF0C\u4E0D\u901A\u8FC7\u9A8C\u8BC1\n    return state.selections[step.key] !== undefined &&\n           state.selections[step.key] !== null &&\n           state.selections[step.key] !== \"\";\n  }\n\n  function parseFraction(fracStr) {\n    if (!fracStr || fracStr === \"0\" || fracStr === \"0/0\") return 0;\n    const parts = fracStr.split(\"/\");\n    if (parts.length === 2) {\n      return parseFloat(parts[0]) / parseFloat(parts[1]);\n    }\n    return 0;\n  }\n\n  function decimalToNearestFraction(val) {\n    const decimal = val - Math.floor(val);\n    const eighths = Math.round(decimal * 8);\n    if (eighths === 0) return { integer: Math.floor(val), fraction: \"0\" };\n    if (eighths === 8) return { integer: Math.floor(val) + 1, fraction: \"0\" };\n    \n    const fracMap = { 1: \"1/8\", 2: \"1/4\", 3: \"3/8\", 4: \"1/2\", 5: \"5/8\", 6: \"3/4\", 7: \"7/8\" };\n    return { integer: Math.floor(val), fraction: fracMap[eighths] };\n  }\n\n  function convertUnits(newUnit, sizeStep) {\n    state.unit = newUnit;\n    if (sizeStep.singleInput) {\n      const currentLen = state.selections[sizeStep.key] || (state.unit === \"cm\" ? 25 : 10);\n      if (newUnit === \"cm\") {\n        const fracVal = parseFraction(state.selections.fractionL || \"0\");\n        state.selections[sizeStep.key] = Math.round((currentLen + fracVal) * 2.54);\n        state.selections.fractionL = \"0\";\n      } else {\n        const converted = decimalToNearestFraction(currentLen / 2.54);\n        state.selections[sizeStep.key] = converted.integer;\n        state.selections.fractionL = converted.fraction === \"0/0\" ? \"0\" : converted.fraction;\n      }\n    } else {\n      const currentW = state.selections.width;\n      const currentH = state.selections.height;\n      if (newUnit === \"cm\") {\n        const fracW = parseFraction(state.selections.fractionW || \"0\");\n        const fracH = parseFraction(state.selections.fractionH || \"0\");\n        state.selections.width = Math.round((currentW + fracW) * 2.54);\n        state.selections.height = Math.round((currentH + fracH) * 2.54);\n        state.selections.fractionW = \"0/0\";\n        state.selections.fractionH = \"0/0\";\n      } else {\n        const convertedW = decimalToNearestFraction(currentW / 2.54);\n        const convertedH = decimalToNearestFraction(currentH / 2.54);\n        state.selections.width = convertedW.integer;\n        state.selections.height = convertedH.integer;\n        state.selections.fractionW = convertedW.fraction;\n        state.selections.fractionH = convertedH.fraction;\n      }\n    }\n  }\n\n  // Calculate pricing\n  function runPricingEngine() {\n    let selectionsInInches = { ...state.selections };\n\n    if (state.unit === \"in\") {\n      const config = TEMPLATE_CONFIGS[state.templateId];\n      const sizeStep = config.steps.find(s => s.type === \"size_input\");\n      if (sizeStep) {\n        if (sizeStep.singleInput) {\n          const fracVal = parseFraction(state.selections.fractionL || \"0\");\n          selectionsInInches[sizeStep.key] = (state.selections[sizeStep.key] !== null && state.selections[sizeStep.key] !== undefined)\n            ? state.selections[sizeStep.key] + fracVal\n            : null;\n        } else {\n          const fracWVal = parseFraction(state.selections.fractionW || \"0\");\n          const fracHVal = parseFraction(state.selections.fractionH || \"0\");\n          selectionsInInches.width = (state.selections.width !== null && state.selections.width !== undefined)\n            ? state.selections.width + fracWVal\n            : null;\n          selectionsInInches.height = (state.selections.height !== null && state.selections.height !== undefined)\n            ? state.selections.height + fracHVal\n            : null;\n        }\n      }\n    } else {\n      const config = TEMPLATE_CONFIGS[state.templateId];\n      const sizeStep = config.steps.find(s => s.type === \"size_input\");\n      if (sizeStep) {\n        if (sizeStep.singleInput) {\n          selectionsInInches[sizeStep.key] = (state.selections[sizeStep.key] !== null && state.selections[sizeStep.key] !== undefined)\n            ? parseFloat((state.selections[sizeStep.key] / 2.54).toFixed(1))\n            : null;\n        } else {\n          selectionsInInches.width = (state.selections.width !== null && state.selections.width !== undefined)\n            ? parseFloat((state.selections.width / 2.54).toFixed(1))\n            : null;\n          selectionsInInches.height = (state.selections.height !== null && state.selections.height !== undefined)\n            ? parseFloat((state.selections.height / 2.54).toFixed(1))\n            : null;\n        }\n      }\n    }\n\n    // Call pricing\n    const formula = localPricing[state.templateId];\n    let calcResult = { pricePerItem: state.basePrice, surcharge: 0 };\n    \n    let useGeneric = !formula;\n\n    if (!useGeneric) {\n      calcResult = formula(state.basePrice, selectionsInInches);\n    } else {\n      // Generic fallback pricing calculation\n      const calcGeneric = (bPrice) => {\n        let pctSurcharge = 0;\n        let flatSurcharge = 0;\n        const config = TEMPLATE_CONFIGS[state.templateId];\n        if (config && config.steps) {\n          config.steps.forEach(step => {\n            const selection = selectionsInInches[step.key];\n            if (selection === undefined) return;\n\n            if (step.type === 'image_radio' || step.type === 'color_swatches' || step.type === 'dropdown_select') {\n              const chosenVal = step.values.find(v => String(v.value) === String(selection));\n              if (chosenVal && chosenVal.priceText) {\n                const text = chosenVal.priceText.toLowerCase();\n                if (text.includes('%')) {\n                  const pct = parseFloat(text.replace(/[+%]/g, '')) || 0;\n                  pctSurcharge += pct;\n                } else if (text.includes('$')) {\n                  const val = parseFloat(text.replace(/[+ $USD]/g, '')) || 0;\n                  flatSurcharge += val;\n                } else if (!text.includes('free')) {\n                  const val = parseFloat(text.replace(/[+]/g, '')) || 0;\n                  flatSurcharge += val;\n                }\n              }\n            }\n          });\n        }\n        const surchargeUsd = bPrice * (pctSurcharge / 100) + flatSurcharge;\n        return {\n          pricePerItem: Math.max(0, bPrice + surchargeUsd),\n          surcharge: Math.max(0, surchargeUsd)\n        };\n      };\n\n      calcResult = calcGeneric(state.basePrice);\n    }\n\n    const flatSurchargeVal = calcResult.flatSurcharge || 0;\n    \n    // Store surcharge relative to basePrice (pre-flatSurcharge/quantity addition)\n    const surchargeVal = calcResult.pricePerItem - state.basePrice;\n    \n    calcResult.totalPrice = calcResult.pricePerItem * state.quantity + flatSurchargeVal;\n    calcResult.pricePerItem = calcResult.pricePerItem + (flatSurchargeVal / state.quantity);\n    calcResult.surcharge = calcResult.surcharge + (flatSurchargeVal / state.quantity);\n\n    let compareAtTotalPrice = null;\n    let compareAtPricePerItem = null;\n    if (state.compareAtPrice && state.compareAtPrice > state.basePrice) {\n      compareAtPricePerItem = state.compareAtPrice + surchargeVal;\n      compareAtTotalPrice = compareAtPricePerItem * state.quantity + flatSurchargeVal;\n      compareAtPricePerItem = compareAtPricePerItem + (flatSurchargeVal / state.quantity);\n    }\n\n    // Formatting money fields helper\n    const formatMoney = (amount) => {\n      if (typeof Shopify !== 'undefined' && Shopify.formatMoney) {\n        return Shopify.formatMoney(amount * 100);\n      }\n      return `$${amount.toFixed(2)}`;\n    };\n\n    const originalTotal = calcResult.totalPrice;\n    const formattedPrice = formatMoney(originalTotal);\n\n    // Restores 25% storefront discount display for all templates/option sets\n    const isCurtainsTemplate = true;\n\n    console.error('[JoyDrape Debug] runPricingEngine: templateId =', state.templateId, 'isCurtainsTemplate =', isCurtainsTemplate, 'originalTotal =', originalTotal);\n    window.__jdLogs = window.__jdLogs || [];\n    window.__jdLogs.push(`[JoyDrape Debug] runPricingEngine: templateId=${state.templateId} isCurtainsTemplate=${isCurtainsTemplate} originalTotal=${originalTotal}`);\n\n    let finalSellingPrice = originalTotal;\n    let finalCompareAtPrice = compareAtTotalPrice;\n\n    if (isCurtainsTemplate) {\n      const DISCOUNT_RATE = 0.25;\n      const unitOriginalPrice = state.basePrice + calcResult.surcharge;\n      const unitSalePrice = Math.round(unitOriginalPrice * (1 - DISCOUNT_RATE) * 100) / 100;\n      const saleTotal = unitSalePrice * state.quantity;\n      const calculatedOriginalTotal = unitOriginalPrice * state.quantity;\n      const savings = calculatedOriginalTotal - saleTotal;\n      const discountPct = 25;\n\n      DOM.summaryTotalPrice.textContent = formatMoney(saleTotal);\n\n      if (DOM.summaryOriginalPrice) {\n        DOM.summaryOriginalPrice.textContent = formatMoney(calculatedOriginalTotal);\n        DOM.summaryOriginalPrice.style.display = 'inline';\n      }\n      if (DOM.summarySavingsRow && DOM.summarySavingsBadge) {\n        DOM.summarySavingsBadge.textContent = `You save ${formatMoney(savings)} (${discountPct}% OFF)`;\n        DOM.summarySavingsRow.style.display = 'block';\n      }\n    } else {\n      // Use variant compare-at price for discount display if available\n      DOM.summaryTotalPrice.textContent = formattedPrice;\n\n      if (compareAtTotalPrice && compareAtTotalPrice > originalTotal) {\n        const savings = compareAtTotalPrice - originalTotal;\n        const discountPct = Math.round((savings / compareAtTotalPrice) * 100);\n        if (DOM.summaryOriginalPrice) {\n          DOM.summaryOriginalPrice.textContent = formatMoney(compareAtTotalPrice);\n          DOM.summaryOriginalPrice.style.display = 'inline';\n        }\n        if (DOM.summarySavingsRow && DOM.summarySavingsBadge) {\n          DOM.summarySavingsBadge.textContent = `You save ${formatMoney(savings)} (${discountPct}% OFF)`;\n          DOM.summarySavingsRow.style.display = 'block';\n        }\n      } else {\n        if (DOM.summaryOriginalPrice) {\n          DOM.summaryOriginalPrice.style.display = 'none';\n        }\n        if (DOM.summarySavingsRow) {\n          DOM.summarySavingsRow.style.display = 'none';\n        }\n      }\n    }\n\n    // Sync with native Shopify theme price elements on the page (showing the pre-discount price per panel in real-time)\n    const nativeFormattedPrice = formatMoney(finalSellingPrice);\n    const nativePriceSelectors = [\n      '.pricearea p.price',\n      '.pricearea .price-sale',\n      '.price-sticky p.price',\n      '.price-sticky .price-sale',\n      '.custom-price',\n      '[id^=\"price-\"] p.price',\n      '[id^=\"price-\"] .price-sale',\n      '[id^=\"price-sticky-\"] p.price',\n      '[id^=\"price-sticky-\"] .price-sale',\n      '.x-atc-text .price',\n      '.x-atc-text .price-sale',\n      '.price-item.price-item--sale',\n      '.price-item.price-item--regular',\n      '.price .price-item:not(s):not(del):not(.price-item--compare)',\n      '.product-single__price',\n      '.product__price',\n      '.price__current',\n      '.main-product-price > span',\n      '.main-product-price > p.price',\n      '[id^=\"price-\"] .main-product-price > span',\n      '[id^=\"price-sticky-\"] .price > span',\n      '.pricearea div.price > span'\n    ];\n    nativePriceSelectors.forEach(selector => {\n      const elements = document.querySelectorAll(selector);\n      elements.forEach(el => {\n        // Exclude compare-at (strikethrough) elements\n        if (el.tagName === 'S' || el.tagName === 'DEL' || el.classList.contains('price-compare') || el.closest('s') || el.closest('del') || el.classList.contains('price-item--compare')) {\n          return;\n        }\n        if (el !== DOM.summaryTotalPrice && (!DOM.section || !DOM.section.contains(el))) {\n          el.textContent = nativeFormattedPrice;\n        }\n      });\n    });\n\n    if (finalCompareAtPrice) {\n      const nativeCompareFormattedPrice = formatMoney(finalCompareAtPrice);\n      const nativeCompareSelectors = [\n        '.price-item.price-item--compare',\n        '.price-compare',\n        '.product-single__price--compare',\n        '.price__compare',\n        '.price-item--compare',\n        's.price-item',\n        'del.price-item'\n      ];\n      nativeCompareSelectors.forEach(selector => {\n        const elements = document.querySelectorAll(selector);\n        elements.forEach(el => {\n          if (el !== DOM.summaryOriginalPrice && (!DOM.section || !DOM.section.contains(el))) {\n            el.textContent = nativeCompareFormattedPrice;\n            el.style.display = ''; // Make sure it's visible if it has compare at price\n          }\n        });\n      });\n    } else {\n      // Hide compare-at elements if no compare at price\n      const nativeCompareSelectors = [\n        '.price-item.price-item--compare',\n        '.price-compare',\n        '.price-item--compare',\n        's.price-item',\n        'del.price-item'\n      ];\n      nativeCompareSelectors.forEach(selector => {\n        const elements = document.querySelectorAll(selector);\n        elements.forEach(el => {\n          if (el !== DOM.summaryOriginalPrice && (!DOM.section || !DOM.section.contains(el))) {\n            el.style.display = 'none';\n          }\n        });\n      });\n    }\n\n    if (DOM.labelBasePrice) DOM.labelBasePrice.textContent = formatMoney(state.basePrice * state.quantity);\n    if (DOM.labelSurcharge) DOM.labelSurcharge.textContent = `+${formatMoney(calcResult.surcharge * state.quantity)}`;\n    if (DOM.labelQty) DOM.labelQty.textContent = `${state.quantity} Panel${state.quantity > 1 ? 's' : ''}`;\n\n    state.lastCalculatedResult = calcResult;\n    \n    // Update selected options summary\n    updateSelectedOptionsSummary();\n    updateStepLockStates();\n    stripPricesFromLabels();\n  }\n\n  // Draft Order checkout via Vercel API\n  async function handleCheckoutSubmit(isBuyNow = false) {\n    if (isBuyNow !== true) {\n      isBuyNow = false;\n    }\n    // Verify that all active and required configurator steps are valid and complete\n    const config = TEMPLATE_CONFIGS[state.templateId];\n    if (config) {\n      const activeSteps = config.steps.filter(step => {\n        if (typeof step.condition === \"function\") {\n          return step.condition(state.selections);\n        }\n        return true;\n      });\n\n      const mergedSteps = [];\n      let skipNext = false;\n      activeSteps.forEach((step, idx) => {\n        if (skipNext) { skipNext = false; return; }\n        const nextStep = activeSteps[idx + 1];\n        if (\n          step.key === \"width\" && step.type === \"dropdown_select\" &&\n          nextStep && nextStep.key === \"height\" && nextStep.type === \"dropdown_select\"\n        ) {\n          mergedSteps.push({ _combined: true, widthStep: step, heightStep: nextStep });\n          skipNext = true;\n        } else {\n          mergedSteps.push(step);\n        }\n      });\n\n      for (let i = 0; i < mergedSteps.length; i++) {\n        const stepOrPair = mergedSteps[i];\n        if (stepOrPair.required !== false && !isStepValidMerged(stepOrPair)) {\n          showToastNotice(\"Incomplete Customization\", \"Please complete the custom sizing and all required steps.\", \"error\");\n          state.activeStepIdx = i;\n          renderAccordion();\n\n          // Scroll page to highlight the target invalid step\n          setTimeout(() => {\n            const container = DOM.accordionContainer;\n            if (container) {\n              const activeEl = container.querySelector(\".accordion-step.active\");\n              if (activeEl) {\n                activeEl.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n              }\n            }\n          }, 100);\n          return;\n        }\n      }\n    }\n\n    try {\n      const result = state.lastCalculatedResult;\n      if (!result) return;\n\n      // Build line item properties\n      const cartProperties = {};\n      const activeSteps = config.steps.filter(step => {\n        if (typeof step.condition === \"function\") {\n          return step.condition(state.selections);\n        }\n        return true;\n      });\n      const activeKeys = new Set(activeSteps.map(s => s.key));\n      activeKeys.add(\"width\");\n      activeKeys.add(\"height\");\n      activeKeys.add(\"length\");\n      activeKeys.add(\"fractionW\");\n      activeKeys.add(\"fractionH\");\n      activeKeys.add(\"fractionL\");\n\n      Object.entries(state.selections).forEach(([k, v]) => {\n        if (v !== null && v !== undefined && v !== \"\" && (activeKeys.has(k) || k === \"color\" || k === \"quantity\")) {\n          const formattedKey = k.replace(/([A-Z])/g, ' $1').replace(/^./, str => str.toUpperCase());\n          cartProperties[formattedKey] = v;\n        }\n      });\n      cartProperties[\"Unit\"] = state.unit;\n\n      let unitTotalPrice = state.basePrice + result.surcharge;\n      // Restores 25% storefront discount for checkout on all templates/option sets\n      const isCurtainsTemplate = true;\n      if (isCurtainsTemplate) {\n        const DISCOUNT_RATE = 0.25;\n        unitTotalPrice = Math.round(unitTotalPrice * (1 - DISCOUNT_RATE) * 100) / 100;\n      }\n\n      if (DOM.btnAddToCart) {\n        DOM.btnAddToCart.disabled = true;\n        DOM.btnAddToCart.textContent = \"Adding...\";\n      }\n      if (DOM.toast) {\n        showToastNotice(\"Adding to Cart\", \"Adding custom design to your cart...\", \"success\");\n      }\n\n      // Add storefront discount identifier\n      cartProperties['_custom_unit_price'] = unitTotalPrice.toFixed(2);\n\n      const sectionsToRender = (typeof Alpine !== 'undefined' && Alpine.store('xCartHelper'))\n        ? Alpine.store('xCartHelper').getSectionsToRender().map(s => s.id)\n        : [];\n\n      const payload = {\n        id: parseInt(state.selectedVariantId),\n        quantity: parseInt(state.quantity),\n        properties: cartProperties,\n        sections: sectionsToRender\n      };\n\n      const addResponse = await fetch(window.Shopify.routes.root + 'cart/add.js', {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify(payload)\n      });\n\n      if (!addResponse.ok) {\n        const errData = await addResponse.json().catch(() => ({}));\n        throw new Error(errData.description || 'Failed to add item to cart.');\n      }\n\n      const addResult = await addResponse.json();\n\n      // Trigger analytics pixel track\n      document.dispatchEvent(new CustomEvent('eurus:cart:add-success', {\n        detail: {\n          product: {\n            id: parseInt(state.selectedVariantId),\n            price: Math.round(unitTotalPrice * 100),\n            title: state.product ? state.product.title : document.title\n          }\n        }\n      }));\n\n      if (isBuyNow) {\n        if (DOM.toast) {\n          showToastNotice(\"Redirecting\", \"Redirecting to checkout...\", \"success\");\n        }\n        \n        // Fetch current cart items (which includes the item we just added)\n        let cartData;\n        let iframe = null;\n        try {\n          iframe = document.createElement('iframe');\n          iframe.style.display = 'none';\n          document.body.appendChild(iframe);\n          cartData = await iframe.contentWindow.fetch(window.Shopify.routes.root + 'cart.js').then(res => res.json());\n        } catch (e) {\n          cartData = await fetch(window.Shopify.routes.root + 'cart.js').then(res => res.json());\n        } finally {\n          if (iframe && iframe.parentNode) {\n            iframe.parentNode.removeChild(iframe);\n          }\n        }\n        \n        // Construct draft order items payload\n        const payloadItems = cartData.items.map(item => {\n          let itemPrice = item.price / 100.0;\n          if (item.properties && item.properties._custom_unit_price) {\n            itemPrice = parseFloat(item.properties._custom_unit_price);\n          }\n          return {\n            variant_id: parseInt(item.variant_id),\n            quantity: parseInt(item.quantity),\n            title: item.title,\n            price: itemPrice.toFixed(2),\n            properties: item.properties || {}\n          };\n        });\n\n        const payload = { items: payloadItems };\n        const endpoint = \"https://joydrape-configurator-admin.vercel.app/api/checkout\";\n        const checkoutResponse = await fetch(endpoint, {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify(payload)\n        });\n\n        if (!checkoutResponse.ok) {\n          const errData = await checkoutResponse.json().catch(() => ({}));\n          throw new Error(errData.error || 'Checkout failed.');\n        }\n\n        const data = await checkoutResponse.json();\n        \n        // Restore buttons state\n        if (DOM.btnAddToCart) {\n          DOM.btnAddToCart.disabled = false;\n          DOM.btnAddToCart.textContent = \"Add Custom Design to Cart\";\n        }\n        if (DOM.toast) {\n          DOM.toast.classList.remove(\"show\");\n        }\n        \n        if (data.invoice_url) {\n          window.location.href = data.invoice_url;\n          return;\n        } else {\n          throw new Error('Invoice URL missing from response.');\n        }\n      }\n\n      // Reload cart sections via Alpine xCartHelper\n      if (typeof Alpine !== 'undefined') {\n        if (Alpine.store('xCartHelper') && addResult.sections) {\n          await Alpine.store('xCartHelper').reRenderSections(addResult.sections);\n        }\n        setTimeout(() => {\n          if (Alpine.store('xMiniCart')) {\n            Alpine.store('xMiniCart').openCart();\n          }\n        }, 100);\n      }\n\n      document.dispatchEvent(new CustomEvent(\"eurus:cart:items-changed\"));\n\n      if (DOM.btnAddToCart) {\n        DOM.btnAddToCart.disabled = false;\n        DOM.btnAddToCart.textContent = \"Add Custom Design to Cart\";\n      }\n      if (DOM.toast) {\n        DOM.toast.classList.remove(\"show\");\n      }\n\n    } catch (err) {\n      console.error(\"[JoyDrape Configurator] Add to cart failed:\", err);\n      showToastNotice(\"Add to Cart Error\", err.message || \"Please try again.\", \"error\");\n      if (DOM.btnAddToCart) {\n        DOM.btnAddToCart.disabled = false;\n        DOM.btnAddToCart.textContent = \"Add Custom Design to Cart\";\n      }\n      if (DOM.toast) {\n        DOM.toast.classList.remove(\"show\");\n      }\n    }\n  }\n\n  function parseDaysRange(str, defaultMin, defaultMax) {\n    if (!str) return [defaultMin, defaultMax];\n    const parts = str.toString().split('-');\n    if (parts.length === 2) {\n      const min = parseInt(parts[0], 10);\n      const max = parseInt(parts[1], 10);\n      return [isNaN(min) ? defaultMin : min, isNaN(max) ? defaultMax : max];\n    }\n    const val = parseInt(str, 10);\n    return [isNaN(val) ? defaultMin : val, isNaN(val) ? defaultMax : val];\n  }\n\n  function addDaysRange(startDate, minDays, maxDays) {\n    const minDate = new Date(startDate);\n    minDate.setDate(minDate.getDate() + minDays);\n    const maxDate = new Date(startDate);\n    maxDate.setDate(maxDate.getDate() + maxDays);\n    const formatOptions = { month: 'short', day: 'numeric' };\n    if (minDate.getMonth() === maxDate.getMonth()) {\n      return `${minDate.toLocaleDateString('en-US', { month: 'short' })} ${minDate.getDate()} - ${maxDate.getDate()}`;\n    } else {\n      return `${minDate.toLocaleDateString('en-US', formatOptions)} - ${maxDate.toLocaleDateString('en-US', formatOptions)}`;\n    }\n  }\n\n  function updateShipDate() {\n    const config = TEMPLATE_CONFIGS[state.templateId] || {};\n    const tailoringStr = state.tailoringDays || config.tailoringDays || \"7-10\";\n    const shippingStr = state.shippingDays || config.shippingDays || \"7-10\";\n\n    const [tailoringMin, tailoringMax] = parseDaysRange(tailoringStr, 7, 10);\n    const [shippingMin, shippingMax] = parseDaysRange(shippingStr, 7, 10);\n\n    const today = new Date();\n\n    // 1. Expected ship date fallback (standard ship date)\n    if (DOM.shipDate) {\n      const shipDateObj = new Date(today);\n      shipDateObj.setDate(shipDateObj.getDate() + tailoringMax);\n      const options = { month: 'long', day: 'numeric', year: 'numeric' };\n      DOM.shipDate.textContent = shipDateObj.toLocaleDateString('en-US', options);\n    }\n\n    // 2. Timeline nodes\n    if (DOM.purchasedDate) {\n      DOM.purchasedDate.textContent = today.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n    }\n    if (DOM.processingDate) {\n      DOM.processingDate.textContent = addDaysRange(today, tailoringMin, tailoringMax);\n    }\n    if (DOM.deliveryDate) {\n      const totalMin = tailoringMin + shippingMin;\n      const totalMax = tailoringMax + shippingMax;\n      DOM.deliveryDate.textContent = addDaysRange(today, totalMin, totalMax);\n    }\n  }\n\n  function getIconSvg(iconName) {\n    const svgs = {\n      Check: `<svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>`,\n      Shield: `<svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"/></svg>`,\n      Leaf: `<svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M2 22C2 12 10 4 20 4v6C12 10 8 14 8 22H2z\"/><path d=\"M8 14c2-2 5-3 8-3\"/></svg>`,\n      Tag: `<svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z\"/><line x1=\"7\" y1=\"7\" x2=\"7.01\" y2=\"7\"/></svg>`,\n      Truck: `<svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"1\" y=\"3\" width=\"15\" height=\"13\"/><polygon points=\"16 8 20 8 23 11 23 16 16 16 16 8\"/><circle cx=\"5.5\" cy=\"18.5\" r=\"2.5\"/><circle cx=\"18.5\" cy=\"18.5\" r=\"2.5\"/></svg>`,\n      Lock: `<svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"/><path d=\"M7 11V7a5 5 0 0 1 10 0v4\"/></svg>`,\n      Star: `<svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\"/></svg>`,\n      Refresh: `<svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21.5 2v6h-6M21.34 15.57a10 10 0 1 1-.57-8.38l5.67-5.67\"/></svg>`\n    };\n    return svgs[iconName] || svgs.Check;\n  }\n\n  function updateStorefrontWidgets() {\n    const config = TEMPLATE_CONFIGS[state.templateId];\n    if (!config || !config.widgets) {\n      return;\n    }\n\n    // 1. Locate title badges container\n    const titleBadgesContainer = document.querySelector('.joydrape-title-badges');\n    if (titleBadgesContainer && config.widgets.topBadges) {\n      titleBadgesContainer.innerHTML = '';\n      config.widgets.topBadges.forEach(badge => {\n        if (!badge.text) return;\n        const span = document.createElement('span');\n        span.style.backgroundColor = badge.bgColor || '#727b4e';\n        span.style.color = badge.textColor || '#ffffff';\n        span.style.padding = '4px 12px';\n        span.style.borderRadius = '20px';\n        span.style.fontSize = '10px';\n        span.style.fontWeight = 'bold';\n        span.style.textTransform = 'uppercase';\n        span.style.letterSpacing = '0.05em';\n        span.style.display = 'inline-flex';\n        span.style.alignItems = 'center';\n        span.style.lineHeight = '1';\n        span.textContent = badge.text;\n        titleBadgesContainer.appendChild(span);\n      });\n    }\n\n    // 2. Locate performance badges container\n    const performanceBadgesContainer = document.querySelector('.joydrape-performance-badges');\n    if (performanceBadgesContainer && config.widgets.sellingPoints) {\n      performanceBadgesContainer.innerHTML = '';\n      \n      // Inject stylesheet rules once if not present\n      if (!document.getElementById('joydrape-badges-dynamic-style')) {\n        const style = document.createElement('style');\n        style.id = 'joydrape-badges-dynamic-style';\n        style.innerHTML = `\n          .joydrape-performance-badges::-webkit-scrollbar { display: none; }\n          .joy-badge-dynamic {\n              display: flex !important;\n              align-items: center !important;\n              gap: 6px !important;\n              padding: 5px 12px !important;\n              border: 1.5px solid #ececec !important;\n              border-radius: 6px !important;\n              background: #ffffff !important;\n              flex-shrink: 0 !important;\n              box-shadow: 0 1px 2px rgba(0,0,0,0.02) !important;\n          }\n          .joy-badge-dynamic span {\n              font-size: 10px !important;\n              font-weight: 700 !important;\n              color: #2e2e2e !important;\n              text-transform: uppercase !important;\n              letter-spacing: 0.06em !important;\n              white-space: nowrap !important;\n          }\n          .joy-badge-dynamic svg {\n              color: #c64c4c !important;\n          }\n        `;\n        document.head.appendChild(style);\n      }\n\n      config.widgets.sellingPoints.forEach(point => {\n        if (!point.text) return;\n        const badgeDiv = document.createElement('div');\n        badgeDiv.className = 'joy-badge-dynamic';\n        \n        const iconSpan = document.createElement('span');\n        iconSpan.innerHTML = getIconSvg(point.icon);\n        \n        const textSpan = document.createElement('span');\n        textSpan.textContent = point.text;\n        \n        badgeDiv.appendChild(iconSpan);\n        badgeDiv.appendChild(textSpan);\n        performanceBadgesContainer.appendChild(badgeDiv);\n      });\n    }\n  }\n\n  function updateVisualizerElements() {\n    if (!DOM.svg) return;\n    const tid = state.templateId;\n    if (DOM.blindsGroup) DOM.blindsGroup.style.display = \"none\";\n    if (DOM.rodGroup) DOM.rodGroup.style.display = \"block\";\n    \n    const leftCurtain = document.getElementById(\"leftCurtain\");\n    const rightCurtain = document.getElementById(\"rightCurtain\");\n    if (leftCurtain) leftCurtain.style.display = \"block\";\n    if (rightCurtain) rightCurtain.style.display = \"block\";\n\n    if (tid.includes(\"rod\")) {\n      if (leftCurtain) leftCurtain.style.display = \"none\";\n      if (rightCurtain) rightCurtain.style.display = \"none\";\n    } \n    else if (tid.includes(\"tem8\") || tid.includes(\"tem205720\") || tid.includes(\"tem205858\") || tid.includes(\"tem205864\")) {\n      if (DOM.blindsGroup) DOM.blindsGroup.style.display = \"block\";\n      if (leftCurtain) leftCurtain.style.display = \"none\";\n      if (rightCurtain) rightCurtain.style.display = \"none\";\n\n      const isDarkLining = state.selections.lining === \"Blackout Lining\";\n      if (DOM.blindFabric) DOM.blindFabric.setAttribute(\"fill\", isDarkLining ? \"#847a6d\" : \"#e0d4c2\");\n    } \n    else {\n      updateVisualizerDrawing();\n    }\n\n    const rodColorVal = state.selections.color === \"White\" ? \"#e5e5e5\" : \"#2b2b2b\";\n    document.documentElement.style.setProperty('--hardware-color', rodColorVal);\n  }\n\n  function updateVisualizerDrawing() {\n    if (!DOM.svg || !DOM.leftCurtainFolds || !DOM.rightCurtainFolds) return;\n    DOM.leftCurtainFolds.innerHTML = \"\";\n    DOM.rightCurtainFolds.innerHTML = \"\";\n    DOM.leftCurtainHeader.innerHTML = \"\";\n    DOM.rightCurtainHeader.innerHTML = \"\";\n\n    const isCafe = state.templateId === \"tem209612\";\n    const numFolds = 8;\n    const panelYTop = isCafe ? 180 : 58;\n    const panelHeight = isCafe ? 230 : 350;\n    const panelYBottom = panelYTop + panelHeight;\n\n    if (isCafe) {\n      DOM.metalRod.setAttribute(\"y\", \"175\");\n      DOM.leftFinial.setAttribute(\"cy\", \"179\");\n      DOM.rightFinial.setAttribute(\"cy\", \"179\");\n    } else {\n      DOM.metalRod.setAttribute(\"y\", \"55\");\n      DOM.leftFinial.setAttribute(\"cy\", \"59\");\n      DOM.rightFinial.setAttribute(\"cy\", \"59\");\n    }\n\n    const leftXStart = 65;\n    const leftXEnd = state.curtainsOpen ? 120 : 250;\n    const leftWidth = leftXEnd - leftXStart;\n\n    const rightXStart = state.curtainsOpen ? 380 : 250;\n    const rightXEnd = 435;\n    const rightWidth = rightXEnd - rightXStart;\n\n    const leftFoldWidth = leftWidth / numFolds;\n    const rightFoldWidth = rightWidth / numFolds;\n\n    const lining = state.selections.lining || \"Unlined\";\n    let fabricBase = \"#dfd6c8\";\n    let fabricLight = \"#f1ebd8\";\n    let fabricDark = \"#c1b39e\";\n\n    if (lining.includes(\"100%\") || lining.includes(\"Blackout\")) {\n      fabricBase = \"#bcaea0\";\n      fabricLight = \"#cfc3b7\";\n      fabricDark = \"#9b8d80\";\n    } else if (lining.includes(\"50%\") || lining.includes(\"Privacy\")) {\n      fabricBase = \"#ebdccb\";\n      fabricLight = \"#fcf3e8\";\n      fabricDark = \"#ccaead\";\n    }\n\n    document.documentElement.style.setProperty('--fabric-base', fabricBase);\n    document.documentElement.style.setProperty('--fabric-light', fabricLight);\n    document.documentElement.style.setProperty('--fabric-dark', fabricDark);\n\n    for (let i = 0; i < numFolds; i++) {\n      const tx1 = leftXStart + i * leftFoldWidth;\n      const tx2 = leftXStart + (i + 1) * leftFoldWidth;\n      const bx1 = tx1;\n      const bx2 = tx2;\n\n      const path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n      const pathData = `M ${tx1} ${panelYTop} L ${tx2} ${panelYTop} L ${bx2} ${panelYBottom - 8} Q ${(bx1 + bx2)/2} ${panelYBottom + 2} ${bx1} ${panelYBottom - 8} Z`;\n      path.setAttribute(\"d\", pathData);\n      path.setAttribute(\"fill\", \"url(#fabricGrad)\");\n      DOM.leftCurtainFolds.appendChild(path);\n\n      const headerStyle = state.selections.headerStyle || \"Grommet Top\";\n      const centerX = tx1 + leftFoldWidth / 2;\n      drawHeaderAccessories(headerStyle, centerX, panelYTop, DOM.leftCurtainHeader);\n    }\n\n    for (let i = 0; i < numFolds; i++) {\n      const tx1 = rightXStart + i * rightFoldWidth;\n      const tx2 = rightXStart + (i + 1) * rightFoldWidth;\n      const bx1 = tx1;\n      const bx2 = tx2;\n\n      const path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n      const pathData = `M ${tx1} ${panelYTop} L ${tx2} ${panelYTop} L ${bx2} ${panelYBottom - 8} Q ${(bx1 + bx2)/2} ${panelYBottom + 2} ${bx1} ${panelYBottom - 8} Z`;\n      path.setAttribute(\"d\", pathData);\n      path.setAttribute(\"fill\", \"url(#fabricGrad)\");\n      DOM.rightCurtainFolds.appendChild(path);\n\n      const headerStyle = state.selections.headerStyle || \"Grommet Top\";\n      const centerX = tx1 + rightFoldWidth / 2;\n      drawHeaderAccessories(headerStyle, centerX, panelYTop, DOM.rightCurtainHeader);\n    }\n  }\n\n  function drawHeaderAccessories(style, cx, cy, parentNode) {\n    if (style === \"Grommet Top\") {\n      const circle = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\n      circle.setAttribute(\"cx\", cx.toString());\n      circle.setAttribute(\"cy\", (cy - 3).toString());\n      circle.setAttribute(\"r\", \"4.5\");\n      circle.setAttribute(\"fill\", \"none\");\n      circle.setAttribute(\"stroke\", \"var(--hardware-color, #2b2b2b)\");\n      circle.setAttribute(\"stroke-width\", \"2\");\n      parentNode.appendChild(circle);\n    } else if (style.includes(\"Pleat\")) {\n      const path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n      path.setAttribute(\"d\", `M ${cx - 2} ${cy + 2} L ${cx} ${cy + 8} M ${cx} ${cy + 1} L ${cx} ${cy + 8} M ${cx + 2} ${cy + 2} L ${cx} ${cy + 8}`);\n      path.setAttribute(\"stroke\", \"rgba(0,0,0,0.3)\");\n      path.setAttribute(\"stroke-width\", \"1\");\n      path.setAttribute(\"fill\", \"none\");\n      parentNode.appendChild(path);\n    }\n  }\n\n  window.showHelpImageModal = function(imgSrc) {\n    const overlay = document.createElement(\"div\");\n    overlay.className = \"help-image-modal-overlay\";\n    overlay.style.position = \"fixed\";\n    overlay.style.top = \"0\";\n    overlay.style.left = \"0\";\n    overlay.style.width = \"100vw\";\n    overlay.style.height = \"100vh\";\n    overlay.style.backgroundColor = \"rgba(0, 0, 0, 0.75)\";\n    overlay.style.display = \"flex\";\n    overlay.style.justifyContent = \"center\";\n    overlay.style.alignItems = \"center\";\n    overlay.style.zIndex = \"999999\";\n    overlay.style.cursor = \"zoom-out\";\n    overlay.style.opacity = \"0\";\n    overlay.style.transition = \"opacity 0.25s ease\";\n\n    const img = document.createElement(\"img\");\n    img.src = imgSrc;\n    img.style.maxWidth = \"90%\";\n    img.style.maxHeight = \"90%\";\n    img.style.borderRadius = \"8px\";\n    img.style.boxShadow = \"0 8px 32px rgba(0, 0, 0, 0.5)\";\n    img.style.transform = \"scale(0.9)\";\n    img.style.transition = \"transform 0.25s ease\";\n\n    overlay.appendChild(img);\n    document.body.appendChild(overlay);\n\n    setTimeout(() => {\n      overlay.style.opacity = \"1\";\n      img.style.transform = \"scale(1)\";\n    }, 10);\n\n    const closeModal = () => {\n      overlay.style.opacity = \"0\";\n      img.style.transform = \"scale(0.9)\";\n      setTimeout(() => { overlay.remove(); }, 250);\n    };\n\n    overlay.addEventListener(\"click\", closeModal);\n  };\n\n  function initHelpDrawer() {\n    let drawer = document.getElementById(\"joydrapeHelpDrawer\");\n    if (!drawer) {\n      drawer = document.createElement(\"div\");\n      drawer.id = \"joydrapeHelpDrawer\";\n      drawer.className = \"joydrape-help-drawer\";\n      drawer.innerHTML = `\n        <div class=\"joydrape-help-drawer-overlay\" id=\"joydrapeHelpDrawerOverlay\"></div>\n        <div class=\"joydrape-help-drawer-content\">\n          <div class=\"joydrape-help-drawer-header\">\n            <h3 class=\"joydrape-help-drawer-title\" id=\"joydrapeHelpDrawerTitle\">Guide</h3>\n            <button type=\"button\" class=\"joydrape-help-drawer-close\" id=\"joydrapeHelpDrawerClose\">&times;</button>\n          </div>\n          <div class=\"joydrape-help-drawer-body\" id=\"joydrapeHelpDrawerBody\"></div>\n        </div>\n      `;\n      document.body.appendChild(drawer);\n\n      const closeBtn = drawer.querySelector(\"#joydrapeHelpDrawerClose\");\n      const overlay = drawer.querySelector(\"#joydrapeHelpDrawerOverlay\");\n      const close = () => {\n        drawer.classList.remove(\"active\");\n      };\n      closeBtn.addEventListener(\"click\", close);\n      overlay.addEventListener(\"click\", close);\n    }\n  }\n\n  function openHelpDrawer(title, contentHtml, imageSrc) {\n    initHelpDrawer();\n    const drawer = document.getElementById(\"joydrapeHelpDrawer\");\n    if (!drawer) return;\n    \n    drawer.querySelector(\"#joydrapeHelpDrawerTitle\").textContent = title;\n    \n    let bodyHtml = \"\";\n    if (imageSrc) {\n      bodyHtml += `\n        <div class=\"joydrape-help-drawer-img-wrap\" onclick=\"window.showHelpImageModal('${imageSrc}')\">\n          <img src=\"${imageSrc}\" class=\"joydrape-help-drawer-img\" alt=\"Guide\">\n          <div class=\"joydrape-help-drawer-zoom-hint\">\uD83D\uDD0D Tap to Zoom</div>\n        </div>\n      `;\n    }\n    bodyHtml += `<div class=\"joydrape-help-drawer-text\">${contentHtml}</div>`;\n    \n    drawer.querySelector(\"#joydrapeHelpDrawerBody\").innerHTML = bodyHtml;\n    drawer.classList.add(\"active\");\n  };\n\n  const HEADER_GUIDELINES_DATA = {\n    \"Grommet Top\": {\n      bullets: [\n        \"Opens and closes easily\",\n        \"Grommet is 1 5/8 inches in inner diameter\",\n        \"Hang with a rod, rod diameter &le; 1 1/2 inches\",\n        \"Curtains extend 1 1/8 inches above the rod\",\n        \"2.0x Fullness is recommended\"\n      ],\n      note: \"Grommets are available in four colors: silver, black, bronze, and gold. And only the silver grommet is rustproof. Need to learn more details? Please visit the Header Style Page.\"\n    },\n    \"Back Tab\": {\n      bullets: [\n        \"4 inches hidden back tabs\",\n        \"About per 6 inches set a tab\",\n        \"Not easy to open and close\",\n        \"Clean & crisp folds look\",\n        \"Fit rod and can hang with rings and clips\"\n      ],\n      note: \"It can conceal hardware like pocket drapery and have a clean look. Back tab header does not fit the track. Please choose the flat panel header and purchase ZAC small metal hooks to achieve the back tab look on the track.\"\n    },\n    \"Pinch Pleat - Double\": {\n      bullets: [\n        \"4 inches buckram ensures a lasting look\",\n        \"White adjustable hooks included\",\n        \"Pleat space is 5 inches, side return is 2 inches\",\n        \"Comes in 2x fullness: 2-fold\",\n        \"About 4 inches pleat length\"\n      ],\n      note: \"The installed adjustable hook and two additional replacement hooks are included. But the Aaron rings are ordered separately; please order the same number of rings as the pleats.\"\n    },\n    \"Pinch Pleat - Triple\": {\n      bullets: [\n        \"4 inches buckram ensures a lasting look\",\n        \"White adjustable hooks included\",\n        \"Pleat space is 5 inches, side return is 2 inches\",\n        \"Comes in 2.5x fullness: 3-fold\",\n        \"About 4 inches pleat length\"\n      ],\n      note: \"The installed adjustable hook and two additional replacement hooks are included. But the Aaron rings are ordered separately; please order the same number of rings as the pleats.\"\n    },\n    \"Rod Pocket\": {\n      bullets: [\n        \"It does not open easily\",\n        \"1.2 inches top +2.8 inches height pocket\",\n        \"The rod diameter should be less than 1.7 inches\",\n        \"If you need a bigger pocket, please mark it at check out\"\n      ],\n      note: \"Choose from lightweight and thin fabrics, which provide a lasting look suitable for more relaxed settings.\"\n    },\n    \"Flat Panel\": {\n      bullets: [\n        \"Rings & clips NOT included\",\n        \"Hooks included\uFF081 hook per 5 inches\uFF0Cfirst hook 2 1/2 inches apart the edge)\",\n        \"Long metal hooks for rod & ring hardware use\",\n        \"Small metal hooks for track & runner hardware use\",\n        \"Deep rich folds showcase fabric\",\n        \"Creating 4 hanging looks: Flat Hooks, Pencil Pleat, Back Tab, Flat Panel\",\n        \"If you don't order hardware and note the hooks type, send the long metal hooks by default\",\n        \"Fit the IKEA Vidga track system; refer to the last image.\"\n      ],\n      note: \"Come with 4-in-1 tape. It opens and closes easily. A functional style that lends itself to frequent use. The long metal hook and two additional replacement hooks are included. But the Aaron rings are ordered separately; please order the same number of rings as the hooks.\"\n    },\n    \"Pencil Pleat\": {\n      bullets: [\n        \"4 inches of 4-in-1 tape to create the pleat look\",\n        \"Long metal hooks included\uFF081 hook per 3 inches), want small metal hooks, please click Zac to buy\",\n        \"Comes in 2x fullness, need more fullness for sheer, please start a live chat\",\n        \"About 3 1/2 inches in length\",\n        \"The pleats are pre-finished by CURTARRA and may require you to adjust the looseness caused by shipping.\"\n      ],\n      note: \"Please click to learn how to hang pencil pleat curtains. The long metal hook and two additional replacement hooks are included. But the Aaron rings are ordered separately; please order the same number of rings as the hooks.\"\n    },\n    \"Tab Top\": {\n      bullets: [\n        \"4 inches height tabs\",\n        \"About per 6 inches set a tab\",\n        \"Soft less formal folds look\",\n        \"Fit rod only\"\n      ],\n      note: \"It is an informal style and works as a transitional decor. Not open easily.\"\n    },\n    \"Ripple Fold\": {\n      bullets: [\n        \"5-inch spaced snap tape\",\n        \"Please note the tape type at checkout\",\n        \"2.1X fullness(110%) with 2.36-inch runner spacing\",\n        \"Requires a dedicated runner system\",\n        \"Order a compatible track here\"\n      ],\n      note: \"Enjoy a crisp, clean look with evenly spaced soft S-folds.\"\n    },\n    \"Euro Pleat - Double\": {\n      bullets: [\n        \"4 inches buckram ensures a lasting look\",\n        \"White adjustable hooks included\",\n        \"Pleat space is 5 inches, side return is 2 inches\",\n        \"Comes in 2X fullness: 2-fold\",\n        \"No extra pleat length\"\n      ],\n      note: \"The installed adjustable hook and two additional replacement hooks are included. But the Aaron rings are ordered separately; please order the same number of rings as the pleats.\"\n    },\n    \"Euro Pleat - Triple\": {\n      bullets: [\n        \"4 inches buckram ensures a lasting look\",\n        \"White adjustable hooks included\",\n        \"Pleat space is 5 inches, side return is 2 inches\",\n        \"Comes in 2.5X fullness: 3-fold\",\n        \"No extra pleat length\"\n      ],\n      note: \"The installed adjustable hook and two additional replacement hooks are included. But the Aaron rings are ordered separately; please order the same number of rings as the pleats.\"\n    }\n  };\n\n  const LINING_GUIDELINES_DATA = {\n    \"Unlined\": {\n      bullets: [\n        \"Unlined is practical if you have sheers or already 100% blackout curtains, such as our Gary & Todd.\",\n        \"Unlined is literally the fabric alone without anything added. So does the light-blocking limited.\"\n      ],\n      specification: [\n        \"Side Hem: 1 1/5\\\" W, 3-layer\",\n        \"Bottom Hem: 3 1/10\\\" L, 3-layer\"\n      ]\n    },\n    \"White Lining-Privacy\": {\n      bullets: [\n        \"White Lining-Privacy is thin and lightweight, providing a moderate level of privacy.\",\n        \"Designed for a seamless back look.\"\n      ],\n      specification: [\n        \"Color: White\",\n        \"Material: Polyester\",\n        \"Weight: 140 GSM\",\n        \"Light-blocking: 30%\"\n      ]\n    },\n    \"50% Lining\": {\n      bullets: [\n        \"50% Lining is thin and lightweight, providing a moderate level of privacy.\",\n        \"Designed for a seamless back look.\"\n      ],\n      specification: [\n        \"Color: White\",\n        \"Material: Polyester\",\n        \"Weight: 140 GSM\",\n        \"Light-blocking: 30%\"\n      ]\n    },\n    \"Privacy Lining\": {\n      bullets: [\n        \"Privacy Lining is thin and lightweight, providing a moderate level of privacy.\",\n        \"Designed for a seamless back look.\"\n      ],\n      specification: [\n        \"Color: White\",\n        \"Material: Polyester\",\n        \"Weight: 140 GSM\",\n        \"Light-blocking: 30%\"\n      ]\n    },\n    \"Cotton Lining-Privacy\": {\n      bullets: [\n        \"Cotton Lining-Privacy is thin and lightweight, designed for a seamless back look.\",\n        \"Features a natural drape look.\"\n      ],\n      specification: [\n        \"Color: White\",\n        \"Material: 100% Cotton\",\n        \"Weight: 137 GSM\",\n        \"Light-blocking: 30%\",\n        \"Shrinkage Rate: 5%\"\n      ]\n    },\n    \"White Blackout Lining\": {\n      bullets: [\n        \"White Blackout Lining is midweight, tailored for ultra 100% blackout to provide complete darkness and maximized privacy.\",\n        \"Designed for a seamless back look.\"\n      ],\n      specification: [\n        \"Color: White\",\n        \"Material: Polyester\",\n        \"Weight: 240 GSM\",\n        \"Light-blocking: 100%\",\n        \"Finish: Triple-coated\"\n      ]\n    },\n    \"Blackout Lining\": {\n      bullets: [\n        \"Blackout Lining is lightweight, foam-coated to provide complete darkness and maximized privacy.\",\n        \"Designed for a seamless back look.\"\n      ],\n      specification: [\n        \"Color: White\",\n        \"Material: Polyester\",\n        \"Weight: 120 GSM\",\n        \"Light-blocking: 100%\"\n      ]\n    },\n    \"100% Blackout Lining\": {\n      bullets: [\n        \"100% Blackout Lining is midweight, triple-coated to provide complete darkness and maximized privacy.\",\n        \"Designed for a seamless back look.\"\n      ],\n      specification: [\n        \"Color: White\",\n        \"Material: Polyester\",\n        \"Weight: 240 GSM\",\n        \"Light-blocking: 100%\"\n      ]\n    }\n  };\n\n  function initLiningGuidelinesDrawer() {\n    let drawer = document.getElementById(\"joydrapeLiningGuidelinesDrawer\");\n    if (!drawer) {\n      drawer = document.createElement(\"div\");\n      drawer.id = \"joydrapeLiningGuidelinesDrawer\";\n      drawer.className = \"joydrape-guidelines-drawer\";\n      drawer.innerHTML = `\n        <div class=\"joydrape-guidelines-drawer-overlay\" id=\"joydrapeLiningGuidelinesDrawerOverlay\"></div>\n        <div class=\"joydrape-guidelines-drawer-content\">\n          <div class=\"joydrape-guidelines-drawer-header\">\n            <h3 class=\"joydrape-guidelines-drawer-title\">LINING GUIDELINES</h3>\n            <button type=\"button\" class=\"joydrape-guidelines-drawer-close\" id=\"joydrapeLiningGuidelinesDrawerClose\">&times;</button>\n          </div>\n          <div class=\"joydrape-guidelines-drawer-body\">\n            <div class=\"guidelines-accordion\"></div>\n          </div>\n        </div>\n      `;\n      document.body.appendChild(drawer);\n\n      const closeBtn = drawer.querySelector(\"#joydrapeLiningGuidelinesDrawerClose\");\n      const overlay = drawer.querySelector(\"#joydrapeLiningGuidelinesDrawerOverlay\");\n      const close = () => {\n        drawer.classList.remove(\"active\");\n      };\n      closeBtn.addEventListener(\"click\", close);\n      overlay.addEventListener(\"click\", close);\n    }\n  }\n\n  function openLiningGuidelinesDrawer() {\n    initLiningGuidelinesDrawer();\n    const drawer = document.getElementById(\"joydrapeLiningGuidelinesDrawer\");\n    if (!drawer) return;\n\n    const liningStep = TEMPLATE_CONFIGS[state.templateId]?.steps.find(s => s.key === \"lining\");\n    const values = liningStep ? liningStep.values : [];\n\n    const accordionContainer = drawer.querySelector(\".guidelines-accordion\");\n    accordionContainer.innerHTML = \"\";\n\n    values.forEach((val, idx) => {\n      const name = val.value;\n      const image = val.image || \"\";\n      const isExpanded = idx === 0;\n      \n      let itemData = { bullets: [], specification: [], blogUrl: \"\", blogText: \"\" };\n      const defaultData = LINING_GUIDELINES_DATA[name] || { bullets: [\"Custom lining details.\"], specification: [] };\n      \n      if (val.description) {\n        const lines = val.description.split('\\n').map(l => l.trim()).filter(l => l.length > 0);\n        let inSpec = false;\n        lines.forEach(line => {\n          if (line.toLowerCase().startsWith('specification:') || line.toLowerCase().startsWith('spec:')) {\n            inSpec = true;\n          } else if (line.toLowerCase().startsWith('blog:') || line.toLowerCase().startsWith('link:')) {\n            const linkParts = line.substring(5).split('|');\n            itemData.blogUrl = linkParts[0].trim();\n            if (linkParts[1]) {\n              itemData.blogText = linkParts[1].trim();\n            }\n          } else {\n            if (inSpec) {\n              itemData.specification.push(line);\n            } else {\n              itemData.bullets.push(line);\n            }\n          }\n        });\n      } else {\n        itemData.bullets = defaultData.bullets || [];\n        itemData.specification = defaultData.specification || [];\n        itemData.blogUrl = defaultData.blogUrl || \"\";\n        itemData.blogText = defaultData.blogText || \"\";\n      }\n      \n      const itemEl = document.createElement(\"div\");\n      itemEl.className = \"guidelines-item\" + (isExpanded ? \" active\" : \"\");\n      \n      let bulletsHtml = itemData.bullets.map(b => `<li>${b}</li>`).join(\"\");\n      let specHtml = \"\";\n      if (itemData.specification && itemData.specification.length > 0) {\n        specHtml = `\n          <h4 style=\"margin-top: 14px; margin-bottom: 6px; font-family: var(--font-body); font-weight: 600; font-size: 14px; color: var(--color-text);\">Specification</h4>\n          <ul>\n            ${itemData.specification.map(s => `<li>${s}</li>`).join(\"\")}\n          </ul>\n        `;\n      }\n      let blogHtml = \"\";\n      if (itemData.blogUrl) {\n        blogHtml = `\n          <div style=\"margin-top: 14px; font-style: italic; font-size: 13px;\">\n            <a href=\"${itemData.blogUrl}\" target=\"_blank\" style=\"color: var(--color-primary); text-decoration: underline;\">${itemData.blogText || 'Blog: How to Choose Lining Type?'}</a>\n          </div>\n        `;\n      }\n      \n      itemEl.innerHTML = `\n        <div class=\"guidelines-item-header\">\n          <span>${name}</span>\n          <span class=\"guidelines-arrow\">${isExpanded ? \"\u25B2\" : \"\u25BC\"}</span>\n        </div>\n        <div class=\"guidelines-item-content\" style=\"display: ${isExpanded ? 'block' : 'none'};\">\n          ${image ? `<img src=\"${image}\" class=\"guidelines-img\" alt=\"${name}\">` : \"\"}\n          <ul>\n            ${bulletsHtml}\n          </ul>\n          ${specHtml}\n          ${blogHtml}\n        </div>\n      `;\n\n      itemEl.querySelector(\".guidelines-item-header\").addEventListener(\"click\", () => {\n        const content = itemEl.querySelector(\".guidelines-item-content\");\n        const arrow = itemEl.querySelector(\".guidelines-arrow\");\n        const wasActive = itemEl.classList.contains(\"active\");\n        \n        if (wasActive) {\n          itemEl.classList.remove(\"active\");\n          content.style.display = \"none\";\n          arrow.textContent = \"\u25BC\";\n        } else {\n          accordionContainer.querySelectorAll(\".guidelines-item\").forEach(other => {\n            other.classList.remove(\"active\");\n            other.querySelector(\".guidelines-item-content\").style.display = \"none\";\n            other.querySelector(\".guidelines-arrow\").textContent = \"\u25BC\";\n          });\n          itemEl.classList.add(\"active\");\n          content.style.display = \"block\";\n          arrow.textContent = \"\u25B2\";\n        }\n      });\n\n      accordionContainer.appendChild(itemEl);\n    });\n\n    drawer.classList.add(\"active\");\n  };\n\n  function initHeaderGuidelinesDrawer() {\n    let drawer = document.getElementById(\"joydrapeHeaderGuidelinesDrawer\");\n    if (!drawer) {\n      drawer = document.createElement(\"div\");\n      drawer.id = \"joydrapeHeaderGuidelinesDrawer\";\n      drawer.className = \"joydrape-guidelines-drawer\";\n      drawer.innerHTML = `\n        <div class=\"joydrape-guidelines-drawer-overlay\" id=\"joydrapeHeaderGuidelinesDrawerOverlay\"></div>\n        <div class=\"joydrape-guidelines-drawer-content\">\n          <div class=\"joydrape-guidelines-drawer-header\">\n            <h3 class=\"joydrape-guidelines-drawer-title\">HEADER GUIDELINES</h3>\n            <button type=\"button\" class=\"joydrape-guidelines-drawer-close\" id=\"joydrapeHeaderGuidelinesDrawerClose\">&times;</button>\n          </div>\n          <div class=\"joydrape-guidelines-drawer-body\">\n            <div class=\"guidelines-accordion\"></div>\n          </div>\n        </div>\n      `;\n      document.body.appendChild(drawer);\n\n      const closeBtn = drawer.querySelector(\"#joydrapeHeaderGuidelinesDrawerClose\");\n      const overlay = drawer.querySelector(\"#joydrapeHeaderGuidelinesDrawerOverlay\");\n      const close = () => {\n        drawer.classList.remove(\"active\");\n      };\n      closeBtn.addEventListener(\"click\", close);\n      overlay.addEventListener(\"click\", close);\n    }\n  }\n\n  function openHeaderGuidelinesDrawer() {\n    initHeaderGuidelinesDrawer();\n    const drawer = document.getElementById(\"joydrapeHeaderGuidelinesDrawer\");\n    if (!drawer) return;\n\n    const headerStep = TEMPLATE_CONFIGS[state.templateId]?.steps.find(s => s.key === \"headerStyle\");\n    const values = headerStep ? headerStep.values : [];\n\n    const accordionContainer = drawer.querySelector(\".guidelines-accordion\");\n    accordionContainer.innerHTML = \"\";\n\n    values.forEach((val, idx) => {\n      const name = val.value;\n      const image = val.image || \"\";\n      const isExpanded = idx === 0;\n      \n      let itemData = { bullets: [], note: \"\" };\n      if (val.description) {\n        const lines = val.description.split('\\n').map(l => l.trim()).filter(l => l.length > 0);\n        lines.forEach(line => {\n          if (line.toLowerCase().startsWith('note:')) {\n            itemData.note = line.substring(5).trim();\n          } else {\n            itemData.bullets.push(line);\n          }\n        });\n      } else {\n        const defaultData = HEADER_GUIDELINES_DATA[name] || { bullets: [\"Custom header style details.\"] };\n        itemData.bullets = defaultData.bullets;\n        itemData.note = defaultData.note || \"\";\n      }\n      \n      const itemEl = document.createElement(\"div\");\n      itemEl.className = \"guidelines-item\" + (isExpanded ? \" active\" : \"\");\n      \n      let bulletsHtml = itemData.bullets.map(b => `<li>${b}</li>`).join(\"\");\n      let noteHtml = itemData.note ? `<div class=\"guidelines-note\">${itemData.note}</div>` : \"\";\n      \n      itemEl.innerHTML = `\n        <div class=\"guidelines-item-header\">\n          <span>${name}</span>\n          <span class=\"guidelines-arrow\">${isExpanded ? \"\u25B2\" : \"\u25BC\"}</span>\n        </div>\n        <div class=\"guidelines-item-content\" style=\"display: ${isExpanded ? 'block' : 'none'};\">\n          ${image ? `<img src=\"${image}\" class=\"guidelines-img\" alt=\"${name}\">` : \"\"}\n          <ul>\n            ${bulletsHtml}\n          </ul>\n          ${noteHtml}\n        </div>\n      `;\n\n      itemEl.querySelector(\".guidelines-item-header\").addEventListener(\"click\", () => {\n        const content = itemEl.querySelector(\".guidelines-item-content\");\n        const arrow = itemEl.querySelector(\".guidelines-arrow\");\n        const wasActive = itemEl.classList.contains(\"active\");\n        \n        if (wasActive) {\n          itemEl.classList.remove(\"active\");\n          content.style.display = \"none\";\n          arrow.textContent = \"\u25BC\";\n        } else {\n          accordionContainer.querySelectorAll(\".guidelines-item\").forEach(other => {\n            other.classList.remove(\"active\");\n            other.querySelector(\".guidelines-item-content\").style.display = \"none\";\n            other.querySelector(\".guidelines-arrow\").textContent = \"\u25BC\";\n          });\n          \n          itemEl.classList.add(\"active\");\n          content.style.display = \"block\";\n          arrow.textContent = \"\u25B2\";\n        }\n      });\n\n      accordionContainer.appendChild(itemEl);\n    });\n\n    drawer.classList.add(\"active\");\n  };\n\n  const MOUNT_GUIDELINES_DATA = {\n    \"Inside\": {\n      bullets: [\n        \"To mount the window shades within your sash.\",\n        \"Creating a streamlined, crisp look in a simple way.\",\n        \"Maximize your space without hiding your beautiful window trim.\"\n      ],\n      notes: [\n        \"*For Roman shades, we recommend a minimum window depth of 2 inches to ensure the entire shade fits within the window frame. However, since the mounting brackets for Roman shades are relatively small in size, if you don't mind a portion of the shade extending beyond the frame, a minimum depth of 1 1/4 inches is acceptable.\",\n        \"*Please note that an inside mount is designed to ensure the roller shade fits within the window frame. As a result, there may be approximately 1/4\\\" light gaps on each side. If you are concerned about light leakage, we recommend choosing an outside mount.\",\n        \"For other types of shades, like bamboo shades and roller shades, the headrail size changes and will have its own frame depth requirement.\"\n      ]\n    },\n    \"Outside\": {\n      bullets: [\n        \"To mount the window shades outside the window frame (on the wall or trim).\",\n        \"Great for windows with shallow depth, or when you want to block more light, or make the window look larger.\",\n        \"Provides 100% light coverage as it overlaps the window opening.\"\n      ],\n      notes: [\n        \"*Outside Mount: No minimum window depth is required.\"\n      ]\n    }\n  };\n\n  function initGenericGuidelinesDrawer() {\n    let drawer = document.getElementById(\"joydrapeGenericGuidelinesDrawer\");\n    if (!drawer) {\n      drawer = document.createElement(\"div\");\n      drawer.id = \"joydrapeGenericGuidelinesDrawer\";\n      drawer.className = \"joydrape-guidelines-drawer\";\n      drawer.innerHTML = `\n        <div class=\"joydrape-guidelines-drawer-overlay\" id=\"joydrapeGenericGuidelinesDrawerOverlay\"></div>\n        <div class=\"joydrape-guidelines-drawer-content\">\n          <div class=\"joydrape-guidelines-drawer-header\">\n            <h3 class=\"joydrape-guidelines-drawer-title\" id=\"joydrapeGenericGuidelinesDrawerTitle\">GUIDELINES</h3>\n            <button type=\"button\" class=\"joydrape-guidelines-drawer-close\" id=\"joydrapeGenericGuidelinesDrawerClose\">&times;</button>\n          </div>\n          <div class=\"joydrape-guidelines-drawer-body\">\n            <div class=\"guidelines-accordion\"></div>\n          </div>\n        </div>\n      `;\n      document.body.appendChild(drawer);\n\n      const closeBtn = drawer.querySelector(\"#joydrapeGenericGuidelinesDrawerClose\");\n      const overlay = drawer.querySelector(\"#joydrapeGenericGuidelinesDrawerOverlay\");\n      const close = () => {\n        drawer.classList.remove(\"active\");\n      };\n      closeBtn.addEventListener(\"click\", close);\n      overlay.addEventListener(\"click\", close);\n    }\n  }\n\n  function openGenericStepGuidelinesDrawer(stepKey) {\n    initGenericGuidelinesDrawer();\n    const drawer = document.getElementById(\"joydrapeGenericGuidelinesDrawer\");\n    if (!drawer) return;\n\n    const currentTemplate = TEMPLATE_CONFIGS[state.templateId];\n    if (!currentTemplate) return;\n\n    const stepObj = currentTemplate.steps.find(s => s.key === stepKey);\n    if (!stepObj) return;\n\n    // Set Title\n    const titleEl = document.getElementById(\"joydrapeGenericGuidelinesDrawerTitle\");\n    if (titleEl) {\n      titleEl.textContent = (stepObj.label || stepKey).toUpperCase();\n    }\n\n    const values = stepObj.values || [];\n    const accordionContainer = drawer.querySelector(\".guidelines-accordion\");\n    accordionContainer.innerHTML = \"\";\n\n    values.forEach((val, idx) => {\n      const name = val.value;\n      const image = val.image || \"\";\n      const isExpanded = idx === 0;\n\n      let itemData = { bullets: [], notes: [] };\n\n      // 1. Check if description is configured in backend\n      if (val.description) {\n        const lines = val.description.split('\\n').map(l => l.trim()).filter(l => l.length > 0);\n        lines.forEach(line => {\n          if (line.toLowerCase().startsWith('note:') || line.startsWith('*')) {\n            let cleanNote = line;\n            if (line.toLowerCase().startsWith('note:')) {\n              cleanNote = line.substring(5).trim();\n            }\n            itemData.notes.push(cleanNote);\n          } else {\n            itemData.bullets.push(line);\n          }\n        });\n      } else {\n        // 2. Fallback registries\n        let defaultData = null;\n        if (stepKey === \"mountType\" || stepKey === \"mountingType\") {\n          defaultData = MOUNT_GUIDELINES_DATA[name];\n        } else if (stepKey === \"lining\") {\n          defaultData = typeof LINING_GUIDELINES_DATA !== 'undefined' ? LINING_GUIDELINES_DATA[name] : null;\n        } else if (stepKey === \"headerStyle\") {\n          defaultData = typeof HEADER_GUIDELINES_DATA !== 'undefined' ? HEADER_GUIDELINES_DATA[name] : null;\n        }\n\n        if (defaultData) {\n          itemData.bullets = defaultData.bullets || [];\n          itemData.notes = defaultData.notes || (defaultData.note ? [defaultData.note] : []);\n        } else {\n          itemData.bullets = [val.description || 'Details for this option.'];\n        }\n      }\n\n      const bulletsHtml = itemData.bullets.map(b => `<li>${b}</li>`).join(\"\");\n      const notesHtml = itemData.notes.map(n => `<div class=\"guidelines-note\">${n}</div>`).join(\"\");\n\n      const itemEl = document.createElement(\"div\");\n      itemEl.className = \"guidelines-item\" + (isExpanded ? \" active\" : \"\");\n\n      itemEl.innerHTML = `\n        <div class=\"guidelines-item-header\">\n          <span>${name}</span>\n          <span class=\"guidelines-arrow\">${isExpanded ? \"\u25B2\" : \"\u25BC\"}</span>\n        </div>\n        <div class=\"guidelines-item-content\" style=\"display: ${isExpanded ? 'block' : 'none'};\">\n          ${image ? `<img src=\"${image}\" class=\"guidelines-img\" alt=\"${name}\">` : \"\"}\n          <ul>\n            ${bulletsHtml}\n          </ul>\n          ${notesHtml}\n        </div>\n      `;\n\n      itemEl.querySelector(\".guidelines-item-header\").addEventListener(\"click\", () => {\n        const content = itemEl.querySelector(\".guidelines-item-content\");\n        const arrow = itemEl.querySelector(\".guidelines-arrow\");\n        const wasActive = itemEl.classList.contains(\"active\");\n\n        if (wasActive) {\n          itemEl.classList.remove(\"active\");\n          content.style.display = \"none\";\n          arrow.textContent = \"\u25BC\";\n        } else {\n          accordionContainer.querySelectorAll(\".guidelines-item\").forEach(other => {\n            other.classList.remove(\"active\");\n            other.querySelector(\".guidelines-item-content\").style.display = \"none\";\n            other.querySelector(\".guidelines-arrow\").textContent = \"\u25BC\";\n          });\n\n          itemEl.classList.add(\"active\");\n          content.style.display = \"block\";\n          arrow.textContent = \"\u25B2\";\n        }\n      });\n\n      accordionContainer.appendChild(itemEl);\n    });\n\n    drawer.classList.add(\"active\");\n  };\n\n  function openMountGuidelinesDrawer() {\n    const currentTemplate = TEMPLATE_CONFIGS[state.templateId];\n    if (!currentTemplate) return;\n    const mountStep = currentTemplate.steps.find(s => s.key === \"mountType\" || s.key === \"mountingType\");\n    const stepKey = mountStep ? mountStep.key : \"mountType\";\n    window.openGenericStepGuidelinesDrawer(stepKey);\n  };\n\n  const SIZE_MEASUREMENT_GUIDELINES_DATA = {\n    \"Grommet Top\": {\n      bullets: [\n        \"Width = Rod/Track Width * Fullness/Number of Panels (2.0x Fullness is recommended)\",\n        \"Length = 1.5 inches + Measure from the very top of the rod to the floor + Bottom\",\n        \"Different Bottom Measurement:\",\n        \"\u2022 1/2\\\" Above the Floor: -1/2\\\"\",\n        \"\u2022 Kiss the Floor: 0\",\n        \"\u2022 Puddling: +2\\\"\"\n      ],\n      note: \"For more puddling, add a longer bottom.\"\n    },\n    \"Back Tab\": {\n      bullets: [\n        \"Width = Rod/Track Width * Fullness/Number of Panels\",\n        \"Length = Measure from the very top of the rod to the floor + Bottom\",\n        \"Different Bottom Measurement:\",\n        \"\u2022 1/2\\\" Above the Floor: -1/2\\\"\",\n        \"\u2022 Kiss the Floor: 0\",\n        \"\u2022 Puddling: +2\\\"\"\n      ],\n      note: \"For more puddling, add a longer bottom.\"\n    },\n    \"Pinch Pleat - Double\": {\n      bullets: [\n        \"Width = Rod/Track Width/Number of Panels\",\n        \"The flat bottom hem width is about 2 times the ordered header width\",\n        \"Length = Measure from the hole for the hooks to the floor + Bottom\",\n        \"Different Bottom Measurement:\",\n        \"\u2022 1/2\\\" Above the Floor: -1/2\\\"\",\n        \"\u2022 Kiss the Floor: 0\",\n        \"\u2022 Puddling: +2\\\"\"\n      ],\n      note: \"For more puddling, add a longer bottom.\"\n    },\n    \"Pinch Pleat - Triple\": {\n      bullets: [\n        \"Width = Rod/Track Width/Number of Panels\",\n        \"The flat bottom hem width is about 2.5 times the ordered header width\",\n        \"Length = Measure from the hole for the hooks to the floor + Bottom\",\n        \"Different Bottom Measurement:\",\n        \"\u2022 1/2\\\" Above the Floor: -1/2\\\"\",\n        \"\u2022 Kiss the Floor: 0\",\n        \"\u2022 Puddling: +2\\\"\"\n      ],\n      note: \"For more puddling, add a longer bottom.\"\n    },\n    \"Rod Pocket\": {\n      bullets: [\n        \"Width = Rod/Track Width * Fullness/Number of Panels\",\n        \"Length = 1.5 inches + Measure from the very top of the rod to the floor + Bottom\",\n        \"Different Bottom Measurement:\",\n        \"\u2022 1/2\\\" Above the Floor: -1/2\\\"\",\n        \"\u2022 Kiss the Floor: 0\",\n        \"\u2022 Puddling: +2\\\"\"\n      ],\n      note: \"For more puddling, add a longer bottom.\"\n    },\n    \"Flat Panel\": {\n      bullets: [\n        \"Width = Rod/Track Width * Fullness/Number of Panels\",\n        \"Length = Measure from the clip to floor + Bottom (Flat Panel)\",\n        \"Measure from the hole for the hooks to the floor + Bottom (Flat Hooks)\",\n        \"Measure from the hole for the hooks to the floor + Bottom (Pencil Pleat)\",\n        \"1 Inch + Measure from the very top of the rod to floor + Bottom (Back Tab)\",\n        \"Different Bottom Measurement:\",\n        \"\u2022 1/2\\\" Above the Floor: -1/2\\\"\",\n        \"\u2022 Kiss the Floor: 0\",\n        \"\u2022 Puddling: +2\\\"\"\n      ],\n      note: \"For more puddling, add a longer bottom. Read the blog about the flat panel.\"\n    },\n    \"Pencil Pleat\": {\n      bullets: [\n        \"Width = Rod/Track Width/Number of Panels\",\n        \"Before creating the pleat, the flat panel width is double the panel width.\",\n        \"Length = Measure from the hole for the hooks to the floor + Bottom\",\n        \"Different Bottom Measurement:\",\n        \"\u2022 1/2\\\" Above the Floor: -1/2\\\"\",\n        \"\u2022 Kiss the Floor: 0\",\n        \"\u2022 Puddling: +2\\\"\"\n      ],\n      note: \"For more puddling, add a longer bottom.\"\n    },\n    \"Tab Top\": {\n      bullets: [\n        \"Width = Rod/Track Width * Fullness/Number of Panels\",\n        \"Length = Measure from the very top of the rod to the floor + Bottom\",\n        \"Different Bottom Measurement:\",\n        \"\u2022 1/2\\\" Above the Floor: -1/2\\\"\",\n        \"\u2022 Kiss the Floor: 0\",\n        \"\u2022 Puddling: +2\\\"\"\n      ],\n      note: \"For more puddling, add a longer bottom.\"\n    },\n    \"Ripple Fold\": {\n      bullets: [\n        \"Width = Rod/Track Width * /Number of Panels\",\n        \"The flat bottom hem width is about 2.1 times the ordered header width\",\n        \"Length = Measure from the track bottom to floor + Bottom\",\n        \"Every 2.36 inches will have a fold.\",\n        \"Different Bottom Measurement:\",\n        \"\u2022 1/2\\\" Above the Floor: -1/2\\\"\",\n        \"\u2022 Kiss the Floor: 0\",\n        \"\u2022 Puddling: +2\\\"\"\n      ],\n      note: \"For more puddling, add a longer bottom.\"\n    },\n    \"Euro Pleat - Double\": {\n      bullets: [\n        \"Width = Rod/Track Width/Number of Panels\",\n        \"The flat bottom hem width is about 2 times the ordered header width\",\n        \"Length = Measure from the hole for the hooks to the floor + Bottom\",\n        \"Different Bottom Measurement:\",\n        \"\u2022 1/2\\\" Above the Floor: -1/2\\\"\",\n        \"\u2022 Kiss the Floor: 0\",\n        \"\u2022 Puddling: +2\\\"\"\n      ],\n      note: \"For more puddling, add a longer bottom.\"\n    },\n    \"Euro Pleat - Triple\": {\n      bullets: [\n        \"Width = Rod/Track Width/Number of Panels\",\n        \"The flat bottom hem width is about 2.5 times the ordered header width\",\n        \"Length = Measure from the hole for the hooks to the floor + Bottom\",\n        \"Different Bottom Measurement:\",\n        \"\u2022 1/2\\\" Above the Floor: -1/2\\\"\",\n        \"\u2022 Kiss the Floor: 0\",\n        \"\u2022 Puddling: +2\\\"\"\n      ],\n      note: \"For more puddling, add a longer bottom.\"\n    },\n    \"Inside\": {\n      bullets: [\n        \"Width = Window Recess Width (take the narrowest measurement of top, middle, and bottom)\",\n        \"Height = Window Recess Height (take the longest measurement of left, middle, and right)\",\n        \"Deduction: We will automatically make a 1/4 inch deduction on width for a clean fit.\",\n        \"Minimum Depth: 2 inches for a fully recessed inside mount.\"\n      ],\n      note: \"If your window frame depth is less than 2 inches, a portion of the shade will protrude.\"\n    },\n    \"Outside\": {\n      bullets: [\n        \"Width = Window Frame Width + 4 inches (adding 2 inches overlap on each side for better coverage)\",\n        \"Height = Window Frame Height + 4 inches (or add more if you want the shade to mount higher)\"\n      ],\n      note: \"Outside mount requires no minimum window depth and is ideal for blocking 100% of light.\"\n    }\n  };\n\n  function initSizeGuidelinesDrawer() {\n    let drawer = document.getElementById(\"joydrapeSizeGuidelinesDrawer\");\n    if (!drawer) {\n      drawer = document.createElement(\"div\");\n      drawer.id = \"joydrapeSizeGuidelinesDrawer\";\n      drawer.className = \"joydrape-guidelines-drawer\";\n      drawer.innerHTML = `\n        <div class=\"joydrape-guidelines-drawer-overlay\" id=\"joydrapeSizeGuidelinesDrawerOverlay\"></div>\n        <div class=\"joydrape-guidelines-drawer-content\">\n          <div class=\"joydrape-guidelines-drawer-header\">\n            <h3 class=\"joydrape-guidelines-drawer-title\">MEASUREMENT GUIDELINES</h3>\n            <button type=\"button\" class=\"joydrape-guidelines-drawer-close\" id=\"joydrapeSizeGuidelinesDrawerClose\">&times;</button>\n          </div>\n          <div class=\"joydrape-guidelines-drawer-body\">\n            <div class=\"guidelines-accordion\"></div>\n          </div>\n        </div>\n      `;\n      document.body.appendChild(drawer);\n\n      const closeBtn = drawer.querySelector(\"#joydrapeSizeGuidelinesDrawerClose\");\n      const overlay = drawer.querySelector(\"#joydrapeSizeGuidelinesDrawerOverlay\");\n      const close = () => {\n        drawer.classList.remove(\"active\");\n      };\n      closeBtn.addEventListener(\"click\", close);\n      overlay.addEventListener(\"click\", close);\n    }\n  }\n\n  function openSizeGuidelinesDrawer() {\n    initSizeGuidelinesDrawer();\n    const drawer = document.getElementById(\"joydrapeSizeGuidelinesDrawer\");\n    if (!drawer) return;\n\n    let targetStep = TEMPLATE_CONFIGS[state.templateId]?.steps.find(s => s.key === \"headerStyle\");\n    if (!targetStep || !targetStep.values || targetStep.values.length === 0) {\n      targetStep = TEMPLATE_CONFIGS[state.templateId]?.steps.find(s => s.key === \"mountType\" || s.key === \"mountingType\");\n    }\n    const values = targetStep ? targetStep.values : [];\n\n    const accordionContainer = drawer.querySelector(\".guidelines-accordion\");\n    accordionContainer.innerHTML = \"\";\n\n    values.forEach((val, idx) => {\n      const name = val.value;\n      const image = val.measureImage || \"\";\n      const isExpanded = idx === 0;\n      \n      let itemData = { bullets: [], note: \"\" };\n      if (val.measureDescription) {\n        const lines = val.measureDescription.split('\\n').map(l => l.trim()).filter(l => l.length > 0);\n        lines.forEach(line => {\n          if (line.toLowerCase().startsWith('note:')) {\n            itemData.note = line.substring(5).trim();\n          } else {\n            itemData.bullets.push(line);\n          }\n        });\n      } else {\n        const defaultData = SIZE_MEASUREMENT_GUIDELINES_DATA[name] || { bullets: [\"Custom measurement details.\"] };\n        itemData.bullets = defaultData.bullets;\n        itemData.note = defaultData.note || \"\";\n      }\n      \n      const itemEl = document.createElement(\"div\");\n      itemEl.className = \"guidelines-item\" + (isExpanded ? \" active\" : \"\");\n      \n      let bulletsHtml = itemData.bullets.map(b => `<li>${b}</li>`).join(\"\");\n      let noteHtml = itemData.note ? `<div class=\"guidelines-note\">${itemData.note}</div>` : \"\";\n      \n      itemEl.innerHTML = `\n        <div class=\"guidelines-item-header\">\n          <span>${name}</span>\n          <span class=\"guidelines-arrow\">${isExpanded ? \"\u25B2\" : \"\u25BC\"}</span>\n        </div>\n        <div class=\"guidelines-item-content\" style=\"display: ${isExpanded ? 'block' : 'none'};\">\n          ${image ? `<img src=\"${image}\" class=\"guidelines-img\" alt=\"${name}\">` : \"\"}\n          <ul>\n            ${bulletsHtml}\n          </ul>\n          ${noteHtml}\n        </div>\n      `;\n\n      itemEl.querySelector(\".guidelines-item-header\").addEventListener(\"click\", () => {\n        const content = itemEl.querySelector(\".guidelines-item-content\");\n        const arrow = itemEl.querySelector(\".guidelines-arrow\");\n        const wasActive = itemEl.classList.contains(\"active\");\n        \n        if (wasActive) {\n          itemEl.classList.remove(\"active\");\n          content.style.display = \"none\";\n          arrow.textContent = \"\u25BC\";\n        } else {\n          accordionContainer.querySelectorAll(\".guidelines-item\").forEach(other => {\n            other.classList.remove(\"active\");\n            other.querySelector(\".guidelines-item-content\").style.display = \"none\";\n            other.querySelector(\".guidelines-arrow\").textContent = \"\u25BC\";\n          });\n          \n          itemEl.classList.add(\"active\");\n          content.style.display = \"block\";\n          arrow.textContent = \"\u25B2\";\n        }\n      });\n\n      accordionContainer.appendChild(itemEl);\n    });\n\n    drawer.classList.add(\"active\");\n  };\n\n  function updateSelectedOptionsSummary() {\n    const container = document.getElementById(\"selectedOptionsSummary\");\n    if (!container) return;\n\n    const config = TEMPLATE_CONFIGS[state.templateId];\n    if (!config) {\n      container.innerHTML = \"\";\n      return;\n    }\n\n    // Get active color from native inputs\n    let activeColor = null;\n    const variantUpdateEl = findVariantUpdateEl();\n    const variantPickerContainer = variantUpdateEl\n      ? (variantUpdateEl.closest('.x-variant-picker') || variantUpdateEl.closest('[x-data]') || variantUpdateEl)\n      : null;\n    const colorFieldset = findColorFieldset(variantPickerContainer);\n    if (colorFieldset) {\n      const checkedInput = colorFieldset.querySelector('input[type=\"radio\"]:checked');\n      if (checkedInput && checkedInput.value) {\n        activeColor = checkedInput.value.trim();\n      }\n    }\n    if (!activeColor) {\n      const activeColorNameEl = document.getElementById(\"active-color-name\");\n      if (activeColorNameEl && activeColorNameEl.textContent) {\n        activeColor = activeColorNameEl.textContent.trim();\n      }\n    }\n\n    const items = [];\n\n    // 1. Color\n    if (activeColor) {\n      items.push({ label: \"Color\", value: activeColor });\n    }\n\n    // 2. Steps selections\n    let sizeHandled = false;\n    \n    for (let i = 0; i < config.steps.length; i++) {\n      const step = config.steps[i];\n      const nextStep = config.steps[i + 1];\n\n      // Skip if step condition is not met\n      if (typeof step.condition === \"function\" && !step.condition(state.selections)) {\n        continue;\n      }\n\n      // Combine width and height/length steps\n      if (!sizeHandled && step.type === \"dropdown_select\" && step.key === \"width\" && nextStep && nextStep.type === \"dropdown_select\" && (nextStep.key === \"height\" || nextStep.key === \"length\")) {\n        const w = state.selections.width;\n        const h = state.selections.height || state.selections.length;\n        if (w && h) {\n          let dispW = w;\n          let dispH = h;\n          if (state.unit === \"cm\") {\n            dispW = Math.round(w * 2.54);\n            dispH = Math.round(h * 2.54);\n          }\n          const wFrac = (state.unit === \"in\" && state.selections.fractionW && state.selections.fractionW !== \"0\" && state.selections.fractionW !== \"0/0\") ? ` ${state.selections.fractionW}` : \"\";\n          const hFrac = (state.unit === \"in\" && (state.selections.fractionH || state.selections.fractionL) && (state.selections.fractionH || state.selections.fractionL) !== \"0\" && (state.selections.fractionH || state.selections.fractionL) !== \"0/0\") ? ` ${state.selections.fractionH || state.selections.fractionL}` : \"\";\n          const unitLabel = state.unit === \"cm\" ? \"cm\" : '\"';\n          items.push({\n            label: \"Size\",\n            value: `${dispW}${wFrac}${unitLabel} W x ${dispH}${hFrac}${unitLabel} H`\n          });\n        }\n        sizeHandled = true;\n        i++; // skip next step\n        continue;\n      }\n\n      if (step.key === \"width\" || step.key === \"height\" || step.key === \"length\" || step.key === \"fractionW\" || step.key === \"fractionH\" || step.key === \"fractionL\") {\n        if (!sizeHandled) {\n          if (step.type === \"size_input\") {\n            if (step.singleInput) {\n              const val = state.selections[step.key];\n              const fracL = (state.unit === \"in\" && state.selections.fractionL && state.selections.fractionL !== \"0\" && state.selections.fractionL !== \"0/0\") ? ` ${state.selections.fractionL}` : \"\";\n              if (val) {\n                let dispVal = `${val}${fracL} ${state.unit}`;\n                if (state.templateId === \"tem209676\") {\n                  const inW = state.unit === \"in\" ? val : (val / 2.54);\n                  const wSur = Math.round(Math.max(0, Math.floor(inW) - 10) * 1.40 * 100) / 100;\n                  dispVal += wSur > 0 ? (' (+$' + wSur.toFixed(2) + ')') : ' (Free)';\n                }\n                items.push({ label: step.label || \"Size\", value: dispVal });\n              }\n              const w = state.selections.width;\n              const h = state.selections.height;\n              if (w && h) {\n                items.push({ label: \"Size\", value: `${w}W x ${h}H ${state.unit}` });\n              }\n            }\n            sizeHandled = true;\n          } else {\n            const val = state.selections[step.key];\n            if (val) {\n              let dispVal = val;\n              if (state.unit === \"cm\") {\n                dispVal = Math.round(parseFloat(val) * 2.54);\n              }\n              items.push({ label: step.label, value: `${dispVal} ${state.unit}` });\n            }\n          }\n        }\n        continue;\n      }\n\n      const val = state.selections[step.key];\n      if (val) {\n        let label = step.label || \"\";\n        if (label.toLowerCase().endsWith(\" style\")) {\n          label = label.substring(0, label.length - 6);\n        } else if (label.toLowerCase().endsWith(\" option\")) {\n          label = label.substring(0, label.length - 7);\n        }\n        let dispVal = val;\n        if (state.templateId === \"tem209676\") {\n          const stepConfig = config.steps.find(s => s.key === step.key);\n          const valObj = stepConfig && stepConfig.values ? stepConfig.values.find(v => v.value === val) : null;\n          if (valObj && valObj.priceText) {\n            dispVal += ' (' + valObj.priceText + ')';\n          }\n        }\n        items.push({ label: label, value: dispVal });\n      }\n    }\n\n    // 3. Weight calculation\n    let weightText = null;\n    const isDropdown = (config.steps.find(s => s.key === \"width\")?.type === \"dropdown_select\");\n    const wVal = parseFloat(state.selections.width || 0);\n    const hVal = parseFloat(state.selections.height || state.selections.length || 0);\n    if (wVal > 0 && hVal > 0) {\n      const wFrac = state.selections.fractionW ? parseFraction(state.selections.fractionW) : 0;\n      const hFrac = (state.selections.fractionH || state.selections.fractionL) ? parseFraction(state.selections.fractionH || state.selections.fractionL) : 0;\n      const totalW = wVal + wFrac;\n      const totalH = hVal + hFrac;\n      const wInches = isDropdown ? totalW : (state.unit === \"cm\" ? (totalW / 2.54) : totalW);\n      const hInches = isDropdown ? totalH : (state.unit === \"cm\" ? (totalH / 2.54) : totalH);\n      const weight = wInches * hInches * 0.00077;\n      weightText = `~${weight.toFixed(2)} lbs (per panel)`;\n    }\n\n\n\n    // 4. Quantity\n    if (state.quantity) {\n      items.push({ label: \"Quantity\", value: `${state.quantity} panel${state.quantity > 1 ? 's' : ''}` });\n    }\n\n    if (items.length === 0) {\n      container.innerHTML = \"\";\n      return;\n    }\n\n    container.innerHTML = `\n      <div class=\"selected-summary-title\">You've Selected:</div>\n      <div class=\"selected-summary-list\">\n        ${items.map(item => `\n          <div class=\"selected-summary-item\">\n            <span class=\"selected-summary-label\">${item.label}:</span>\n            <span class=\"selected-summary-value\">${item.value}</span>\n          </div>\n        `).join('')}\n      </div>\n    `;\n  }\n\n  function findOwnSection() {\n    var all = document.querySelectorAll('#joydrapeConfiguratorSection');\n    // Priority 1: section registered via liquid's __jdSectionQueue\n    if (window.__jdSectionQueue && window.__jdSectionQueue.length) {\n      var sid = window.__jdSectionQueue.shift();\n      var sec = document.querySelector('#joydrapeConfiguratorSection[data-section-id=\"' + sid + '\"]');\n      if (sec) return sec;\n    }\n    // Priority 2: section whose data-section-id doesn't indicate quick-view/modal\n    for (var i = 0; i < all.length; i++) {\n      var id = (all[i].dataset.sectionId || \"\").toLowerCase();\n      if (!id.includes(\"quick\") && !id.includes(\"modal\") && !id.includes(\"drawer\")) {\n        return all[i];\n      }\n    }\n    return all[0] || null;\n  }\n\n  \n  // ============================================================\n  // JoyDrape Free Swatches Drawer JS Logic\n  // ============================================================\n  const PROXY_VARIANT_ID = \"45601670463649\";\n  const MAX_SWATCHES = 5;\n  let selectedSwatchesInCart = [];\n\n        function upscaleShopifyImageUrl(url, size = \"350\") {\n    if (!url) return \"\";\n    \n    // 1. Handle query parameters (e.g. ?width=50 or &width=50)\n    if (url.includes(\"width=\")) {\n      url = url.replace(/([\\?&]width=)[0-9]+/gi, `$1${size}`);\n    }\n    if (url.includes(\"height=\")) {\n      // Remove height parameter to maintain aspect ratio\n      url = url.replace(/[\\?&]height=[0-9]+/gi, '');\n    }\n    \n    // 2. Handle filename size suffixes (e.g. _50x50 or _120x)\n    const sizeSuffix = size + \"x\";\n    url = url.replace(/_(?:[0-9]+x[0-9]*|[0-9]*x[0-9]+)(?:_crop_[a-z]+)?(?=\\.(?:png|jpg|jpeg|webp|gif))/gi, `_${sizeSuffix}`);\n    \n    return url;\n  }\n\nfunction initFreeSwatchesDrawer() {\n    window.openFreeSwatchesDrawer = () => {\n      console.log(\"[JoyDrape Swatches] openFreeSwatchesDrawer triggered\");\n      let drawerEl = document.getElementById(\"joydrapeSwatchesDrawer\");\n      \n      // If the drawer HTML does not exist in the DOM (e.g. due to server cache), create it dynamically!\n      if (!drawerEl) {\n        console.log(\"[JoyDrape Swatches] Creating swatches drawer dynamically...\");\n        drawerEl = document.createElement(\"div\");\n        drawerEl.id = \"joydrapeSwatchesDrawer\";\n        drawerEl.className = \"joydrape-swatches-drawer\";\n        drawerEl.innerHTML = `\n          <div class=\"joydrape-swatches-drawer-overlay\" id=\"joydrapeSwatchesDrawerOverlay\"></div>\n          <div class=\"joydrape-swatches-drawer-content\">\n            <div class=\"joydrape-swatches-drawer-header\">\n              <h3 class=\"joydrape-swatches-drawer-title\">Order Free Swatches</h3>\n              <button type=\"button\" class=\"joydrape-swatches-drawer-close\" id=\"joydrapeSwatchesDrawerClose\">&times;</button>\n            </div>\n            <div class=\"joydrape-swatches-drawer-body\">\n              <div class=\"swatches-grid\" id=\"swatchesDrawerGrid\"></div>\n            </div>\n            <div class=\"joydrape-swatches-drawer-footer\">\n              <div class=\"swatches-progress-bar-wrap\">\n                <div class=\"swatches-progress-text\">\n                  <span>Selected Swatches</span>\n                  <span id=\"swatchesSelectedCount\">0/5</span>\n                </div>\n                <div class=\"swatches-progress-bg\">\n                  <div class=\"swatches-progress-fill\" id=\"swatchesProgressFill\"></div>\n                </div>\n              </div>\n              <button type=\"button\" class=\"swatches-checkout-btn\" id=\"swatchesCheckoutBtn\" style=\"display: none;\">\n                View Cart & Checkout\n              </button>\n            </div>\n          </div>\n        `;\n        document.body.appendChild(drawerEl);\n      }\n\n      const allowed = (state.product && state.product.tags)\n        ? state.product.tags.some(tag => {\n            const t = tag.toLowerCase();\n            return t === \"swatch\" || t === \"swatches\";\n          })\n        : [\"tem3\", \"tem8\", \"tem205720\"].includes(state.templateId);\n      if (!allowed) {\n        console.warn(\"[JoyDrape Swatches] Product not allowed to show swatches\");\n        return;\n      }\n\n      // Bind close buttons dynamically if they haven't been bound yet\n      if (!drawerEl.dataset.swatchesBound) {\n        const closeBtn = document.getElementById(\"joydrapeSwatchesDrawerClose\");\n        const overlay = document.getElementById(\"joydrapeSwatchesDrawerOverlay\");\n        const checkoutBtn = document.getElementById(\"swatchesCheckoutBtn\");\n\n        const closeDrawer = () => {\n          drawerEl.classList.remove(\"active\");\n          document.body.style.overflow = \"\";\n        };\n\n        if (closeBtn) closeBtn.addEventListener(\"click\", closeDrawer);\n        if (overlay) overlay.addEventListener(\"click\", closeDrawer);\n        if (checkoutBtn) {\n          checkoutBtn.addEventListener(\"click\", () => {\n            window.location.href = \"/cart\";\n          });\n        }\n        drawerEl.dataset.swatchesBound = \"true\";\n      }\n\n      populateSwatchesDrawerGrid();\n      drawerEl.classList.add(\"active\");\n      document.body.style.overflow = \"hidden\";\n      syncSwatchesCartState();\n    };\n  }\n\n    function populateSwatchesDrawerGrid() {\n    const variantUpdateEl = findVariantUpdateEl();\n    const variantPickerContainer = variantUpdateEl\n      ? (variantUpdateEl.closest('.x-variant-picker') || variantUpdateEl.closest('[x-data]') || variantUpdateEl)\n      : null;\n    const colorFieldset = findColorFieldset(variantPickerContainer);\n\n    const gridContainer = document.getElementById(\"swatchesDrawerGrid\");\n    if (!gridContainer) return;\n    gridContainer.innerHTML = \"\";\n\n    if (!colorFieldset) {\n      console.warn(\"[JoyDrape Swatches] colorFieldset not found\");\n      return;\n    }\n\n    const inputs = colorFieldset.querySelectorAll('input[type=\"radio\"]');\n    if (inputs.length === 0) {\n      console.warn(\"[JoyDrape Swatches] No radio color inputs found in fieldset\");\n      return;\n    }\n\n    inputs.forEach(input => {\n      const colorName = input.value ? input.value.trim() : \"\";\n      if (!colorName) return;\n\n      const label = colorFieldset.querySelector(`label[for=\"${input.id}\"]`);\n      if (!label) return;\n\n      const bgHex = label.style.backgroundColor || \"\";\n      const bgImgUrl = label.style.backgroundImage || \"\";\n\n      let largeFabricImgUrl = \"\";\n      if (bgImgUrl && bgImgUrl !== \"none\") {\n        // Extract URL robustly from CSS url(\"...\") format\n        const match = bgImgUrl.match(/url\\(['\"]?(.*?)['\"]?\\)/);\n        largeFabricImgUrl = match ? match[1].trim() : \"\";\n        largeFabricImgUrl = upscaleShopifyImageUrl(largeFabricImgUrl, \"350\");\n      }\n\n      let curtainImgUrl = \"\";\n      if (state.product && state.product.variants) {\n        const matchingVariant = state.product.variants.find(v => {\n          return v.options && v.options.some(opt => opt.trim().toLowerCase() === colorName.toLowerCase());\n        });\n        if (matchingVariant && matchingVariant.image) {\n          curtainImgUrl = matchingVariant.image;\n        }\n      }\n\n      if (!curtainImgUrl && state.product && state.product.variants && state.product.variants[0]) {\n        curtainImgUrl = state.product.variants[0].image || \"\";\n      }\n      \n      curtainImgUrl = upscaleShopifyImageUrl(curtainImgUrl, \"120\");\n\n      const card = document.createElement(\"div\");\n      card.className = \"swatch-card\";\n      card.setAttribute(\"data-color\", colorName);\n\n      let visualHtml = \"\";\n      if (largeFabricImgUrl) {\n        visualHtml = `<img src=\"${largeFabricImgUrl}\" class=\"swatch-card-img\" alt=\"${colorName}\" loading=\"lazy\">`;\n      } else if (bgHex) {\n        visualHtml = `<div class=\"swatch-card-color-circle\" style=\"background-color: ${bgHex};\"></div>`;\n      } else {\n        if (curtainImgUrl) {\n          visualHtml = `<img src=\"${curtainImgUrl}\" class=\"swatch-card-img\" alt=\"${colorName}\" loading=\"lazy\">`;\n        } else {\n          visualHtml = `<div class=\"swatch-card-color-circle\" style=\"background-color: #cccccc;\"></div>`;\n        }\n      }\n\n      const curtainThumbHtml = curtainImgUrl ? `<img src=\"${curtainImgUrl}\" class=\"swatch-card-curtain-thumb\" alt=\"${colorName} curtain\" loading=\"lazy\">` : \"\";\n\n      card.innerHTML = `\n        <div class=\"swatch-card-img-wrap\">\n          ${visualHtml}\n          ${curtainThumbHtml}\n          <button type=\"button\" class=\"swatch-card-btn\" data-color=\"${colorName}\">+</button>\n        </div>\n        <h4 class=\"swatch-card-name\" title=\"${colorName}\">${colorName}</h4>\n        <p class=\"swatch-card-price\">Free</p>\n      `;\n\n      const btn = card.querySelector(\".swatch-card-btn\");\n      btn.addEventListener(\"click\", () => {\n        handleSwatchCardClick(colorName, curtainImgUrl || largeFabricImgUrl, btn);\n      });\n\n      gridContainer.appendChild(card);\n    });\n  }\n\nfunction syncSwatchesCartState() {\n    fetch(\"/cart.js\")\n      .then(res => res.json())\n      .then(cart => {\n        selectedSwatchesInCart = cart.items.filter(item => item.variant_id == PROXY_VARIANT_ID || item.id == PROXY_VARIANT_ID);\n        updateSwatchesUI();\n      })\n      .catch(err => console.error(\"Error syncing swatches cart:\", err));\n  }\n\n  function updateSwatchesUI() {\n    const gridContainer = document.getElementById(\"swatchesDrawerGrid\");\n    if (!gridContainer) return;\n\n    const cards = gridContainer.querySelectorAll(\".swatch-card\");\n    let totalCount = 0;\n\n    cards.forEach(card => {\n      const color = card.getAttribute(\"data-color\");\n      const btn = card.querySelector(\".swatch-card-btn\");\n      \n      const inCart = selectedSwatchesInCart.find(item => {\n        return item.properties && item.properties.Color && item.properties.Color.toLowerCase() === color.toLowerCase();\n      });\n\n      if (inCart) {\n        btn.textContent = \"\u2713\";\n        btn.classList.add(\"added\");\n        totalCount += inCart.quantity;\n      } else {\n        btn.textContent = \"+\";\n        btn.classList.remove(\"added\");\n      }\n    });\n\n    const countLabel = document.getElementById(\"swatchesSelectedCount\");\n    const progressFill = document.getElementById(\"swatchesProgressFill\");\n    const checkoutBtn = document.getElementById(\"swatchesCheckoutBtn\");\n\n    if (countLabel) countLabel.textContent = `${totalCount}/${MAX_SWATCHES}`;\n    if (progressFill) {\n      // Cap width to 100% even if user adds more than 5 swatches\n      const percentage = Math.min(100, (totalCount / MAX_SWATCHES) * 100);\n      progressFill.style.width = `${percentage}%`;\n    }\n    if (checkoutBtn) {\n      checkoutBtn.style.display = totalCount > 0 ? \"block\" : \"none\";\n    }\n  }\n\n  function handleSwatchCardClick(colorName, imageUrl, btn) {\n    if (btn.classList.contains(\"loading\")) return;\n\n    const inCart = selectedSwatchesInCart.find(item => {\n      return item.properties && item.properties.Color && item.properties.Color.toLowerCase() === colorName.toLowerCase();\n    });\n\n    if (inCart) {\n      removeSwatchFromCart(colorName, btn);\n    } else {\n      // Removed product page 5-swatch limit check completely so they can add unlimited swatches\n      addSwatchToCart(colorName, imageUrl, btn);\n    }\n  }\n\n  async function addSwatchToCart(colorName, imageUrl, btn, retryCount = 0) {\n    btn.classList.add(\"loading\");\n    btn.textContent = \"\";\n\n    const productName = state.product && state.product.title ? state.product.title : \"Curtains Swatch\";\n    const properties = {\n      \"Product\": productName,\n      \"Color\": colorName,\n      \"_Swatch Preview\": imageUrl,\n      \"_is_swatch\": \"true\",\n      \"_hidden\": \"true\"\n    };\n\n    const formData = {\n      id: PROXY_VARIANT_ID,\n      quantity: 1,\n      properties: properties\n    };\n\n    try {\n      const res = await fetch(\"/cart/add.js\", {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: JSON.stringify(formData)\n      });\n\n      if (!res.ok) {\n        if (res.status === 429 && retryCount < 2) {\n          await new Promise(r => setTimeout(r, 800 * (retryCount + 1)));\n          return addSwatchToCart(colorName, imageUrl, btn, retryCount + 1);\n        }\n        let errMsg = \"Please wait a moment and try again.\";\n        try {\n          const errData = await res.json();\n          if (errData.description) errMsg = errData.description;\n          else if (errData.message) errMsg = errData.message;\n        } catch (e) {}\n        throw new Error(errMsg);\n      }\n\n      await res.json();\n      document.dispatchEvent(new CustomEvent(\"cart:updated\"));\n      \n      const cartRes = await fetch(\"/cart.js\");\n      const cart = await cartRes.json();\n      selectedSwatchesInCart = cart.items.filter(item => item.variant_id == PROXY_VARIANT_ID || item.id == PROXY_VARIANT_ID);\n      updateSwatchesUI();\n    } catch (err) {\n      console.error(\"Error adding swatch to cart:\", err);\n      alert(\"Notice: \" + (err.message || \"Failed to add swatch. Please try again.\"));\n    } finally {\n      btn.classList.remove(\"loading\");\n    }\n  }\n\n  async function removeSwatchFromCart(colorName, btn, retryCount = 0) {\n    btn.classList.add(\"loading\");\n    btn.textContent = \"\";\n\n    const inCart = selectedSwatchesInCart.find(item => {\n      return item.properties && item.properties.Color && item.properties.Color.toLowerCase() === colorName.toLowerCase();\n    });\n\n    if (!inCart) {\n      btn.classList.remove(\"loading\");\n      return;\n    }\n\n    const updates = {};\n    updates[inCart.key || inCart.id] = 0;\n\n    try {\n      const res = await fetch(\"/cart/update.js\", {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: JSON.stringify({ updates: updates })\n      });\n\n      if (!res.ok) {\n        if (res.status === 429 && retryCount < 2) {\n          await new Promise(r => setTimeout(r, 800 * (retryCount + 1)));\n          return removeSwatchFromCart(colorName, btn, retryCount + 1);\n        }\n        throw new Error(\"Failed to remove swatch\");\n      }\n\n      await res.json();\n      document.dispatchEvent(new CustomEvent(\"cart:updated\"));\n      \n      const cartRes = await fetch(\"/cart.js\");\n      const cart = await cartRes.json();\n      selectedSwatchesInCart = cart.items.filter(item => item.variant_id == PROXY_VARIANT_ID || item.id == PROXY_VARIANT_ID);\n      updateSwatchesUI();\n    } catch (err) {\n      console.error(\"Error removing swatch from cart:\", err);\n      alert(\"Notice: Failed to remove swatch. Please try again.\");\n    } finally {\n      btn.classList.remove(\"loading\");\n    }\n  }\n\n  // Wait for our section container to appear in DOM, then init\n  function waitAndInit() {\n    window.__jdLogs = window.__jdLogs || [];\n    const section = findOwnSection();\n    window.__jdLogs.push('[JoyDrape] configurator init, section=' + (section ? section.dataset.sectionId : 'NOT FOUND'));\n    console.log('[JoyDrape] configurator init, section=', section ? section.dataset.sectionId : 'NOT FOUND');\n    if (section) {\n      init();\n    } else {\n      var t = setInterval(function() {\n        if (findOwnSection()) {\n          clearInterval(t);\n          init();\n        }\n      }, 50);\n      setTimeout(function() { clearInterval(t); }, 10000);\n    }\n  }\n\n  // Allow each section instance to initialize independently (no global guard),\n  // since each instance owns its own section and accordion container.\n  if (document.readyState === \"complete\" || document.readyState === \"interactive\") {\n    waitAndInit();\n  } else {\n    document.addEventListener(\"DOMContentLoaded\", waitAndInit);\n  }\n})();"],
  "mappings": "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O,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,KACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,OACb,CACF,EACA,QAAS,KACT,UAAW,CACT,CACE,MAAO,WACP,QAAS,CACP,CACE,KAAM,OACN,KAAM,6BACN,IAAK,kBACP,CACF,EACA,KAAM,WACR,EACA,CACE,MAAO,QACP,QAAS,CACP,CACE,KAAM,OACN,KAAM,uLACR,CACF,CACF,CACF,CACF,EACA,CACE,IAAK,SACL,MAAO,gBACP,KAAM,kBACN,SAAU,GACV,OAAQ,CACN,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,QACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,SACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,EACA,CACE,MAAO,MACP,UAAW,UACb,CACF,EACA,QAAS,IACX,EACA,CACE,IAAK,SACL,MAAO,iBACP,KAAM,cACN,SAAU,GACV,OAAQ,CACN,CACE,MAAO,UACP,UAAW,OACX,MAAO,yFACT,EACA,CACE,MAAO,aACP,UAAW,UACX,MAAO,mIACT,EACA,CACE,MAAO,aACP,UAAW,UACX,MAAO,+FACT,EACA,CACE,MAAO,cACP,UAAW,UACX,MAAO,oJACT,CACF,EACA,QAAS,UACT,UAAW,CACT,CACE,MAAO,OACP,QAAS,CACP,CACE,KAAM,OACN,KAAM,uDACR,CACF,CACF,CACF,CACF,EACA,CACE,IAAK,UACL,MAAO,oBACP,KAAM,cACN,SAAU,GACV,OAAQ,CACN,CACE,MAAO,UACP,UAAW,OACX,MAAO,0EACT,EACA,CACE,MAAO,gCACP,UAAW,SACX,MAAO,2EACT,CACF,EACA,QAAS,UACT,UAAW,CACT,CACE,MAAO,OACP,QAAS,CACP,CACE,KAAM,OACN,KAAM,iDACR,CACF,CACF,CACF,CACF,CACF,EACA,cAAe,OACf,aAAc,OACd,QAAS,CACP,UAAW,CACT,CACE,KAAM,cACN,QAAS,UACT,UAAW,SACb,EACA,CACE,KAAM,WACN,QAAS,UACT,UAAW,SACb,CACF,EACA,cAAe,CACb,CACE,KAAM,mBACN,KAAM,QACR,EACA,CACE,KAAM,sBACN,KAAM,MACR,EACA,CACE,KAAM,qBACN,KAAM,KACR,CACF,CACF,CACF,EACA,KAAM,CACJ,MAAO,kCACP,MAAO,CACL,CACE,IAAK,YACL,MAAO,aACP,KAAM,cACN,SAAU,GACV,OAAQ,CACN,CACE,MAAO,SACP,UAAW,OACX,MAAO,uHACP,YAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2IACb,mBAAoB;AAAA;AAAA;AAAA;AAAA,+FACpB,aAAc,wFAChB,EACA,CACE,MAAO,UACP,UAAW,OACX,MAAO,uHACP,YAAa;AAAA;AAAA;AAAA;AAAA;AAAA,sKACb,mBAAoB;AAAA;AAAA,+FACpB,aAAc,yFAChB,CACF,EACA,QAAS,SACT,UAAW,CACT,CACE,MAAO,OACP,QAAS,CACP,CACE,KAAM,OACN,KAAM,mDACR,EACA,CACE,KAAM,OACN,KAAM,wCACN,IAAK,mBACP,CACF,CACF,CACF,CACF,EACA,CACE,IAAK,WACL,MAAO,sBACP,KAAM,cACN,SAAU,GACV,OAAQ,CACN,CACE,MAAO,mBACP,UAAW,UACX,MAAO,mFACP,YAAa;AAAA;AAAA;AAAA;AAAA,6HACf,EACA,CACE,MAAO,sBACP,UAAW,WACX,MAAO,oFACP,YAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oGACf,CACF,EACA,QAAS,mBACT,UAAW,CACT,CACE,MAAO,OACP,QAAS,CACP,CACE,KAAM,OACN,KAAM,0CACN,IAAK,2BACP,CACF,CACF,CACF,CACF,EACA,CACE,IAAK,QACL,MAAO,eACP,KAAM,kBACN,SAAU,GACV,cAAe,GACf,OAAQ,CACN,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,CACF,EACA,QAAS,KACT,UAAW,CACT,CACE,MAAO,OACP,QAAS,CACP,CACE,KAAM,OACN,KAAM,oDACR,EACA,CACE,KAAM,OACN,KAAM,kCACN,IAAK,kBACP,CACF,CACF,CACF,CACF,EACA,CACE,IAAK,SACL,MAAO,gBACP,KAAM,kBACN,SAAU,GACV,cAAe,GACf,OAAQ,CACN,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,CACF,EACA,QAAS,IACX,EACA,CACE,IAAK,SACL,MAAO,eACP,KAAM,cACN,SAAU,GACV,OAAQ,CACN,CACE,MAAO,UACP,UAAW,OACX,MAAO,sGACT,EACA,CACE,MAAO,iBACP,UAAW,UACX,MAAO,6GACT,EACA,CACE,MAAO,kBACP,UAAW,UACX,MAAO,8GACT,CACF,EACA,QAAS,SACX,CACF,CACF,EACA,UAAW,CACT,MAAO,mCACP,MAAO,CACL,CACE,IAAK,YACL,MAAO,aACP,KAAM,cACN,SAAU,GACV,OAAQ,CACN,CACE,MAAO,SACP,UAAW,OACX,MAAO,uHACP,mBAAoB;AAAA;AAAA;AAAA;AAAA,+FACpB,aAAc,wFAChB,EACA,CACE,MAAO,UACP,UAAW,OACX,MAAO,uHACP,mBAAoB;AAAA;AAAA,+FACpB,aAAc,yFAChB,CACF,EACA,QAAS,SACT,SAAU,OACV,UAAW,CACT,CACE,MAAO,OACP,QAAS,CACP,CACE,KAAM,OACN,KAAM,mDACR,EACA,CACE,KAAM,OACN,KAAM,wCACN,IAAK,mBACP,CACF,CACF,CACF,CACF,EACA,CACE,IAAK,WACL,MAAO,eACP,KAAM,cACN,SAAU,GACV,OAAQ,CACN,CACE,MAAO,oBACP,UAAW,UACX,MAAO,mFACP,YAAa;AAAA;AAAA;AAAA;AAAA,6HACf,EACA,CACE,MAAO,sBACP,UAAW,UACX,MAAO,oFACP,YAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oGACf,CACF,EACA,QAAS,oBACT,UAAW,CACT,CACE,MAAO,OACP,QAAS,CACP,CACE,KAAM,OACN,KAAM,0CACN,IAAK,2BACP,CACF,CACF,CACF,EACA,SAAU,MACZ,EACA,CACE,IAAK,QACL,MAAO,eACP,KAAM,kBACN,SAAU,GACV,cAAe,GACf,OAAQ,CACN,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,CACF,EACA,QAAS,KACT,UAAW,CACT,CACE,MAAO,OACP,QAAS,CACP,CACE,KAAM,OACN,KAAM,oDACR,EACA,CACE,KAAM,OACN,KAAM,kCACN,IAAK,kBACP,CACF,CACF,CACF,EACA,SAAU,MACZ,EACA,CACE,IAAK,SACL,MAAO,gBACP,KAAM,kBACN,SAAU,GACV,cAAe,GACf,OAAQ,CACN,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,CACF,EACA,QAAS,IACX,EACA,CACE,IAAK,cACL,MAAO,kCACP,KAAM,cACN,SAAU,GACV,OAAQ,CACN,CACE,MAAO,kBACP,UAAW,OACX,MAAO,oFACT,EACA,CACE,MAAO,aACP,UAAW,OACX,MAAO,8FACT,EACA,CACE,MAAO,cACP,UAAW,OACX,MAAO,6FACT,EACA,CACE,MAAO,YACP,UAAW,OACX,MAAO,6FACT,CACF,EACA,QAAS,iBACX,CACF,CACF,EACA,UAAW,CACT,MAAO,2CACP,MAAO,CACL,CACE,IAAK,YACL,MAAO,aACP,KAAM,cACN,SAAU,GACV,OAAQ,CACN,CACE,MAAO,SACP,UAAW,OACX,MAAO,uHACP,mBAAoB;AAAA;AAAA;AAAA;AAAA,+FACpB,aAAc,wFAChB,EACA,CACE,MAAO,UACP,UAAW,OACX,MAAO,uHACP,mBAAoB;AAAA;AAAA,+FACpB,aAAc,yFAChB,CACF,EACA,QAAS,SACT,SAAU,OACV,UAAW,CACT,CACE,MAAO,OACP,QAAS,CACP,CACE,KAAM,OACN,KAAM,mDACR,EACA,CACE,KAAM,OACN,KAAM,wCACN,IAAK,mBACP,CACF,CACF,CACF,CACF,EACA,CACE,IAAK,WACL,MAAO,YACP,KAAM,cACN,SAAU,GACV,OAAQ,CACN,CACE,MAAO,oBACP,UAAW,UACX,MAAO,mFACP,YAAa;AAAA;AAAA;AAAA;AAAA,6HACf,EACA,CACE,MAAO,sBACP,UAAW,WACX,MAAO,oFACP,YAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oGACf,CACF,EACA,QAAS,oBACT,UAAW,CACT,CACE,MAAO,OACP,QAAS,CACP,CACE,KAAM,OACN,KAAM,0CACN,IAAK,2BACP,CACF,CACF,CACF,EACA,SAAU,MACZ,EACA,CACE,IAAK,QACL,MAAO,eACP,KAAM,kBACN,SAAU,GACV,OAAQ,CACN,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,CACF,EACA,QAAS,KACT,UAAW,CACT,CACE,MAAO,OACP,QAAS,CACP,CACE,KAAM,OACN,KAAM,oDACR,EACA,CACE,KAAM,OACN,KAAM,kCACN,IAAK,kBACP,CACF,CACF,CACF,EACA,SAAU,OACV,cAAe,EACjB,EACA,CACE,IAAK,SACL,MAAO,gBACP,KAAM,kBACN,SAAU,GACV,OAAQ,CACN,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,UACb,CACF,EACA,QAAS,KACT,cAAe,EACjB,CACF,CACF,EACA,UAAW,CACT,MAAO,4CACP,MAAO,CACL,CACE,IAAK,YACL,MAAO,aACP,KAAM,cACN,SAAU,GACV,OAAQ,CACN,CACE,MAAO,SACP,UAAW,OACX,MAAO,sHACT,EACA,CACE,MAAO,UACP,UAAW,OACX,MAAO,sHACT,CACF,EACA,QAAS,QACX,EACA,CACE,IAAK,WACL,MAAO,oBACP,KAAM,cACN,SAAU,GACV,OAAQ,CACN,CACE,MAAO,YACP,UAAW,OACX,MAAO,8EACT,EACA,CACE,MAAO,sBACP,UAAW,UACX,MAAO,mFACT,CACF,EACA,QAAS,WACX,EACA,CACE,IAAK,QACL,MAAO,eACP,KAAM,kBACN,SAAU,GACV,cAAe,GACf,OAAQ,CACN,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,EACA,CACE,MAAO,KACP,UAAW,UACb,CACF,EACA,QAAS,IACX,EACA,CACE,IAAK,SACL,MAAO,gBACP,KAAM,kBACN,SAAU,GACV,cAAe,GACf,OAAQ,CACN,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,UACb,CACF,EACA,QAAS,IACX,EACA,CACE,IAAK,mBACL,MAAO,iBACP,KAAM,cACN,SAAU,GACV,SAAU,+CACV,OAAQ,CACN,CACE,MAAO,OACP,UAAW,OACX,MAAO,mEACT,EACA,CACE,MAAO,QACP,UAAW,OACX,MAAO,oEACT,CACF,EACA,QAAS,OACX,CACF,CACF,EACA,UAAW,CACT,MAAO,cACP,MAAO,CACL,CACE,IAAK,QACL,MAAO,YACP,KAAM,cACN,SAAU,GACV,OAAQ,CACN,CACE,MAAO,QACP,UAAW,OACX,MAAO,4EACT,EACA,CACE,MAAO,QACP,UAAW,OACX,MAAO,mFACT,CACF,EACA,QAAS,OACX,EACA,CACE,IAAK,WACL,MAAO,qBACP,KAAM,cACN,SAAU,GACV,OAAQ,CACN,CACE,MAAO,QACP,UAAW,OACX,MAAO,4EACT,EACA,CACE,MAAO,SACP,UAAW,OACX,MAAO,4EACT,CACF,EACA,QAAS,OACX,EACA,CACE,IAAK,SACL,MAAO,8BACP,KAAM,aACN,SAAU,GACV,YAAa,GACb,WAAY,kBACZ,KAAM,GACN,KAAM,IACN,SAAU,GACV,cAAe,EACjB,EACA,CACE,IAAK,aACL,MAAO,eACP,KAAM,cACN,SAAU,GACV,SAAU,+CACV,OAAQ,CACN,CACE,MAAO,YACP,UAAW,OACX,MAAO,4EACT,EACA,CACE,MAAO,gBACP,UAAW,OACX,MAAO,iFACT,EACA,CACE,MAAO,eACP,UAAW,OACX,MAAO,kFACT,CACF,EACA,QAAS,WACX,CACF,CACF,EACA,UAAW,CACT,MAAO,gBACP,MAAO,CACL,CACE,IAAK,cACL,MAAO,eACP,KAAM,cACN,SAAU,GACV,OAAQ,CACN,CACE,MAAO,uBACP,UAAW,QACX,MAAO,6FACT,EACA,CACE,MAAO,uBACP,UAAW,QACX,MAAO,6FACT,EACA,CACE,MAAO,aACP,UAAW,SACX,MAAO,mFACT,CACF,EACA,QAAS,YACX,EACA,CACE,IAAK,QACL,MAAO,eACP,KAAM,kBACN,SAAU,GACV,OAAQ,CACN,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,KACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,KACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,MACb,CACF,EACA,QAAS,IACX,EACA,CACE,IAAK,SACL,MAAO,gBACP,KAAM,kBACN,SAAU,GACV,OAAQ,CACN,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,OACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,MACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,QACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,EACA,CACE,MAAO,KACP,UAAW,SACb,CACF,EACA,QAAS,IACX,EACA,CACE,IAAK,SACL,MAAO,iBACP,KAAM,cACN,SAAU,GACV,OAAQ,CACN,CACE,MAAO,UACP,UAAW,OACX,MAAO,yFACT,EACA,CACE,MAAO,aACP,UAAW,OACX,MAAO,mIACT,CACF,EACA,QAAS,SACX,CACF,CACF,EACA,UAAW,CACX,MAAO,oBACP,MAAO,CACH,CACI,IAAK,QACL,MAAO,YACP,KAAM,aACN,SAAU,GACV,YAAa,GACb,WAAY,QACZ,KAAM,GACN,KAAM,GACN,cAAe,GACf,SAAU,sLACV,OAAQ,CACJ,CACI,MAAO,KACP,UAAW,QACf,EACA,CACI,MAAO,KACP,UAAW,QACf,EACA,CACI,MAAO,KACP,UAAW,QACf,EACA,CACI,MAAO,KACP,UAAW,QACf,EACA,CACI,MAAO,KACP,UAAW,QACf,EACA,CACI,MAAO,KACP,UAAW,QACf,EACA,CACI,MAAO,KACP,UAAW,QACf,EACA,CACI,MAAO,KACP,UAAW,QACf,EACA,CACI,MAAO,KACP,UAAW,QACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,EACA,CACI,MAAO,KACP,UAAW,SACf,CACJ,EACA,QAAS,IACb,EACA,CACI,IAAK,eACL,MAAO,gBACP,KAAM,cACN,SAAU,GACV,OAAQ,CACJ,CACI,MAAO,eACP,UAAW,OACX,MAAO,gFACP,YAAa,2KACjB,EACA,CACI,MAAO,gBACP,UAAW,UACX,MAAO,gFACP,YAAa,+JACjB,CACJ,EACA,QAAS,cACb,EACA,CACI,IAAK,aACL,MAAO,cACP,KAAM,cACN,SAAU,GACV,OAAQ,CACJ,CACI,MAA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CP,uBACA,+BACA,8BACA,cACF,EACA,KAAM,6EACR,EACA,cAAe,CACb,QAAS,CACP,0BACA,wCACA,oDACA,qCACA,+BACF,EACA,KAAM,4DACR,EACA,sBAAuB,CACrB,QAAS,CACP,0CACA,kCACA,mDACA,+BACA,uBACF,EACA,KAAM,mLACR,EACA,sBAAuB,CACrB,QAAS,CACP,0CACA,kCACA,mDACA,iCACA,uBACF,EACA,KAAM,mLACR,CACF,EAEM,uBAAyB,CAC7B,QAAW,CACT,QAAS,CACP,sGACA,mGACF,EACA,cAAe,CACb,8BACA,gCACF,CACF,EACA,uBAAwB,CACtB,QAAS,CACP,uFACA,oCACF,EACA,cAAe,CACb,eACA,sBACA,kBACA,qBACF,CACF,EACA,aAAc,CACZ,QAAS,CACP,6EACA,oCACF,EACA,cAAe,CACb,eACA,sBACA,kBACA,qBACF,CACF,EACA,iBAAkB,CAChB,QAAS,CACP,iFACA,oCACF,EACA,cAAe,CACb,eACA,sBACA,kBACA,qBACF,CACF,EACA,wBAAyB,CACvB,QAAS,CACP,oFACA,gCACF,EACA,cAAe,CACb,eACA,wBACA,kBACA,sBACA,oBACF,CACF,EACA,wBAAyB,CACvB,QAAS,CACP,2HACA,oCACF,EACA,cAAe,CACb,eACA,sBACA,kBACA,uBACA,uBACF,CACF,EACA,kBAAmB,CACjB,QAAS,CACP,kGACA,oCACF,EACA,cAAe,CACb,eACA,sBACA,kBACA,sBACF,CACF,EACA,uBAAwB,CACtB,QAAS,CACP,uGACA,oCACF,EACA,cAAe,CACb,eACA,sBACA,kBACA,sBACF,CACF,CACF,EAEA,SAAS,4BAA6B,CACpC,IAAI,OAAS,SAAS,eAAe,gCAAgC,EACrE,GAAI,CAAC,OAAQ,CACX,OAAS,SAAS,cAAc,KAAK,EACrC,OAAO,GAAK,iCACZ,OAAO,UAAY,6BACnB,OAAO,UAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAYnB,SAAS,KAAK,YAAY,MAAM,EAEhC,MAAM,SAAW,OAAO,cAAc,sCAAsC,EACtE,QAAU,OAAO,cAAc,wCAAwC,EACvE,MAAQ,IAAM,CAClB,OAAO,UAAU,OAAO,QAAQ,CAClC,EACA,SAAS,iBAAiB,QAAS,KAAK,EACxC,QAAQ,iBAAiB,QAAS,KAAK,CACzC,CACF,CAEA,SAAS,4BAA6B,CACpC,2BAA2B,EAC3B,MAAM,OAAS,SAAS,eAAe,gCAAgC,EACvE,GAAI,CAAC,OAAQ,OAEb,MAAM,WAAa,iBAAiB,MAAM,UAAU,GAAG,MAAM,KAAK,GAAK,EAAE,MAAQ,QAAQ,EACnF,OAAS,WAAa,WAAW,OAAS,CAAC,EAE3C,mBAAqB,OAAO,cAAc,uBAAuB,EACvE,mBAAmB,UAAY,GAE/B,OAAO,QAAQ,CAAC,IAAK,MAAQ,CAC3B,MAAM,KAAO,IAAI,MACX,MAAQ,IAAI,OAAS,GACrB,WAAa,MAAQ,EAE3B,IAAI,SAAW,CAAE,QAAS,CAAC,EAAG,cAAe,CAAC,EAAG,QAAS,GAAI,SAAU,EAAG,EAC3E,MAAM,YAAc,uBAAuB,IAAI,GAAK,CAAE,QAAS,CAAC,wBAAwB,EAAG,cAAe,CAAC,CAAE,EAE7G,GAAI,IAAI,YAAa,CACnB,MAAM,MAAQ,IAAI,YAAY,MAAM;AAAA,CAAI,EAAE,IAAI,GAAK,EAAE,KAAK,CAAC,EAAE,OAAO,GAAK,EAAE,OAAS,CAAC,EACrF,IAAI,OAAS,GACb,MAAM,QAAQ,MAAQ,CACpB,GAAI,KAAK,YAAY,EAAE,WAAW,gBAAgB,GAAK,KAAK,YAAY,EAAE,WAAW,OAAO,EAC1F,OAAS,WACA,KAAK,YAAY,EAAE,WAAW,OAAO,GAAK,KAAK,YAAY,EAAE,WAAW,OAAO,EAAG,CAC3F,MAAM,UAAY,KAAK,UAAU,CAAC,EAAE,MAAM,GAAG,EAC7C,SAAS,QAAU,UAAU,CAAC,EAAE,KAAK,EACjC,UAAU,CAAC,IACb,SAAS,SAAW,UAAU,CAAC,EAAE,KAAK,EAE1C,MACM,OACF,SAAS,cAAc,KAAK,IAAI,EAEhC,SAAS,QAAQ,KAAK,IAAI,CAGhC,CAAC,CACH,MACE,SAAS,QAAU,YAAY,SAAW,CAAC,EAC3C,SAAS,cAAgB,YAAY,eAAiB,CAAC,EACvD,SAAS,QAAU,YAAY,SAAW,GAC1C,SAAS,SAAW,YAAY,UAAY,GAG9C,MAAM,OAAS,SAAS,cAAc,KAAK,EAC3C,OAAO,UAAY,mBAAqB,WAAa,UAAY,IAEjE,IAAI,YAAc,SAAS,QAAQ,IAAI,GAAK,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,EAChE,SAAW,GACX,SAAS,eAAiB,SAAS,cAAc,OAAS,IAC5D,SAAW;AAAA;AAAA;AAAA,cAGL,SAAS,cAAc,IAAI,GAAK,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA,WAIjE,IAAI,SAAW,GACX,SAAS,UACX,SAAW;AAAA;AAAA,uBAEI,SAAS,OAAO,sFAAsF,SAAS,UAAY,kCAAkC;AAAA;AAAA,WAK9K,OAAO,UAAY;AAAA;AAAA,kBAEP,IAAI;AAAA,2CACqB,WAAa,SAAM,QAAG;AAAA;AAAA,+DAEF,WAAa,QAAU,MAAM;AAAA,YAChF,MAAQ,aAAa,KAAK,iCAAiC,IAAI,KAAO,EAAE;AAAA;AAAA,cAEtE,WAAW;AAAA;AAAA,YAEb,QAAQ;AAAA,YACR,QAAQ;AAAA;AAAA,QAId,OAAO,cAAc,yBAAyB,EAAE,iBAAiB,QAAS,IAAM,CAC9E,MAAM,QAAU,OAAO,cAAc,0BAA0B,EACzD,MAAQ,OAAO,cAAc,mBAAmB,EACpC,OAAO,UAAU,SAAS,QAAQ,GAGlD,OAAO,UAAU,OAAO,QAAQ,EAChC,QAAQ,MAAM,QAAU,OACxB,MAAM,YAAc,WAEpB,mBAAmB,iBAAiB,kBAAkB,EAAE,QAAQ,OAAS,CACvE,MAAM,UAAU,OAAO,QAAQ,EAC/B,MAAM,cAAc,0BAA0B,EAAE,MAAM,QAAU,OAChE,MAAM,cAAc,mBAAmB,EAAE,YAAc,QACzD,CAAC,EACD,OAAO,UAAU,IAAI,QAAQ,EAC7B,QAAQ,MAAM,QAAU,QACxB,MAAM,YAAc,SAExB,CAAC,EAED,mBAAmB,YAAY,MAAM,CACvC,CAAC,EAED,OAAO,UAAU,IAAI,QAAQ,CAC/B,CAEA,SAAS,4BAA6B,CACpC,IAAI,OAAS,SAAS,eAAe,gCAAgC,EACrE,GAAI,CAAC,OAAQ,CACX,OAAS,SAAS,cAAc,KAAK,EACrC,OAAO,GAAK,iCACZ,OAAO,UAAY,6BACnB,OAAO,UAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAYnB,SAAS,KAAK,YAAY,MAAM,EAEhC,MAAM,SAAW,OAAO,cAAc,sCAAsC,EACtE,QAAU,OAAO,cAAc,wCAAwC,EACvE,MAAQ,IAAM,CAClB,OAAO,UAAU,OAAO,QAAQ,CAClC,EACA,SAAS,iBAAiB,QAAS,KAAK,EACxC,QAAQ,iBAAiB,QAAS,KAAK,CACzC,CACF,CAEA,SAAS,4BAA6B,CACpC,2BAA2B,EAC3B,MAAM,OAAS,SAAS,eAAe,gCAAgC,EACvE,GAAI,CAAC,OAAQ,OAEb,MAAM,WAAa,iBAAiB,MAAM,UAAU,GAAG,MAAM,KAAK,GAAK,EAAE,MAAQ,aAAa,EACxF,OAAS,WAAa,WAAW,OAAS,CAAC,EAE3C,mBAAqB,OAAO,cAAc,uBAAuB,EACvE,mBAAmB,UAAY,GAE/B,OAAO,QAAQ,CAAC,IAAK,MAAQ,CAC3B,MAAM,KAAO,IAAI,MACX,MAAQ,IAAI,OAAS,GACrB,WAAa,MAAQ,EAE3B,IAAI,SAAW,CAAE,QAAS,CAAC,EAAG,KAAM,EAAG,EACvC,GAAI,IAAI,YACQ,IAAI,YAAY,MAAM;AAAA,CAAI,EAAE,IAAI,GAAK,EAAE,KAAK,CAAC,EAAE,OAAO,GAAK,EAAE,OAAS,CAAC,EAC/E,QAAQ,MAAQ,CAChB,KAAK,YAAY,EAAE,WAAW,OAAO,EACvC,SAAS,KAAO,KAAK,UAAU,CAAC,EAAE,KAAK,EAEvC,SAAS,QAAQ,KAAK,IAAI,CAE9B,CAAC,MACI,CACL,MAAM,YAAc,uBAAuB,IAAI,GAAK,CAAE,QAAS,CAAC,8BAA8B,CAAE,EAChG,SAAS,QAAU,YAAY,QAC/B,SAAS,KAAO,YAAY,MAAQ,EACtC,CAEA,MAAM,OAAS,SAAS,cAAc,KAAK,EAC3C,OAAO,UAAY,mBAAqB,WAAa,UAAY,IAEjE,IAAI,YAAc,SAAS,QAAQ,IAAI,GAAK,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,EAChE,SAAW,SAAS,KAAO,gCAAgC,SAAS,IAAI,SAAW,GAEvF,OAAO,UAAY;AAAA;AAAA,kBAEP,IAAI;AAAA,2CACqB,WAAa,SAAM,QAAG;AAAA;AAAA,+DAEF,WAAa,QAAU,MAAM;AAAA,YAChF,MAAQ,aAAa,KAAK,iCAAiC,IAAI,KAAO,EAAE;AAAA;AAAA,cAEtE,WAAW;AAAA;AAAA,YAEb,QAAQ;AAAA;AAAA,QAId,OAAO,cAAc,yBAAyB,EAAE,iBAAiB,QAAS,IAAM,CAC9E,MAAM,QAAU,OAAO,cAAc,0BAA0B,EACzD,MAAQ,OAAO,cAAc,mBAAmB,EACpC,OAAO,UAAU,SAAS,QAAQ,GAGlD,OAAO,UAAU,OAAO,QAAQ,EAChC,QAAQ,MAAM,QAAU,OACxB,MAAM,YAAc,WAEpB,mBAAmB,iBAAiB,kBAAkB,EAAE,QAAQ,OAAS,CACvE,MAAM,UAAU,OAAO,QAAQ,EAC/B,MAAM,cAAc,0BAA0B,EAAE,MAAM,QAAU,OAChE,MAAM,cAAc,mBAAmB,EAAE,YAAc,QACzD,CAAC,EAED,OAAO,UAAU,IAAI,QAAQ,EAC7B,QAAQ,MAAM,QAAU,QACxB,MAAM,YAAc,SAExB,CAAC,EAED,mBAAmB,YAAY,MAAM,CACvC,CAAC,EAED,OAAO,UAAU,IAAI,QAAQ,CAC/B,CAEA,MAAM,sBAAwB,CAC5B,OAAU,CACR,QAAS,CACP,+CACA,sDACA,gEACF,EACA,MAAO,CACL,sUACA,iQACA,2IACF,CACF,EACA,QAAW,CACT,QAAS,CACP,6EACA,8GACA,iEACF,EACA,MAAO,CACL,sDACF,CACF,CACF,EAEA,SAAS,6BAA8B,CACrC,IAAI,OAAS,SAAS,eAAe,iCAAiC,EACtE,GAAI,CAAC,OAAQ,CACX,OAAS,SAAS,cAAc,KAAK,EACrC,OAAO,GAAK,kCACZ,OAAO,UAAY,6BACnB,OAAO,UAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAYnB,SAAS,KAAK,YAAY,MAAM,EAEhC,MAAM,SAAW,OAAO,cAAc,uCAAuC,EACvE,QAAU,OAAO,cAAc,yCAAyC,EACxE,MAAQ,IAAM,CAClB,OAAO,UAAU,OAAO,QAAQ,CAClC,EACA,SAAS,iBAAiB,QAAS,KAAK,EACxC,QAAQ,iBAAiB,QAAS,KAAK,CACzC,CACF,CAEA,SAAS,gCAAgC,QAAS,CAChD,4BAA4B,EAC5B,MAAM,OAAS,SAAS,eAAe,iCAAiC,EACxE,GAAI,CAAC,OAAQ,OAEb,MAAM,gBAAkB,iBAAiB,MAAM,UAAU,EACzD,GAAI,CAAC,gBAAiB,OAEtB,MAAM,QAAU,gBAAgB,MAAM,KAAK,GAAK,EAAE,MAAQ,OAAO,EACjE,GAAI,CAAC,QAAS,OAGd,MAAM,QAAU,SAAS,eAAe,sCAAsC,EAC1E,UACF,QAAQ,aAAe,QAAQ,OAAS,SAAS,YAAY,GAG/D,MAAM,OAAS,QAAQ,QAAU,CAAC,EAC5B,mBAAqB,OAAO,cAAc,uBAAuB,EACvE,mBAAmB,UAAY,GAE/B,OAAO,QAAQ,CAAC,IAAK,MAAQ,CAC3B,MAAM,KAAO,IAAI,MACX,MAAQ,IAAI,OAAS,GACrB,WAAa,MAAQ,EAE3B,IAAI,SAAW,CAAE,QAAS,CAAC,EAAG,MAAO,CAAC,CAAE,EAGxC,GAAI,IAAI,YACQ,IAAI,YAAY,MAAM;AAAA,CAAI,EAAE,IAAI,GAAK,EAAE,KAAK,CAAC,EAAE,OAAO,GAAK,EAAE,OAAS,CAAC,EAC/E,QAAQ,MAAQ,CACpB,GAAI,KAAK,YAAY,EAAE,WAAW,OAAO,GAAK,KAAK,WAAW,GAAG,EAAG,CAClE,IAAI,UAAY,KACZ,KAAK,YAAY,EAAE,WAAW,OAAO,IACvC,UAAY,KAAK,UAAU,CAAC,EAAE,KAAK,GAErC,SAAS,MAAM,KAAK,SAAS,CAC/B,MACE,SAAS,QAAQ,KAAK,IAAI,CAE9B,CAAC,MACI,CAEL,IAAI,YAAc,KACd,UAAY,aAAe,UAAY,eACzC,YAAc,sBAAsB,IAAI,EAC/B,UAAY,SACrB,YAAc,OAAO,uBAA2B,IAAc,uBAAuB,IAAI,EAAI,KACpF,UAAY,gBACrB,YAAc,OAAO,uBAA2B,IAAc,uBAAuB,IAAI,EAAI,MAG3F,aACF,SAAS,QAAU,YAAY,SAAW,CAAC,EAC3C,SAAS,MAAQ,YAAY,QAAU,YAAY,KAAO,CAAC,YAAY,IAAI,EAAI,CAAC,IAEhF,SAAS,QAAU,CAAC,IAAI,aAAe,0BAA0B,CAErE,CAEA,MAAM,YAAc,SAAS,QAAQ,IAAI,GAAK,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,EAChE,UAAY,SAAS,MAAM,IAAI,GAAK,gCAAgC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAEtF,OAAS,SAAS,cAAc,KAAK,EAC3C,OAAO,UAAY,mBAAqB,WAAa,UAAY,IAEjE,OAAO,UAAY;AAAA;AAAA,kBAEP,IAAI;AAAA,2CACqB,WAAa,SAAM,QAAG;AAAA;AAAA,+DAEF,WAAa,QAAU,MAAM;AAAA,YAChF,MAAQ,aAAa,KAAK,iCAAiC,IAAI,KAAO,EAAE;AAAA;AAAA,cAEtE,WAAW;AAAA;AAAA,YAEb,SAAS;AAAA;AAAA,QAIf,OAAO,cAAc,yBAAyB,EAAE,iBAAiB,QAAS,IAAM,CAC9E,MAAM,QAAU,OAAO,cAAc,0BAA0B,EACzD,MAAQ,OAAO,cAAc,mBAAmB,EACpC,OAAO,UAAU,SAAS,QAAQ,GAGlD,OAAO,UAAU,OAAO,QAAQ,EAChC,QAAQ,MAAM,QAAU,OACxB,MAAM,YAAc,WAEpB,mBAAmB,iBAAiB,kBAAkB,EAAE,QAAQ,OAAS,CACvE,MAAM,UAAU,OAAO,QAAQ,EAC/B,MAAM,cAAc,0BAA0B,EAAE,MAAM,QAAU,OAChE,MAAM,cAAc,mBAAmB,EAAE,YAAc,QACzD,CAAC,EAED,OAAO,UAAU,IAAI,QAAQ,EAC7B,QAAQ,MAAM,QAAU,QACxB,MAAM,YAAc,SAExB,CAAC,EAED,mBAAmB,YAAY,MAAM,CACvC,CAAC,EAED,OAAO,UAAU,IAAI,QAAQ,CAC/B,CAEA,SAAS,2BAA4B,CACnC,MAAM,gBAAkB,iBAAiB,MAAM,UAAU,EACzD,GAAI,CAAC,gBAAiB,OACtB,MAAM,UAAY,gBAAgB,MAAM,KAAK,GAAK,EAAE,MAAQ,aAAe,EAAE,MAAQ,cAAc,EAC7F,QAAU,UAAY,UAAU,IAAM,YAC5C,OAAO,gCAAgC,OAAO,CAChD,CAEA,MAAM,iCAAmC,CACvC,cAAe,CACb,QAAS,CACP,qFACA,mFACA,gCACA,qCACA,2BACA,sBACF,EACA,KAAM,yCACR,EACA,WAAY,CACV,QAAS,CACP,sDACA,sEACA,gCACA,qCACA,2BACA,sBACF,EACA,KAAM,yCACR,EACA,uBAAwB,CACtB,QAAS,CACP,2CACA,sEACA,qEACA,gCACA,qCACA,2BACA,sBACF,EACA,KAAM,yCACR,EACA,uBAAwB,CACtB,QAAS,CACP,2CACA,wEACA,qEACA,gCACA,qCACA,2BACA,sBACF,EACA,KAAM,yCACR,EACA,aAAc,CACZ,QAAS,CACP,sDACA,mFACA,gCACA,qCACA,2BACA,sBACF,EACA,KAAM,yCACR,EACA,aAAc,CACZ,QAAS,CACP,sDACA,gEACA,yEACA,2EACA,6EACA,gCACA,qCACA,2BACA,sBACF,EACA,KAAM,6EACR,EACA,eAAgB,CACd,QAAS,CACP,2CACA,6EACA,qEACA,gCACA,qCACA,2BACA,sBACF,EACA,KAAM,yCACR,EACA,UAAW,CACT,QAAS,CACP,sDACA,sEACA,gCACA,qCACA,2BACA,sBACF,EACA,KAAM,yCACR,EACA,cAAe,CACb,QAAS,CACP,8CACA,wEACA,2DACA,sCACA,gCACA,qCACA,2BACA,sBACF,EACA,KAAM,yCACR,EACA,sBAAuB,CACrB,QAAS,CACP,2CACA,sEACA,qEACA,gCACA,qCACA,2BACA,sBACF,EACA,KAAM,yCACR,EACA,sBAAuB,CACrB,QAAS,CACP,2CACA,wEACA,qEACA,gCACA,qCACA,2BACA,sBACF,EACA,KAAM,yCACR,EACA,OAAU,CACR,QAAS,CACP,0FACA,0FACA,uFACA,4DACF,EACA,KAAM,yFACR,EACA,QAAW,CACT,QAAS,CACP,mGACA,6FACF,EACA,KAAM,yFACR,CACF,EAEA,SAAS,0BAA2B,CAClC,IAAI,OAAS,SAAS,eAAe,8BAA8B,EACnE,GAAI,CAAC,OAAQ,CACX,OAAS,SAAS,cAAc,KAAK,EACrC,OAAO,GAAK,+BACZ,OAAO,UAAY,6BACnB,OAAO,UAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAYnB,SAAS,KAAK,YAAY,MAAM,EAEhC,MAAM,SAAW,OAAO,cAAc,oCAAoC,EACpE,QAAU,OAAO,cAAc,sCAAsC,EACrE,M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",
  "names": ["fracs", "hasFractions", "payload", "val"]
}
