{"id":12288,"date":"2026-02-09T10:54:06","date_gmt":"2026-02-09T09:54:06","guid":{"rendered":"https:\/\/www.cieffeplast.com\/?page_id=12288"},"modified":"2026-09-25T15:22:08","modified_gmt":"2026-09-25T13:22:08","slug":"fascette-in-plastica-e-accessori-per-il-fissaggio-cobra-by-cieffeplast-prova-home","status":"publish","type":"page","link":"https:\/\/www.cieffeplast.com\/fr\/","title":{"rendered":"Fascette in plastica e accessori per il fissaggio Cobra by Cieffeplast PROVA HOME"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"12288\" class=\"elementor elementor-12288 elementor-12286\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-998164f qodef-elementor-content-grid elementor-section-content-middle elementor-section-full_width elementor-section-height-min-height elementor-section-height-default elementor-section-items-middle\" data-id=\"998164f\" data-element_type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t\t<div class=\"elementor-background-overlay\"><\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-67947ad\" data-id=\"67947ad\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ad96e3c elementor-widget elementor-widget-spacer\" data-id=\"ad96e3c\" data-element_type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e298c87 elementor-widget__width-initial elementor-widget-tablet__width-initial elementor-widget-mobile__width-initial elementor-widget elementor-widget-stal_core_section_title\" data-id=\"e298c87\" data-element_type=\"widget\" data-widget_type=\"stal_core_section_title.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"qodef-shortcode qodef-m Cieffeplast Srl produttore italiano di fascette stringicavo e articoli per fissaggio plastici. Marchio COBRA Cable Ties: qualit\u00e0 Made in Italy, produzione certificata, spedizione veloce in tutta Europa. qodef-section-title qodef-alignment--left  qodef-title-with-tagline\">\n\t\t<div class=\"qodef-m-title-wrap\">\n\t        <h6 class=\"qodef-m-title-tagline\" style=\"color: #FFFFFF\">Notre id\u00e9e fixe!<\/h6>\n    \t<h1 class=\"qodef-m-title\" style=\"color: #FFFFFF\">\n\t\t\t\t\t<a itemprop=\"url\" href=\"https:\/\/www.cieffeplast.com\/fr\/\" target=\"_self\">\n\t\t\t\t\tFabricant de colliers de c\u00e2blage <span style=\"color: #e30916;font-weight: 800\">Cobra\u00ae<\/span>\t\t\t\t\t<\/a>\n\t\t\t<\/h1>\n\t\n\t<\/div>\n\t<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-2e184ab elementor-section-full_width elementor-section-height-default elementor-section-height-default qodef-elementor-content-no\" data-id=\"2e184ab\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-inner-column elementor-element elementor-element-83e1674\" data-id=\"83e1674\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-2cc30df title-front-page elementor-widget-mobile__width-inherit elementor-widget elementor-widget-stal_core_section_title\" data-id=\"2cc30df\" data-element_type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;none&quot;}\" data-widget_type=\"stal_core_section_title.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"qodef-shortcode qodef-m  qodef-section-title qodef-alignment--left qodef-title-break--disabled qodef-title-with-tagline\">\n\t\t\t<p class=\"qodef-m-text\" style=\"font-size: 18px;color: #FFFFFF\">Fabricant de colliers de serrage en plastique et d&#039;accessoires de fixation pour professionnels. Made in Italy &amp; Livraison rapide dans toute l&#039;Europe.<\/p>\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-482a4e4 elementor-widget__width-auto btn-header-home elementor-widget-mobile__width-inherit elementor-widget elementor-widget-stal_core_button\" data-id=\"482a4e4\" data-element_type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;none&quot;,&quot;_animation_mobile&quot;:&quot;fadeInLeft&quot;}\" data-widget_type=\"stal_core_button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<a class=\"qodef-shortcode qodef-m  qodef-button qodef-layout--splitted qodef-size--large qodef-html--link\" href=\"https:\/\/www.cieffeplast.com\/fr\/contacts\/\" target=\"_self\"  style=\"font-size: 16px;font-weight: 700\">\n    <span class=\"qodef-m-text\">\n        Contact direct        <svg class=\"qodef-m-arrowline\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlns:xlink=\"http:\/\/www.w3.org\/1999\/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 63 20\" xml:space=\"preserve\">\n                            <line x1=\"61.6\" y1=\"10\" x2=\"61.6\" y2=\"10\"\/>\n                            <line x1=\"62\" y1=\"10\" x2=\"61.6\" y2=\"10\"\/>\n                            <line x1=\"61.6\" y1=\"10\" x2=\"1\" y2=\"10\"\/>\n                            <path d=\"M61.6,10\"\/>\n                            <line x1=\"61.6\" y1=\"10\" x2=\"61.6\" y2=\"10\"\/>\n                            <line class=\"arrow-up\" x1=\"56.7\" y1=\"5.1\" x2=\"61.6\" y2=\"10\"\/>\n                            <path d=\"M61.6,10\"\/>\n                            <line x1=\"61.6\" y1=\"10\" x2=\"61.6\" y2=\"10\"\/>\n                            <line class=\"arrow-down\" x1=\"61.6\" y1=\"10\" x2=\"56.7\" y2=\"14.9\"\/>\n                        <\/svg>    <\/span>\n    <span class=\"qodef-m-split qodef-split--up\"><\/span>\n    <span class=\"qodef-m-split qodef-split--down\"><\/span>\n<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-bfb45b3 elementor-hidden-mobile\" data-id=\"bfb45b3\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap\">\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<div class=\"elementor-element elementor-element-0a449f6 elementor-widget__width-inherit carosello-continuo elementor-widget elementor-widget-image-carousel\" data-id=\"0a449f6\" data-element_type=\"widget\" data-settings=\"{&quot;slides_to_show&quot;:&quot;9&quot;,&quot;navigation&quot;:&quot;none&quot;,&quot;speed&quot;:3000,&quot;slides_to_show_mobile&quot;:&quot;3&quot;,&quot;slides_to_show_tablet&quot;:&quot;4&quot;,&quot;autoplay_speed&quot;:0,&quot;autoplay&quot;:&quot;yes&quot;,&quot;infinite&quot;:&quot;yes&quot;}\" data-widget_type=\"image-carousel.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-image-carousel-wrapper swiper\" role=\"region\" aria-roledescription=\"carousel\" aria-label=\"Carosello d&#039;immagini\" dir=\"rtl\">\n\t\t\t<div class=\"elementor-image-carousel swiper-wrapper\" aria-live=\"off\">\n\t\t\t\t\t\t\t\t<div class=\"swiper-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"1 sur 9\"><figure class=\"swiper-slide-inner\"><img decoding=\"async\" class=\"swiper-slide-image\" src=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/elementor\/thumbs\/made-in-italy-icon-rkl73jx1oetx40z7yjmlc4ouj4atqhq832ibd3sxkw.webp\" alt=\"made-in-italy-icon\" \/><\/figure><\/div><div class=\"swiper-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"2 sur 9\"><figure class=\"swiper-slide-inner\"><img decoding=\"async\" class=\"swiper-slide-image\" src=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/elementor\/thumbs\/UL_Cieffeplast_Cobra_cableties-rj3d270ii1u7k0v40ctly6nkykl5w67mct2ioviyv4.webp\" alt=\"ul-certification-cieffeplast-cable-ties-cobra\" \/><\/figure><\/div><div class=\"swiper-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"3 sur 9\"><figure class=\"swiper-slide-inner\"><img decoding=\"async\" class=\"swiper-slide-image\" src=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/elementor\/thumbs\/CE-Certification-logo-removebg-preview-e1769700257583-rj3d262ob7sx8ewh5uezdow4d6psoh3w0of17lkd1c.webp\" alt=\"CE-Certification-logo-removebg-preview\" \/><\/figure><\/div><div class=\"swiper-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"4 sur 9\"><figure class=\"swiper-slide-inner\"><img decoding=\"async\" class=\"swiper-slide-image\" src=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/elementor\/thumbs\/reach-compliant-logo-with-green-tick-above-the-eng-1-rj3d270ii1u7k0v40ctly6nkykl5w67mct2ioviyv4.webp\" alt=\"cieffeplast-reach-compliant-logo-with-white-tick\" \/><\/figure><\/div><div class=\"swiper-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"5 sur 9\"><figure class=\"swiper-slide-inner\"><img decoding=\"async\" class=\"swiper-slide-image\" src=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/elementor\/thumbs\/rohs_compliant-white-1-rj3d270ii1u7k0v40ctly6nkykl5w67mct2ioviyv4.webp\" alt=\"rohs_compliant-white (1)\" \/><\/figure><\/div><div class=\"swiper-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"6 sur 9\"><figure class=\"swiper-slide-inner\"><img decoding=\"async\" class=\"swiper-slide-image\" src=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/elementor\/thumbs\/AF-CERT_MARKS_NEGATIVE_IQNET_Assoc_CMYK-rj3d270ii1u7k0v40ctly6nkykl5w67mct2ioviyv4.webp\" alt=\"AF CERT_MARKS_NEGATIVE_IQNET_Assoc_CMYK\" \/><\/figure><\/div><div class=\"swiper-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"7 sur 9\"><figure class=\"swiper-slide-inner\"><img decoding=\"async\" class=\"swiper-slide-image\" src=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/elementor\/thumbs\/9001_gm_en-rj3d270ii1u7k0v40ctly6nkykl5w67mct2ioviyv4.webp\" alt=\"Cieffeplat-iso-9001-certified-management-system\" \/><\/figure><\/div><div class=\"swiper-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"8 sur 9\"><figure class=\"swiper-slide-inner\"><img decoding=\"async\" class=\"swiper-slide-image\" src=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/elementor\/thumbs\/40-anni-rj3d270ii1u7k0v40ctly6nkykl5w67mct2ioviyv4.webp\" alt=\"Cieffeplast-anniversario-40-anni\" \/><\/figure><\/div><div class=\"swiper-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"9 sur 9\"><figure class=\"swiper-slide-inner\"><img decoding=\"async\" class=\"swiper-slide-image\" src=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/elementor\/thumbs\/images-rj3d270ii1u7k0v40ctly6nkykl5w67mct2ioviyv4.webp\" alt=\"cable-ties-halogen-free-certification\" \/><\/figure><\/div>\t\t\t<\/div>\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-5fb0b2d qodef-elementor-content-grid elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"5fb0b2d\" data-element_type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-25 elementor-inner-column elementor-element elementor-element-e355aea box-interattivo\" data-id=\"e355aea\" data-element_type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-184968c elementor-widget elementor-widget-image\" data-id=\"184968c\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/www.cieffeplast.com\/fr\/produit\/colliers-de-cablage-standard-nylon\/\">\n\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"300\" height=\"300\" src=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/fascette-standard-300x300.png\" class=\"elementor-animation-grow attachment-medium size-medium wp-image-9197\" alt=\"Colliers de c\u00e2blage naturels et noirs \u2013 Cobra\" srcset=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/fascette-standard-300x300.png 300w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/fascette-standard-150x150.png 150w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/fascette-standard-82x82.png 82w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/fascette-standard-100x100.png 100w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/fascette-standard.png 500w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9a07e79 up-title elementor-widget elementor-widget-stal_core_section_title\" data-id=\"9a07e79\" data-element_type=\"widget\" data-widget_type=\"stal_core_section_title.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"qodef-shortcode qodef-m  qodef-section-title qodef-alignment--left  qodef-title-with-tagline\">\n\t\t<div class=\"qodef-m-title-wrap\">\n\t        <h6 class=\"qodef-m-title-tagline\" >COLLIERS DE C\u00c2BLAGE<\/h6>\n    \t<h3 class=\"qodef-m-title\" style=\"color: #FFFFFF\">\n\t\t\t\t\t<a itemprop=\"url\" href=\"https:\/\/www.cieffeplast.com\/fr\/produit\/colliers-de-cablage-standard-nylon\/\" target=\"_self\">\n\t\t\t\t\tColliers de<br \/> c\u00e2blage standard nylon\t\t\t\t\t<\/a>\n\t\t\t<\/h3>\n\t\n\t<\/div>\n\t<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-25 elementor-inner-column elementor-element elementor-element-f6016db box-interattivo\" data-id=\"f6016db\" data-element_type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-808f6da elementor-widget elementor-widget-image\" data-id=\"808f6da\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/www.cieffeplast.com\/fr\/produit\/colliers-de-cablage-colores-nylon\/\">\n\t\t\t\t\t\t\t<img decoding=\"async\" width=\"300\" height=\"300\" src=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/fascette-colorate-standard-300x300.png\" class=\"elementor-animation-grow attachment-medium size-medium wp-image-9192\" alt=\"Colliers de c\u00e2blage color\u00e9s \u2013 Cobra\" srcset=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/fascette-colorate-standard-300x300.png 300w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/fascette-colorate-standard-150x150.png 150w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/fascette-colorate-standard-82x82.png 82w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/fascette-colorate-standard-100x100.png 100w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/fascette-colorate-standard.png 500w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8f753dc up-title elementor-widget elementor-widget-stal_core_section_title\" data-id=\"8f753dc\" data-element_type=\"widget\" data-widget_type=\"stal_core_section_title.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"qodef-shortcode qodef-m  qodef-section-title qodef-alignment--left  qodef-title-with-tagline\">\n\t\t<div class=\"qodef-m-title-wrap\">\n\t        <h6 class=\"qodef-m-title-tagline\" >Colliers de c\u00e2blage<\/h6>\n    \t<h3 class=\"qodef-m-title\" style=\"color: #FFFFFF\">\n\t\t\t\t\t<a itemprop=\"url\" href=\"https:\/\/www.cieffeplast.com\/fr\/produit\/colliers-de-cablage-colores-nylon\/\" target=\"_self\">\n\t\t\t\t\tColliers de<br \/> c\u00e2blage color\u00e9s nylon\t\t\t\t\t<\/a>\n\t\t\t<\/h3>\n\t\n\t<\/div>\n\t<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-25 elementor-inner-column elementor-element elementor-element-6cd8d60 box-interattivo\" data-id=\"6cd8d60\" data-element_type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-2e77ed5 elementor-widget elementor-widget-image\" data-id=\"2e77ed5\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/www.cieffeplast.com\/fr\/produit\/cheville-pour-colliers-de-cablage\/\">\n\t\t\t\t\t\t\t<img decoding=\"async\" width=\"300\" height=\"300\" src=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/tassello-fascette-300x300.png\" class=\"elementor-animation-grow attachment-medium size-medium wp-image-9202\" alt=\"Cheville pour colliers de c\u00e2blage 9771 \u2013 Cieffeplast\" srcset=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/tassello-fascette-300x300.png 300w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/tassello-fascette-150x150.png 150w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/tassello-fascette-82x82.png 82w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/tassello-fascette-100x100.png 100w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/tassello-fascette.png 500w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9a04bf1 up-title elementor-widget elementor-widget-stal_core_section_title\" data-id=\"9a04bf1\" data-element_type=\"widget\" data-widget_type=\"stal_core_section_title.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"qodef-shortcode qodef-m  qodef-section-title qodef-alignment--left  qodef-title-with-tagline\">\n\t\t<div class=\"qodef-m-title-wrap\">\n\t        <h6 class=\"qodef-m-title-tagline\" >ACCESSOIRES POUR FIXATION<\/h6>\n    \t<h3 class=\"qodef-m-title\" style=\"color: #FFFFFF\">\n\t\t\t\t\t<a itemprop=\"url\" href=\"https:\/\/www.cieffeplast.com\/fr\/produit\/cheville-pour-colliers-de-cablage\/\" target=\"_self\">\n\t\t\t\t\tCheville pour<br \/> colliers de c\u00e2blage\t\t\t\t\t<\/a>\n\t\t\t<\/h3>\n\t\n\t<\/div>\n\t<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-25 elementor-inner-column elementor-element elementor-element-9d3e9ff box-interattivo\" data-id=\"9d3e9ff\" data-element_type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-f600730 elementor-widget elementor-widget-image\" data-id=\"f600730\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/www.cieffeplast.com\/fr\/produit\/chevilles-tenax-sans-collerette-avec-vis\/\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"300\" src=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/tassello-tenax-con-bordo-e-vite-300x300.png\" class=\"elementor-animation-grow attachment-medium size-medium wp-image-9207\" alt=\"Cheville \u00e0 expansion Tenax TX avec vis, d\u00e9tail de la page d\u2019accueil \u2013 Cieffeplast\" srcset=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/tassello-tenax-con-bordo-e-vite-300x300.png 300w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/tassello-tenax-con-bordo-e-vite-150x150.png 150w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/tassello-tenax-con-bordo-e-vite-82x82.png 82w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/tassello-tenax-con-bordo-e-vite-100x100.png 100w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/tassello-tenax-con-bordo-e-vite.png 500w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7c19b0a up-title elementor-widget elementor-widget-stal_core_section_title\" data-id=\"7c19b0a\" data-element_type=\"widget\" data-widget_type=\"stal_core_section_title.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"qodef-shortcode qodef-m  qodef-section-title qodef-alignment--left  qodef-title-with-tagline\">\n\t\t<div class=\"qodef-m-title-wrap\">\n\t        <h6 class=\"qodef-m-title-tagline\" >CHEVILLES<\/h6>\n    \t<h3 class=\"qodef-m-title\" style=\"color: #FFFFFF\">\n\t\t\t\t\t<a itemprop=\"url\" href=\"https:\/\/www.cieffeplast.com\/fr\/produit\/chevilles-tenax-sans-collerette-avec-vis\/\" target=\"_self\">\n\t\t\t\t\tChevilles tenax<br \/> avec collerette et vis\t\t\t\t\t<\/a>\n\t\t\t<\/h3>\n\t\n\t<\/div>\n\t<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-02aa094 qodef-elementor-content-grid d-none elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"02aa094\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-25 elementor-top-column elementor-element elementor-element-616fa5e\" data-id=\"616fa5e\" data-element_type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-310ff4a elementor-widget elementor-widget-image\" data-id=\"310ff4a\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/www.cieffeplast.com\/product-category\/accessori\/\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"250\" height=\"250\" src=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/03\/ellisse-test.png\" class=\"attachment-full size-full wp-image-11626\" alt=\"ellisse-test\" srcset=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/03\/ellisse-test.png 250w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/03\/ellisse-test-100x100.png 100w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/03\/ellisse-test-150x150.png 150w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/03\/ellisse-test-82x82.png 82w\" sizes=\"(max-width: 250px) 100vw, 250px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8b7cd09 up-title elementor-widget elementor-widget-stal_core_section_title\" data-id=\"8b7cd09\" data-element_type=\"widget\" data-widget_type=\"stal_core_section_title.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"qodef-shortcode qodef-m  qodef-section-title qodef-alignment--left  qodef-title-with-tagline\">\n\t\t<div class=\"qodef-m-title-wrap\">\n\t        <h6 class=\"qodef-m-title-tagline\" >Fascette<\/h6>\n    \t<p class=\"qodef-m-title\" style=\"color: #FFFFFF\">\n\t\t\t\t\t<a itemprop=\"url\" href=\"https:\/\/www.cieffeplast.com\/product-category\/accessori\/\" target=\"_self\">\n\t\t\t\t\tFascette standard<br \/> in nylon\t\t\t\t\t<\/a>\n\t\t\t<\/p>\n\t\n\t<\/div>\n\t<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-25 elementor-top-column elementor-element elementor-element-6a0ce98\" data-id=\"6a0ce98\" data-element_type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a9d658b elementor-widget elementor-widget-image\" data-id=\"a9d658b\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/www.cieffeplast.com\/product-category\/accessori\/\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"250\" height=\"250\" src=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/03\/ellisse-test.png\" class=\"attachment-full size-full wp-image-11626\" alt=\"ellisse-test\" srcset=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/03\/ellisse-test.png 250w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/03\/ellisse-test-100x100.png 100w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/03\/ellisse-test-150x150.png 150w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/03\/ellisse-test-82x82.png 82w\" sizes=\"(max-width: 250px) 100vw, 250px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-33b1e7e up-title elementor-widget elementor-widget-stal_core_section_title\" data-id=\"33b1e7e\" data-element_type=\"widget\" data-widget_type=\"stal_core_section_title.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"qodef-shortcode qodef-m  qodef-section-title qodef-alignment--left  qodef-title-with-tagline\">\n\t\t<div class=\"qodef-m-title-wrap\">\n\t        <h6 class=\"qodef-m-title-tagline\" >Fascette<\/h6>\n    \t<p class=\"qodef-m-title\" >\n\t\t\t\t\t<a itemprop=\"url\" href=\"https:\/\/www.cieffeplast.com\/product-category\/accessori\/\" target=\"_self\">\n\t\t\t\t\tFascette colorate<br \/> in nylon\t\t\t\t\t<\/a>\n\t\t\t<\/p>\n\t\n\t<\/div>\n\t<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-25 elementor-top-column elementor-element elementor-element-8b67cc2\" data-id=\"8b67cc2\" data-element_type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-75e8259 elementor-widget elementor-widget-image\" data-id=\"75e8259\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/www.cieffeplast.com\/product-category\/accessori\/\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"250\" height=\"250\" src=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/03\/ellisse-test.png\" class=\"attachment-full size-full wp-image-11626\" alt=\"ellisse-test\" srcset=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/03\/ellisse-test.png 250w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/03\/ellisse-test-100x100.png 100w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/03\/ellisse-test-150x150.png 150w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/03\/ellisse-test-82x82.png 82w\" sizes=\"(max-width: 250px) 100vw, 250px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a06246b up-title elementor-widget elementor-widget-stal_core_section_title\" data-id=\"a06246b\" data-element_type=\"widget\" data-widget_type=\"stal_core_section_title.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"qodef-shortcode qodef-m  qodef-section-title qodef-alignment--left  qodef-title-with-tagline\">\n\t\t<div class=\"qodef-m-title-wrap\">\n\t        <h6 class=\"qodef-m-title-tagline\" >Fascette<\/h6>\n    \t<p class=\"qodef-m-title\" >\n\t\t\t\t\t<a itemprop=\"url\" href=\"https:\/\/www.cieffeplast.com\/product-category\/accessori\/\" target=\"_self\">\n\t\t\t\t\tFascette standard<br \/> in nylon\t\t\t\t\t<\/a>\n\t\t\t<\/p>\n\t\n\t<\/div>\n\t<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-25 elementor-top-column elementor-element elementor-element-2b4b71f\" data-id=\"2b4b71f\" data-element_type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-09a3830 elementor-widget elementor-widget-image\" data-id=\"09a3830\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/www.cieffeplast.com\/product-category\/accessori\/\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"250\" height=\"250\" src=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/03\/ellisse-test.png\" class=\"attachment-full size-full wp-image-11626\" alt=\"ellisse-test\" srcset=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/03\/ellisse-test.png 250w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/03\/ellisse-test-100x100.png 100w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/03\/ellisse-test-150x150.png 150w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/03\/ellisse-test-82x82.png 82w\" sizes=\"(max-width: 250px) 100vw, 250px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f23779a up-title elementor-widget elementor-widget-stal_core_section_title\" data-id=\"f23779a\" data-element_type=\"widget\" data-widget_type=\"stal_core_section_title.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"qodef-shortcode qodef-m  qodef-section-title qodef-alignment--left  qodef-title-with-tagline\">\n\t\t<div class=\"qodef-m-title-wrap\">\n\t        <h6 class=\"qodef-m-title-tagline\" >Fascette<\/h6>\n    \t<p class=\"qodef-m-title\" >\n\t\t\t\t\t<a itemprop=\"url\" href=\"https:\/\/www.cieffeplast.com\/product-category\/accessori\/\" target=\"_self\">\n\t\t\t\t\tFascette colorate<br \/> in nylon\t\t\t\t\t<\/a>\n\t\t\t<\/p>\n\t\n\t<\/div>\n\t<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-fc17691 elementor-section-boxed elementor-section-height-default elementor-section-height-default qodef-elementor-content-no\" data-id=\"fc17691\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-extended\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-26dd597\" data-id=\"26dd597\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-9f41d3e elementor-widget elementor-widget-html\" data-id=\"9f41d3e\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- INIZIO WIDGET ELEMENTOR: copiare fino a FINE WIDGET, script incluso. -->\r\n<style>\r\n.cfs{--cfs-top:151px;--cfs-bottom:0px;--cfs-red:#e30916;position:relative;background:#000;color:#f5f5f5;font:inherit;isolation:isolate}\r\n@media(max-width:600px){.cfs{--cfs-top:30px;--cfs-bottom:30px}}\r\n.cfs-host{overflow:visible!important}\r\n\/* Solo i contenitori Elementor che ospitano questo widget, su ogni dispositivo. *\/\r\n.elementor-section.cfs-host,.elementor-container.cfs-host,.elementor-column.cfs-host,.elementor-widget-wrap.cfs-host,.elementor-widget.cfs-host,.elementor-widget-container.cfs-host,.elementor-widget-image.cfs-host,.e-con.cfs-host,.e-con-inner.cfs-host{overflow:visible!important}\r\n.cfs *,.cfs *::before,.cfs *::after{box-sizing:border-box}\r\n.cfs button,.cfs h2,.cfs h3,.cfs p{font-family:inherit}\r\n.cfs h2,.cfs h3,.cfs p{margin:0;color:inherit}\r\n.cfs button{appearance:none;min-height:42px;margin:0;padding:9px 15px;border:1px solid #343434;border-radius:30px;background:#101010;color:#ddd;font:inherit;font-size:12px;font-weight:500;line-height:1.25;letter-spacing:0;text-transform:none;box-shadow:none;cursor:pointer;transition:background .18s,border-color .18s,color .18s}\r\n.cfs button:hover{background:#202020;color:#fff;border-color:#747474}\r\n.cfs button:focus-visible,.cfs canvas:focus-visible{outline:2px solid #fff;outline-offset:4px}\r\n.cfs button:disabled{opacity:.35;cursor:default}\r\n.cfs [hidden]{display:none!important}\r\n.cfs-stage{position:sticky;top:var(--cfs-top);left:0;width:100%;min-height:0;overflow:hidden;background:#000}\r\n.cfs{overflow:clip}\r\n.cfs:not(.is-ready) .cfs-stage{position:sticky}\r\n.cfs.is-offscreen .cfs-stage{visibility:hidden;will-change:auto}\r\n.cfs.is-reduced .cfs-stage,.cfs.is-failed .cfs-stage{transform:none!important;visibility:visible}\r\n.cfs-mount,.cfs-mount canvas,.cfs-lines{position:absolute;inset:0;width:100%;height:100%;display:block}\r\n.cfs-mount canvas{touch-action:pan-y;outline:none}\r\n.cfs[data-manual=\"true\"] canvas{cursor:grab}\r\n.cfs[data-manual=\"true\"] canvas:active{cursor:grabbing}\r\n.cfs-header{position:absolute;z-index:2;top:30px;left:4%;right:4%;pointer-events:none}\r\n.cfs-kicker{font-size:10px;letter-spacing:.2em;color:#aaa!important;margin-bottom:12px!important}\r\n.cfs-title{max-width:650px;font-size:clamp(26px,3.8vw,58px);font-weight:500;line-height:1.05;letter-spacing:-.045em}\r\n.cfs-header > button{position:absolute;right:0;top:0;pointer-events:auto;background:#000;border-color:#292929}\r\n.cfs-lines{z-index:2;pointer-events:none;overflow:hidden}\r\n.cfs-lines path{fill:none;stroke:#8d6669;stroke-width:1;vector-effect:non-scaling-stroke}\r\n.cfs-pin{position:absolute!important;z-index:3;width:44px;height:44px;padding:0!important;border:0!important;background:transparent!important;border-radius:50%!important;transform:translate(-50%,-50%);opacity:0;visibility:hidden}\r\n.cfs-pin::before{content:\"\";position:absolute;inset:10px;border:1px solid #fff;border-radius:50%;background:#0009}\r\n.cfs-pin::after{content:\"\";position:absolute;inset:19px;border-radius:50%;background:var(--cfs-red)}\r\n.cfs-pin.is-visible{opacity:1;visibility:visible}\r\n.cfs-card{position:absolute;z-index:4;right:4%;top:50%;width:min(370px,32%);padding:28px 30px;border:1px solid #444;border-left:4px solid #9e242b;border-radius:30px;background:linear-gradient(135deg,#29292b,#1d1d1f 75%);box-shadow:0 18px 50px #0008;transform:translateY(-45%);opacity:0;visibility:hidden;pointer-events:none;transition:opacity .22s}\r\n.cfs-card.is-open{opacity:1;visibility:visible;pointer-events:auto}\r\n.cfs-card .cfs-close{position:absolute;right:12px;top:10px;min-height:32px;width:32px;padding:0;border:0;background:transparent}\r\n.cfs-count{color:#999!important;font-size:10px;letter-spacing:.16em;margin-bottom:16px!important}\r\n.cfs-card h3{font-size:clamp(22px,2.3vw,34px);line-height:1.15;font-weight:650;margin-bottom:16px}\r\n.cfs-card h3::after{content:\"\";display:block;width:68px;height:2px;margin-top:12px;background:var(--cfs-red)}\r\n.cfs-copy{font-size:clamp(13px,1.12vw,16px);line-height:1.65;color:#c2c2c5!important}\r\n.cfs-bottom{position:absolute;z-index:5;bottom:22px;left:4%;right:4%}\r\n.cfs-progress{height:1px;background:#303030;margin-bottom:16px}\r\n.cfs-progress i{display:block;height:100%;background:var(--cfs-red);transform:scaleX(0);transform-origin:left}\r\n.cfs-row{display:flex;align-items:center;justify-content:space-between;gap:16px}\r\n.cfs-nav,.cfs-tools{display:flex;gap:7px;align-items:center}\r\n.cfs-nav button{background:transparent;border-color:transparent;padding-inline:10px}\r\n.cfs-nav button[aria-current=\"step\"]{border-color:#7b2027;color:#fff;background:#190508}\r\n.cfs-nav b{font-size:9px;font-weight:400;color:#a85a5f;margin-right:6px}\r\n.cfs-tools [data-action=\"mode\"]{border-color:#733036}\r\n.cfs-tools [data-action=\"zoom-in\"],.cfs-tools [data-action=\"zoom-out\"]{width:42px;padding:0;font-size:19px}\r\n.cfs-help{font-size:11px;line-height:1.4;color:#8d8d90!important;margin-top:10px!important}\r\n.cfs-status{position:absolute;z-index:6;left:5%;right:5%;top:45%;text-align:center;font-size:14px}\r\n.cfs-fallback{position:absolute!important;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0}\r\n.cfs[data-narrow=\"true\"] .cfs-header{top:22px;left:22px;right:22px}\r\n.cfs[data-narrow=\"true\"] .cfs-title{font-size:29px;max-width:72%}\r\n.cfs[data-narrow=\"true\"] .cfs-kicker{font-size:8px}\r\n.cfs[data-narrow=\"true\"] .cfs-header > button{font-size:10px;padding:8px;min-height:34px}\r\n.cfs[data-narrow=\"true\"] .cfs-count{margin-bottom:8px!important}\r\n.cfs[data-narrow=\"true\"] .cfs-card h3{font-size:23px;margin-bottom:10px}\r\n.cfs[data-narrow=\"true\"] .cfs-card h3::after{margin-top:8px}\r\n.cfs[data-narrow=\"true\"] .cfs-copy{font-size:13px;line-height:1.5}\r\n.cfs[data-narrow=\"true\"] .cfs-bottom{bottom:16px;left:18px;right:18px}\r\n.cfs[data-narrow=\"true\"] .cfs-progress{margin-bottom:9px}\r\n.cfs[data-narrow=\"true\"] .cfs-row{flex-wrap:wrap;gap:8px}\r\n.cfs[data-narrow=\"true\"] .cfs-nav{width:100%;justify-content:space-between;gap:2px}\r\n.cfs[data-narrow=\"true\"] .cfs-nav button{font-size:11px;padding:6px 10px;min-height:32px}\r\n\/* Con cinque tappe su schermo stretto resta il numero; il nome solo sulla tappa attiva. *\/\r\n.cfs[data-narrow=\"true\"] .cfs-nav span{display:none}\r\n.cfs[data-narrow=\"true\"] .cfs-nav b{margin-right:0}\r\n.cfs[data-narrow=\"true\"] .cfs-nav button[aria-current=\"step\"] span{display:inline}\r\n.cfs[data-narrow=\"true\"] .cfs-nav button[aria-current=\"step\"] b{margin-right:6px}\r\n.cfs[data-narrow=\"true\"] .cfs-tools{margin-left:auto}\r\n.cfs[data-narrow=\"true\"] .cfs-tools button{min-height:34px}\r\n.cfs[data-narrow=\"true\"] .cfs-help{font-size:10px}\r\n.cfs.is-reduced{height:auto}.cfs.is-reduced .cfs-stage{position:relative;top:0}\r\n.cfs.is-failed{height:auto}\r\n.cfs.is-failed .cfs-stage{position:relative;top:0;height:auto;min-height:600px;padding:160px 5% 40px}\r\n.cfs.is-failed .cfs-fallback{position:static!important;width:auto;height:auto;margin:0;overflow:visible;clip:auto;clip-path:none;white-space:normal;display:grid;gap:24px}\r\n.cfs.is-failed .cfs-fallback article{max-width:650px}\r\n.cfs.is-failed .cfs-fallback h3{margin-bottom:8px}\r\n.cfs.is-failed .cfs-fallback p{font-size:14px;line-height:1.6;color:#bbb}\r\n.cfs.is-failed .cfs-status{position:static;text-align:left;margin-bottom:30px}\r\n.cfs.is-failed .cfs-bottom,.cfs.is-failed .cfs-header > button{display:none}\r\n\r\n\/* Colori: radio nativi, navigabili da tastiera; nessun tooltip DOM animato. *\/\r\n.cfs .cfs-colors{display:block;pointer-events:auto;margin:18px 0 0;padding:8px 12px 10px;width:fit-content;max-width:min(560px,100%);border:1px solid #303033;border-radius:18px;background:#101012}\r\n.cfs .cfs-colors legend{float:none;width:auto;padding:0 6px;margin:0;font:inherit;font-size:10px;line-height:1.5;color:#939398;letter-spacing:.03em}\r\n.cfs .cfs-color-name{display:inline;margin-left:9px;color:#eee;font:inherit}\r\n.cfs-color-list{display:flex;flex-wrap:wrap;gap:3px}\r\n.cfs .cfs-color-list label{position:relative;display:grid;place-items:center;width:32px;height:32px;min-width:32px;margin:0;cursor:pointer}\r\n.cfs .cfs-color-list input{position:absolute;inset:0;width:100%;height:100%;margin:0;opacity:0;cursor:pointer;z-index:1}\r\n.cfs-swatch{display:block;width:22px;height:22px;border-radius:50%;border:1px solid #ffffff33;background:var(--swatch);box-shadow:inset 0 1px 2px #ffffff22;pointer-events:none}\r\n.cfs .cfs-color-list input:checked+.cfs-swatch{outline:1px solid #fff;outline-offset:3px}\r\n.cfs .cfs-color-list input:focus-visible+.cfs-swatch{outline:2px solid #fff;outline-offset:3px}\r\n.cfs .cfs-color-list input:disabled+.cfs-swatch{opacity:.45}\r\n.cfs[data-narrow=\"true\"] .cfs-colors{margin-top:12px;padding:4px 8px 8px;border-radius:14px;max-width:100%}\r\n.cfs[data-narrow=\"true\"] .cfs-color-list{gap:2px}\r\n.cfs[data-narrow=\"true\"] .cfs-color-list label{width:28px;min-width:28px;height:28px}\r\n.cfs[data-narrow=\"true\"] .cfs-swatch{width:18px;height:18px}\r\n.cfs.is-failed .cfs-colors{display:none}\r\n\r\n\/* Il titolo lascia spazio all'oggetto durante i dettagli; i colori restano disponibili. *\/\r\n.cfs-title{max-height:150px;overflow:hidden;transition:max-height .3s,opacity .3s}\r\n.cfs[data-focused=\"true\"] .cfs-title{max-height:0;opacity:0}\r\n.cfs[data-focused=\"true\"] .cfs-kicker{margin-bottom:0!important}\r\n.cfs[data-focused=\"true\"] .cfs-colors{margin-top:10px}\r\n.cfs-install-controls{margin-top:24px}\r\n.cfs-install-meter{display:flex;align-items:center;justify-content:space-between;gap:14px;font-size:11px;color:#a7a7ac}\r\n.cfs-install-value{font-variant-numeric:tabular-nums;color:#e2e2e4}\r\n.cfs input[data-install-progress]{display:block;width:100%;height:30px;margin:10px 0 14px;padding:0;accent-color:var(--cfs-red);cursor:pointer;background:transparent;touch-action:pan-y}\r\n.cfs input[data-install-progress]:focus-visible{outline:2px solid #fff;outline-offset:4px}\r\n.cfs-install-actions{display:flex;align-items:center;flex-wrap:wrap;gap:9px}\r\n.cfs [data-action=\"install-play\"]{background:#742023;border-color:#a43b40;color:#fff;min-width:105px}\r\n.cfs [data-action=\"install-play\"]:hover{background:#96272d}\r\n.cfs [data-action=\"sound\"]{display:inline-flex;align-items:center;gap:7px}\r\n.cfs [data-action=\"sound\"] svg{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}\r\n.cfs [data-action=\"sound\"] .cfs-sound-muted,.cfs [data-action=\"sound\"][aria-pressed=\"false\"] .cfs-sound-waves{display:none}\r\n.cfs [data-action=\"sound\"][aria-pressed=\"false\"] .cfs-sound-muted{display:block}\r\n.cfs [data-action=\"details\"]{border-color:transparent;background:transparent;text-decoration:underline;text-underline-offset:4px;padding-inline:6px;color:#b8b8bd}\r\n.cfs[data-narrow=\"true\"] .cfs-install-controls{margin-top:14px}\r\n\r\n.cfs[data-narrow=\"true\"] .cfs-install-actions button{min-height:38px}\r\n@media(max-height:620px){.cfs-header{top:16px}.cfs-title{font-size:26px}.cfs-card{padding:20px}.cfs[data-narrow=\"true\"] .cfs-card{padding:12px 20px}}\r\n@media(prefers-reduced-motion:reduce){.cfs *{transition:none!important;scroll-behavior:auto!important}}\r\n.cfs-intro{position:relative;padding-left:28px;padding-right:110px;max-height:310px;overflow:hidden;transition:max-height .3s,opacity .3s}\r\n.cfs .cfs-intro .cfs-kicker{position:absolute;left:0;top:5px;writing-mode:vertical-rl;transform:rotate(180deg);font-size:12px;letter-spacing:.02em;color:#e32c20!important}\r\n.cfs .cfs-title{max-width:1250px;max-height:none;font-weight:600;line-height:1.15;letter-spacing:0}\r\n.cfs-description{margin-top:16px!important;max-width:1400px;font-size:clamp(15px,1.55vw,23px);line-height:1.5;color:#ddd!important}\r\n.cfs[data-focused=\"true\"] .cfs-intro{max-height:0;opacity:0}\r\n.cfs .cfs-products{display:flex;align-items:center;justify-content:center;gap:22px;width:100%;min-height:64px;padding:18px 24px;margin:0 0 18px;border-radius:12px;background:#e32c20;color:#fff;text-decoration:none;font:inherit;font-size:18px;font-weight:700;line-height:1.3;pointer-events:auto}\r\n.cfs .cfs-products:hover{background:#c7251b;color:#fff}\r\n.cfs .cfs-products:focus-visible{outline:2px solid #fff;outline-offset:4px}\r\n.cfs-products svg{width:70px;height:20px;flex-shrink:0;fill:none;stroke:currentColor;stroke-width:1.4}\r\n.cfs[data-narrow=\"true\"] .cfs-intro{padding-left:22px;padding-right:0;max-height:330px}\r\n.cfs[data-narrow=\"true\"] .cfs-title{max-width:100%;font-size:26px;padding-right:65px}\r\n.cfs[data-narrow=\"true\"][data-focused=\"true\"] .cfs-intro{max-height:0}\r\n.cfs[data-narrow=\"true\"] .cfs-products{min-height:48px;padding:12px 18px;font-size:16px}\r\n\r\n.cfs[data-compact=\"true\"] .cfs-copy{font-size:13px!important;line-height:1.4!important;letter-spacing:0!important}\r\n.cfs[data-compact=\"true\"] .cfs-card h3{font-size:17px!important;line-height:1.2!important;margin-bottom:6px!important;padding-right:24px}\r\n.cfs[data-compact=\"true\"] .cfs-count{font-size:10px!important;line-height:1.3!important;letter-spacing:.06em!important;margin-bottom:5px!important}\r\n.cfs[data-compact=\"true\"] .cfs-card button{min-height:44px}\r\n.cfs[data-compact=\"true\"] .cfs-card .cfs-close{width:44px;top:2px;right:2px}\r\n.cfs[data-compact=\"true\"] .cfs-install-actions{gap:6px}\r\n.cfs[data-compact=\"true\"] .cfs-products{margin-bottom:10px}\r\n.cfs[data-compact=\"true\"] .cfs-card h3::after{margin-top:5px;width:44px}\r\n.cfs[data-compact=\"true\"] .cfs-help{display:none}\r\n.cfs[data-compact=\"true\"] .cfs-install-controls{margin-top:8px}\r\n.cfs[data-compact=\"true\"] .cfs-products{font-size:14px;min-height:44px;padding:10px 14px}\r\n.cfs[data-compact=\"true\"][data-landscape=\"true\"] .cfs-card{padding:14px}\r\n.cfs[data-compact=\"true\"][data-landscape=\"true\"] .cfs-header{top:10px}\r\n.cfs[data-compact=\"true\"][data-landscape=\"true\"][data-focused=\"true\"] .cfs-colors{max-width:54%;margin-top:0}\r\n.cfs[data-compact=\"true\"][data-landscape=\"true\"] .cfs-help{display:none}\r\n.cfs[data-compact=\"true\"][data-landscape=\"true\"] .cfs-bottom{bottom:8px}\r\n@media(min-width:1025px){\r\n .cfs{width:var(--cfs-viewport-width,100vw);max-width:none;margin-left:calc(50% - var(--cfs-viewport-width,100vw)\/2);margin-right:calc(50% - var(--cfs-viewport-width,100vw)\/2)}\r\n .cfs .cfs-header,.cfs .cfs-bottom{left:50%;right:auto;width:min(1300px,calc(100% - 60px));transform:translateX(-50%)}\r\n .cfs .cfs-card{right:max(30px,calc((100% - 1300px)\/2))}\r\n}\r\n\r\n\/* ===== PATCH LAYOUT v1: sticky Elementor, altezze proporzionali, zero scroll interno ===== *\/\r\nbody,html{overflow-x:clip}.cfs-host,.e-con-inner.cfs-host,.e-con.cfs-host,.elementor-column.cfs-host,.elementor-container.cfs-host,.elementor-section.cfs-host,.elementor-widget-container.cfs-host,.elementor-widget-image.cfs-host,.elementor-widget-wrap.cfs-host,.elementor-widget.cfs-host{overflow:visible!important;transform:none!important;perspective:none!important;filter:none!important;backdrop-filter:none!important;contain:none!important;container-type:normal!important;will-change:auto!important}.cfs{--cfs-scroll:5.8;--cfs-stage:calc(100svh - var(--cfs-top) - var(--cfs-bottom));--cfs-h:var(--cfs-stage);--cfs-gap:clamp(12px, 2.2svh, 26px);height:calc(var(--cfs-stage) * (1 + var(--cfs-scroll)));--cfs-grid:1300px;--cfs-pad-x:30px;--cfs-pad-t:60px;--cfs-pad-b:50px}@media (max-width:600px){.cfs{--cfs-scroll:5.2}}@media (max-width:600px){.cfs{--cfs-scroll:4.8}}.cfs-stage{position:sticky;top:var(--cfs-top);height:var(--cfs-stage);overflow:hidden;transform:none!important;filter:none!important;perspective:none!important;will-change:auto}.cfs .cfs-stage .cfs-card,.cfs[data-compact=true] .cfs-stage .cfs-card,.cfs[data-narrow=true] .cfs-stage .cfs-card{overflow:hidden!important;overscroll-behavior:none}.cfs *,.cfs ::after,.cfs ::before{scrollbar-width:none}.cfs ::-webkit-scrollbar{width:0;height:0;display:none}.cfs .cfs-stage .cfs-card{--cfs-base:clamp(12px, calc(var(--cfs-h) * .0185), 16.5px);font-size:calc(var(--cfs-base) * var(--cfs-fit, 1));border-radius:1.9em}.cfs .cfs-stage .cfs-count{font-size:.7em!important;line-height:1.4!important;margin-bottom:1em!important}.cfs .cfs-stage .cfs-copy{font-size:1em!important;line-height:1.6!important}.cfs .cfs-stage .cfs-card .cfs-close{width:2.4em;min-height:2.4em;top:.4em;right:.5em}.cfs .cfs-stage .cfs-install-controls{margin-top:1.3em!important}.cfs .cfs-stage .cfs-install-meter{font-size:.74em;gap:1em}.cfs .cfs-stage input[data-install-progress]{height:1.9em;margin:.55em 0 .8em}.cfs .cfs-stage .cfs-install-actions{gap:.55em}.cfs .cfs-stage .cfs-card button{font-size:.8em;min-height:2.7em;padding:.6em 1.1em}.cfs .cfs-stage [data-action=install-play]{min-width:8em}.cfs .cfs-stage .cfs-products{font-size:1.05em!important;min-height:2.9em!important;padding:.7em 1.1em!important;margin-bottom:.85em!important;gap:1.2em}.cfs .cfs-stage .cfs-products svg{width:4em;height:1.15em}@media (min-width:601px){.cfs .cfs-stage .cfs-card{top:calc(var(--cfs-head-h,150px) + var(--cfs-gap));bottom:calc(var(--cfs-foot-h,110px) + var(--cfs-gap));height:fit-content;max-height:calc(var(--cfs-h) - var(--cfs-head-h,150px) - var(--cfs-foot-h,110px) - var(--cfs-gap) * 2);margin:auto 0;transform:none;width:min(370px,32%)}.cfs .cfs-stage .cfs-intro{padding-left:32px}}.cfs[data-compact=true] .cfs-stage .cfs-card{top:auto!important;bottom:calc(var(--cfs-foot-h,96px) + var(--cfs-gap))!important;left:var(--cfs-gap)!important;right:var(--cfs-gap)!important;width:auto!important;height:fit-content!important;max-height:min(calc(var(--cfs-h) - var(--cfs-head-h,90px) - var(--cfs-foot-h,96px) - var(--cfs-gap) * 2),calc(var(--cfs-h) * .44))!important;margin:0!important;transform:none!important}.cfs[data-compact=true] .cfs-stage .cfs-mount{top:calc(var(--cfs-head-h,90px) + var(--cfs-gap) * .5)!important;bottom:calc(var(--cfs-foot-h,96px) + var(--cfs-gap) * .5)!important;height:auto!important}.cfs[data-compact=true] .cfs-stage:has(.cfs-card.is-open) .cfs-mount,.cfs[data-compact=true][data-focused=true] .cfs-stage .cfs-mount{bottom:calc(var(--cfs-foot-h,96px) + var(--cfs-card-h,0px) + var(--cfs-gap) * 1.5)!important}.cfs[data-narrow=true] .cfs-stage .cfs-card{max-height:min(calc(var(--cfs-h) - var(--cfs-head-h,90px) - var(--cfs-foot-h,96px) - var(--cfs-gap) * 2),calc(var(--cfs-h) * .4))!important}.cfs[data-narrow=true] .cfs-stage .cfs-intro{max-height:calc(var(--cfs-h) * .34)}.cfs[data-narrow=true] .cfs-stage .cfs-colors{--sw:clamp(20px, calc(var(--cfs-h) * .034), 28px)}.cfs[data-compact=true][data-landscape=true] .cfs-stage .cfs-card{top:calc(var(--cfs-gap) * .4)!important;bottom:calc(var(--cfs-foot-h,80px) + var(--cfs-gap) * .4)!important;right:var(--cfs-gap)!important;height:fit-content!important;max-height:calc(var(--cfs-h) - var(--cfs-foot-h,80px) - var(--cfs-gap) * .8)!important;margin:auto 0!important;left:56%!important}.cfs[data-compact=true][data-landscape=true] .cfs-stage:has(.cfs-card.is-open) .cfs-mount,.cfs[data-compact=true][data-landscape=true][data-focused=true] .cfs-stage .cfs-mount{bottom:calc(var(--cfs-foot-h,80px) + var(--cfs-gap) * .5)!important;width:54%!important}.cfs[data-landscape=true] .cfs-stage .cfs-header{right:46%!important}.cfs[data-landscape=true] .cfs-stage .cfs-colors{--sw:18px;padding:3px 7px 6px}.cfs[data-landscape=true] .cfs-stage .cfs-products{display:none!important}.cfs[data-landscape=true] .cfs-stage .cfs-install-meter{display:none}.cfs[data-landscape=true] .cfs-stage .cfs-card{padding:.95em 1.1em}.cfs[data-landscape=true] .cfs-stage input[data-install-progress]{height:1.5em;margin:.35em 0 .5em}.cfs[data-landscape=true] .cfs-stage .cfs-copy{line-height:1.45!important}.cfs .cfs-stage .cfs-card.is-clamped .cfs-copy{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:var(--cfs-lines,3);line-clamp:var(--cfs-lines,3);overflow:hidden}.cfs .cfs-stage .cfs-intro{max-height:calc(var(--cfs-h) * .42);overflow:hidden}.cfs .cfs-stage .cfs-title{font-size:clamp(22px, min(3.6vw, calc(var(--cfs-h) * .076)), 56px);max-height:none}.cfs .cfs-stage .cfs-description{font-size:clamp(13px, min(1.5vw, calc(var(--cfs-h) * .028)), 22px)}.cfs .cfs-stage .cfs-color-list label{width:var(--sw);min-width:var(--sw);height:var(--sw)}.cfs .cfs-stage .cfs-swatch{width:calc(var(--sw) * .7);height:calc(var(--sw) * .7)}.cfs .cfs-stage .cfs-bottom{bottom:clamp(10px,2.2svh,22px);bottom:var(--cfs-pad-b)}.cfs .cfs-stage .cfs-help{font-size:clamp(9px, calc(var(--cfs-h) * .016), 12px);margin-top:.7em!important}.cfs .cfs-stage .cfs-lines path,.cfs .cfs-stage .cfs-pin{transition:none}@media (prefers-reduced-motion:reduce){.cfs,.cfs *{scroll-behavior:auto!important}}.cfs .cfs-stage .cfs-intro .cfs-kicker{font-size:13px!important;letter-spacing:.02em!important;line-height:1.2!important}.cfs[data-compact=true] .cfs-stage .cfs-intro{padding-left:0!important;padding-right:0!important}.cfs[data-compact=true] .cfs-stage .cfs-intro .cfs-kicker{position:static!important;writing-mode:horizontal-tb!important;transform:none!important;display:block;margin:0 0 10px!important}.cfs .cfs-stage .cfs-title{font-size:45px!important;line-height:1.1!important;margin:0!important;letter-spacing:-.01em}.cfs .cfs-stage .cfs-description{font-size:20px!important;line-height:1.45!important;margin:18px 0 0!important;max-width:62ch}.cfs[data-compact=true] .cfs-stage .cfs-title{font-size:30px!important}.cfs .cfs-stage .cfs-card h3{line-height:1.15!important;font-size:1.6em!important;font-weight:600!important;text-transform:none!important;letter-spacing:-.01em!important;margin-bottom:.55em!important;padding-right:1.6em}.cfs .cfs-stage .cfs-card h3::after{width:3.4em;margin-top:.45em}.cfs .cfs-stage .cfs-card{padding:1.45em 1.6em}.cfs[data-compact=true] .cfs-stage .cfs-card{--cfs-base:clamp(11px, calc(var(--cfs-h) * .0125), 13.5px);border-radius:1.15em;max-height:min(calc(var(--cfs-h) - var(--cfs-head-h,90px) - var(--cfs-foot-h,96px) - var(--cfs-gap) * 2),calc(var(--cfs-h) * .34))!important}.cfs[data-narrow=true] .cfs-stage .cfs-card{max-height:min(calc(var(--cfs-h) - var(--cfs-head-h,90px) - var(--cfs-foot-h,96px) - var(--cfs-gap) * 2),calc(var(--cfs-h) * .32))!important}.cfs[data-compact=true] .cfs-stage .cfs-install-controls{margin-top:.9em!important}.cfs .cfs-stage .cfs-colors legend{display:inline-flex;align-items:center;gap:9px}.cfs .cfs-stage [data-action=colors]{flex:none;width:21px;min-width:21px;min-height:21px;padding:0;border:1px solid #3a3a3d;border-radius:50%;background:#161618;color:#c9c9cd;font-size:13px;line-height:1;display:grid;place-items:center}.cfs .cfs-stage [data-action=colors]:hover{background:#242427;color:#fff}.cfs[data-colors=off] .cfs-stage .cfs-color-list{display:none}.cfs[data-colors=off] .cfs-stage .cfs-colors{padding:5px 11px 7px;margin-top:12px}.cfs[data-compact=true]{--cfs-pad-x:20px;--cfs-pad-t:30px;--cfs-pad-b:30px}@media (min-width:601px){.cfs .cfs-stage .cfs-bottom,.cfs .cfs-stage .cfs-header{left:50%;right:auto;width:min(var(--cfs-grid),calc(100% - var(--cfs-pad-x) * 2));transform:translateX(-50%)}.cfs .cfs-stage .cfs-card{right:max(var(--cfs-pad-x),calc((100% - var(--cfs-grid))\/ 2))}}.cfs .cfs-stage .cfs-header{top:var(--cfs-pad-t)}.cfs[data-compact=true] .cfs-stage .cfs-bottom,.cfs[data-compact=true] .cfs-stage .cfs-header{left:var(--cfs-pad-x);right:var(--cfs-pad-x)}.cfs .cfs-stage .cfs-intro .cfs-kicker{margin:0 0 14px!important}.cfs .cfs-stage .cfs-colors{--sw:clamp(22px, calc(var(--cfs-h) * .042), 32px);margin:28px 0 0}.cfs[data-compact=true] .cfs-stage .cfs-description{font-size:18px!important;margin:12px 0 0!important;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:4;line-clamp:4;overflow:hidden}.cfs[data-colors=off][data-compact=true] .cfs-stage .cfs-colors,.cfs[data-compact=true] .cfs-stage .cfs-colors{margin:18px 0 0}.cfs[data-narrow=true] .cfs-stage .cfs-description{-webkit-line-clamp:3;line-clamp:3;-webkit-line-clamp:2;line-clamp:2}.cfs[data-compact=true] .cfs-stage .cfs-intro,.cfs[data-narrow=true] .cfs-stage .cfs-intro{max-height:calc(var(--cfs-h) * .58)}.cfs[data-focused=true] .cfs-stage .cfs-intro{max-height:0}.cfs[data-compact=true] .cfs-stage .cfs-card{left:var(--cfs-pad-x)!important;right:var(--cfs-pad-x)!important;--cfs-base:clamp(13px, calc(var(--cfs-h) * .0155), 15px);padding:1.05em 1.15em;max-height:min(calc(var(--cfs-h) - var(--cfs-head-h,90px) - var(--cfs-foot-h,96px) - var(--cfs-gap) * 2),calc(var(--cfs-h) * .32))!important}.cfs[data-narrow=true] .cfs-stage .cfs-card{max-height:min(calc(var(--cfs-h) - var(--cfs-head-h,90px) - var(--cfs-foot-h,96px) - var(--cfs-gap) * 2),calc(var(--cfs-h) * .3))!important}.cfs[data-compact=true] .cfs-stage .cfs-card h3{font-size:1.45em!important}.cfs[data-compact=true] .cfs-stage .cfs-copy{line-height:1.5!important}.cfs[data-compact=true] .cfs-stage .cfs-count{font-size:.72em!important;margin-bottom:.6em!important}.cfs[data-compact=true] .cfs-stage .cfs-card button,.cfs[data-compact=true] .cfs-stage .cfs-header>button,.cfs[data-compact=true] .cfs-stage .cfs-nav button,.cfs[data-compact=true] .cfs-stage .cfs-tools button,.cfs[data-compact=true] .cfs-stage [data-action=colors]{position:relative}.cfs[data-compact=true] .cfs-stage .cfs-card button::after,.cfs[data-compact=true] .cfs-stage .cfs-header>button::after,.cfs[data-compact=true] .cfs-stage .cfs-nav button::after,.cfs[data-compact=true] .cfs-stage .cfs-tools button::after,.cfs[data-compact=true] .cfs-stage [data-action=colors]::after{content:\"\";position:absolute;left:50%;top:50%;width:100%;height:44px;min-width:44px;transform:translate(-50%,-50%)}.cfs[data-compact=true] .cfs-stage .cfs-tools button{min-height:44px}.cfs[data-compact=true] .cfs-stage .cfs-tools [data-action=zoom-in],.cfs[data-compact=true] .cfs-stage .cfs-tools [data-action=zoom-out]{width:44px}.cfs[data-compact=true] .cfs-stage .cfs-card button{min-height:44px}.cfs[data-compact=true] .cfs-stage .cfs-products{min-height:48px!important}.cfs[data-compact=true] .cfs-stage .cfs-colors{--sw:40px}.cfs[data-compact=true] .cfs-stage .cfs-swatch{width:22px;height:22px}.cfs[data-compact=true] .cfs-stage .cfs-color-list{gap:0}.cfs[data-compact=true] .cfs-stage input[data-install-progress]{margin:.2em 0 .35em;height:36px}.cfs[data-compact=true] .cfs-stage .cfs-card button,.cfs[data-compact=true] .cfs-stage .cfs-header>button{position:static}.cfs[data-compact=true] .cfs-stage .cfs-card button::after,.cfs[data-compact=true] .cfs-stage .cfs-header>button::after{content:none}.cfs[data-compact=true] .cfs-stage .cfs-install-actions button{position:relative;min-height:44px}.cfs[data-compact=true] .cfs-stage .cfs-install-actions button::after{content:\"\";position:absolute;left:50%;top:50%;width:100%;height:44px;min-width:44px;transform:translate(-50%,-50%)}.cfs .cfs-stage .cfs-card .cfs-close{position:absolute!important}.cfs[data-compact=true] .cfs-stage .cfs-card .cfs-close{width:44px;min-height:44px;top:2px;right:2px}.cfs .cfs-stage .cfs-header>button{position:absolute!important;right:0;top:0}.cfs[data-compact=true] .cfs-stage .cfs-header>button{min-height:44px;padding-inline:16px}.cfs[data-compact=true][data-installation=true] .cfs-stage .cfs-card{max-height:min(calc(var(--cfs-h) - var(--cfs-head-h,90px) - var(--cfs-foot-h,96px) - var(--cfs-gap) * 2),calc(var(--cfs-h) * .38))!important}.cfs[data-narrow=true][data-installation=true] .cfs-stage .cfs-card{max-height:min(calc(var(--cfs-h) - var(--cfs-head-h,90px) - var(--cfs-foot-h,96px) - var(--cfs-gap) * 2),calc(var(--cfs-h) * .36))!important}.cfs[data-compact=true][data-focused=true] .cfs-stage .cfs-header{top:14px}.cfs[data-compact=true][data-focused=true] .cfs-stage .cfs-bottom{bottom:16px}.cfs[data-compact=true] .cfs-stage .cfs-nav button{min-height:44px}\r\n.cfs input[value=\"gold\"] + .cfs-swatch{background:linear-gradient(120deg,#796738 0%,#d6c78e 28%,#baa466 48%,#e4d7a5 62%,#887342 100%)!important}\r\n<\/style>\r\n\r\n<section id=\"cobra-scroll3d\" class=\"cfs\" data-language=\"\" data-color=\"gold\" data-glass=\"0.72\">\r\n  <div class=\"cfs-stage\">\r\n    <div class=\"cfs-mount\"><\/div>\r\n    <div class=\"cfs-climate\" aria-hidden=\"true\"><\/div>\r\n    <div class=\"cfs-signature\" hidden>\r\n      <span class=\"cfs-logo-src\" role=\"img\" aria-label=\"COBRA\u00ae Cable Ties \u2014 Made in Italy\" data-width=\"600\" data-height=\"258\" data-logo=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlgAAAECCAYAAAAim6nQAAB680lEQVR42u2dd3gkV5X233NvVXVLEz1RcUbdSjPO2cYG29g4R8BkFkxcMgsssEuGD1hgl2CTF2PMEk20ScbGOOCcsz0zkrqlGaXJSVJ3V917z\/dH1TDjsTSj0FJXt+7vefQYRqGrbnzvOeeeA1gsFovFYrFYLBaLxWKxWCwWi8VisVgsFovFYrFYLBaLxWKxWCwWi8VisVgsFovFYrFYLBaLxWKxWCwWi8VisVgsFovFYrFYLBaLxWKxWCwWi8VisVgsFovFYrFYLBaLxWKxWCwWi8VisVgsFovFYrFYLBaLxWKxWCwWi8VisVgsFovFYrFYLBaLxWKxWCwWi8VisVgsFovFYrFUHGSbIL5k69sAwNvTT6SCamiuGmfPGnbdnRBCpXrXBrY1LRaLxWKxAqtiyTS0g4wh0tqB0kkyZj6AOQDmkTY1DBxC4HowAEAAaCbmagDMQB2Yl4yn0xgIiCjDRIMgrAeoD4RNLMQWALtAGIKQu4wjC+y6Jr1hje0ci8VisViswCofsnWtkoJgAWm9BIZXkDEpMFaDzSoyvALAXDDPiYSWA4azTw9RJLYm3lv8z99hAAqAD2AERLtA2MkkOiDoESZ6ElJk2HEG2XWGwKxT\/Z224ywWi8VisQKr9HTXNIOJQMZINjxPaF1HWh8ObY4n5mPAvBLAYjDPBeDGpP0VgCEQbQZRJ4ieYUGPsCOfYCn7WIhdEMIQETf1d9hOtlgsFovFCqyZIbu82SWl5pExdTDmcDJ8Eow5htikwFgCIAFAlsnrGAAFELYyiW4I8SgLuh9SPsxSbjCeM5Lu62Db6xaLxWKxWIFVdDJ1bSSCYAEpdRgpdTEMn0DMbWBeGgmqSsIHUS8LcQ+kuIWlvN94bk9qsCtnR4LFYrFYLFZgTYlsbQtI6yQp3URKvxhaX0RsjobBclDZWKimAgPIRWLrXjjyj+zI+1jIjey5KtW71g4Si8VisViswDo4mcY2kNIO+WoJKX08GX0xaXMWmBtQeZaqiYqtEQixhqX4M0t5A7vOGnbkiA2Qt1gsFosVWJbRhVVDOygIqoQfHElanw2tzyfDhwOYZ9vteejIqvU3uPLH2ks8lNrYlbfNYrFYLBYrsCyhsKpvgwiCagrUCRSoN5PWLwGwFOGtP8uBMQAGWcq\/sutcy577kE64ueb11nVosVgsFiuwZqewamgH+f4c4QfHk9KvJ2MuBvMy20aTggFsZEf+jB3nZ8bznklt7CrYZrFYLBaLFVizhGxjOxCoKlHwT6BAvYG0vgCMGpBtmyLILA1B3Szl7zjhXq0Tbme6r9PYhrFYLBaLFVgVSqahDcIP5lEQHEtKv5mUPhehK1DYYVF0FIjWsOtcYxz3lybpDtpcWhaLxWKxAqvCyNa2SlEoHEVB8C7S+lIYXgwia7GafnwW4h\/sOlex591qEt6wrYFosVgsFiuwypxMXStEoJYI338VAvUeYm4FZkX+qjjBALawI3\/Hnvtt43nPQEid6rOB8BaLxWKxAqu8hFWYciEp\/OAFFAQfIG3OAlBtu7+kaBB1sOP8L7vOL03SG0xZt6HFYrFYrMAqE3FV30YiX2gSfvA20voKGFML6w2MEz6kuNM47v\/oZOK29GCnvW1osVgsFiuwYiusGtohfH8eFYKLhFLvhTHHAfBsl8cSBmGAHefHxnW\/y57bmxrotNYsi8VisViBFSeytS1CFPw2CoIPkNKvBLDQdnVZ4LMQd7Pr\/Bd73l0m4eTSG9bZVrFYLBaLFVglF1c1aU\/k\/fMoCD5B2hwLIhvEXl4wgEF2nGtNwvuOqUr22puGFovFYrECq0Rk6lohC34NBcHbKVDvAFADm0i1nPFZiDvZc77CrnuH8bxCutfeNLRYLBZLeVAR1p1sfauQ+cKR5AdfpkC\/FYSFVlyV\/9gk5hQp\/RJiZhA9+o3hHco2i8VisVjKgbLPWt5d25IQI\/lLqFC4lrR+KcgGslcQBKCWAv0GaLPINofFYrFYygWnXB+8a8UqyJH8IWJo5D2k9HsAXgprtapQWNi+tVgsFosVWNNMZsVqyFxuCRX8T1MQvBVESduVFovFYrFYrMCagrgSI7nFVCh8ipR+ixVXFovFYrFYrMCaAtnGdhLDI7VU8D9GWr8FgBVXFovFYrFYrMCaLJmGNoiRfAvl\/a+Q1hfYYHaLxWKxWCxWYE2BbMMqUG4kLQr+V6HNBSDY5KEWi8VisVhiS+zTNGTrW0nkcm0iH3wDypxvxZXFYrFYLJa4E2sLVldDO0Qu3ywKhSthzNlWXFksFovFYrECawpkG1dBjIw0U8H\/GrQ+G7A1BS2W2QwzE4BDALQBWA1gBYACgAcBrAeQBaCIqFifJzC2lV8TERfhM4CwosbBHpoBaAAoxvtFbSmn690m8F6jvmex+nCS7z9eDBGZcbTDWONoQu86hWc20bNOth8FgPkADgVwcjQOHwOwDUAXgPzB2sEKrBiRqW8jGsm1UN7\/KhlzgRVXFsusFVUA4AJIAzgVwLkAjgSwCMCcaLHfAmAAwN8B3MrMDxBRrgife0H0mfujANzAzA8VQQh4AF4PoPUgP7cLQDeAzcy8FUAGwK4pCKEmAG8EkNjv3wsA\/i\/6+1NhDoArADRM8PfWAvg5AH+ah1Y9gKncRGcAfwRw70F+TgJ4OYBjRvnes9G7jrcE2EoA\/wKgeoLP+jiA3wIIJiFCawGcD+A8AIcjrPHLkbjaCWANgPuY+ZbogJOfbnFsBdZUxNWKVRDDueWiUPgK2YB2i2U2iysCkALwOgCvjkTWaBvi\/Oh7L4g2oFcCeGiKHz8PwHsiQTfa5loD4CkA+Sl+jhttwBeMwwrhR5+3G6HV7lvM\/A8i0pP43AYA7wewcL9\/3wHgtiIIrOqoL06a4O\/9EcBvZkBg1QB4L4DFk\/x9BaB3HAJLALgoaov9uR7AdRMQWPUA3gdgyQSf9WfRZwUTmHsugNMB\/Gc0r6r2+5FDov8eC+DySPzfCuB\/ATxqV6+YCiyRyy8Wvv9JUlZcWSyzVFjtWZvOAPD\/ABwXCZGDLh\/Rwp8swucfG32NBgE4C0ArMz9ZhBO7Gee7JaOvhZFAOhLA25n59klYskwkFEcTj8Vw9\/AYf388vzcjw6wIf8NM8ef0DLTphPuTmT0A7wTwEYQWrIMNcA+h234ugGvtCvbcSRsbssvS80Te\/48wQ7vNc2WxzFISCN1m1yCM+XBn+PM9AJcidEOORWMkskq1hhKAlmgTXGyHjKWIh5sTAfwHgDqMP4bOILQ+Pm5bMYYCq3tZao7MF95PSr0Nz48LmIUjHQxm88+v0LzrH+ArAGCe8zvMBjxjJ0KLpRgLvATwUgBfikRMKTaYlQDOwYEDih2Erp+F0\/g4uxDGlg0dwNpxIoD2slvdxv6aSYE6kc8f7WepAts0GR1ulh1ASO0EsAlhvN6ev58FcDWm7jKvKGLhIszWtjhiJPdaCoKPIIx9mF1SKhRHAYAREG0FYTOT2ACiTPTvYEF9xBg+wKSWADeCn3PaF2BuBPMiYq4BcAiY5wFYEIlYx04BS8xOz8cB+AyA5QeYLzkAwwC2AhhBGINVj+KUzhIILVMt4\/jZ4wAcD+DmaWqS6wF8IxJxpyF02+zfLlWRpaFc0AD+AKBjjO+vxQSDsSfJRgDfxnNjixYCeFW0Pu7LCIBfIrxMsa\/QiIu1Jh+NlfVjfP8xjN8dWYPwYsdoxpdOhBcg7gawPZoj5wK4EGEs2RM2wD1mAitb3ybESO50CtTHZ4e4YgDkg2g7CN0sxBMAPcWC+kA0ACH72ZM7GTRMDL9pY9ekP6m7pnlPH7tgrqZAzQfzIWRMMwyvhuFDCaYZhlcAWADmBOwEsZSO+QgDj9vG+P4IgL9Em0lHdIrORb\/3IgBvALCqCM9wGcZnRZ8P4FJmvo2IpkMUDAF4moh8Zr4z+rwP7HfIcg9gbYirwPo5Ef2mlA9BRBsiIb+vwG+LBMOCUfrhG0T0ZEzbNA\/gaiL6exH+Vg2ApaP8uwLwTQDf3udSxaPM\/MdIMK8hIh+W+AissL5g7lBRCL4I5hUV3M4GhCGQWMeCHgLRgyzl0yxoPRxnO0tZSPV3FN083jTYtWdiqGgj2gogm61teQREkoIgScYshDaNZLgNxhxJzMeBuQ3MSzHzsS+WWUpkvToDwCUY3Uo7DOCrAK4EsH2\/oO6NzNyJ0JL0xilaQI4BcMIo\/57752FlLwLhTaumA1hkiiUIFDNnRl1bwrYpFwjxrSBCGNtDIGLepsU6GdciTLEx2vvXRONf7zMu85HIssRNYIlcYTn5wafA5njEy59dlD0DwDCIuliKO1jKm9lxHoagbew4AQOc7u8oyYOlBjr3nCSHAQxn69r6wHw\/aS1hzDzSOkXavBhan0nMx0Riy7oTLdO9Fp2L0a3YBsANkbjaNpobgoiYmXsBfG2ya0kU\/3Upnh9XxQhTB6xG6BLcl2YAL2bmrulKthiJz4UAThnl3XYDWFdBIhsldjPN9pjVXRg9RYZAmDdsFzNfD2ADgBEi4mIk3LUCq8hk6lpdMTT8r6TNpSiDmogTQIGoi4W4i6X4GzvOA+w5GyCkSvXFcx1M9a\/bs7AohL717dn6tkdJqR+QHxxBSl9IRl8Aw6tgLyBYpocVCGM\/Rttd+xC6J7YdaPONvjeVBKONAF48ynqUA\/B7AJsRpm7Y9\/tJhIkYfxltTsVkJUKLnkSY6PHSUcTA4wizaZcLAsCFzNwwSl8bhIliH7exPBPCA3A5Mx816n4E3EhE4918NiN0iY52g3YZgM8CeDOABwD8jZnvBbCeiGxwe1wEVraulUQufxrCG4OVko4hYKJOOPLn7MhfG8ddD0fmp8P1NyOiq28dA9iVrWu5mzQ\/ABX8QCh9Nin9BhhzNEY3I1ssk2URwhij0SwKdwN4bDo33Sip6RkYPbi9A2Fiz50I47z2T\/R4KoAjmPnuIj\/jOdEzUSTkxH5i5F6EiSA3lVE\/S4SJY187yvd8AP8G4AlYS9JEqALw1jHaLIcwIep4BVYPgLsQBvvLMcRcazRPXhb97QeZ+WcIKykUrDguocDKNK4CjeTqyA8+Soz6CmhDH0Rr2ZHXGdf9DbtOF1xXpTasqYgBkurvBMKYlmz38uarofUfKAjOF0q\/EcacgImXbbBYRuNohDEeowmsZzH917\/nI7QQVY\/y+Xdgb0D9YwBest\/PLIl+9z5MPHnkgXAxdhzkMMLM2UPRplcoM5E1GtpOg6K3qYOJucx3AvgvhElsDz\/Az1Ek7PaIrTMRuue\/j+JbcsuWGXfNCd9PCD94GxlzOso77opB1MGu8ymTTFyu5875ctPWnrWpwa6KEVf707SxyzRt6R7Uc6qvNVXJ17HnfpCFeBTFyfxsmd14Y2wSjIO4Bqc8kcPYn8MRxjjtz+7oZO4jrL92M54fRE+R6Fo+g+01F8CHELouP8rM8+0QskyVaJ49A+BTCFNmjGdtp+hw9EkA\/xrFMlpmWmBlGttBBf+FpNTbUd6uwV0s5c9N0nuNqa76qq6uWpfq71CzZdCk+zt45ZbuPj2n6gec8F7DjvO\/0eZjzfqWybIWz80ztO8a1Ry58KYLF6EFarQabx2I3JNRMO8tCHMo7U8rgFOL\/JwBooso0Zfab1OrRpjS4iMA\/p2ZrTXZUgwMwtQLL42E1j8QxmYdbI+bB+AdAI6wTRgyoy5CkSssoUB9EIyaMrVdKQjxMDvON03Cu8EkvaH0+jWzdvCk+jsNgLXdNc0fFPnCrRSof4cxxwG2hqRlwvQjdC3UjXI6PhmhdWhwmj67HmGx5f0PnBrAPQAKzLynHM1GhPFYDfv97ByEMSl\/QfHSJtyIMDu2jubUMQBegzBzO+332e9AGCB+e8xjYAxC12YWz\/dgqEho24PaxIX4YwgvKO2PjwnG6EXjRwN4lpm\/gDAh66EI3YBnIHTnL8LoHqi6aJw+ZrtlBgVWtrZZ0nD+ZWTM6aCylFc72XF+ZDz3OyaZ6Er3rbNusYimwa5cpq71tyLvPykC\/\/2k9KsxvSVELJXHeoSxVqMlCj0CwCXM\/MN9khyOykSv+kcWp9MApEfbawCcHX3+nj\/ICG\/3YQwh2M7MjxRJ5GwA8Nc9SUyZ+cZI8H0PYXqIfVmC8AbknYh3LJOOROPvDvB9y8QYAfAFhLGCozFpwR+N4x0A7mHm+6OxdzyA90dzY\/\/DtAtgBTPLg81VK7CKJa7q2yBy+Tah1btQbrfPGAxBncZ1vsSe+yuTSA6le9fYKb0f6f4Ok21oXWN8+jD5wR3CVx+D4cNAFZWCwzJ9DCOMb7oIzw\/sngPg3wGsYea7xso3xcwCYSzV7shCMh7mIHQPjlZmR0SCb7zZ4esRpmx4Agd3p4xrf9vXShAlG70b4e3B9H4WBELopnTKQKTwNGW+n9Xzh4h2FKVzwnk0D8DufedaJJi2MPNNCC9XnIjnp3MQCDPBCyuWZyoGS+sEBcE7YLjcfLMBS3GLSXhX6Plzr23a3G3F1QFI9XagaVP3kJ479zqTTLyJpRgtINhiGeuk\/NdInIxGC4CrALycmeczs2BmRF8eM9civFp+JZ7vvhtrI0EkyE5EcS7cuAjzVi2ZxqaqQljKZbTnXVSENX0mii5bF2C8aQDwLQCvi+ba\/nOVo3E22lhT0eFG2WacAQtWtr6NxEjuVNL6lSivhKI72XF+bBLu14zrrk9vWGsXhXGS7l3LmbrWRwTRO4UffJSUeh1mXxFvy8RZj7C48TfxfBczATgKYTzIgwgLz2YQXpY5AmFc0iqEMT7jnasuwtirmiK+w2qEMSg3FkmwLWJmhdAVUwfg1QhdgaMxWASrgQPgaGYeLaEwIUz6umaK2bsPZeazxvjeVgBPWvfShJAAjuL9ldBzx8Wz46k0wMwOgH8B8AqE1uRzAPyEmdchvMiUR2j1fS1Gz1tXiOax3S9nQmBRwV9CfvBv4Bm9wjxVtrPrfk4nvR9wwhtOb1hrR8pERVZ\/B2ca27sh5EdEobCOlPowmGtQeSWRLMVaK4hMVIbjcIQJJ0fb5JdGoshg7xVyuc+42jEuE0q4F9UAuHiUdZABdGP024L7bmpteH5h4HkIs2rfUgQ32MWRqORIbO0pxDtabiwG8GQRLAfzAHxpDKFGAH4E4INTEHIugI9Gf2O0v\/9XhJnCh+yMGDdzAHzuAH3\/awDvwUFyyUVz4kiEyXQT0ddrI6G1CWES0s0ILaUvHMNg0gXgfptsdAYEVramWYpc\/uVkzJlls7ESDbDrfMkkEz9Ibczk7BCZgsgKhenu7uXN3xaFQg\/5wWfAfLgVWZYDiKwhZv4qwiDul+PAxXenahE\/FaHFaX92I8zpc\/NB1s7PIqzPtv9znBE9\/1TjCWowfutaB8IUElO9fEM4cJxsMQrAV0Vfo2FLcU2uz8ZK0cEYf0qkJIAr8NxqBgKhNXlhdKA4EAphyahe2yV7G2\/6et0PahCoN6NcAtuJeoznvt8kEt9vsuKqaDRt7PJ1InGDSSbeBCFugvXPWw7MZoT5d27G6IVni0EVgMvH2NCfBHALEW0+wNcAgD8jvMG1P\/UIC0CLGWyvLwN42loOLFPgSACXTVIX7Em\/8bPpKnpuBdY+ZBraibS+hEYvQBk3GEQdxnM\/YJLJ3zdtyhTs0CguqY1d2iS8R3Qy8Q6W8newwe+WMc85BITWn7ciDGzfgCJWC9jHFTJa5nYfews7H4z7ADw9yr8nEN5MXDwBC8RkGEZ4Nf\/9AH5KRBM5uEz2M2kGPqOkw28G34VK+D6j0RHNt2cmeLApILSefhjWevUcps1FSAV\/KSn9LyiHjO1E643nfsRUJf+UGui01pXpElkDndy1YnUPAR9BwR8hrV8D6xKwjC6yGEAvM38SwPUIg7vPBJDC6O6lIBJF9+HgCUkFwsSJPaNsCFsA\/GGcp\/CtCONbxBif0TgOoWYQBus\/OEFrQTdCC9+NADZOwmowAuBxTNy7sAHjC2DWCJOGTvQQn0HpSm8ZhLFG++d22oGpXR7YhfBywP7sxsSCwRXCuEB\/Ep8\/njm3nZm\/gdAy+xKEea6OBrBslHW6EI2hXgA\/B\/ATAP1TvPxQeevYdPzRTF2LcIZyb6YguBLxLwa8hT3vA7oq8cvUYJcVVzNAtqENlPcXi0Lh46T0OzB2PMYentHVVec2be2xp6NZSGRxSiCMRzoK4TXypQAO2WfT7wfwVCSadh9ooY+Si87F6LmvNIAd47xxhWh9G0uk7CKiwkH+BiG8jTWRgyhHm1t+su4YZnYxdrqHA5GP2vdgf19Ef3+ih3g\/ajcuwThLIEwi64wyJnqIKD+Jv0kAajF64uXdAHrH+65RKaRGTLxSxs6JiJ9oXItoXDcgvKHbCGBF9O8bonk2GAnHAZvXbAYFVveSlUtFrvALMuasmL\/\/TuO6nzJVye+nNnZZt+AM0720aaEo+B+kQL0bz09YZwWW5WCbwL6nb9soFsv0zjlCmCTWNsY4KbqLMFvXSmJ45Awy5viYv\/sIO8732HOvseKqNDRt7t6RrUl\/SY7kd1KgPonnX3kvGdmGNpAxoEARMwtiuAzMB\/OcPWcTYjOfjJmDA5n5GcSCcizlVgJ2MdEICAog5oTLqd51diBM5mRoF3mLZabnnHX\/lVpgCb+wmLR+S5w2y1HQLOVvTNL7sq5K2HwrJSQ1mBnpXpb6niDKUaA+AuaVM\/0M3TXNYCGItPYoUPMBXoihkcVgriVjWghogOFGwdwEYO5eOcVzcHD3JggoICxjsQ1C9DBhA4ANKPidPQsbNkKIzSzEDnadAoRQZDQ3DXTZwWGxWCzlLEqL+ccyje1wdg9dToXgWsQ5NQPRsyaZeMXKbeuftkMgHmRrWxyRy18ofP8bYDTt9+2iuwiz9W0EY5LkB8tJ6zYypg3MR5Lhw8C8HMwLEMbpJMDRPCnWbGEGwtiZHIh2M2ETSHSCkAWJNSwoy1Jk4Lob2XFyqV5bRcBisVjKjaJasETBX0DKvAnxznu1jcPCzbaoYIxIDXSqbG3zn4jZoSD4Ghgriirg6lpASrswvIi0Oox2D50AY46OBFUjwmBlb\/qPIQBC91YYRMo8hxg1gD4SAAO6QKHwGuCC\/wyEuLdnYcM9LGUXBO1g1w1S\/R1l06\/dNWmAmcCV59JjITg12Bnvg0tdC8gwYCqnA6JAIG7aaK280eEUpA3FrZNYCE4NdM7qvimawMqsWA3aPXQ8tD4hxu+r2HF+Zjzvd8ZxbK2r2ImsLt29LHUDESB89UUwt05F3mQa2kFKuSJQSzCSP4K0OQvGnE7GtCEsCSIRr1w9hPBmWxLMh5Dm1dDmMiJsZxKdEHQfAnVTz9KVj2jP3Zru64x\/Qr9AzxFBcCEMz68kMxwRAYIGeg5p2A7QZgjaxlLmWYo8HEenYlNei0C+X49AnQeuDJFFRIqE6F2\/sP6f458BgMQWgH0QFUC0EwCzdPLGlfl0X0flWoEZLhUKZ0ObesSkBiAR+cZz\/4ow7YUVWFNFFApJUuoyHPg2WKlPnI8Zz72yaXPWxl3FlKZNWZWtbbkeVNgmfP8qaHM4aGKpdDL1bSQK\/nIaGj6CtHkxGXM6jFkNxkJQWSU\/JAAOGEuJzVIYnAytryAlHoav\/tizeOVNxnUzqcHO2F6RFlrPp0B\/HMyHVmBceo6APIh2gGiQifpBtI4FPduzsGEdu04vS7EtNZgpbf8o3UyB+ioBcyqkSFXoXt9HTFC4q+9GmCsqB6LNAAxTsEEQnuxZ2LAOQnSyI\/uJaNfKjZmKyTZOgaqjQH2ODB8Vm\/5l+CTovdnGVdekNsxeZ1FRBFamcRVoaLiFtDkPE8\/RMVPshuN8hZOJjJUx8SY10Kmz9a13AHi3KPhXIazwfkCyjasAP3CFChppaPgCUvp1MKYdYY4huXcVLu+1FIxDoM1LhDYvQqDeRb5\/2\/qFDTcY13mQXXdbqj92J3WORK1TgUN1HoB5YF4K5tZoeGkKkzDuhB8MsBBPrZ9f\/yALegSO7DCuu42F0Om+mbk9murvwPr5dSCCrLA+eL47n3nhPv97z5RnAIqUzoOwDaAeluKBngUNt8ERT7OUg+w6fqpMLVzZ+lYSu0deRMyrQDHqX4IkrS+hQuE3GGeiUyuwxmpL35ek9XmluAE2viWeDTvyj8Z1bkr1rbMBw+Ugsvo6TLa+9S4Q3kO+eu+B5FG2pjkhhoZXkTaXQqtXkeEWlEMFgamRAHM7BaoNSr9WKHUn++pHPUua7jSeuyXV32HrgZUGiTCerxrMtaTUMSB6HQE7EYinyA\/+YBznpuzy5g6bHmaGtvqwQLULxjyAV1KgXkSk34mAulmKu9iXN3QvTd1rHGdneqC8hBb5wRwYfRHil9CbSJsTKFCHZhva70v1rp2Vg684AkubRaTNS1GcSuvFR1AfO853TNLbbdebshNZ95CjtkOI55yCMitWgXzlCt8\/hoZzryatLwHzitiOwelbxgjAfNLmAtL+qazUwzIIftG9NPUn9pxNqUqOPSmf\/pEAFsGY08iYF0il\/5UDdX3PohU\/M577NEuh0n0dtq1mtk\/mgPkwUvpQ0vrlCNS95MhfdS9L3ciO3Jrqj39wdqahHTQ80kKGT0E87fPLSOtzYPRDCF23s46iFHsWSh0OY1bH9B0DdpyfcCLxULrXWq\/KUWSx4zzNQuzc82\/Z2mYph0aa5fDI50W+8FtS6n1gbp514ur5J\/WFZMxZ5AdXypHcb8XQyBXdS5sOydS12qyc8cEFcysp9QGRL1wvh0e+KHOF1dmaZmmbpkTzhrEExlws\/OC7cjh3nRjJX969NLUgW98W7wcPlIg8R\/UxfUSHtDmPCsHS2Tq4piywMvWtAtqcCcb8mJ5WHmfP\/UGTNceXr8jq70CqvwOZxnZ0L00tEiP5K0Sh8CtS6kNgbkB84\/5KxRwYc6rwg2+JXP6HMpd\/cXZ5c9I2S7w2HzA3UaA+JAqF62Su8PruZal5tllKylxoc5Yo+D8Uufz3xHDulGxtOrZxa8RmIWlzYbEMJdOCMYeR0sdk61pn6SSfqkLzgyVkzOmgWG5yPrvOD9l119u1o3wJ87zoJA2NnERB8F7S5hyEAcaWA1NN2lxGxj+elP5Fz5KV\/2tcN2tcxzSvt2ngYnIAFDB8BPn+14XWp3YvXvkVTnqZVJ+NoStNfwAA5pPWryRjTiA23+temrqGPWdbKkZu3ExDO2ho+DgYc1jMW3QeGX0RKfU3ADNymzaqmSgRFoOvj76WRd8eQFgYfiOAbQDUdJYAmpLAyoadfCKMOSKWXSvoWZbyRuNIu1iVKV0N7US5XL3w1ftJqdeBsRwU4xNbHLcM5kZS6gNkzEsQ6P8mz\/1TprF9KL1hrW2d+HAIaf0mkS8cxsZ8IluT\/kdqMGNz9ZVw9wBzM\/nB54Q2x7N2v5CtbX46NdAVi72ElPJI6wuAmHqO9j1CaHMWKd0EYFoValQAfi6AkwG8EsCRAFZEh\/E94SM+gN2R0HoCwO+Y+R8Adk+H0JraRqW1Q9qcEtNOVizkDew4\/XYjKU+yNc2uMzxymsj7V5NS7wdQa8XVpHFhzLHC978j8vnPi1w+la1vs7FZ8cIhY14gCv7\/irx\/Yaau1bq+S08Vaf0KyheuFbnCZd01LbGI8xR+kCZtzkU5hEcwr4DSZ2Tqpy8WNLJaHQngSgA\/B\/BWAEdFgup+AL+M\/v3+6N8OBfAmAD8B8B0AJzBz0dtyShYsCtRcsDkWcfQBE\/Wx6\/yxaVMmsGtEmQmrhnZQoXCIyOXfQIH6NxheWWYJQuNtKVH6ncIUTmClv9S9PP0347l5ewiJz8oF5hbhB18DgO6a5r80DXYp2yyl1TPEfCz5wZXM8LK1Lb9JDXSWrE8ytS2EkZEXgTlVJu2XFFpfwIG6DtOQE4uZXQAXAfhkJLJGAPwJwC8APAWgF2FiWgCoAlAL4HAALwdwNoDXADgewBeZ+ToiKlq89qSFUXdDK8joOjJmVQw71LAQNxnPe9KuDWUmrmpapBjJHSXyhSvJD74A5iYrroqOR8acIgr+1SKX\/3eRKyzJNLTbVonXqb9Z+MHXqFA4LVvTYsd\/PPqkgXz\/KyKXf3l3TXPJ8uyJIJhHylwCRvlcXDF8Ivnq8ExjW5G7hCWASwF8C8ARAB4H8A4AbwTwSyJ6koi2E1E++tpORM8A+DVCK9fbATwJoBXAVwG8PhJsRWHSFiyjAUebNvA\/g8didAak7ew4v0oNdtqbg+UlrlyRz18m\/ODTYF4NWHfgNLOMAvWfwvBqMH8m09jeYS1Z8RJZ5KtPkQg6AdiLOvGgUfj+VwyA7prm3zQNds14nBxpvYrYnFhex05eRlq\/hHz1AIqUEyuKuToWwGcA1AD4C4CPAugEcCKA5dHP7GEYYW3EAEAPQmva7wB0ReLqDAAfB5Bl5tuKEZM16Q1MaCVgzHEAV8VQYD3BjnzErgVlIqxqW9C9pGmxHMm9X\/j+N8F8mBVXM0Y1af0qmS9cLYdGTumuaXZsk8RoKTPmFOH7H8wuS82xrREXrYAVwg8+R4XCyV2Nq2ZU5mTqWomUuRgG5ZZbyoEx55PSizONRXN6LQTwYYTxVBkAnwXwDMKA9g8A+DGAHwG4Jvr6GULX4V8QxmRdjDCG7bHo76wB0ITQ1VhXjAcUUxhkc8jwCTFMIGtYiL+xFLvsSlAmm4gfrBD5wjcoCD4HxnLbIjOOhDEvEgX\/WpHLvza7PJ2wTRIbXFL69aLgX5itb7WHjvjsMq3kqy\/LkVxbZsXM5dgWQbCMjDm3HMMmyJgjhFInkJ660S8Kan81gAsBaAD\/C+BR2ltR3kVYPugehIHvVyEMZr8R4S3CswF8F8CLIkvVowitWHkApwB4QzGC3ic9YUnrGjDHMXvYNpbiTnYde8U55nSHlqs6UfC\/REq9GmEAoqVE6x+YW8kPviLy\/muytS3WkhUfFpPS76O8X5dtXGVbIx6zhUibk0TB\/5gYyR2SnYEYxkzjKlCgT4yK2JcfjDkw5mIUJ8ZpPoCXRSLqKQC\/jYTWc2QwgJsRuhA\/HX29OxJmDyDMj\/UyZiYiMgitWw8irGN7EYDFJRFYmRWrAGMOA3Ps4q9YiKcg5Zp07zq7CMSYrhWrgEAtF\/nCV0jpy0FkN\/R4sFz4\/n+Jkdy\/ZJdZS1aMTv8nikC9EUrZ1A3xEVkOaX258P03UBBMe\/oG4fvVpNSlCHM9lWN7gbQ5g\/xgZRH+WjOAVQjjuf4IYMM+1qvnfCoRmX2+8ghdgY9H32\/b52C\/FcBtkVBrB3B0ZCmbWYFF2kjS5vgYWhwCSHGL8dwddvbHG5nLLxIF\/z9I68tBs7qGYBypEX7wJVnw\/6V7WeluS1meg0tKvb5Im5OleFSTUh8k3z8pM83WRfKDVjLmTJRzfCrzCqHUmZmGKefgOxzAEgCbAdxIRGOlYxotUH1BJM4Q\/X4QKTEF4GGEwfDzAJyO0Jo1swILWldTmL09Xqcpos0s5c0spc0bE1MyK1YhuzQ1T+T9j5FSbwdgrSTxZBn5\/uepkH9dNibJFWc9zE0iUOdNZ8JGy2T6BY0UqA+LXH7JdH1EdnlaQOszYlzYebwkSOvzRMGfP\/lpwIiEj0AYT7VxLEUA4AhmfgUzvzL6egVCl+HJCOOt\/rqfONuA8HahB+C4qe5Pk7NgBWo+EMuO7mbPyaZ77VXzONK1YhVELl8lC4W3kVJvQ+g\/t8SX5cJXXxS5\/OuyNc1WZJWeJGl9mSj4i21TxOxor82ZIgguytY2T4t1SSizICrsXO4WZYI2J1KgVmUaJx1K5gBIIwxk34Sxk5cKAK8FcG309WMA\/wfgzdHv\/BDAn\/f7HR97Y7mm3JeTE1jGLIfhuN32YhZiDTvOTjvf44ko+AlR8N9KgfoE4l9DyxJOqxoRBJ8RhcIZ2ZpmazkpNcYcS0odaRPDxo65pPQVwlfTkz5BqyPJmOMqpK1qyJjzKFCTjbs1kbBSCOPRxkq4ygBuBfAVAFcjdP0xgO8jrFX4ESLaNsrv8HME4UwKrGx9G2BMfQw3SMVSPAQhbWmcGJKtaXZkvvA6CtQnEVY5t5SNxuIV5AefF35weMbeYis1C0mbM4RS9lJI\/MTviaTUOdm64h5EMnWtkrS+CGHep0pAkjbni2ByYjS68bczElpzMXYsuAFwC4D\/B+A\/EObCkgAWAXiciEZG+Z0lAOYgtGL1YopJUSdjwRJkuBmxC3CnnSB6JLVhjZ3ocRNXtS0k8oUXUqA+BpRdgjwLQGT4ePL9L8mRXFNmhRVZJd2cDJ9FgVpkmyJuBxFUkdJXUKCL2jey4NeTNmejkpIvG3MYtJ6KRa4PYc3BGgAnH+i2XyTIRgD8AMATAC4D8Ir981xFf6MdYYB7DsAdCOO0ZlBgKeUA3AbE7OaXwHqWssfO8niRaWgH+X4zBerzYE7bFilbBGlzDvn+R0UuP882R0k3p9XQutU2RNyOIQCMOY4C9YJMY3GSj2Ya2oi0fiGYWypLjPIcUvqSTH3bZC2xTwLIIrQ2XYaDpK6IUjh0IaxZCISZ3g\/fr5RONYDTEAa29yFMUjqlfJoTFlikdALMK2LXXyQeB9F2O8tjJK5WtEMUCouFH3yKjHkBYIs2lzkOKf168v1\/ydqSOqVkHhk+rLu2xbZE\/JhPgbpC5HMLi3KqKQRzoPRFqLQLQURExpwmc\/mmSf6FzQDuROgGPA3A8fuJpdE+0gC4HmFgexuADyFyu+5T1\/BshDFYd2Hs3FrTKLCYF8Bw3HKxMIjWw7HpGWJl8sj71aLgv4+UfgVsbcFKYa4I1EdEwT8l29BeToK5gPBK9\/5fIwjjLHT0xbF\/E2YJNqtZiHI7sOgxvkxFSQfDp1Ggj8o2tE3tgFrfBlKqjbQ5tSIPp8wrSekzM3WTyomlEAarP40wbuqdGF9s706EJXH6ALwcwKsiV+F8AG9D6HJcj7D0Tn6qrzihU2i2oR0YHllCHLs4mgDAeuNIA0ssyNY0S8rlX0aBehfGvuVhKcuFESuEH3yMRf6tmfq23nRf7KsmGHbk9SzEL0b5XiK6tCMAMAHLYXg1Ma8GeBkY82K3uRERmA+F0XMADJWLwGVHXsvA8wYLAfPBqAUgibkBgAfmGoCXgzEPDLe85AUfAq2PhzF3TkU8klKStD4b4LoKXUmSMPo8oYLrIuEzwSnAHQjrDH4NYU3CtzPzVZFovwvADuw33qLfewJh4PsZAFYAaARwBUJXYw5hzcJHp2q9mrDAYjaAMbUAx+0G4QgL0VsWp89ZggiCJqHUB6PThaWyIBjzYuH7H4AQn0RoBYq7KOzS8+fekN7w3Bx53cvSwD7WVSYIKF0F5iVkTIq0OY+0PiequxobNw0ZbhCBWlhGAkuxkH\/ihPeX56lfQUTMEgyiIPDAEBC0AMbUEvNhMOZIMuZoMK8GY9FE960SjDWHjHkh+cH3p9I\/pPQh0Ob82L\/vVMaxNieRrw7NNq66dxIX1DSAXyF0970fwIcRxmJ9C8A3onk9mlfLR5gX62cI6w2+F8C7EMZeXYswP1ZRshFMqONEEICMSYGRjNWJgjAMQZtt\/cF4kK1t8Wh45G0wfKRtjYrFI6XfRIH6R6Zx9Q3pDc\/GXxSOQtOmDPazMhjsdR9mM\/Vtd8hC4UoK1Pmk9FsQ5iKKwQUfXghtliC8Sl42+2nTpow5wGYJhK5cRBaN9QDuz9a1EoxZIArBoaTURWTMWTDmSMTVMk4AMR9FhuswisVu\/OJDH0vGHF3h68hy0vpc+P6DmGBKhMjCNMTM\/43w5t\/rAXwUwJEIrVD3RmJqtLWgGmHM1TsRWq4MgF8A+MwoubFmRmCRNiBmGVrSY6WwtoJoq93zYiCuGtshhkZOJKVfi7iVUprquTRcAPIg2glgB4jWRxsBjfLDksLLIEvAPD9aADxUVizaIRQE7xX5\/H0Yu1xFWZPuW6cB9GXqWq8Ref9WCvx3CKXfEfVnKUfjnNCNVvmk+jsYwI5sfds9MOZB4QffQ6AuE0q9BcyHxtLCw1wLrQ+frMDqrm3xaPfwRSUfZ9OPhDHnkdLfAzA4qd2faCszfwzAUwA+COACACcBeADA\/cz81D4C3kFYh\/BkACcAWBYdUr4H4Boi2lzMl5vEwIyfM5yJBiHFLitvYiB1c4VF5Afvq4CaWXtO1TtBtJ6FeBpS3A1gLQuxEUQ7QLQTzMEYs16wMdUgWghjDiHmFAwfDWOOJ+bWaHOsKvv+NuYUUSi8Lru8+arUxq6KvWSS7u8wmcZVGcqLz1GhsJsC9eESb34eGZ5VOeVSYaxfkGlsW0+B820Ogr8KX72dlHoL4paEk5EkY07P1rVen+rvmHAcFhX8JjIVlvtq7DXkMKHUyZmG9usnW+aOiHYy89UIY6\/eCOBSAGcBOA\/PtWIRQgu0jgTd1Qhdgo+jSG7BSQssdh2wH8Qx3nATkyhYeVNaumtahMjlLyFjzivzhSEPQR0sxC3sOH+BlM8aV25h1y2k108oTiAHYI9l9aFMfdtvhFLzKFANpPUp0PocMvyCSGyVa5xFFSn9duH7t2Yb2x9LbajcOqDpMEZkqHtZ6uuCMZ+Uej9K6y6clTGn6Q3r9hx+1nUvS39S5AuDFAQfQ5wqRBBAhk8ipRcB2DKRX83WtQgM504Hx+62\/nQxB9pcCK1vxF4X8WREVgDgyciadTWAFwJ4E8JAdt5HYPUAuA7A7QDWEdG0aYcJLerGcZIC1BjLLmIb317yNSUIGkipd6E8zdoGwDaW4l5I+Wt25D3GcXohRCE10FmcjaFvHSMsMvpMtqblWTL6OgpUK2l9DrS5jIw5AuWY74a5lZR6OxX8D0WisqJp2pQd6l684gdS6\/PAfLid+aXsi0yue2nqOwQEIgg+hbAMSkzmhUlTELRPVGBRoOaR0heiAizc49ZGRp8qC35jtr6tMzXFW8lE5ANYw8xdAB5EGMi+L1sArIl+blqZWAwWwwF4Acjmi7Tsd+qqbyXaPXIhQpFQXsKKqJ+FuJld56fsyEdYyl3sSJ7OSxOpwU4GsDtb1\/oIaf04tPk\/EQQXkNJXwJhjy2xxFaT0ZRSonyLMflzxcCLZxYG6joJgFUA26WopRdbm7Eh2efp7xDyPlPoU4lJlhDEfxqwCcPd4fyVT3wYazh1Kxpw8qzqR0URKvTgSRUWxlkQWrcdLujBO4rHtjLY8fyAV\/FrS+vUor5xXwyzlb03Ce72ZU\/VePaf6tqbN3TtTg108UzdSU\/0daNqY0U1buvvVnOprdFXiNey5HwXRUyivBIzLSenLs7Uts0JspPrXaZbyzyAxaGd\/HASvV2DXuRZC3B+jx5JkuCa7PD3ufVYoLUjrs8FYNsu6sAqGL5SFYH4lvVQlBNAxiPIg2CSjJSJb10rkqwthzDFl8sgaQtzLCe+dJun9q5o7546mjZmRyQZYFot0f4dp2tKzQVcnv2MS3qvYcb6DvTFcsV9LSOuLRMFf1dXYPjs2dSnXsRD32RWg9KTXr4Hx3H7jOt8AsC0mjyXBZiWIxm9R02oZGX0haPZZMkibk6H1Ydn6top5p4kJrLCWT9yCnQwIWXYcH5bSTAw\/WAytX47ycGsVWMrfmWTijbq66qemunp788QT3E0rqYEuredUP2PmVH2EPfcDIOpCeZRwaaJAXSqUnhVWLBaiAEKnzW8ck3kz2GXYc29nIR6Oy9IIRg0Zkxj3hqz0STC8elZ2IJtlZPR50Lpi0vtMTGAFwSqA22O4nhgQ2VWuBGRrm0mo4MVkzCll8Ljb2XG+YZKJ96\/c2tOR6u\/g9Pp4JshM965F02BXTs+p\/rlJeO9kQQ9gipXdZwCXjHmpKPgNlXQKPZC9AYwegGa+Xzg88doVaL9mcZ3tkOJ2TDBp5TTiADyufTa7PF0FrS9DmI18Fp7UiUibs0npiqn+MSGBRYZXwHCjDcOy\/HNMKL0QSr8V8b85uNl47sdMMvE5rkoMlM2pvL9Dc9L7OycTV7CUv8fomYljdNQxh0Pps6BNxa8SQilEG\/nMH+4IBRbotyvQfvOlr8OwlLciJq51Yq4VvjqoYMqsWAXhB82kzYswmwOdjVktAnVipnHV7BNYIPiYxpwRljIUWIE+grQ5Nu7iij3306Y6+cOmzdmRcsvV1DTQZVZuXb\/GJBPvZSmvRhGqvE+fCQEJ0vplpPV8OzumFR3rcVDKIeg4nSDqidEee1DBRIESpPSZYG6c5d03D1pfhCBIVMLLiAkO3PtB9KCdwhYAyNS1OqTVhYhTgr\/ns8l47sd0IvGj1EBXUM7tbaoSgybpfZod+cPYbq4EkDEnkAqOyDRUeLA7RZKyJJ9NOQgxBMvzm8boHIDd5RQaR0GwEMZchLCcVumOR2EZsFKGIggy5nTpB6lKWD8mGuSeB9hasCzh4PGDZaTNaYhvzcHN7Lmf5qT3k9SmTNmf9tMb1kJXJbeYROIz7Mj\/RXyTei4ipS8hXdnB7sZ1CUSLUJrb2Lts\/dUxVIKUPgvRVy6XD7J1rSCljyJjTijxo4wY1\/0OQKUNoWBeQUqfTobLPsvBRF+AYugeJjCWIVAuLDNGpqEdFAQnRcVW48hO9tzPmmTyR00bsxVzKGjesBZNW7q3mKrk59iRP0c8A98laXOO8P2GSr5gFwpIbi2FwGLCduM61oI1GtoYALvLZhwRSTLmApS6niJRPxz5Wxb0dImbpApGX0SBX\/aFrishD5YA81JittmUZ7LRC34Vab4E8Qxu99lxrjGe++OmjV0VaXFlz9vKrvvF2OZhYm6lQL+4ovP5aFNDukQZt4kGIMjGYB1gBMbk+D\/MQhz4Yorv15DS55S8wYS4zzjOMxDi72CUNJyCjDmZAnVYtq51NgksQkzNrtUgSFhmhEx9O0ipJjL6dMTPpMksxe0m4X7dVCUr9oSf6l0LU5XIsuP8N4BNsZyTxpzJRBVZTy2zcjVI6xeBuaUU0g5C3M1CWIE16q4mHDAvjYfKo63syDFd+dmGNiJfnQbm5hI\/aoGlvBmC8uzK20ETq59YdAwWkzZnwpiyNgJNMAaLfYA2xq6wMvMS0iYBy0ydLgBtTgHzivg9HHWz637OJJMb0uvXVHQ\/pPo62CQTN7Pj\/ATxyfuzz7w0xwKVWfJD5AtzSetLwCUpDbWThXhgpso5lR3GOMS8NCZpwgocJugefbkKgmrS+gKUusg70XpIeT+kZPa8NSzEU6V9HhBpfQGMOaSs14mJnZuMD0IfQLEqS0NANcBWYM3cxukSm5PAsbMaBizlj9h1Hyh12ZsZE1kbu3LGc78FIR6Mm3E5zJtnmoHKKmOVrW0hKvinkzYlcYGyEJ0sZZddiMYUC\/MALIrDSglC\/1ipjTIN7SA\/aCdT8txXzELcw47sTfWuBYiGIMUtJZ+3zKuEH5xQzrcJxQQnNphoPQjximthboDheruyzND6pfVi0uaE2DkHSTzGrvMz4zjBbOoP9tz1xpFXgrA9Xg+GuWT4mEpq60xdK4lC4SgRBB8HUIqM0wZC3A7H2QbLWOtTCsx1MXgUA6IdYDajP6eSpPRZMdi7RiDF39iVeQAwUjCkvA1EW0r8XAtI6wtJKa9cx+JE0zQARNsAjMTsPeaT1iszDW12dZmJBUzpNBgNMXusEXbEtSbh9aT7Z5frJDXQaTjh3ciO\/BPiZC0iAMynAiVxoxWdbF0rybx\/pCgEV8LwSSWxOhAGWYob2J1dh4hxC+CGdpDWx6PUN\/LCE4ZiIXrguqPe9KVALSLDF4NQ2gtaRBvYkQ+m+joYANK962Ck7ATRE6XWJ2TMWcIPVmbL1Io1IYEVul1oJwjDMXuPJBiHUQUViYzvJtNGpM2JAMcqUzcLca9JJH6dGujUs7FfjOvuYkf+CDELeCetj4tBAO\/Uxnx9G3UvS82Xw7lXi3z+RzDmhSjNDWwGibvYdZ9IzRIX+IQ3ND+Yi7AuagzS9lAeROvH6ivS+hiwOaLUSyeEuN+47vrn\/KPr7GIp\/o5Sx3YabiKlz4DWZRnsPuGHZkHbmcTW2L0H8yqyubBmYMCramj9ApQ24\/D+7ITrfNskvc2ztVvSfevAyeS9LOVNiNdVXxdA2aVQ6aprQ7amOdmzeGWLHBp+tcjlv0e+\/z0wH4PSpbfZbVznOuO5Nv\/VaEK4tkWQ759P2pyNONxuJtoOIbrHeFaXlL4cjAUlfsq8keJmyOfeSE0NdGoj5e0MlHpNDXNiKVWWBbCdSQyaHAiDcXsRYtMOxiEABmCZxhOiqiXmw2L0SMxS3mQc59b0htl9qm8a6Mz3LGz8MRlzIZiX2NG67wKBKpEr1HQvaTrwad7wHDI6RUPDh8OYY2HMccTchPCWF5V4nP\/duO6t6T57e3B\/Mg1toJFcioLgwwAWx2PMUR87zpbR11G\/kZQ5tdRCkIky7Dj3pPo6RlEHzlqI4EkYU1vSZjR8IindCuDh2SCwfIDiZylg1JDRS63AmsYTYn0raDhXA+blMXqsIUjxC3adnbaHAJbiISa6h5gvsa2xz6qlzavlSO6Mg4gwgDEnyqE0J1ofKSZvkGXX+TI8d4ftzv3E1YpVECP5RcJXHyHDsSk8z4KeHm1dytS3Eu0ePgPgVMl3TSnugBR9o37Tc3eg4N8CY16MUrpcmZeS0hdk6tseSfetK6vaEBMWWOy5ARf8Zyn0zcbH9M88HwZNAJ6wS860nSTAzMsJiE\/ySKL1LOVTqYFO20EAjOcOCz+4Bcacj1jEocRjlIC5BkDNQbabuDLMjnOVSXgPp6z16nmIkfwSUSh8irR+A+JTF1Uz0UMY5dKJKATzYMyFKPXljzDL\/E3suKNemEj1reOeQxpvpQBbAJTSiiXJmPNEEHwXwJayGpuTOQuCqBNA3LIIJ8G8KltvbxJO44lMRMlF45JzjFmI+43n9tre2bMUScNSPFBuC5FlTBQ78tfGc3+aGuxStjn2km1oo+7FK5eLfOEzpPRbEa\/bqlsgxSP7C+JsfRtIqcPJ8AtQcusodUDKx1IHuHXNjuyAEKU3WhhzKPnB8dkyyxQwYYFFWgOS1iN+xTSFMPpEMqYalmk6k2lJzPWIj+Uyz1LeBsexJUMi0r1rwY7TBSHW2NYo\/zMNhLjTeO7ndFViq22OkMyKVehelk6I4ZHTRcH\/X9L6rYiTVZ0BluI+duTzApsoUA5pc27JwywYhoX4h\/HcA8dTCznEYdJRXeLnnU9KX0KBKquULxMWWE2DXWAh+0EUt1gnguFDKQiWwzI9DRxoGZMEftED0XZIYa+s778Wue4OFuKBki+KlqltKUSPGc\/9OHted\/MGO8YBIFvb4onhkVUil\/+YKAQ\/Ia0vRnws6nt2ogKE\/Ct73vNue5Ixi8mY81C6m6h7nnEIUt7OruMfeC1xDAt5d5T\/spTPK2DMaQjUinIar5OyRLArdyJPveD4BBSGD8b1UOqobF1rNtXfYVej4lMNRpwE1jp23R7bLfshhWIp7iWFHIC5tkHKDg1BDxrP+5BJevenBjp5NjZCtqENCLQkYxwYs5C0PoF2D7+UjDk9ClWIZ4whUQc78tZUX4d57vu0A0PDp8CY1TF4xiy7zsMHu3md6l2L7sUr1zLRo8R8TkkfmblFKH1atqa5MzXYVRbltybn6pFyhAWtJQMNxKoe3VzSfDKY\/wzAZjou\/gCvjkuVegBgKe4CYZftmecvij1LVj4FnwbA3GpbpKxQkOKvJpH4sE56a9NRdu3KWEBQ1bO4adEBvk8weiEYEszLaNdQAzNaibmZmFfBmEOjAwPFuf9YyhtMwss8XzbrJCn9shgcegxLeZfx3HF5oTjh7UQQlP42IZCA1peS1tchfiFKxRNYLElDiC5Ax01gCTLmRBEEC2CDfKdhWpoFFIsSFNFGBFprhGDbMaN0letsEYRNYFiBVT5sY8f5mfGcK03S60r3VZQVPiEC9R8I1L8eaP2Obnu6AOaBeS6FgevllMV7gB3n96mBzuddSBCFIE3GlKbE0nPJsRC3pPo7xnVpItXfoXsOabyTArUZKK0Hg4w5jpRuB\/BQxQqs9Pp16Dmk8SECtqK01zdHEwFHQOnVmcb2O9M2bqH4Z9D4MMIE6x4cu6tGmKiHwKfatog9BRbiUXadr7Dr3sQJbyRdeXGFDow5psL7UbPj\/Np4zpP7fyNb1yJoaOQMMDeWfmmgTjhyQgKFPfdZ9oMnyJhSh4gsI63Pzda1PpLq74i9m3DSJwN2ZA+EiN8Gx1hE2ryIfGXrEhZfXokYiaxdEGIrEdl+GV0JK5BYD2vfizsBO84fTDLxAVOV\/KtJeiP20kaZIugJ4zrf5YT3vMBx4atDyJhLUPpUEoalvJml2DihbdV1d0GIu8ElvzgjSZsLhB+URaUKMYXBtIMF3Ru77HzhbYOXkNYL7Iwv+tRcCuZ58ehn2gKi7Tbx4hgLIjMD2A6rsOKOJK1fJHP5b8ndQ993duz+954F9Wd3L1lZ37O0yc3WtdgTRHmwkx3nKnhONr3+uRlSsvWtIKWOgOETYvCcO1iKvxnPm1CMcqp3LbMU\/wCh9BUzjFlNgTop09Ae+0Ex6XxGLF0NUXgQoAJidk2WjDmWAnVGtrH9dynrJizirg0HcYm5IwwDXLCdMkZXEQFEmwCKV8UFy\/MPuVGWedJ8LGA0AcMIVJaluEv4wd+6F694lD1vEFIEqV57oIjl0VPKPxrP+33TYOZ5Fh4KtAOtLwHzISVfFwQ9y1I+ORkXNDvyGQ7EM2TMC0v8Gguh9YUUBH9D\/BKe7ze5J33uArOQz4CwOYbvNZ+0fiV8NcfO\/YqFAOsfHLt1CABvB9lcWOU1puEAWADmoynQ7xZ+8DOR938vh0c+KXL5o7K1Lbb8UfzmWid77tebNmdHt+4YXUPanInSh1doCPkP47mTuwAm5Q4IcTtKbxYnMubFogxyYk1aYKU2rANL2cMkno7lkNf6DFEovCDT2G4XgOKt\/vMQmxs9NMBC2AzuB9+wrQgt394jAHPJmOMoUP8pcoXfyuGRL\/YsWnFM97K0ZxsoFgyy43zBuM7jo30z09gGEajTY5IuZSdL8XdIMamSS8Z1FUtxG4DtJX8T5pUU5sSK9fo2pc2SXWcIUtyHsPBz3FhKSr9cFPwquwYUCWPqwYjLwp4jNtY6Y5ktOGBupkB9QOQLvxO5\/Kd6Fq9sztS1Cts0JWOj8byPmarEdey6o65F5Ks5UPpixKGUj6B17LlPpCfpZk73rgVL+RSLWBhVEtD6QtI61l6qqU1Ox1Es5U0giqObUJAxF1GgDiuHYLjyOFFTgPhETS8DKGE7xTLLkGBuIqU+IvKFn8uRkddll6dttv6ZZ4Rd5ypTnfxZ08ZMYayYJuGrVcR8MkpvSWaW8h\/Gc6ZU09J43rbITVjywy0Zc1KUE6syBVZqwxoY13mGiZ6I5dsZriel3iCCwJrTizFDibpBiElgOc8FGxu8PebqAwBkrRuViwtjThSF4FtyOPfV7qVNdZnGVbZVZoYhdp2vmkTiW6mBzjFr+WVrWyRpfXYs6rcSdkGIv6Z7p5g7SgrFUt4CYFvJ34mxlJS+MFsfXyvulB+ME94uSHErmOPnJiQQaX0ZBcFR1opVFHS8xq4Nch9z6GsDAI1g2KDoymY+af0mkS98SeZy9TbmdNrZya7zPyaZ\/G+TTBywTBcFwSJofT7iUDORxDNGyim79tK9a2E850kQPROD\/d2B0eeQHyyrWIGV3rCW2XFugZhY4rIZVLn15Kv3iYJ\/iD3hVRAGy8C8sKu+zbbFmGOfPYCtCK18XFL6VZT3vyTyhdrMCrvOTdOGvpFd5+Mmmfhq06bM7vSGNWP+aLa2FRToY8mYo+OwWrKg29iRxbE6ue4OlvIOMEqeSZ0MH0aBOjET032gKKY1FmIdC\/FwXEUkaX0pFfxXkh\/Y7O6Vox4WgnmxbYex9gIQgKX2EuGswSOtXylyhS+IkfxSK7KKig8h7jSe91aTTPygaVN2aBzrk0NGXwZgfgyefzukvJ0dpyheplTfOmYhbo1F0lFgASl9kfCDZBwHTnEEluOMQIi\/AQhiOkHmCaXeJ4LAmjumeBKKvuJANQzXCLaZysfUWMxLrL6adSLrNaLgf1Dk8vNsc0x9awNRP7vO13VV8nVm\/tw\/N23K+uOafH7QSNqcEYuXEOIx47qPpotY9YId+QwL8UwMXo\/ImNNJ6cZMY\/y29yIJLGnYkbeBKBPfqcKrKAg+mF2errbrxmRHC20C0e6YPE2SgGYYY\/tltOFOVEVxCK61zPy8UOrdVAhek61tthb7yQorYDNL+RPjea8zVcnPctLbkFq\/ZlynuWxjOwmlXgTmOCTCDFiKv7PnFjUonR1nOwtxK+IQl8ucIq1OJaVjd5wsisAKA9+8TpbiphhZOJ4vD8K8WOdma219r8m1oNjOwI7YPI8xhxPI3iQc7VgXBEvB3GRbYlYyTyj1PioEbfZyz8TECAjdLOWPTdJ7lalKvNtUJW5v2pjJTaREERX8eaT1JYhD7ivCNkh5GxMVdV9m11EUl6SjgAvDl5Hm2BlPina9kRNOgR3negBbYjyBFgo\/+Igo+Gm7lkzKKjIMotj0L7E5EsYcYntmvxN0QztI6cNhLVizeLJyuwiCd4sgsBb7A6NBtBlC3MKu8ymTTL5Mz61+l6muuq1pc\/dQaqBzYnOvsR0UqMNh+BTEIQCSxJPsuc9MpvbggUj3rgU78ikI8VQs9gJjTqRAHVaxAivdswbGcx9iKR6I88EezMdToN7RvSxlk\/NNnBEQbYjPJoJaClSN7Zb9MEaSNqcCsJvrXnIIra+jfY0A8Mf4UohX7OF4cUjpy0XBP81edHju7EBYILgHQvyJXedDxnMvNcnEq\/Wc6v\/mZOLR1GBXLtXXMbkNxg8cUvp8MMchdYBhKW6ZrrAOk\/C2sRB3IA6VXJiXklbnZmpbYuUWL6p7hV1nN6T8DbR5CYBkfBce9a8ij4Hs8vS3Uhszvl1zxtm\/nhPA99fH6JS+iIw5JVPf9lS6b52Ndt+zyBf85TD6hQBsDM6ejcaRv4IQ14zx\/eVgzH+eDmEAzIvJmEVMVAXmlQAEgZfBcCOAhQjdQHFVMMtI6X8xUvzESqx\/Co77IOU1LOW9LOV6FmKEHWmKFgCu9FIYfW5M5t5WFuIOI+W0rI0shWZH3kJKvRvAkpJrGa3PF0FwNYCBihRY6d516F688jap1FoYPirGE20eBepDgvxsV13bDc3962yk9Lh2bqFBlI1O9nHIjp8kpS4WBf86xCk2rIRkGtshdg0dQ4YPt63xHLHUp+bP\/Ud6w8RcJT2LVxIDMAlXwnASzBBKzYHhJtKmBWxOIm1OA3N7DA+VBGNOIynuRPlZ4KYDQYaXGoe6dDL5bLq\/+IcyofTJZPjQWAx5IZ5gKdcV8\/bgc\/b79WuRXZ5+mvxgDRnzwpIPdsOHikCfkKlv\/0O6b208BlzxJZszwFLegHgWgN6XOhEEX3RyudOyta32gDeeAczMIOpF6G6JyZnUHEdKHWYzWEcTuuAnoc2FABbY1thPbEyClVt7eOXWHk71d6rUYNdQamNmaOXW9RtXbt9wv5lb9XNTXfXvJpm4hD33jSzFDQCGYvXWzLUw5tJpWevLUmhziwjUZ2U+vzJb21LUP52taXah9UXgWLjmFQTdyq47rbmq2HV2ILxNGAcPwnwYfYEI\/NgcdMQ0NHhgHPenIHqqDCbbKvKDL1OhcBgsB9cyQoClXAeigRg91jLS5qVUsPUmAYCUTpMx58IG3kw7Tf2d3LQx43MysV5XV\/3KVFddwZ77MRD1xOgxJSl9LoBSx5wywtinUm\/EBGNeSH7wCdKmqIcQ4QfNZMwZoFjMvc0s5e1w5PSmUWBmluLvQCySjhK0ORtKr4jL5Cv6FfdU71pk61qzrILrKFCHIh6upLF7ROvjhO9\/untJ0\/u4KjGQ2rAWltFJ961Ddnl6IxX8dcQcl1TRgrS+TATqRwCens39k61rE7R7+NKY5N+ZRULrnwHRO7K1Ld8VuXyX8IOvRW7DWCxzMXiGYXadn1OgXg5gcQzWjFeLQuHJ7prm7zQNdk05QXa2vk3Q7uEXx+XmLgvxFLvuWgSKssubp++DlAFLuYaFeIaMOaXkA525QWj9omxD27qJpNYoG4EFAKn+DtWzZOWvSOlXgfnoeB\/5SZI2l4hCYdAAn840tm9LW5F1gBHjDEPQMzC4EHEJomZuIqVen61v\/USqr0PP1q4R+UIztHrddM1ryzjWvoFOla1tuQnAx4QffAvMtbZVor1PiNsgpSat3xaDMTonjMMtdHXXNP+labBrSjFqouAvgtaXIR5xeAZEEIXCm2bEXkiQoJi4oBkelL6IlPolgOGKFFgAoJOJLHz1fREEVyLmViwAHin9FoGCD6LPIx7J02IJAxpSPgyl8wDmxOSxJLR+KeX8nwB4Zjb2S7amxaWRkVcTc7zqRRBtBiDBvGgWiSydrWn+ExluoyD4FOKQcDIeB6Fh9ryvU77wAnAMiiAzN5If\/D8SIospWL8z9W3A8MhRZMxxcTlrkdYvgcbZs0\/GA2TMyVRQhwEoecqoaVOd6d51zK7zRwh6tEy6poqUfofIFz7avbRpcXdNCyyj9GvfOrAQT8cp4SgAkOFmEQSvz9Y0z7pYrK7GdgjfT5PSrwTgxkmNsxR3ANgw2\/okNdjlm4T7IxbiQbtq7N39TNLrMq7zVQC7YiL6jhR+8MnupanFmcbJRT0IpVzS5jwAi2LV2LOXJaTU+dnalpJb8qfVrMeuM8CO80PE7WbN2FSTUu+VucI3KQhW2ptpB+jXMF1DnJYTh7S+XBT81ZNdKMsVEQQuBeoViE9c3J4+8UF056ydJ0JshpS\/ARDYVSNqEykMe+4N7MifIR43zQW0vkTk8\/9GhcKkbv+R0vVkzDmwF0vigkNan0N+sKz0g2t6T3HGuO7vIMXNiMc1znGJLGj9SsoXrpLDuUMzje120jx\/49gFKf4G5nj1KXOalL5CFPw5s6k\/REEdRVq\/EXGLvSLazFI+M1s3HnYcw1LcBqJ+u2qEpDeshU4mdhvXvQpET8TksULvRSG4qHt584T3RFLqVBjTans3VnvBYaT00aU2kkx7YJqpTmw1rvt1EHrLqHskGX0hFfzvyqGRM7uXpRN2xD5HYBkW4jYQbY1dvyn1RioUXpWtaa74LOZdK1eje0lTDQX+x8Gcjt84oUcB2jBbBVa6bx3YdbpZ0D1ldMCcdpo3rAEnvHUcugp3xOSxlogg+BT5wXHZ+rZxj9dsTboKWl8Ajm3lktnKfDL6XFHwS7p3T7vASq9fC+N597PjXIOyMpWTJGNeJPL+j0U+\/6HupU1Lsg3WmvXPjcNx1rCUcaw7eYgI1H+Ign98ZsWqiu4vOZKvFgX\/PaTN+YhfIskRCPF7YrNrNs8VljIHojWwmdSfQ2qg05iEdwM78hdgxOPmr+FDyff\/n8gX6se9gRZUOxk+NSa5ryz7bOCk+Vwo3VDRAgsA4DkBu+6PIMRD5dZJANdToD4ucoVvi5Hc0dm6VlvfDQB77k4W4q8Iy+bE7OG4WQTqk3I415BZsboi2797ebMnCv5bSal3AYifhZUoY1zndvDsttwQwUCIXtg4rOfrmWRimF33mxD0bExWeyJjXky+\/57uZemDWqSytc2StDonLrmvLPvvA2YFGXNKtr50F6tnRGClNqyFTni9LMXPEVauLzeqSevLRb5wnRwaeW\/3kqalEzEjV+jOYSDoacTlNtD+41rpc6ngf1wOjyyqtKD37toWQX7hhaSCDwM4JI5LGxM9y667cbaf61k6AMHAugifR3r9GhjP7eTwIkBcDmoeafMG8v0zsrUtB9wfhR8shdaXIk43dy374gBYyEQlW4VmzK3AUmiT8H7JoqwC3p\/bVsytFAT\/JfKFa8TwyPndy1JzZ\/PoZdd9jIV4JJ4CEA5pfQX5\/idFvrCwYsRVXYugfOEUUQi+CkZ9TB8zByn\/wK4zDAuDkbMCa4zGcURgEt4PIcS9sWkj5loKgs+HN5JHD5LONLSClDnWFlWPNS4F6jwKgnkVL7CaN6yFSSS2sOf+T8xqdU2UJGl9oSj414qR\/JU9i1a8oHt5OtFd2zxrRm2mrhUI1BxS6kUIc7\/EdfNIkNJvE\/nCJ7uXNC3ONLSVdbtna1qIcoWTRcG\/CsxHIa7B46F78E5bEQFIbVgD2Ov7Y5Lu7YCpSvQZ1\/kG4hPwDtJ8tPD9T4lcftloLibytQdtzgNjvu3F+ELGHCP84NBSrf1iZifTWrDnPsCOcxXK01W41z4CLCWtrxD5wm\/FSO5\/KOef1L0sVZ2pb6vYwZqpbaXupan5ciR3lhzJfV\/kCz+MshfHeQOZQ0q9S+Tz35K5QjqzojwvKmTrWoXIF04VBf\/bUfmpuL4Hs5R\/YSn77PIOdNe2EsJM7lZkjbUvbFjL7Lo3s3R+jHjkxgrLv2hziSgEH6WCPzezctV+Akw1kNEvsb0ae5aS0heS1iVJYTPjN4+aNmYCnXD\/j6W8HuV\/s0aAuZaUfrco+L8TI\/kr5fDIud3LUnMrSWhl6ttE99KmZXJk5HKRy\/9Q+P4vSanXIizaWg5LTJKUeYUo+FfK4dxR2fo2UU7t3708nRAjuZcK3\/82TIwtVwBANMhSXg\/PVbCAwQLGNCGOFxFihK5KjrDnfBtEj8Vr3VBvoyB4Bfn6n5ebMo2rQEqfBuYm23Oxx4Ex55Cvlpfmw0ux6CQSW1mbL1LBtMPwsRVwuiOA60jrt5DWl7JSfyfp39C9aMX9cGS\/cRwfRJzuW1cWL5OtbwvDlJWaQ4FK0+7hs0mri2H4aADzEd63KbcektD6fJEzjVDmM9nl6b8Yz\/ObQxdOXIUthO8vFbn8OylQ7wKwLObXwZmFuIld54lUr3UPAgAFwQIYPhHxS6MRK5rXP4tsXWsGWl8l\/OAqAAtj8mjzRKA+gXw+m6lvvSPd18HC9+cKpS8EbO6rspiDxqwWSh+frWvtT\/V3zGg4S0kEVrp3LbK1zc+A+XOi4H8fzDWV0pcAlpIyryJtLgGp9SzE3UKKm1nKR7qXpTay44ywEDodsw0o07gKpJUgpaspl68nrU+CNheTMSdF\/VMJN2UkmI8Svv8dMH+NjLkmU9+2LY7CN1vTLEUudxT56j9J64vKZDHfxo78lfHcEViQqWsFjeSOJmNOtK1xcFL9HaZ7efp3rM3ppNSbQBQPUcqcIj\/4vCB6a6axfQ0NjRwKY06GdfuWB4x50PoiUuqvAAoVL7AAIDXQxdll6ZtI6yspUJVVcT60MlSDeRVpvQpav4ZIrWdBz0CIh1iI+7oXr1wHR24GKGja2FWSIPHummYCc5ICtYx2D7VDm2PB5ngyfASYV1TwCa1WBMFn2OjjKdD\/m61pvic12JWPhbBqaCPyg6ViJH85KfUeMLeXi\/WDhXiIXfe+dN86e2MOgAiCeaT1GxDPVBqxpGljZrhnUeM3yJgXgTkucRZExrxA+MFnIcQHSOtzASy3vVVGZg9jziClmwDMqGWjpLXLuCpRMEb\/UGhzNGlzOQiVmsQzElu8CtpcTMAuEG1gorWQYu36BfVrmMQ6ljRAzLsghGIhNEupWQgmAqd6x2dliWK\/iIwRpLQAsxBGO0zkgbEAhheATT0xN2A41whjDiXmVVGyvLmIWz276WMOafNK0v7ppNX1PYc0\/ohd53HjeYVSWBezda1EQbBADI2ciUC9m4w5CUA51VQcguP8xHjuDruiA9maZlfkcv9CSr\/UWjomhnHdNaTMNygIvgxgXkweS5DWl4qCPwhjToDNfVVeGou5EUqfma1rXTeTbsKSbqbpnmeRqW\/dDOZPyby\/GNqcNQtKDrgAFoN5MTEfBaMZoICAnSzEAAGDTLSNiLYA6AFhKxMN9CyoH8+gYOwenkvMywEsALgewFwyXBuJvFoCzwdjLoAEGAI0q2NDCOAaCtTbSZsLWKnrRRD8vntZ6lHjubvSvdNvicnUtwqR92toeOQ00uZVpPWLw74rK5iFuJM95yZrvQKyy5s9kS+8nAL9n4C9xj\/hweS5yhj+pTDmRaT1qxAfC26ClHonbDxdOZKA1heT1j8HsHNWCCwASPd1INPYvo4M\/4co+D8G82Gza4MnQnjDaBkZswzAUfsoTA1AEZDH+HNNOQhdewTstQjSGJ9uAUAkwLyClH4PtH6VCNSd5Ae\/7V688gH23N7UQGdRs0xna5pBwBzygxbaPXImKf1SsDkGoQWxHBtwK7vOt9h1t872odS9vLla5PNvIF99IjrgWCa6J2xYi67GVduh1DeFMS+geN3Ws5arcl3mjTma\/OBwAHfPGoG1Z0Jla5ofA\/ABUfC\/FSPfe6mR0Ze94j0zCDCWkzYvJ+2fB6IB9v37ehbU3wQpHwTRZpZyhKVQINKp\/o6Db7h1rcTGOKS1R9osgDFNGMmdRsa8kLQ5CsAyAF75mhug2RG\/Zc+9o2mGb+jEhWx9GygIkhSoVhrJ\/Ssp9XqUnxUyVjRvWINsTfOD0ObbCIIvlPUcscSFpaTU2dma9P2pwcyMpJGJTbxNarBLZxra\/w7DHxd+8DWAG+14sJTqsANgLphbSelWgn4VSPUy0XoiyoAoA0FrexY2DAJQRDQIw3rPbzLRYjDPBfNcGhpeAeYWMKeJuRmGVwB8CMouz8VYkpQy7LnfMwlv1pXFyS5vFmTMfBoZOYqUfiVpc0F0OcS6kIpyvJTKuM5PhdbnkjFnwdrcLVPUO2TM+cJX3wcwMKsEFgCke9ea7PLm64nNYgrUfyM+AY6W2Y0XCaQ0gDMQum5zBORB0ABtBUP\/U50RFoC5GqE7IRmevpn27g8Vs08U2HGuNsnEU2VQFofBoEx927itbGQ0kTYEBoFZgDAXzEkYs4Q0t9BI7kgYcxKxORqM5VZYFfnQ3bcO2dqWjaz1\/1AhWG1drpYpY\/gw0vqkbF3r9ePxQFSUwAIA9qQyJvFTASyhQP074pNwzmL559kaYbzU3DAyjpfvt5WPtl1XWhswS3Gzcd0fpfo7yiBrO7c7O3e\/ckK\/QpgPRgOARWCzHIw6gOeT4UUAFoKRAM2aW7elEVkDnZytSd9G2vyIlPoIrKvQMjXmQJtLoPSNmIGcWLFbHNIb1gHAcHZ58zckckSB+k8A1XZcWCwxgijLrvtlU5XYUgZPK0ibywBzyUR\/DzhA6hjrsJoZkTWY8XuWrPwBjDmDjHmhbRHLlJYuY04TemZyYsXWpJ3a2DVsEu632ZHXYoazr1oslgOSY8f5jkm4D6R715ZLYLtE6LKdyFel5OXLo8zrvhrX3cCO8xUAW+30s0wJ5gYK1BmZ+tZpPyLFOmaAXW87JxKfYelcGy0SFoulpJMSzFL8xSTca1ODmcA2SOwpsOv+AsBQOb9EaqCT2XVuZSl\/CUDN6hkYGhzyZfgVl37zoPVFwg+m\/aZvrOMHoiC0zd1LUp8WBdYU6LeAbMoCi6VkS7ugp9l1P8eeZy0J5QBRFxPdTsDl5f4qTVu6h7sXr7hK5vkkGHP8rO1PR34DjDK8tcunktJvROlziREZcxwF+vBMY\/td03lBxymPiZXd2L1k5acF+0RavxE2JstiKcGyhH723E+YhPt0KoYFsi3PE8SaHfFngPtRIRFjJpHoEMp8lXz\/+5h9WfINS3GzqUpc3bQxW3ZhMz2LVjxMSp8LIA4pmJaR1udRoO4HMG2W+LK5Vmw8d4upSnycXecLALbZ1dNimVGG2HW+rhPejanBjLbNUQYI6mXH+TUx\/Ep5pXR\/BxvP+QtL+TuUeVzZJE44W1nK37PrlmVMsvHcDpbynpg8jiSjzxOBWjatU7B8JlYnmjZ3b9fVVd9g1\/0qyjymwGIpG5g1O\/I6k0z8ILUx49sGKY\/9jIW4jV336fFX2SqTF0skdrHrXAWirlk1DQU9zK7zcKq3PK3HqcGuPKS4EdNoMZrgDFkNpafV1SzKsJNGTMK7ij33wyDqRKWtHhZLvNCQ8mZ23c8bx9lpm6NMIAyw61xjPHek0l4t3bsWxnOfNK68ahYdtPOQ4vfGc3eUt0iU\/4j27ThQTVq\/PFvbMm1x3WWZeZiTiSE1p\/oHJpl4M4S4C4B1WVgsRZ9o0CzEzSaZ+Dc9p7o7PQOZjy1FIWDH+YFJJu5N966tyBdMbcwoTiR\/ylL8eVYcsom62XVuAVFZv6txZR8L8TfExL1LWr9I+H7aCqx9J9eGNUj3d2hTlbzLJLy3Rld3R2CxWIokrtiwFH\/nhPdBM6d6XXrDGtsm5dJzQtxtXPcadmRFpzMwnreDXfebAPoq\/KDDLMXfjeP0pnvL+3IJe57PUt4EYFdMHqmWAn1Wpr5tWi6BlHXtrFTfOjbVyXVclXg\/u85nAQzCugwtlqkug4qlvJkT3r+ZZGJtav2ztknKBaIu9txPm4TbWwb1IadEuncNjOs+yI7zXQC5yu1T7GApb4CUfvn32VrAkY9CiKdj8kgJ0voCUfAPsQJrNJHVuw4rN3dv1dVVXzcJ718hxAP7Ft61WCwT0VZsWMq\/cTLxXjWn+tlUf4c9sJQPW4zrfEFXV92d7u+cFf2W2pTxTcL7IQtxe6UerlmIx9hxHktViIveJL1NLMXNiEviUeYTSKkjMw3tVmCNOdEGuwJTXfUnk\/CuYFdeC2C3XW8tlgnhsyOvZ8\/7oJ5T1dls3YJlJa7YdT7LycR16b51s+qAaRKJTew6X0Powag0CnDkH9hzKyY1UaqvQ7OUfwFhU0wE1iLS5gLyg6InQBWVNBJT\/R1Gz6leY5KJD5nwluE6zLpcKeV9WIN18ZZsIWdH\/sQkE+\/hhLcmvd6KqzJiI3vuJ00yebVOeLnZ9vLpvrVsEok72HF+iEoro0PUw45zEzuiokQze+5aJvFoTB5HkNZnk1Y1VmAdbLJtWIOmzd07TXXVD03SewML8WfYOoblwBBL+XuW4ibM7lpjpWAnO843TTL5saYtPQNNA522RcqHrey6n9VVVT9q2pTJN89SYcyuExjX+SELeqSCXsuwFLcbz+1Kr6+seDomGmIp\/4D4uAnbSOkTrcAaJ6mBTqXnVD9gkom3Gs\/9EIiesht3LPEh6H723HeZqsTbTCLxVnbktwBst00z\/Qs4iJ5mz32\/SSY+a5LeJtskZcUmdt1Pm2Ti2tRgZ2E2N0S6dy044a5n1\/kKgEoZx7sg5e9TA50Vl9yXHYchxT9AlI3JI1WRNpdla5uLmhNLVPSk27CWTVVyk6mu+r6uSrySHef7CMvsWDdUPDb3HnadL5tk4tW6KvnTps3d20xVsk9XVX3CeN4Hosln+2rahK34s0kmXq\/nVP3UJLyhSr91VmEMcML9uKlKXG2SiZxtDiA10GVMInEjO\/JXZX+YZoAFPWYc58GKFcSO081C3BmTNZ7ImFOFH7RagTXBjkwNdGpTXfWsqUr+h0l472Qh7kNc0vXPTnaxlL80Ce91urrq8yu3ru9ODXbxP\/trU2bYVCd\/Zjz3HSzI9lXx2cqOvMpUJd5lksnHUv2dulITUlYgDKIuk\/A+YJLJnzRtzBTSNo3GXpG1MTPCnvttJnq6rF+EoCDlH+HKHRV7wvacAsLbhPHIxs9cR0qfka1vLZouErNl4qU3rEXTpsyQrqr6DScTr2bP\/QiInrSb94wyAiHuNAnvLSaZeJeuTt6dGuzyRz+NdiqTTNzCyeRr2XG+DGAA1po1VXwIcY9JeG82VclP6eqq3lT\/Otsq5cMwS\/kbk\/RebxLeb5sGuwq2SUbZuF13HbtOederJVrPUt7M0qnYG6Hpvg5mx7kbRHE53SWg9EXkBwuL9Qed2Tb50gMdBsD6TH3blSJf+Ivwg9eT1q8Fc2o2Cc4ZJgchHjKO\/Cl77h+NlxhM9609qFhKDXYZAN3ZmpbPiULhdgqCD5A2ZwFI2iadkM2DIdDPjnO18bxrjOdtSPevs2K1vITx0+zIH5pE4mdNmzI7bJMceN3oXtL0RzbmHFL6NQBkuc3YsFC305WqcMuyTnj95Ac3k1LHxKGfyPDxFKijsg3ttxWj7Z3ZOgnTfesYwLpsTfPnRcH\/Myn1JtL6UjCWWaFVNPIsxGOQ4sfGdf9kkl5\/uq9jwmkzUoOdQaah7VaRF08LP3gzKf1mMDeV4cJZIquHuB2uc5VOJu5IWatHOVEA0TPsOD8zrnM9J9zuVH+nTaI8HoVSldjBxnyVtDkGzIeV2ePvYin+YGZByo10f4fpWdh4C2n9DjAvisHIOYS0OY\/84C4UwbvlzPaJmBrs8jP1rfeLQD1JgfoxKf1a0vo8MK8E4MIyGUai7MM\/Zkf+Ga4z2DTYNaWNId27jgEMdi9L\/w8p9ScK1FtIqZcDqANAtslHFbePsOt8B9K5ySTcrTYre3loAwBDEOJplvIX7MobjOv2pqY4f2bdur5hLbK1LU+Q1t8jP\/gygOqyGQAknuSEd+9suXTCjnyEA3qImM+JweMI0vo80vpbADZYgVUMFd3XAYTFou\/N1jQ\/LILge+SrV4YWLV4NwLOtNC5yIHqYHecnJuH+iT1vINVXXFdU06aMD+CJbG3LR0S+8FsK1LtIm7OBOJx+YoEC0Vp2nGuN5\/6KPXeDFVZlIaqGQdTDQjzEUt7MrnMbJ7yNqb51NlHyZEXWQKfpXtr0S6H1S0ibS8rkIKbYEX9mz90yawa\/FLshxd9gzFmIg1eCuRlKv8AKrOmYlGHQ9dPZmvTnha\/+j5S6ENpcQsYcBeAQWLfU\/hgQtkGIe1iKX7Hj3K49byA90DmtG0NqoLOQrW\/7B\/n+4xSoM0jp15PRp8FgMWjW9REDyEPQOpbydyzlr0zC60wNdtm8b\/HtLwVgJ4ToYCHugqR7WMjH2XE2shS51ECnFcXFaGjX2cqB+xUyhaPBWBn7Bybqh5R\/SfXOnhhJdhzDUt5KSg+AuSEGj1RNWl+QrUn\/ITWYmVKSciuwxhRamSDTuKpL+P63oM1PSOsjSanzYfhMMmYVgDmY3bFaAYj6WIq\/s+P8kh35AEu5G47kdO\/M3ExL9a0DgJ3ZupY\/kNK3UqCOIqUuJ23OB3MTGF6FOw8ZoG0s6GE48tfsOjezEP3GcVQ6LoVhmfcWQJqdjlwDoADQCAibQNjIRFkI+SRL8QBL2QEhtrHr6GJbe58n6SgGw3Wm1\/H+Ts4uSz9EWn+flPoU4nxBhplZyr+z43TMpgmS7luHnqVNHRyIe0jrV8RgpBIZ\/UJRCFqyDe1PTSXY3QqsA3V8WOzWIMwqfke2tuUuClQdBeoE0vocMubFYF6B2XOrjaNT97MsxM3sOjew565hR+RSvaVbE1L9nYywuPdd2dqW+4Xv\/4ACdSG0OY+MOQLAogoTwwUQbWAh7mBHXs+uey977rZp3aAnO2CEMBQWde2ZNYKKxCAIeSYMgKgLRF0sxHoI0c2O3MFSDpM2ftOmzLQ\/TLauFTw0EhChr8TrVJ6ISnLBIrUp43cvbbpGjpgTYcwxsR05RAVIeYNJeLOutJvxvCHhB38grY9BHEJyGEzML4HRazGFYHcbHDyZRauhDeQHVaR0PbQ+jrQ5l4x5IZjrwagCVVS7BiDaxkQZSHEbC3ELS\/kMu+621GBnbHOIZWtbpfD9Q6B1OxlzBrR5CTEfDuaFZXiwCF2ARH0sxL0sxc2Q8kF2nPXsubk4X+XuXpZyKFCNmDUXRoiZsINAiiUV2HUKEEKneteVaB60gAI1h7SuL7l9RsrBpi3du0vx4ZkVqyCHcjVgMz\/O85wd2d+0uXt4Nu6r3Uub5pDScbm0ROzIYXac\/tQUwl2swJri4gWASBuXtG4kpU6CNmeTMaujW4gLolNjObWzQVgceysLsQZC3AZH3mYcp5OF2M6O1Om+8klOmalvAyktyJgFpNQRpPWZpM1xYF4N5hoAVYindSsAsB2CukHiaZbyNuOI+1g66yGlz0SctklCLRaLJb7HLdsERRRcDe2gQCVJqUOg9UoYbiVjTgDzocTcBuYlYCQAFqAYND1HgoowBKLNLGgtSDwJosdZ0Bp23B525I7UYGfF3GTK1jQLMjyXgqARxhxGhk+CMScScwOYF4Oj2Dqa8Z7wAeyGoAEm8QyIHopidDrhONuMI\/LRbVeLxWKxWIE1ywVXfRshCFzSppoM18HoJmK0gU0LDDcTcx2YlyC0dDkILSky6pdi9Q0D0AhvLfkg7AZoJxNtAVEnhHiKBT0GQRtYiI3sOHmWMignK9VkyTS0gQLtiiCYD2AxjKknw6vB3AJjDiPmRoCrwFiIMC7Aib4m2j+M0DK4pw9yAO0EsI2FyEKIp0BYw0L0gGiAhdjOrpNnRxpbgNlisViswLKMR3TVhS4rliJJKphPSi8nw60wZiGA+QDXgFFFzHUAkpEba08\/1SK8vTgaOQD92HtVR4FokIkGQbQBhF4WoheCNoHEZvbcIQZGwKxSg122Y\/YVXrUtREC18IOFYJ4Lw3XEZjmYl4G5Ifz\/XD3e2cNCDAK0EUA\/S9EPQZsB2siuu5uFGAIb3\/aBxWKxWIFlmS7xVd9KAAQMS\/IDD4I8EC0FgwEIYj4DzPUY5b4zEzZCiFvB0FHPGjBvhpB5liIAkUn12ZidKQmv+jYiZgmlPKH0uOK2WBDYcXwIoVhKE91MtVgsFosVWJaSbeiN7SDe20cUBA6Yx+gzYvZctZ\/oYutislgsFovFYrFYLBaLxWKxWCwWi8VisVgsFovFYrFYLBaLxWKxWCwWi8VisVgsFovFYrFYLBaLpVjYNA0VADO7AOqwt6YeAdgFYCsR8QT\/lgRQg70VzQnADiLaNk3PLhAmUPX2ee4tNA2lhKJ3W46wPuRY7bIDYS1GDcCnaSppxMwAsBDAogM8y8EYBrB5on08zWMxEY0fEb3XABEVpthOSwHMi\/5eAcBGItKTGF8awCAR+TGcw3vGAgDsjuYAT6KtFkXjaqpjgqKxtXuK70UAlkT9B4QJkQenY8xGn7UUwNzo\/bcB2FmsORy175xoDdnz\/Nuj9XGia94yANXT3SaW0uLYJqgIlgH4drSQ7Vkc\/wzgSwhr3E2ERQC+DKBln3\/7PwDfmaZnnw\/gvwC0RZvynwF8PtoMi81cAJ8DcPgY3zcAbgPQFQm9Z5l5C4CdAPJFFlsCwMsBvH0Km+HfAXwaYQmeuNAG4KtRvw4BeD+Ap6fYTv8K4OKonboA\/DuAgQn0+f8DcGi04b43+htx4+UA3ha97+8B\/Pck+lUCeDWAK6KxPFW+COAPU\/wbHoD3ATg7WpeeAvDBaE4VGxfAuwCcH60f3wTwiyJ\/xhFR37jR\/\/9FtDYGE1xjPx\/9LQbw16itfViswLLEjmQkGlbu17c\/BtAzwRPa8QDOA7B4H9FxyzQ+++HR4lsT\/f+FAK4DMB0pz91IAJx0gJ85NtrYdCSyBgE8BOCXzPwAEeWK+Dz1AE6cwu+vR\/ys0HMBHB1ZErZi7NJOE7GkNO3TTkcAeJyZvzFOS5QDoDXq84F9rAZxozaaezIab5Pt1zoAJxThefQ+B7apsALApVG\/AUA7gN8AuHEa2lAASEVjJUBoaSo2HQhLkl0efd4SAA8w873jOYBFVvSXAXhVNFfWALhpggLNYgWWZYbZ3wrSDuBUZl4\/AdNzVTT5F+33d6fFdB25k14WbcYq2lRWAjiXmdcRkZnm9toYWTX2JREtfHtcXfWR6LokElnfBNBTJHP+nrYlhK6GwQm29UAZjEku8tiuBvAeAI8w89\/H0Q88E2O5yO84lWfcAuDZMf4GAWjAXnfrAEKX+GiY6IAxlfktALwkOtTseZ75AF4W9Z0\/ze1Y1PWDiMDMWxFam9qig0QaoUXu7dEcPtgB9nCEVt25Uft+A8AD1j1oBZalPNDR1xwALwXwR4QxHRjH5E9jryk\/wF4z+HSIqz2fd0F0ErwZofXqpOh09xsAfdPYTiZa3H6236KcjDaBuQBWATgjapNahO6lYwF8kJkfK\/Ki+AcAn5ngSTaHeLkHZ4oGhK7eLgBZO+WfM\/d\/FM2d0camizCU4IJo3Hwl+tmx2DHF51kUzeUEgLXReD0awDkADo3m0HS2R9H\/eCSyngTwBQDfRWjBugDAm5n5mwcRjYsBfCJaVzSAnwL46XjjCS1WYFlKTx+AhyNx9SIAqwE8MI7fEwhdgw0IY2f+BuBChC6L6UAAODcSWXkAv8Rea9GRAE5n5l9M88luGED\/WJYyZr4zEmAvAfBZAEcBOB3A\/yCMc9lQxFN3IXoWG4dxYAHRg9DtdAKADzPzR6caiF0pRGJlJ8aIb2JmL5pre8bcbiKazkPMC6L5zAhjlfIADkPoxnwZwngsVYbtbJj5TwCOQxgPWA3g3wA8xsy3jrZmMbMD4F\/2OVDeD+Br0RpkqVCEbYKK5GaE5uelAC6P\/P4HYwnCuAIJoBPAfdM8PhYjDOx1IyvE7QhjEbYgtL69AntvHpVswyKiEQB\/Qmi9Whedil8I4A3jbFdL8QgAXAngrmicvhbAK2w\/xA9mrsLeOKONAP4SrUt90cH+IgCNkSW7HMkjtGDdhtAaXg\/gPwA07P9O0e3GE6I1pBqha\/YLALLTbMGzWIFlmYY+fSzahPZYpRoPshgSgFOj06UGcD1Ct+K0zP5oAToFoUWII2HVG51o749+7IUAjonLiRXAPQCuihZWLxKA9Xa4zWxXROPkv6KNegGAjwM4qYw36koUV8Beay8B+AfCuLA10UGKEVrWX1Kue1AkjDYA+BRCVzUhDCd4D0KX6P6Hyf9EGIBfAPADADdNc4ypxQosyzSxC8ANkRhoRuhuO5BY2mMxmosw0PovmJ40CXuoBvBK7A30\/AtCV0EeYSxSEC1KL41M63ERWX\/G3iv+KwCsshv7zO\/fAG6NrAcFhC7m\/0RorbXEAw+hdboWoQvsD9F\/c9G6NIQw1vFlCOMdy1Pth67ABxHGcg4jtMxdAeCcPettZF19bSQmCWFqle\/aUAArsCzli4kmcgfCm4EvRxhAPtZp8wgAp0X\/dDumJ0XCvp935D6n24cBPB654\/Z8fmf0vYsRBsPGpV23AcjsIxKbUDwrn1Vq49\/YFICrEeYPYoSXEN7DzEnbOiVWv3svr1yE0I37FIA7iIij+X0PgCejHz8FwBnlfEiJAtR\/ijDGTEdC\/+MAWiORdTqAD0TrcCfC\/Fcb7UiZHdgg98plPcKYh0MBnAzgSGa+YxSfvxsthjXRyfJ6TG\/gpYcwAL8mskD8DmG+pD30RxaKdoSuzYsBPIN4BMMq7L267kUbiSzCsxHCnD2nM\/N4LYfbADw5i28gbUZ4Xb4d4a2sdwB4kpl\/Z10vJT+0n4\/Qch4gtPrum05kC8KbzSchjLG8PFqnRsr4nXchvJG5OhKNxwP4EICvA\/gYwtQzuxBejnnQpmSwAstS\/qf8ILrp8kbsvUp8D56fBqBun9PmGoSxW9OV9wqRaNrzed3R6XbfDbGA0KXwaoRuwksQZpLfEINm9RHGAO3JXZUo4t8+D3utiOPhNgBvKPONaSrjm5n5YYQ3sb6GsJrBxwE8xcxrbPBwyViM0PXnRoelG\/c7BBiElsd3I7yxfBpCK\/VD5dpnUeqGToQVMH4QHZZeEx3ATove+XcAfhFZXy2z6LRhqVweRBhgSpGoqR9F8JyBvXlZfgVg0zSPtwuwN\/HgPQjN5s9ZrBC6DR+J\/ukIAGceJIZsJpmu0ydF7TPer1mvIKKN+xcIU3wYhK7nT2AMd7hlmidGuJ6chjDXFQDcidD6vP\/8XoewOgRHB7w9t4nLWvAjvKzz9eiQOA\/AWZER4xGE1tZddpTMLqwFq7IZiU5OFyI02Z\/FzD\/c56Q4H6GlyEPoUrwpyvEyXZv3AoRlM5zo2f4B4JBRYjAIwN2R+Ntz3ft6TE\/9songRpYSwt5M18USXDcirJ02Xpff9mghn+0ia4iZv4wwJ9ExAC4D8Og4kj5ais8chJdX5kRj83YAC5l5wSg\/ewf2BrlfgjCmrqvMx6LPzNcgvJF9UbRODCKshdllrapWYFkq7FAZCZU10en+pQB+C2BHJGqORRgvwNhb5Hg6T7cnRxshIlH3QYTFWUdjPvYmOT0JwPFReY1StqcXnbiB0F3Yg+LcttxTtucuKwomRQZh6oZvIwwyfh\/CeoV\/t00zQwvN3vXkhZGwkAiTb759jF9JILxJCISF5c9m5mwFxM9tRWi5uzBqh2cA3GPjAq3AslTe6R7M3IcwDcLh+wiVW6LF7XKE5Sx2Avg9wmvU03m6fU0knPZYfVrHITyA0OVzOcL4sFJabZYizGUDhHnCOovZXXbETnqc78msfTTC4OJGhJn3O1F6q+dsIYnQ1bd8n\/HcPM4x70Xz+9d47oWXsh2S+\/xvgyLXRLRYgWWJDwFCN+HrEcZgXRKdsPbUHRQIY7Xunq7bLdHp9jCEV5YFwvQRPxqHoFsO4G0IA2fPRXhj7IkSntAPx96krT0AOq3ZPzYiKxcV4j4RYc6hEyOx9RXbOjMyN9LR2iIR3hT8fvTfA7EYoYVrGcJM56cy8x\/snLJYgWUpl40HzPwMQuvPqxEWWv1u9N89mYVvQHjtf7pwo8W3HqFL7Y8Avnowdxgzz4tOwZdHwuYVzPwsEQUz2YbRBlKHMBVAVXQivQPTeyHAMnE2Ym\/qhsboULEGNsfYdLPn8kpj1NZ3AvgSEQ0dZF5VIbxJeAXCoPDXIwxVsLUlLRUzMSyVzwj25rdKI8wtdVkkfDYA+Nt0xQhE4qQGewtHb0WYhmE8sUb75uXaU7+smOVpaBzPTwgzUn8awJnR7wwA+J29ch27wwRHB4krozGzEKEVq9W2zrSyNDoE7bm8cl00dw9GHs8ty3UqgKNsdQSLFViWctp4EG08ayJR9R6Ewe1AmPE9M82PcCZCFyEQuiMfHY8bYJ8Nc0+s02oUN2WDHsu6wcwOM9cjvBjwPYT5xLxo4\/g6gIeK3EbajtSijPUAwA+jjdsgtNLW2JaZHqK5eMY+83sNgDsnML\/vw96ULMsR3jL2ivR4NvbJUlKsi3D2sDHadI7G3jiiXQjjs6bTErMAYS0uF2E82I2YWD6YfoSZno9AePPolQhvQk41eJki8dQ8yomZARyC8MZjGmHNRCB0CV6FMJlgMW\/7EYAXAPgST+z4vh7A1UQ0bIf3c9gB4L8RFhw+3DbHtDIfe1MzKISXZSbiOt8c\/c7J0fy+BMAPmHndFGOxJEIr\/coJHMi2APg+EW2z3WqxAssyETRC19xbsPcm3N0AHpjG0y0Q3lzck5qhB8BEUy2o6LmvQBgMexKAU5j5xikuwAJhMPRZBxE+HIm5exBasm4C4E9DIO7RkSCYCPchrINmBdZzLSNg5icBfAnAt2ATj07n\/D4Oe1Mz9CIsjaMm0FeGmf8K4F8RWqibEYYCfB1Ti50TCC3nL57A76wD8HNMbzyqxQosS7mtddEmuwNhPAOPselkENb5ezlCa9L1AHaNIRYU9lqJJmutSSC8\/UfRs\/0VYXmcyWyW9yB0RRiEAbW3IYzhmGg7jUTPMh5htzYSMXcidFVuK\/JNSx9Ts8QNIX4B3CYag27032K4aQpRn\/nj3byjjfuGSJC\/Ltpwi\/U800EQvaPE9KYi2dOWAZ5fNmuieAhjK53ob94MYDKWp0y0NtREa8XZAK6dpNDJj3N+T+d8CqJ5TdF6Y4PKZuthzzZBRZwkkwiLOnvRJvQsEeVG+TlC6B6sQ2jR6hrNHB6dTJcDaIrGSB8RbZjEczkIA4wXRItML4D+iYqU6LnTCINpOVoI1040yDx6nnaEN5YO9gwaoXtyMwBV7BQW0TvVI7xFNdm\/PQxgTZyC7aObn+2RUNDR8w1NsZ329L1BmBpj2zh\/d884XhmN4yB6npEYzuGGaDwQQhdbdprGXBtC9zdHn7FpCn9PRn29J7ddH4DeyVh3mbkOe0MXAgDPEFF+gn9DRGNlySTnVCFaOwtTbOPa6F0IYTjEOnshxmKxWCwWi8VisVgsFovFYrFYLBaLxWKxWCwWi8VisVgsFovFYrFYLBaLxWKxWCwWi8VisVgsFovFYrFYLBaLxWKxWCwWi8VisVjKlP8P4OtyuBiPnkMAAAAASUVORK5CYII=\"><\/span>\r\n      <span class=\"cfs-logo-src\" role=\"img\" aria-label=\"Cieffeplast s.r.l.\" data-width=\"600\" data-height=\"100\" data-logo=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlgAAABkCAYAAABaQU4jAAAjbklEQVR42u2deZyV1XnHv2cWmAEEBBlAHcQdEfc9UeuucYlbYmxSG5s2MXuztGmTTxLN0iat2ZpYE02jJjZWjanGHZe44hKNgLiLgoxsAwzIMDPM+vSP57nlzggz977Lve\/ceb6fz3yUUd773vOe95zfeVZwHMdxHMdxHMdxHMdxHMdxHMdxHMdxHMdxHMdxHMdxHMdxHMdxHMdxHMdxHMdxHMdxHMdxHMdxHMdxHMdxHMdxHMdxHMdxHMdxHMdxHMdxHMdxHMdxHMdxHMdxHMdxHMdxHMdxHMdxHMdxHMdxHMcZGQQfAsdxHKeSEZFqoBroCyH0+Ig4LrAcx3EcZ2gBldvPaoEpwG7ArsCOwDhgAtAArAfWAH1Ak\/35TWCV\/Xs30BuCb42OC6zci1ULjAHqgWnAeGC0vVRdQAuwFmgF2oBOoDOE0FeGe6XYlzfq36u0+yz2+lm7nzK+H5HuUUQmA7NTXCf6gGagN++97AM6gK4Un9s4YD9bN6KwHnix1OtHxO86Ddgr5mV6gUUhhI0Z\/Y41wC7ACcB7gQPsz2NQq1WV\/a9VgOT99Jmg2gSsBN4AFgELgBfsd+0hBCnxeJeCFpvDguMCayubRh3QCBwIHAHsC+xgJ5Y6oMYEV27xbrNJ1QK8DbwKLLYX6q0QQnsK9zkGuNBOVADtwM0hhNVFXKMKOMUWjVKy1u61tcD7HA2cB8xI8Z42AjeFEFoKvKcDbezSnOcLgPsKWahEpBa4ANi5xM9yCXBrCKG7yPl7GnAtMCrFe2u1d7TF3o9O4GXgFXtHlwKrknw\/RWQO8DuzaERZM+8DPhpC6Mz4OlkFfBH45zyREYUu4MshhBsy+P1mAh8EPmR7QNy52mdzcBnwPPA48BCwOITQUcA9fRj4acb31gDcBXys2DXBKY6aYSaq6m0DPwp4H3AwMN1+v60FpNYE1+S8zV\/yTsprgKdF5C7gYWBlCKE3odseA1wCHGp\/XgU8Aqwu4hpVwNnAJ0o85AuAu20DLIRRwMXASSne01LgftuMC+EQ4Dspz\/MrgAdMJAxFrY3RCSV+lncCd9hpvRhqge1Ra3BaTLJ\/7pb3u5PsXttM6D8vIvcDDwJLE4ihqUat25Mi\/v2xw2TZ3AE43da+OBu+AGeJyB9CCG0Z2AuCieOPABcB+yQ4R6tsP9nbft6PWrIeEZGbgCeBdwY5UI2yd6Yq43NjnMsfF1i5F6rOLDgft81pmommsI0TCLbhddniUGvftcr+TrBFdpz9zATOARYCN4nIPXZiSSIYMtDfRB31pS\/1C1sV87tm4Z5CCcYuZGyMkrjHLJywR+VtVnsAZ6IW5xtF5LcmtNy9MfiB9DDgoASef0Bdb7OBZ8r8varswPoN2wvGpPyRo21\/mGFi61HgBhF5CFjjsVrOsBVYdlLZE\/gY6lqZYcJooKB6Bw1YXA68CKxArVNr7f+ZYKfO3YBZdp1d7KSSE1x1qKvxQPu834rI9cCKDC7km1Azdpq05onVKPSiLr0k41TeiXm9pMct2DyLOj\/6bIx6U3yOwb73cBYjwTa6fW1jPQm4XETuDyF0+TK+TWFwpq19STANOFFEnkvQwl\/sflANHA38m4nHUh5Uqkzsv9\/u4VPALcP8vXJGosAyYTUd9a3\/NTCH\/r71ThNRT6MutwUmsDYCm4EeQHKni1ygL1vchZPQINczgeOAnUyA5RbyOcClqGvuKhG5DdiQkdNKL3A5cE\/KlolONJg3KiuBz9o\/k6LbnnsUeoCfo7E3SY1bQIO0oy6yzbZQr0h5zmxErbmVwCjgWDSQ+FoR+YlbErbKDODEBEVILRqW8Ss0rKIc4upM4Pv27MvpgnsNteS5uHKGl8CyF+kY4DLgSLb41sWsBYuA\/0VjSt7IbRyDLbB5\/63bflpF5C3gXjTg+FhbPN6DBs7nLFpH2qn5NOAHdnord+aQAEtCCM9kfG51oplHb2ZlagFNGRu3TmBhCGGJL0VFC9vpwJfMqnCpiLjI6s+JqJU+SQ4ADhaRuaUc67xEn8tRd3E5H3Qr8Atgmc83Z9gILLMyjQLOB76JBhjmZvBm4CngejTQtSmu0LGXowdYKiJLgd+j8QqfsZd5e\/v87YAPoK7Kr4jIQ8MhPdtxRgB1qDu\/G7hMRNb7pgciMtYOhUlnf44HzrA1uKdE3wU75F4G7E754wn\/DNzje4AzrAQWMBX4HPB3aIZIMKvDKtQs\/Qs0wy\/xiW2LcpuIPI4Guh8HfB61aOVqqRwI\/Ah16TzhU8dxMsFoNPmlD3Xrb\/QhYT\/g8BSuG4DjUav\/0hKK6L9BM8bLnZnXhpYtWetTzCmEsqeSikiViMwCfgz8gwmtYKfSP5ng+nYIYXnap4YQAiGE1hDCHWj676VoPZ4+G6vZlD7F3nGcwam3Tfgki98csVjRzdPZUnsvaXYDjinFOJv16iDUg1BuY4CgMb\/3efaqMywElvnW3wP8Eg1oz8VbtaMZGn8L3FuOYmghhFXAT4CPAo+ZyApkv76J44xEJqA1xiaO8HGYhroH0xIk9WgmXSlqgdWh9f92zsC4vgNcTRkC\/B0XWFHEVTBx9WP7Z25B2AD8EHUXlrUdhdXBegb4AlqE1KveOk52OQ74i5H65W1NPQotvJnasoi6H2fnZWenxSy0JEfS1rIeiiuNIrb+3+exV04xlNPsuifwPfr71tcC\/wn8sNAWLSUQWSIiC9E4j8soUXCn4zhFMw64QETuDSFsHoHfvw4tLZO2dWknNOv6ubTWQxOL7yUZV2euVuJ8trRfGoW2VdsZLfswk21Xg38HuIZ4ZWscF1glO2lNAP4eLeyZE1frgG8B14UQNmVpkMzn\/qaIfN2EoeM4Q7MQbS0SbDOrz\/tvY1F31vb277VJvKpoAcoZaK2ikcbuqDcg7fioauBUNPFodUqfMRYtnxM3E3I9cDtwA5oB2Ip6IoLtf6PRkh9HoK7V49Ekq\/yC1o8BjxSYodqNlhOqLuIeq2J+z16K965sxqk8gWVBmB9C+0jlFtUu4NfANWk0XU6QZWijaMdxhuYB4Otm5agasPGPQXvlNZgoOB11b8XtKbcjGoT9+kgKRjaLz0mULl5pP+AQEbk7pdIY04H9Y4rFlaiX5DqgdcB9iu07XWhdxNfRUj2Ho8Wt34cmXK1DCxQXmp36MHBhEfctqAXtO0Rv+\/MI2mC6GPflctwbU3kCC3UJfhmtqZJT3\/eiJRCKFldN9Q0BDWxtRIvQzbA\/BzStdjVakHQpsKqxoznypLIX1H3wjlMYfUDPNnp65joFvC4i84DfAl9Fs4brYnxmvVkhbrT3f6SwPVqjqrZEnzcWDXafS8Ktniy2azbqioxKD1re5+oQwpDtsUyMtwMPi8ifTGB9DXgeeKxQERlCWG7ipZjvexjx4nvfBuaOULe4C6y8iTQZrb6cq8YrqBvhUrTnX6GiCluE9wHOAk62a26Hmlpr8hb4nMl2JfBUU33DbajbYl1jR7On2zpOmbH3foWIXGrv7CeJ7jIJaKuriSNFYJkgOQQtaVCyx4YmFewCvJnCtXclXizZOuCOQsTVVuZju4jcCrxgv9rkb6mTaYFlLXAuQPtJ5eKu1qBxVwsLNec31TdU2wJ6iZ2gprPtbMhq+6mzE94+qHvyaeDnTfUN9wKbGjuafSY4TvlpQV0dx6MuqKhMRAPeRwq5xs4TS\/y5M4DjRGRJwu7YGhNucbLc11KkJWmAyOoTkVfzDgCOUzSlLNMwFY27yp1KetFaV\/cXIa7GoP7x\/zGBtVOR3yHY55+A1jS5HNjVLGKO45QR28iWoXEscTbsakrnKssCO6PtvapL\/Ll1qCstaTEbEnh+Y+LelxWe9hfTybbAsgDM4+hvwn4RuAJ13w0lrGiqb5iCBgL+GLVExb337dF4j18DRzbVN3gBUccpv8jqRlPp48SkjEUD6CseW1uPRV1qUehC41OjxFHlSinMKUFNrGKZBpwlIqP8rXIqWmChAe0XsyVLogsNQn2twBPCZOC7wGfRis1JUQMcDVwFHGUB847jlJc1xAucHkkdF8ai7sGo2ZdL0fp+UWs8NaDWsyTDTXIZfnGot\/3iXBGp9VfKqUiBlddPKt969RZwZwhh0EXULFdjgC+ivQHTOI0ENN7jcmAvdxc6jjOMmI2Wt4gqZOYDD7EloLtYqk1gTU7wO\/UAKxK4zgzgX9Dis+NHep9KpwIFlp2sLgAm5b3Uj6JugELu7xzg0\/QvUpiGyDoCrdkzwaeF45QV3wgLO7xWo8Uxo1Y7bwfuQjOs7yd6XaT9bf1Mks3EL4kT0ObUP0VDQc4VkZ1EZFQGXZqOC6xITEPdcLnP6kAD2wsxAe8KfAWNlyrFWJwLfMDjsRynrOxAvIDtHrTOVqUzFQ0yj+qeWwo8bnFvj6KZd1EYC5ydoCtOgGaSqTYe7HB\/toms24EfABeKyN4iMsbFlpMWpSjTsAf9C8a9BfxpqL\/UVN9Qg2YMzi7heIxFew7ej2YzOY5TQkRkNLAv8bLI2tE6SJU8Tjmr+6wYIuZptpQyeAV1E06LKGKORksrLI6tiEJARN5G29qMSWjIAppVeDBwIPAx1A25AHhMRB5FC1K3jaQOAE66VJVgEdgbLQCa40kK86\/PBM6n9OnWBwCnuxXLcUouGkDdTacRz024kQhdIYYZ9ahVJmpIQyvqHsx5ElqAB4mevdkInJRgnNOraBHqNMROlR2m9wQ+gMbf3oVauC4Skd1EpNYtW06mBZaJo\/3YYilrR1srDOoetGy+49HmpaWmDo37GufTw3FKykS0CfwuMa+zksJ7xw1XdkXLM0QVNK8DT+WyuEMIfWj9sZYYgu90kothXQ\/cQ\/xswqEIaJzwTsB5aAPrP6CZlftanJvjRCJtF+EoWyxzi8AGtDSDFPCyHk+8nmRxOBAtQLowg1Xeq+zFPyXF59cHPBNCiONmGQMcKyKzEryv14DFEYv\/BWCPhMetFXi6wHjCbc3zo0Vk7xQPOx32LDPZ7sMsHqPRUIJP2SYXZywEaCKZ+B0yPGbHE72xswCPoeUw8nkZWITGdkXhMFub5sUt0GmV1P+IxmI1lnB469FOIbNQ69bvReS3wCtDZb07TqkF1njU1ZejhcJiIyahrrpyMQWN\/VqYwWdWBXzBTvppna460YD\/B2JcYxpaLT+xfQWthfZdorkNaoBP2E9S4\/YSmqLeHGOeXWXPNC2B1YT263ypDHN1KrC\/bN3XImhqf6OJhWPQtPq4z6YLeIbKDnIfj7YJixo+8Q7qSejeyu8fQjtdVEWcz6eisV09CXzPV4G70YLQpbYk1QB7oUlWZwNXisiNwDqv7u5kRWBtT\/\/+WB0FniynET31OCkRMzvDz210yteXBBa0JNpdJD1fk7aIjiJerFAg3fIjuXssVzzh+cBJg4xRPRoLk+Q8aUZdX5UcQHMQamWPczCYvw2h8DDqnotS1ypXNuLnqJs2iYPeVagrdBblKd9RbXvBv6JJBd8mgUB+xwVWEtQO2KjXFHiynEz\/wPhyMCPDz62b+DVihlrY4p5Ak6jGnPT1eohXIXwgm4kXhCv2LNMUA10pX38wxrKl92gpENR6VbEboJVCOIMtdQWLpRcNZn+XJ8Gy914BnketilGYBRyOxjHFO6Hp\/SwC\/gn4ERqTWy7z0XjgQmAXEfka8KTFrTlO2QTWBPoHi7dQWJZKPelUbS\/23rNIH3At8ERKi02wRTiuS2kNmp2zNqF7Aq06HVUs9KJNwv+Y4DhtIF4wdQvwb7w7FiZJNpNMVezhwCbgBvtnpTKDeI2dO4DnBjlAbUL7xEYVWOOAU0TkjiQESAihR0TusQP3t9HCoeUSWbWoK\/vHwN+JyCIv6eCUU2BV824LVpcPe2yB9XgI4fqM32cr8L8hhDczNG7PhBCuy5gguCWEsMSndWwE+LO9G5X5BTW4\/SjiZVdvAlYPMka9aAHSbqK5bgPqvtyB6LGJWxNZv7MDyVeAI0nftT7Y9zvI7uNTts455XsnBps3FS+whP6urEK\/cYcJsboyjs07Pn0dZ9jQgiZVrKng77gdWkImavFNQYs8vzjIptQrIg+jBUhnRvyc2cARZsVKRtWE0C0ic1H35VloQeg5xI+DjLpvnoHW\/brNrVhl1zDvoX+m6XrUDd6ZhZtLkw12YsqdNqahAdpDFQFcZyeDcgosr+TuOMODbuAa4PYKj4vZG62YHmKM09wQwlBu7VfQTMBdIn7WeBMg95NguQwTMitE5Gq79uloht9h9pmlFFoTTOQ9ZPucUx7q0Kz6c\/N+twC1Zq8u982lnV3UTX9ffx2FxQ6sIpnYnaj0UZ60dsdxin9X7wV+FkJoq9Qvae7B01DXW1SWo1mCQ9FmAiaqBaAKzfxrTKMaeghBLPTgSuAjwMUmsF+xg3kpRHYADkHbOjlOWQRWC2quy9FAYSUGWihvDao1LrAcJ\/P0oHWSvoDW+6pkpgBnEq98ylNofNVQAgbUMhPHir87cCIpWpVCCH0hhGY0Y\/EzqEXrL9HEkblmwUgzS3d74NAE2wM5LrCKopX+GUxTKCw7rwPN9iqXD3UBsCSDVdwdx1HagN+hBXffHAHFH49EXYRxxusOW1sL4W3g0RjiZJQJwtRbjplFqzOEsCSEcBfwNbSkwjnAN2wvWU\/ylq1aey5j\/HV0yiGwutCaNJInsHYdymzc2NEsqCn7jTKMyWbgNio71dtxhitdaEuXrwKfHwniSkTqTazEqQ241A6Oo0Wkbqgf2xvuK0KQbY1DKYMLLYRACGFDCOEptFTMXwIfBP4DLVHRkeDHzaB8GY1Oxkk7yL0LeBb1kdeh1qvjTTwNVchyCXCLLaS1JRyThcDdjR3NXkTOcTKiMVALzMuoO+j3dnDrGSFtS3YDjot5IN4BLdZZaAHhgFqf4n7mGSLyTLn6+FnSwxoReRB4BE20uhB1KUYN4s9nio3TWn9NnZIKrBCCiMh8NKap0SbzcWj7nEEnZGNHc09TfcP1aJZIqfoStgG\/RM3jjuOUj040O+stNKNtHlpcd\/lIqqAtIlVoLNMuMS81FQ2SLyXVdu9XkkzrnDh7ESYu3xaRnwCvo7Fae8UUWePo3w7OcUojsIw3UKtQrk7FPsB+aBDlULwJ\/DtwBRpQmCZ9wK3ALW69cpxEeAmtW1RMHM9K1J211P59mQmtrhHaZHcCWvdp1DC9\/32Bo0XklqzUi7LCpXeiAfC\/oH8NpWIZhcdgOWUUWK128jwVdfWNB04WkUcKOIn2ofFQs4EvkZ6vW+yU\/F28wKjjJMXdwNcprq+l5H5GqKAayMH2M1zZzgTiXQxd\/7CUIqtXRB5CA\/k\/THQrVifq+XCcd1FVgonch2ZxtNivqk1sDXlqaOxoprGjuR3t\/XQ96bTZEWAR2vrgNc8cdJzE6AN6QwjF\/PRZVtiIHzwRqUbdehOG8dcIaP++mTHHot4aXSdJB9rftDfmNfxQ7pRHYBmvoNkbOWYDF9gCUgjr7CR8RcKTuQd4HLgEeMKyFx3HcbLADOAk4tW+ygI7ASdGrRdlwurjwMdFZHxSxUtNxG8kXvmGTairsVJFPiJSlUbB2EE+M5T6M9OipkSfsxH4bzvJjEMzCj8M3Coii4c6rZpVaU1TfcM3gBeAf0RrwsQRiOuBm9AYL6955ThOlja2gAaI710BX6cWbWVyPdHaysxGGyvviCY8fU9E3oob02UJBLvF3AfXUWEuQhM226GV6ndBMyVXi0gLmsnbFELojjHmU+lfGWAzmghXY8\/6cNMJS0XkwQJaO41sgWXZhA+glYRz1X33BS5C454KeliNHc3tTfUNv0GtYZcA7wemFyG0BI0DeBr4OdpiY5OLK8dxMsZ2aGXySqmxNAc4kMJa9eRvyKPROla726Z8sW363xeRx4lYqsNExHTgvTEO6oIW0u6qlElnwn4m8A\/A+ah7ugb19nSiSSd3isivgVcjjP0EtCn7nnm\/mwd8E2179Lf2fKvRUk1nmYHGBdYQrAV+hQZsTrKX5SLgbhH5U6GnkcaO5t6m+oaFaND7f6FlHE4A9rBFabQ9nID61rtRP\/lK4Bk0U3AesM5dgo7jZNSCsC9wVAV9rUnAaSIyr1Drh43DwcBf5Vk8RgEno+UVrgZuFpFlIYSeIu9nvO0hh8T4Tr2oR2VzBT2nndFQnJPpb2WqQT1P+5kAW4GWuijWvVptAirfMtuGepLOBsbm\/b5zOIurkgqsEEKfiNwB\/AXqT69GYwwuAz4vIq8XqobN4rQZeK6pvmE+8BO71l42QSbY9dvRxtFvmBpe2djR3IPjOE50pgPniEgSa0kr8HAIoWvAJnQq6pqpFKqBU9CyCEsL\/Dt1wN+grsF8qoBdge+gRUNvsYzARcDGwfYRs9BMAD4JfIJ4JRbagZcqpS6biNQAF6DFwHPiSlCrVbMJo4nAPcBNCX7vbWXKrmSYJxCU0oJFCKFNRH4GHGYDWo0GcV4GfFFEmos1OZoVar39LMRxHCddDkSt50kwH7Ws5wusBtQ9WF1h47YXWhNryPgps14djbYICoPsXweg1r5PA38G\/igiz6Iekw1mAalCvRvboxarD9pBP26fxJVorbdKYTzqkst3Sz+HWvpetT37bOBnJF+5XtCEgZftsxrQOpjD2jpYU4bPfAX4Hlrdt8Hu4Vw0yO2bDHOToOM4FU81yTUxrtuKgHgPMCvmZtVJ8s2NAxqCETVmaYxt0LcxdK\/XCaj1amqB+9h0E2On2bVb7dC92u63AXVTTrT7iFsHREwcr6igeb0D7y6nsQRYEELYKCL3ou2GOlIoGrsK+Be0Pd56E3njU5jDlS2wzFV4L3AN8EV7YevR4MW1IvKjEEJ7FgdLRLYHGkMIz\/se4zhOCmtMHWq9GhvjMq1ok+M3E769KtStdkwMgfZeNMB5\/iBjEFDPxikRxFyNiaiJxKvQPhSdwH0hhI4Kmn59vLso8InAR0XkBqAlpb25BzW4XJ0Xn9dFBdQXK4cFK+cqvAJtm3OG3ccE4AtAq4hcm7XUTBGZCHwNNY26wHIcJw32Rt1XcUrQLLLNKtH0aHPbVQOHEj27cQpwiogsGMQKMhmNkdohw89pEYW1extOrEJdgrvmzb+JaKb\/2cDvLI56ZcIWrHXA3VFLP2SZqjJ+9nITLA\/mqebJwLeBS0VketTCdEkvKiIyFq3D8nHU4uY4jpP0WlONZkTvHOMyXWiLopYUDsYAj6FuoziH+lPZRm9ZW\/PPQN2kWWUDanFpqrAp2IYmjL3IFtdcQF11J6IdVW4Azk+y4KsZLSqyVlLZBJa9rC+jRUMfZEu7gvEmZq4E9s+AyJoEfBX4MsnFXTiO42xtrTkr5iFuBXBPhLIFxRyMH6K4Bt4DOQBNdNoa0+wgm9UGyj1oqZ\/bQgi9lTT5zCr1tBk+ttZCqB61rv4C+OcEjQ1rULe2C6wUHugLaCzW3WwpOFpvC82v0HTosaUumy8io0XkaLQg6ZdQ65rjOE4a601OeBwU5zJo8+JXU7zVTuBO4lnIJgJnWBHR\/DGoAc5DszSzynzg+0SrSD8cRFav7cUXomUwnuPdTbonozUs90roY9ttXrnASklkvQx8BjU\/5pRsNZpS+0vgh8CcInoXxlnoakVkNnAp8D9oSm+9LV5tqJ\/acRwnSWqBc4jX2LkNzdBLLUnIPA\/P0r+3bJR952S0rtLAjftMNLMyiyxFSwq9VsnNyK2+1WITWGeZgWHpVp7VHH9tB6cmIw8UEWlCy\/MvBj6HBkMGe5AfQ6sa3ywit6OlHrqTmuR5wZt7mnL\/gKnz\/GJrS4H\/AG72aeM4TsLshBZ4jLOovQA8WYLNvwWYCxxLdDfRTLQm1uK8gpXrgG+h8TjvN7GZBSUjwFuo6+z+ShZX1lh7HLDBnssKEfkV6r7+Vt6eWMOAArC2j05B3Yg1qCt5ddTxsuvtYO\/FKOBxYFmUAHu71gS0ttoUtJvLG2kXia3KyoMNIRBCWAv8AC0at5AtLsNaYH\/UqvQH4Kdod\/YdzKwc9QFWW+mFY+xzb0XjrfbNm0idqMn0IuDKEMIG3wscx0mYE9Dsraj0oNarNSWycMwlnjW\/Ds1MG5d33R60X+3nbL29k6HrZaVNt23GnwZuqcRMt\/z9ELWiXgXsa42ZQWOx1tI\/JqsbeDvv7wbgSOA3wLVoId5fAvtFiaPOaxd1lV3ratSjdELefRXDDOBHaMPxK9F6W+fF0Q+FUJO1hxxC2Cwit6KZDJ9GG31OtpNMrS1Cl6CWpheAB61NwuuoX7x9a4rZHlhAgycnoCUiDkPrrRxoCj0MWLCWom7LK0MIq7MyRMBMETkk5dPdZrSZZ8UuKBlgNJrIkXZ83zulOK05kRlPfNfYcmBuCQOvX0fjvS6KcY3DbRN9Mv+gjRabvlNE5qHehI+g8WmltGgJWqn9RjQOd3ElW66Mg8yIsQ+wG\/AbEZlve+5HUCtSjrX0r2LfgBYKPS7PcHO6\/X+fpXi3db3dy7l5z\/xIM4DMp4gYQBNRfw98lC3dEfaz6\/+ZeFmxw0tg5Z2QXhGRrwIPoDVRjsp7wQIaKHm0Dfon0eyZxcDLIrLRHkDuNDfV\/v8paFf2PdBU6IlbGYM+1ER9o6nxl0IIWQrAq0ZdqZ9JebF5AfgwWgnZSYcGNJEj7U3xPjQza7MPefYMByYyjojxPvcBD5voKdUa3Skid6IxqlGF4RTgVBF5emviP4Sw3txTt6MFSj+EehumpLh39aGVxB80C8y8Cismui0RMhr4a7SDQBUa\/7wfGhNdb8+4Km+M7kN7\/OZoRMNqqgbsVbPNqFGswJps70UYYFzY3dbNYpIstjPxWD3gWjPQDgAjS2DlvWBtVtjscbM2XWwv2tQ8NV1jf55qg9hri1Zf3sZVbQ++Kk+gDaTXhNVc4Do0XXVzRk8t4+0nTSaRIRdyhVJFabJTo578223Tro3y+qIxNZLBce+yRTULxYyXmbVgA9FT1bvQ8Ia2Et\/7PBN2cVybs+yg2zLIYXu1eTXmmnXlPNTzsLvN7bjJT302hivRVjA3AU8ArSm0hNkam02sjI34nq1J4D3rQr01h9peW2N77MD1qQftnXnFANG0wt6pnfLWmlywfBSB2oJ6sfYZsHa9RfF9EFvRkKNjBmielWkbEDItsOwFE6BFROaiRe5ylY5PQuOyGmwihDwxVcykWoNmMT5hp5ZnM9iqx107Tjl4Ei36GOnVtYUti7WC3kBDDLJweupB41luj7lJNpfhMLgS7Rc4OuK9B5sfQwpL2wfagGdF5Dm04fABthccgGYkTmFL67WqbewFYp\/ZZZvrMmABWpn9KdQVWGqPxauoKyzqe9ZO\/2bhkfZZEXkabYX0ebSw6M55GqHHRM+twH8CLw+Yb6vQ+liz80TZcrQlXvsAQ8Yy+teUXD1w\/oQQ2kXkKtSNPCPvwPZfA8S4mGFkyQCx15t3rR4Ruca+05y8MbvG7iU9\/TIcV30LchtvJ6fZ9pLthWY1TLCXrIb+geo9dmLtNgX8ogm259FYq9aki\/OJyBjU7DotzyLwmxDCqiKuEYD32UQrJc3A9SGE1gLvcxTqUpxpv3oHuC6EsL6M8+QQNLYl2Is4N4TwVBnvpxb4K96dnp72O\/4acLPH0zmVhsXXjLV1fzrqDpqIWuB3tM1+sllRlrPFernerCErgU0hhC4fzf+PVR6DWgdzsVi9aF\/L5cALIYRN2\/i79XYgOwF1Kd4D\/CF\/bG3v3pH+2acdbKX9ju0pp6GV\/+tQi+nN+Z9v++NU+lv\/uoAV+fGIFsB\/LJqdOgmNvbrBEutcYA0hQGrs1DLZhNdo+\/epZv1pQrNRcgJrg\/25O00TsE3WqgHj3FvsSdMmZamflQB9hd7rVr5rUX8\/xbmR7+bsK5HJv5j5kLln6TjDXCDk9raBISF9bAkfwd+HgtcrClk\/8hLJqu2fPXHXW1vDc9frjbOOJXktx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx3Ecx0mV\/wNaU\/r+JR1MmQAAAABJRU5ErkJggg==\"><\/span>\r\n    <\/div>\r\n    <header class=\"cfs-header\">\r\n      <div class=\"cfs-intro\"><p class=\"cfs-kicker\">PRODOTTI<\/p><h2 class=\"cfs-title\">Ingegneria del fissaggio Cieffeplast<\/h2><p id=\"cobra-scroll3d-description\" class=\"cfs-description\">La fascetta di plastica COBRA\u00ae \u00e8 il risultato di uno studio ingegneristico per aumentare la funzionalit\u00e0 e la sicurezza dell\u2019installatore.<\/p><button type=\"button\" class=\"cfs-intro-toggle\" data-action=\"intro-toggle\" aria-expanded=\"false\" aria-controls=\"cobra-scroll3d-description\" aria-label=\"Apri descrizione\" title=\"Apri descrizione\">+<\/button><\/div>\r\n      <div class=\"cfs-type-switch\" data-nosnippet><div class=\"cfs-type-field\"><span class=\"cfs-type-label\">Tipologia<\/span><select data-type-select aria-label=\"Tipologia\" disabled><\/select><\/div><select data-head-select aria-label=\"Testa\" hidden disabled><option value=\"single\">Testa singola<\/option><option value=\"double\">Testa doppia<\/option><\/select><\/div>\r\n      <fieldset class=\"cfs-colors\" data-nosnippet>\r\n        <legend><span class=\"cfs-color-label\"><\/span><output class=\"cfs-color-name\" aria-live=\"polite\"><\/output><\/legend>\r\n        <div class=\"cfs-color-list\"><\/div>\r\n      <\/fieldset>\r\n      <button type=\"button\" data-action=\"skip\" data-nosnippet><\/button>\r\n      <a class=\"cfs-open-product\" href=\"https:\/\/www.cieffeplast.com\/it\/fascette\/\" hreflang=\"it\"><span class=\"cfs-open-label\"><\/span><span class=\"cfs-open-color\"><\/span><svg viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M4 12 12 4M6 4h6v6\"\/><\/svg><\/a>\r\n    <\/header>\r\n    <p class=\"cfs-status\" role=\"status\" data-nosnippet><\/p>\r\n    <svg class=\"cfs-lines\" aria-hidden=\"true\"><path><\/path><\/svg>\r\n    <button class=\"cfs-pin\" type=\"button\" tabindex=\"-1\"><\/button>\r\n    <aside class=\"cfs-card\" aria-hidden=\"true\" inert>\r\n      <button type=\"button\" class=\"cfs-close\" data-action=\"close\"><\/button>\r\n      <p class=\"cfs-count\"><\/p><h3><\/h3><p class=\"cfs-copy\"><\/p>\r\n      <section class=\"cfs-facts\" hidden><p class=\"cfs-facts-label\"><\/p><ul><\/ul><a href=\"https:\/\/www.cieffeplast.com\/it\/fascette\/\"><\/a><\/section>\r\n      <div class=\"cfs-thermal-spec\" hidden><span class=\"cfs-thermal-label\"><\/span><strong class=\"cfs-thermal-range\"><\/strong><small class=\"cfs-thermal-peak\" hidden><\/small><\/div>\r\n      <p class=\"cfs-origin\" hidden><span aria-hidden=\"true\"><\/span>Made in Italy<\/p>\r\n      <div class=\"cfs-install-controls\" hidden data-nosnippet>\r\n        <div class=\"cfs-install-meter\"><span class=\"cfs-install-label\"><\/span><output class=\"cfs-install-value\"><\/output><\/div>\r\n        <input type=\"range\" data-install-progress min=\"0\" max=\"1000\" step=\"1\" value=\"0\">\r\n        <a class=\"cfs-products\" href=\"https:\/\/www.cieffeplast.com\/it\/fascette\/\" hreflang=\"it\" hidden><span>Vai al prodotto<\/span><svg viewBox=\"0 0 90 20\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M1 10h86M80 3l7 7-7 7\"\/><\/svg><\/a>\r\n        <div class=\"cfs-install-actions\">\r\n          <button type=\"button\" data-action=\"install-play\" aria-pressed=\"false\"><\/button>\r\n          <button type=\"button\" data-action=\"sound\" aria-pressed=\"true\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M4 9h4l5-4v14l-5-4H4z\"\/><path class=\"cfs-sound-waves\" d=\"M16 8a6 6 0 0 1 0 8M19 5a10 10 0 0 1 0 14\"\/><path class=\"cfs-sound-muted\" d=\"m17 9 5 6m0-6-5 6\"\/><\/svg><span><\/span><\/button>\r\n          <button type=\"button\" data-action=\"details\"><\/button>\r\n        <\/div>\r\n      <\/div>\r\n    <\/aside>\r\n    <div class=\"cfs-bottom\" data-nosnippet>\r\n      <div class=\"cfs-progress\" aria-hidden=\"true\"><i><\/i><\/div>\r\n      <div class=\"cfs-row\">\r\n        <nav class=\"cfs-nav\">\r\n          <button type=\"button\" data-stop=\"0\"><b><\/b><span><\/span><\/button>\r\n          <button type=\"button\" data-stop=\"1\"><b><\/b><span><\/span><\/button>\r\n          <button type=\"button\" data-stop=\"2\"><b><\/b><span><\/span><\/button>\r\n          <button type=\"button\" data-stop=\"3\"><b><\/b><span><\/span><\/button>\r\n          <button type=\"button\" data-stop=\"4\"><b><\/b><span><\/span><\/button>\r\n        <\/nav>\r\n        <div class=\"cfs-tools\">\r\n          <button type=\"button\" data-action=\"hud\" aria-expanded=\"true\"><\/button>\r\n          <button type=\"button\" data-action=\"tour-play\" aria-pressed=\"false\">Riproduci tutto<\/button>\r\n          <button type=\"button\" data-action=\"mode\" aria-pressed=\"false\"><\/button>\r\n          <button type=\"button\" data-action=\"zoom-out\"><\/button>\r\n          <button type=\"button\" data-action=\"zoom-in\"><\/button>\r\n        <\/div>\r\n      <\/div>\r\n      <p class=\"cfs-help\"><\/p>\r\n    <\/div>\r\n    <div class=\"cfs-fallback\"><\/div>\r\n  <\/div>\r\n<\/section>\r\n<script>\r\n(() => {\r\n'use strict';\r\nconst root=document.getElementById('cobra-scroll3d');\r\nif(!root)return;\r\nroot.cfsDestroy?.();\r\n\/* Product mode: the same file, opened inside the gallery iframe of a single\r\n   product page, becomes a compact viewer (no scroll journey, only that\r\n   product's colours, colour kept in sync with the WooCommerce variation). *\/\r\nconst PQ=new URLSearchParams(location.search),PRODUCT=PQ.has('cfs3d');\r\nif(PRODUCT){\r\n root.dataset.mode='product';root.setAttribute('data-nosnippet','');\r\n [['type','type'],['color','color'],['colors','only']].forEach(([q,k])=>{const v=(PQ.get(q)||'').replace(\/[^a-z0-9,-]\/gi,'');if(v)root.dataset[k]=v});\r\n const L=(PQ.get('lang')||'').replace(\/[^a-z-]\/gi,'');if(L)root.dataset.language=L;\r\n document.documentElement.classList.add('cfs3d-embed');\r\n}\r\nif(PRODUCT)root.dataset.embed=PQ.get('view')==='full'?'full':'compact';\r\nconst embedCompact=()=>PRODUCT&&root.dataset.embed!=='full';\r\n\/\/ Gallery (compact): the tie lies on the square's diagonal and fills it.\r\nconst restRoll=()=>embedCompact()?-0.78:(narrow?-1.40:.085);\r\n\/* Gallery box: 1K surfaces and half tessellation (identical at ~400px, a\r\n   fraction of the CPU\/GPU work). Full screen upgrades once, in background,\r\n   to native 4K surfaces and full tessellation. *\/\r\nlet tier=embedCompact()?'lite':'full',upgradeQueued=false;\r\nconst LOD=n=>tier==='lite'?Math.max(3,Math.round(n\/2)):n;\r\nconst postParent=m=>{try{if(PRODUCT&&parent!==window)parent.postMessage(Object.assign({source:'cfs3d'},m),location.origin)}catch{}};\r\nconst TEXT={\"it\":{\"title\":\"Ingegneria del fissaggio Cieffeplast\",\"kicker\":\"PRODOTTI\",\"description\":\"La fascetta di plastica COBRA\\u00ae \\u00e8 il risultato di uno studio ingegneristico per aumentare la funzionalit\\u00e0 e la sicurezza dell\\u2019installatore.\",\"products\":{\"label\":\"Vai al prodotto\",\"url\":\"https:\/\/www.cieffeplast.com\/it\/fascette\/\"},\"parts\":[[\"Collare\",\"Le misure corte hanno la parte finale del collarino inclinato (coda inclinata) per facilitare l'inserimento.\"],[\"Coda\",\"Superficie ruvida ad alto grip per facilitare e velocizzare la presa manuale dell'operatore.\"],[\"Testa\",\"Testina arrotondata per evitare spigoli nel cablaggio e angoli interni raggiati per aumentare la tenuta.\"],[\"Installazione\",\"Il nastro avvolge il fascio, rientra nella testa e la linguetta interna blocca la chiusura passo dopo passo, senza attrezzi.\"]],\"ui\":[\"Scorri per esplorare\",\"Esplora in 3D\",\"Riprendi lo scorrimento\",\"Vista completa\",\"Salta il viaggio\",\"Chiudi\",\"Caricamento 3D\",\"3D non disponibile. Ricarica la pagina.\",\"Trascina per ruotare. Usa due dita o i pulsanti per zoomare.\",\"Ingrandisci\",\"Riduci\",\"Dettagli\"],\"colors\":{\"label\":\"Colore\",\"names\":[\"Oro\",\"Bianco autoestinguente\",\"Naturale\",\"Nero UV\",\"Verde UV\",\"Rosa\",\"Grigio\",\"Marrone\",\"Arancione\",\"Verde\",\"Blu\",\"Rosso\",\"Rosso termoresistente\",\"Giallo\"]},\"installation\":{\"progress\":\"Avanzamento\",\"play\":\"Riproduci\",\"pause\":\"Pausa\",\"replay\":\"Rivedi\",\"back\":\"Torna ai dettagli\",\"steps\":[[\"Avvolgimento\",\"Avvolgere la fascetta attorno al fascio di cavi.\"],[\"Inserimento\",\"Inserire la coda inclinata nella testa.\"],[\"Serraggio\",\"La coda scorre nella testa e il corpo della fascetta aderisce al contorno del fascio di cavi.\"]],\"done\":[\"Fissaggio completato\",\"Il colore scelto \\u00e8 gi\\u00e0 selezionato. Scopri misure, imballi e caratteristiche tecniche nella pagina dedicata.\"],\"sound\":\"Suono\",\"soundEnable\":\"Attiva il suono della fascetta\",\"soundMute\":\"Disattiva il suono della fascetta\",\"soundUnavailable\":\"Audio non disponibile\"},\"playAll\":\"Riproduci tutto\"},\"en\":{\"title\":\"Cieffeplast fastening engineering\",\"kicker\":\"PRODUCTS\",\"description\":\"The COBRA\\u00ae plastic cable tie is the result of engineering work aimed at improving functionality and installer safety.\",\"products\":{\"label\":\"Go to product\",\"url\":\"https:\/\/www.cieffeplast.com\/en\/cable-ties\/\"},\"parts\":[[\"Strap\",\"On shorter sizes, the end of the strap is angled (bent tip) to make insertion easier.\"],[\"Tail\",\"High-grip rough surface, so the operator can take hold of the tie quickly and securely.\"],[\"Head\",\"Rounded head to avoid sharp edges in the cable assembly, with radiused internal corners for increased holding strength.\"],[\"Installation\",\"The strap wraps the bundle, re-enters the head and the internal pawl locks it step by step, with no tools.\"]],\"ui\":[\"Scroll to explore\",\"Explore in 3D\",\"Resume scrolling\",\"Full view\",\"Skip the journey\",\"Close\",\"Loading 3D\",\"3D unavailable. Reload the page.\",\"Drag to rotate. Use two fingers or the buttons to zoom.\",\"Zoom in\",\"Zoom out\",\"Details\"],\"colors\":{\"label\":\"Colour\",\"names\":[\"Gold\",\"Flame-retardant white\",\"Natural\",\"UV black\",\"UV green\",\"Pink\",\"Grey\",\"Brown\",\"Orange\",\"Green\",\"Blue\",\"Red\",\"Heat-resistant red\",\"Yellow\"]},\"installation\":{\"progress\":\"Progress\",\"play\":\"Play\",\"pause\":\"Pause\",\"replay\":\"Replay\",\"back\":\"Back to details\",\"steps\":[[\"Wrapping\",\"Wrap the cable tie around the cable bundle.\"],[\"Insertion\",\"Insert the angled tail into the head.\"],[\"Tightening\",\"The tail slides through the head and the body of the cable tie conforms to the contour of the cable bundle.\"]],\"done\":[\"Fastening complete\",\"Your chosen colour is already selected. Explore sizes, packaging and technical specifications on the dedicated page.\"],\"sound\":\"Sound\",\"soundEnable\":\"Enable cable tie sound\",\"soundMute\":\"Mute cable tie sound\",\"soundUnavailable\":\"Audio unavailable\"},\"playAll\":\"Play all\"},\"fr\":{\"title\":\"Ing\\u00e9nierie de fixation Cieffeplast\",\"kicker\":\"PRODUITS\",\"description\":\"Le collier de c\\u00e2blage en plastique COBRA\\u00ae est le r\\u00e9sultat d\\u2019une \\u00e9tude d\\u2019ing\\u00e9nierie visant \\u00e0 am\\u00e9liorer la fonctionnalit\\u00e9 et la s\\u00e9curit\\u00e9 de l\\u2019installateur.\",\"products\":{\"label\":\"Voir le produit\",\"url\":\"https:\/\/www.cieffeplast.com\/fr\/colliers-de-cablage\/\"},\"parts\":[[\"Bande\",\"Sur les petites tailles, l'extr\\u00e9mit\\u00e9 de la bande est inclin\\u00e9e (pointe coud\\u00e9e) pour faciliter l'insertion.\"],[\"Queue\",\"Surface rugueuse \\u00e0 haute adh\\u00e9rence, pour une prise en main rapide et s\\u00fbre par l'op\\u00e9rateur.\"],[\"T\\u00eate\",\"T\\u00eate arrondie pour \\u00e9viter les ar\\u00eates vives dans le c\\u00e2blage et angles int\\u00e9rieurs arrondis pour augmenter la tenue.\"],[\"Installation\",\"La bande enveloppe le faisceau, revient dans la t\\u00eate et le cliquet interne la verrouille cran par cran, sans outil.\"]],\"ui\":[\"Faites d\\u00e9filer pour explorer\",\"Explorer en 3D\",\"Reprendre le d\\u00e9filement\",\"Vue compl\\u00e8te\",\"Passer la visite\",\"Fermer\",\"Chargement 3D\",\"3D indisponible. Rechargez la page.\",\"Faites glisser pour pivoter. Zoomez avec deux doigts ou les boutons.\",\"Agrandir\",\"R\\u00e9duire\",\"D\\u00e9tails\"],\"colors\":{\"label\":\"Couleur\",\"names\":[\"Or\",\"Blanc auto-extinguible\",\"Naturel\",\"Noir UV\",\"Vert UV\",\"Rose\",\"Gris\",\"Marron\",\"Orange\",\"Vert\",\"Bleu\",\"Rouge\",\"Rouge thermor\\u00e9sistant\",\"Jaune\"]},\"installation\":{\"progress\":\"Progression\",\"play\":\"Lire\",\"pause\":\"Pause\",\"replay\":\"Revoir\",\"back\":\"Retour aux d\\u00e9tails\",\"steps\":[[\"Enroulement\",\"Enrouler le collier autour du faisceau de c\\u00e2bles.\"],[\"Insertion\",\"Ins\\u00e9rer la queue inclin\\u00e9e dans la t\\u00eate.\"],[\"Serrage\",\"La queue coulisse dans la t\\u00eate et le corps du collier \\u00e9pouse le contour du faisceau de c\\u00e2bles.\"]],\"done\":[\"Fixation termin\\u00e9e\",\"La couleur choisie est d\\u00e9j\\u00e0 s\\u00e9lectionn\\u00e9e. D\\u00e9couvrez tailles, conditionnements et caract\\u00e9ristiques techniques sur la page d\\u00e9di\\u00e9e.\"],\"sound\":\"Son\",\"soundEnable\":\"Activer le son du collier\",\"soundMute\":\"Couper le son du collier\",\"soundUnavailable\":\"Audio indisponible\"},\"playAll\":\"Tout lire\"},\"de\":{\"title\":\"Cieffeplast Befestigungstechnik\",\"kicker\":\"PRODUKTE\",\"description\":\"Der COBRA\\u00ae Kabelbinder aus Kunststoff ist das Ergebnis einer technischen Entwicklung zur Verbesserung von Funktionalit\\u00e4t und Sicherheit f\\u00fcr den Installateur.\",\"products\":{\"label\":\"Zum Produkt\",\"url\":\"https:\/\/www.cieffeplast.com\/de\/kabelbinder\/\"},\"parts\":[[\"Band\",\"Bei kurzen Gr\\u00f6\\u00dfen ist das Bandende abgewinkelt (abgewinkelte Spitze), um das Einf\\u00fchren zu erleichtern.\"],[\"Bandende\",\"Raue Oberfl\\u00e4che mit hohem Grip, damit der Bediener den Kabelbinder schnell und sicher greifen kann.\"],[\"Kopf\",\"Abgerundeter Kopf zur Vermeidung scharfer Kanten bei der Verkabelung und verrundete Innenkanten zur Erh\\u00f6hung der Haltekraft.\"],[\"Montage\",\"Das Band umschlie\\u00dft das B\\u00fcndel, l\\u00e4uft zur\\u00fcck in den Kopf und die innere Sperrklinke verriegelt es Schritt f\\u00fcr Schritt, ohne Werkzeug.\"]],\"ui\":[\"Zum Erkunden scrollen\",\"In 3D erkunden\",\"Scrollen fortsetzen\",\"Gesamtansicht\",\"Tour \\u00fcberspringen\",\"Schlie\\u00dfen\",\"3D wird geladen\",\"3D nicht verf\\u00fcgbar. Seite neu laden.\",\"Zum Drehen ziehen. Mit zwei Fingern oder den Tasten zoomen.\",\"Vergr\\u00f6\\u00dfern\",\"Verkleinern\",\"Details\"],\"colors\":{\"label\":\"Farbe\",\"names\":[\"Gold\",\"Wei\\u00df selbstverl\\u00f6schend\",\"Natur\",\"Schwarz UV\",\"Gr\\u00fcn UV\",\"Rosa\",\"Grau\",\"Braun\",\"Orange\",\"Gr\\u00fcn\",\"Blau\",\"Rot\",\"Hitzebest\\u00e4ndiges Rot\",\"Gelb\"]},\"installation\":{\"progress\":\"Fortschritt\",\"play\":\"Abspielen\",\"pause\":\"Pause\",\"replay\":\"Erneut ansehen\",\"back\":\"Zur\\u00fcck zu den Details\",\"steps\":[[\"Umschlie\\u00dfen\",\"Den Kabelbinder um das Kabelb\\u00fcndel legen.\"],[\"Einf\\u00fchren\",\"Das abgewinkelte Bandende in den Kopf einf\\u00fchren.\"],[\"Festziehen\",\"Das Bandende gleitet durch den Kopf und der K\\u00f6rper des Kabelbinders legt sich an die Kontur des Kabelb\\u00fcndels an.\"]],\"done\":[\"Befestigung abgeschlossen\",\"Die gew\\u00e4hlte Farbe ist bereits ausgew\\u00e4hlt. Gr\\u00f6\\u00dfen, Verpackungen und technische Eigenschaften finden Sie auf der Produktseite.\"],\"sound\":\"Ton\",\"soundEnable\":\"Kabelbinderger\\u00e4usch einschalten\",\"soundMute\":\"Kabelbinderger\\u00e4usch ausschalten\",\"soundUnavailable\":\"Audio nicht verf\\u00fcgbar\"},\"playAll\":\"Alles abspielen\"},\"es\":{\"title\":\"Ingenier\\u00eda de fijaci\\u00f3n Cieffeplast\",\"kicker\":\"PRODUCTOS\",\"description\":\"La brida de pl\\u00e1stico COBRA\\u00ae es el resultado de un estudio de ingenier\\u00eda para aumentar la funcionalidad y la seguridad del instalador.\",\"products\":{\"label\":\"Ir al producto\",\"url\":\"https:\/\/www.cieffeplast.com\/es\/abrazaderas\/\"},\"parts\":[[\"Cinta\",\"En las medidas cortas, el extremo de la cinta est\\u00e1 inclinado (punta inclinada) para facilitar la inserci\\u00f3n.\"],[\"Cola\",\"Superficie rugosa de alto agarre, para una sujeci\\u00f3n manual r\\u00e1pida y segura del operario.\"],[\"Cabeza\",\"Cabeza redondeada para evitar aristas en el cableado y esquinas interiores redondeadas para aumentar la sujeci\\u00f3n.\"],[\"Instalaci\\u00f3n\",\"La cinta envuelve el mazo, vuelve a entrar en la cabeza y el trinquete interno la bloquea paso a paso, sin herramientas.\"]],\"ui\":[\"Despl\\u00e1zate para explorar\",\"Explorar en 3D\",\"Reanudar el desplazamiento\",\"Vista completa\",\"Saltar el recorrido\",\"Cerrar\",\"Cargando 3D\",\"3D no disponible. Recarga la p\\u00e1gina.\",\"Arrastra para girar. Ampl\\u00eda con dos dedos o con los botones.\",\"Ampliar\",\"Reducir\",\"Detalles\"],\"colors\":{\"label\":\"Color\",\"names\":[\"Oro\",\"Blanco autoextinguible\",\"Natural\",\"Negro UV\",\"Verde UV\",\"Rosa\",\"Gris\",\"Marr\\u00f3n\",\"Naranja\",\"Verde\",\"Azul\",\"Rojo\",\"Rojo termorresistente\",\"Amarillo\"]},\"installation\":{\"progress\":\"Progreso\",\"play\":\"Reproducir\",\"pause\":\"Pausa\",\"replay\":\"Volver a ver\",\"back\":\"Volver a los detalles\",\"steps\":[[\"Envoltura\",\"Envolver la brida alrededor del mazo de cables.\"],[\"Inserci\\u00f3n\",\"Introducir la cola inclinada en la cabeza.\"],[\"Apriete\",\"La cola se desliza por la cabeza y el cuerpo de la brida se adapta al contorno del mazo de cables.\"]],\"done\":[\"Fijaci\\u00f3n completada\",\"El color elegido ya est\\u00e1 seleccionado. Descubre medidas, embalajes y caracter\\u00edsticas t\\u00e9cnicas en la p\\u00e1gina dedicada.\"],\"sound\":\"Sonido\",\"soundEnable\":\"Activar el sonido de la brida\",\"soundMute\":\"Silenciar el sonido de la brida\",\"soundUnavailable\":\"Audio no disponible\"},\"playAll\":\"Reproducir todo\"},\"pt\":{\"title\":\"Engenharia de fixa\\u00e7\\u00e3o Cieffeplast\",\"kicker\":\"PRODUTOS\",\"description\":\"A abra\\u00e7adeira de pl\\u00e1stico COBRA\\u00ae \\u00e9 o resultado de um estudo de engenharia para aumentar a funcionalidade e a seguran\\u00e7a do instalador.\",\"products\":{\"label\":\"Ir para o produto\",\"url\":\"https:\/\/www.cieffeplast.com\/pt-pt\/abracadeiras\/\"},\"parts\":[[\"Fita\",\"Nas medidas curtas, a extremidade da fita \\u00e9 inclinada (ponta inclinada) para facilitar a inser\\u00e7\\u00e3o.\"],[\"Cauda\",\"Superf\\u00edcie rugosa de alta ader\\u00eancia, para uma pega manual r\\u00e1pida e segura do operador.\"],[\"Cabe\\u00e7a\",\"Cabe\\u00e7a arredondada para evitar arestas na cablagem e cantos interiores arredondados para aumentar a reten\\u00e7\\u00e3o.\"],[\"Instala\\u00e7\\u00e3o\",\"A fita envolve o feixe, volta a entrar na cabe\\u00e7a e o linguete interno bloqueia-a passo a passo, sem ferramentas.\"]],\"ui\":[\"Desloque a p\\u00e1gina para explorar\",\"Explorar em 3D\",\"Retomar o deslocamento\",\"Vista completa\",\"Saltar o percurso\",\"Fechar\",\"A carregar 3D\",\"3D indispon\\u00edvel. Recarregue a p\\u00e1gina.\",\"Arraste para rodar. Amplie com dois dedos ou com os bot\\u00f5es.\",\"Ampliar\",\"Reduzir\",\"Detalhes\"],\"colors\":{\"label\":\"Cor\",\"names\":[\"Dourado\",\"Branco autoextingu\\u00edvel\",\"Natural\",\"Preto UV\",\"Verde UV\",\"Rosa\",\"Cinzento\",\"Castanho\",\"Laranja\",\"Verde\",\"Azul\",\"Vermelho\",\"Vermelho termorresistente\",\"Amarelo\"]},\"installation\":{\"progress\":\"Progresso\",\"play\":\"Reproduzir\",\"pause\":\"Pausa\",\"replay\":\"Voltar a ver\",\"back\":\"Voltar aos detalhes\",\"steps\":[[\"Envolvimento\",\"Envolver a abra\\u00e7adeira \\u00e0 volta do feixe de cabos.\"],[\"Inser\\u00e7\\u00e3o\",\"Inserir a cauda inclinada na cabe\\u00e7a.\"],[\"Aperto\",\"A cauda desliza pela cabe\\u00e7a e o corpo da abra\\u00e7adeira adapta-se ao contorno do feixe de cabos.\"]],\"done\":[\"Fixa\\u00e7\\u00e3o conclu\\u00edda\",\"A cor escolhida j\\u00e1 est\\u00e1 selecionada. Descubra medidas, embalagens e caracter\\u00edsticas t\\u00e9cnicas na p\\u00e1gina dedicada.\"],\"sound\":\"Som\",\"soundEnable\":\"Ativar o som da abra\\u00e7adeira\",\"soundMute\":\"Desativar o som da abra\\u00e7adeira\",\"soundUnavailable\":\"\\u00c1udio indispon\\u00edvel\"},\"playAll\":\"Reproduzir tudo\"}};\r\n\r\n\/* Versione CDN fissa. Nessun import map o selettore globale del tema. *\/\r\nconst VERSION='0.180.0';\r\n\/* Palette prodotto. I valori RAL sono le conversioni sRGB standard del RAL Classic:\r\n   1021 Giallo colza, 2004 Arancio puro, 3000 Rosso fuoco, 3003 Rosso rubino,\r\n   3015 Rosa chiaro, 5010 Blu genziana, 6005 Verde muschio, 6029 Verde menta,\r\n   7035 Grigio luce, 8003 Marrone fango.\r\n   Naturale, bianco autoestinguente, nero e oro non hanno un RAL dichiarato:\r\n   il naturale e' il PA6.6 non pigmentato, avorio caldo e traslucido ma mai\r\n   limpido (vedi nylonShader e nylonOptics), il bianco autoestinguente e' un bianco latte\r\n   coprente. *\/\r\nconst PALETTE=[\r\n  {id:'gold',hex:'#bda462'},\r\n  {id:'white',hex:'#e7e4dd'},\r\n  {id:'natural',hex:'#f2efe3',glow:1},\r\n  {id:'black',hex:'#1c1c1e'},\r\n  {id:'dark-green',hex:'#114232',ral:'6005'},\r\n  {id:'pink',hex:'#d8a0a6',ral:'3015'},\r\n  {id:'grey',hex:'#c5c7c4',ral:'7035'},\r\n  {id:'brown',hex:'#7e4b26',ral:'8003'},\r\n  {id:'orange',hex:'#e25303',ral:'2004'},\r\n  {id:'green',hex:'#006f3d',ral:'6029'},\r\n  {id:'blue',hex:'#004f7c',ral:'5010'},\r\n  {id:'red',hex:'#a72920',ral:'3000'},\r\n  {id:'ruby',hex:'#861a22',ral:'3003'},\r\n  {id:'yellow',hex:'#f6b600',ral:'1021'}\r\n];\r\nconst TYPES=[{\"id\":\"cabling\",\"colors\":[\"gold\",\"white\",\"natural\",\"black\",\"dark-green\",\"pink\",\"grey\",\"brown\",\"orange\",\"green\",\"blue\",\"red\",\"ruby\",\"yellow\"],\"width\":1,\"focus\":-20.14,\"span\":3.8},{\"id\":\"id1\",\"colors\":[\"natural\"],\"width\":0.58,\"plate\":[-18.55,-16.88,5.29],\"focus\":-17.7,\"span\":8},{\"id\":\"id2\",\"colors\":[\"natural\"],\"width\":0.58,\"focus\":-22.55,\"span\":7},{\"id\":\"id3\",\"colors\":[\"natural\"],\"width\":1,\"plate\":[-18.4,-12.57,2.71],\"focus\":-15.5,\"span\":9},{\"id\":\"pa66\",\"colors\":[\"black\"],\"width\":1.45,\"flat\":true,\"focus\":-21.4,\"span\":7},{\"id\":\"pa12\",\"colors\":[\"black\"],\"width\":1.45,\"flat\":true,\"focus\":-21.4,\"span\":7},{\"id\":\"releasable\",\"colors\":[\"natural\",\"black\"],\"width\":1.05,\"focus\":-19.5,\"span\":6},{\"id\":\"eyelet\",\"colors\":[\"natural\",\"black\"],\"width\":1,\"focus\":-21.2,\"span\":6},{\"id\":\"crossbow\",\"colors\":[\"natural\",\"black\"],\"width\":1,\"focus\":-21.5,\"span\":7},{\"id\":\"push\",\"colors\":[\"natural\",\"black\"],\"width\":1,\"focus\":-21.5,\"span\":7}];\r\nconst TYPE_COPY={\"it\":[[\"Fascette di cablaggio\",\"\",\"\",\"\"],[\"Identificazione \\u00b7 Tipo 1\",\"Fissa e identifica piccoli fasci di cavi con un unico componente in PA66 naturale. La targhetta integrata sotto la testa, da 25,4 \\u00d7 8 mm, \\u00e8 scrivibile con pennarello.\",\"Targhetta integrata\",\"La targhetta da 25,4 \\u00d7 8 mm fa parte del corpo: unisce fissaggio e identificazione dei piccoli fasci.\"],[\"Identificazione \\u00b7 Tipo 2\",\"Una targhetta esterna sopra la testa rende riconoscibili i cablaggi elettrici. In PA66 naturale, con superficie da 20,4 \\u00d7 9 mm scrivibile con pennarello.\",\"Targhetta esterna\",\"La targhetta da 20,4 \\u00d7 9 mm \\u00e8 posizionata sopra la testa e resta esterna al corpo della fascetta.\"],[\"Identificazione \\u00b7 Tipo 3\",\"Per fissare e identificare fasci di cavi di maggiori dimensioni. Il corpo in PA66 naturale integra sotto la testa una targhetta da 13 \\u00d7 28 mm, scrivibile con pennarello.\",\"Targhetta longitudinale\",\"La targhetta da 13 \\u00d7 28 mm \\u00e8 integrata sotto la testa: uno spazio dedicato alla marcatura sui fasci pi\\u00f9 grandi.\"],[\"Installazione \\u00b7 PA66\",\"Testa piatta, inserimento parallelo e cremagliera esterna: una superficie d\\u2019appoggio ampia sul componente da fissare. In PA66 nero, adatta anche all\\u2019esterno. Disponibile con testa singola o doppia.\",\"Testa piatta\",\"Il nastro entra parallelamente nella testa. Il profilo piatto riduce le sporgenze e amplia la superficie d\\u2019appoggio.\"],[\"Installazione \\u00b7 PA12\",\"Per applicazioni esterne, anche in ambiente marino: il PA12 nero offre elevata resistenza ai raggi UV, agli agenti atmosferici e alle basse temperature. Testa piatta con inserimento parallelo.\",\"Aggancio parallelo\",\"La testa piatta lavora con la cremagliera esterna. Per il serraggio occorre la pinza indicata nel catalogo.\"],[\"Fascette riapribili\",\"Chiudi, riapri e riutilizza. Il grande pulsante di sgancio facilita i fissaggi provvisori, la preparazione dei cablaggi e la chiusura di bobine o matasse. In PA66 naturale o nero.\",\"Pulsante di sgancio\",\"Il pulsante libera il sistema di bloccaggio e permette di riaprire la fascetta per un nuovo utilizzo.\"],[\"Fascette con occhiello\",\"Il fissaggio del fascio incontra il montaggio a vite. L\\u2019occhiello integrato permette l\\u2019ancoraggio a un pannello o a un altro supporto: utile per quadristica e cablaggi speciali.\",\"Occhiello per vite\",\"Il foro sopra la testa consente il fissaggio a vite del cablaggio sul supporto.\"],[\"Innesto a balestra\",\"Fissaggio stabile su pannello mediante inserimento in un foro. L\\u2019attacco a balestra in PA66 \\u00e8 indicato per quadristica, cablaggi speciali e pannelli interni degli elettrodomestici.\",\"Appoggio a balestra\",\"Le ali elastiche accompagnano l\\u2019innesto e stabilizzano l\\u2019appoggio sul pannello.\"],[\"Push mount\",\"Fissa il cablaggio direttamente in un foro del pannello. L\\u2019innesto in PA66 e la sporgenza d\\u2019appoggio mantengono la fascetta parallela al supporto e agevolano l\\u2019assemblaggio.\",\"Innesto per pannello\",\"L\\u2019ancoraggio si inserisce nel foro; la sporgenza alla base mantiene il corretto appoggio sul pannello.\"]],\"en\":[[\"Cable ties\",\"\",\"\",\"\"],[\"Identification \\u00b7 Type 1\",\"Secure and identify small cable bundles with one natural PA66 component. The integrated 25.4 \\u00d7 8 mm marker plate below the head can be written on with a marker pen.\",\"Integrated marker plate\",\"The 25.4 \\u00d7 8 mm plate forms part of the tie body, combining fastening and identification for small bundles.\"],[\"Identification \\u00b7 Type 2\",\"An external plate above the head makes electrical wiring easy to identify. Made of natural PA66, with a 20.4 \\u00d7 9 mm surface that can be written on with a marker pen.\",\"External marker plate\",\"The 20.4 \\u00d7 9 mm plate sits above the head, outside the cable tie body.\"],[\"Identification \\u00b7 Type 3\",\"For securing and identifying larger cable bundles. The natural PA66 body incorporates a 13 \\u00d7 28 mm marker plate below the head, suitable for marking with a pen.\",\"Longitudinal marker plate\",\"The integrated 13 \\u00d7 28 mm plate below the head provides a dedicated marking area for larger bundles.\"],[\"Installation \\u00b7 PA66\",\"A flat head, parallel insertion and an external rack provide a broad bearing surface on the component being secured. Black PA66, also suitable for outdoor use. Single or double locking head.\",\"Flat locking head\",\"The strap enters parallel to the head. The flat profile reduces protrusions and provides a wider bearing surface.\"],[\"Installation \\u00b7 PA12\",\"For outdoor applications, including marine environments: black PA12 offers high resistance to UV, weathering and low temperatures. A flat head with parallel insertion completes the design.\",\"Parallel locking system\",\"The flat head engages the external rack. Installation requires the tightening tool specified in the catalogue.\"],[\"Releasable cable ties\",\"Close, release and reuse. The large release button simplifies temporary fastening, wiring preparation and securing hose or cable coils. Available in natural or black PA66.\",\"Release button\",\"The button releases the locking mechanism so the cable tie can be opened and used again.\"],[\"Mounting cable ties\",\"Bundle fastening meets screw mounting. The integrated eyelet anchors the tie to a panel or another support, making it useful for switchboards and special wiring.\",\"Screw-mount eyelet\",\"The hole above the head allows the cable assembly to be screwed to its support.\"],[\"Crossbow push mount\",\"Stable panel mounting by insertion into a hole. The PA66 crossbow attachment is suited to switchboards, special wiring and internal appliance panels.\",\"Spring-wing support\",\"The flexible wings accompany the push-in attachment and stabilise the bearing surface against the panel.\"],[\"Push mount\",\"Secure wiring directly in a panel hole. The PA66 push-in attachment and its support projection keep the tie parallel to the panel and simplify assembly.\",\"Panel attachment\",\"The anchor pushes into the hole; the projection at its base maintains the bearing position against the panel.\"]],\"fr\":[[\"Colliers de c\\u00e2blage\",\"\",\"\",\"\"],[\"Identification \\u00b7 Type 1\",\"Fixez et identifiez les petits faisceaux avec un seul composant en PA66 naturel. La plaquette int\\u00e9gr\\u00e9e sous la t\\u00eate, de 25,4 \\u00d7 8 mm, peut \\u00eatre marqu\\u00e9e au feutre.\",\"Plaquette int\\u00e9gr\\u00e9e\",\"La plaquette de 25,4 \\u00d7 8 mm fait partie du corps : fixation et identification des petits faisceaux r\\u00e9unies.\"],[\"Identification \\u00b7 Type 2\",\"Une plaquette ext\\u00e9rieure au-dessus de la t\\u00eate facilite le rep\\u00e9rage des c\\u00e2blages \\u00e9lectriques. En PA66 naturel, avec une surface de 20,4 \\u00d7 9 mm inscriptible au feutre.\",\"Plaquette ext\\u00e9rieure\",\"La plaquette de 20,4 \\u00d7 9 mm se trouve au-dessus de la t\\u00eate, \\u00e0 l\\u2019ext\\u00e9rieur du corps du collier.\"],[\"Identification \\u00b7 Type 3\",\"Pour fixer et identifier les faisceaux plus importants. Le corps en PA66 naturel int\\u00e8gre sous la t\\u00eate une plaquette de 13 \\u00d7 28 mm, inscriptible au feutre.\",\"Plaquette longitudinale\",\"La plaquette int\\u00e9gr\\u00e9e de 13 \\u00d7 28 mm sous la t\\u00eate offre une zone de marquage pour les grands faisceaux.\"],[\"Installation \\u00b7 PA66\",\"T\\u00eate plate, insertion parall\\u00e8le et denture ext\\u00e9rieure : une large surface d\\u2019appui sur la pi\\u00e8ce \\u00e0 fixer. En PA66 noir, \\u00e9galement adapt\\u00e9 \\u00e0 l\\u2019ext\\u00e9rieur. T\\u00eate \\u00e0 verrouillage simple ou double.\",\"T\\u00eate plate\",\"La bande entre parall\\u00e8lement dans la t\\u00eate. Le profil plat r\\u00e9duit les saillies et \\u00e9largit la surface d\\u2019appui.\"],[\"Installation \\u00b7 PA12\",\"Pour l\\u2019ext\\u00e9rieur, y compris en milieu marin : le PA12 noir offre une r\\u00e9sistance \\u00e9lev\\u00e9e aux UV, aux intemp\\u00e9ries et aux basses temp\\u00e9ratures. T\\u00eate plate \\u00e0 insertion parall\\u00e8le.\",\"Verrouillage parall\\u00e8le\",\"La t\\u00eate plate s\\u2019engage sur la denture ext\\u00e9rieure. Le serrage n\\u00e9cessite la pince indiqu\\u00e9e dans le catalogue.\"],[\"Colliers r\\u00e9ouvrables\",\"Fermez, ouvrez et r\\u00e9utilisez. Le grand bouton de d\\u00e9verrouillage facilite les fixations provisoires, la pr\\u00e9paration des c\\u00e2blages et le maintien des couronnes de tuyaux ou de c\\u00e2bles. En PA66 naturel ou noir.\",\"Bouton de d\\u00e9verrouillage\",\"Le bouton lib\\u00e8re le verrouillage pour ouvrir le collier et le r\\u00e9utiliser.\"],[\"Colliers avec \\u0153illet\",\"La fixation du faisceau se compl\\u00e8te d\\u2019un montage par vis. L\\u2019\\u0153illet int\\u00e9gr\\u00e9 permet l\\u2019ancrage sur un panneau ou un autre support, pour les tableaux \\u00e9lectriques et les c\\u00e2blages sp\\u00e9ciaux.\",\"\\u0152illet pour vis\",\"Le trou au-dessus de la t\\u00eate permet de visser le c\\u00e2blage sur son support.\"],[\"Embase \\u00e0 ailettes ressort\",\"Fixation stable sur panneau par insertion dans un trou. L\\u2019attache \\u00e0 ailettes en PA66 convient aux tableaux \\u00e9lectriques, aux c\\u00e2blages sp\\u00e9ciaux et aux panneaux internes des appareils \\u00e9lectrom\\u00e9nagers.\",\"Appui \\u00e0 ailettes ressort\",\"Les ailettes souples accompagnent l\\u2019encliquetage et stabilisent l\\u2019appui sur le panneau.\"],[\"Push mount\",\"Fixez le c\\u00e2blage directement dans un trou du panneau. L\\u2019ancrage en PA66 et sa saillie d\\u2019appui maintiennent le collier parall\\u00e8le au support et facilitent l\\u2019assemblage.\",\"Ancrage pour panneau\",\"L\\u2019ancrage s\\u2019ins\\u00e8re dans le trou ; la saillie \\u00e0 sa base assure l\\u2019appui sur le panneau.\"]],\"de\":[[\"Kabelbinder\",\"\",\"\",\"\"],[\"Kennzeichnung \\u00b7 Typ 1\",\"Kleine Kabelb\\u00fcndel mit einem Bauteil aus naturfarbenem PA66 befestigen und kennzeichnen. Das integrierte Schild unter dem Kopf misst 25,4 \\u00d7 8 mm und ist mit einem Marker beschreibbar.\",\"Integriertes Schild\",\"Das 25,4 \\u00d7 8 mm gro\\u00dfe Schild ist Teil des Bandes und verbindet Befestigung und Kennzeichnung kleiner B\\u00fcndel.\"],[\"Kennzeichnung \\u00b7 Typ 2\",\"Ein au\\u00dfenliegendes Schild oberhalb des Kopfes erleichtert die Kennzeichnung elektrischer Verkabelungen. Aus naturfarbenem PA66, mit einer 20,4 \\u00d7 9 mm gro\\u00dfen, beschreibbaren Fl\\u00e4che.\",\"Au\\u00dfenliegendes Schild\",\"Das 20,4 \\u00d7 9 mm gro\\u00dfe Schild liegt oberhalb des Kopfes au\\u00dferhalb des Bandk\\u00f6rpers.\"],[\"Kennzeichnung \\u00b7 Typ 3\",\"Zum Befestigen und Kennzeichnen gr\\u00f6\\u00dferer Kabelb\\u00fcndel. Das Band aus naturfarbenem PA66 besitzt unter dem Kopf ein integriertes, mit einem Marker beschreibbares Schild von 13 \\u00d7 28 mm.\",\"L\\u00e4ngliches Schild\",\"Das integrierte Schild von 13 \\u00d7 28 mm unter dem Kopf bietet Platz zur Kennzeichnung gr\\u00f6\\u00dferer B\\u00fcndel.\"],[\"Installation \\u00b7 PA66\",\"Flacher Kopf, parallele Einf\\u00fchrung und Au\\u00dfenverzahnung bieten eine breite Auflagefl\\u00e4che am Befestigungsgut. Aus schwarzem PA66, auch f\\u00fcr au\\u00dfen geeignet. Mit Einfach- oder Doppelverschluss.\",\"Flacher Verschlusskopf\",\"Das Band wird parallel in den Kopf eingef\\u00fchrt. Die flache Bauform reduziert Vorspr\\u00fcnge und vergr\\u00f6\\u00dfert die Auflagefl\\u00e4che.\"],[\"Installation \\u00b7 PA12\",\"F\\u00fcr Au\\u00dfenanwendungen, auch im maritimen Umfeld: Schwarzes PA12 bietet eine hohe Best\\u00e4ndigkeit gegen UV-Strahlung, Witterung und niedrige Temperaturen. Flacher Kopf mit paralleler Einf\\u00fchrung.\",\"Paralleler Verschluss\",\"Der flache Kopf greift in die Au\\u00dfenverzahnung. Zum Spannen ist die im Katalog angegebene Zange erforderlich.\"],[\"Wiederl\\u00f6sbare Kabelbinder\",\"Schlie\\u00dfen, l\\u00f6sen und wiederverwenden. Die gro\\u00dfe Entriegelungstaste erleichtert vor\\u00fcbergehende Befestigungen, die Vorbereitung von Verkabelungen und das B\\u00fcndeln von Schlauch- oder Kabelrollen. Aus naturfarbenem oder schwarzem PA66.\",\"Entriegelungstaste\",\"Die Taste l\\u00f6st den Verschluss, damit sich der Kabelbinder \\u00f6ffnen und erneut verwenden l\\u00e4sst.\"],[\"Kabelbinder mit Schraub\\u00f6se\",\"B\\u00fcndelbefestigung mit Schraubmontage: Die integrierte \\u00d6se erm\\u00f6glicht die Verankerung an einer Platte oder einem anderen Tr\\u00e4ger, etwa im Schaltschrankbau und bei Sonderverkabelungen.\",\"Schraub\\u00f6se\",\"Die Bohrung oberhalb des Kopfes erm\\u00f6glicht das Anschrauben der Verkabelung am Tr\\u00e4ger.\"],[\"Steckbefestigung mit Federfl\\u00fcgeln\",\"Stabile Plattenmontage durch Einstecken in eine Bohrung. Die PA66-Befestigung mit Federfl\\u00fcgeln eignet sich f\\u00fcr Schaltschr\\u00e4nke, Sonderverkabelungen und Innenplatten von Haushaltsger\\u00e4ten.\",\"Federfl\\u00fcgel als Auflage\",\"Die flexiblen Fl\\u00fcgel unterst\\u00fctzen die Steckbefestigung und stabilisieren die Auflage an der Platte.\"],[\"Push mount\",\"Verkabelungen direkt in einer Plattenbohrung befestigen. Der PA66-Steckanker und sein Auflagevorsprung halten den Kabelbinder parallel zur Platte und vereinfachen die Montage.\",\"Steckanker f\\u00fcr Platten\",\"Der Anker wird in die Bohrung gesteckt; der Vorsprung an seinem Fu\\u00df sichert die Auflage an der Platte.\"]],\"es\":[[\"Bridas de cableado\",\"\",\"\",\"\"],[\"Identificaci\\u00f3n \\u00b7 Tipo 1\",\"Fija e identifica peque\\u00f1os mazos con un \\u00fanico componente de PA66 natural. La placa integrada bajo la cabeza, de 25,4 \\u00d7 8 mm, se puede escribir con rotulador.\",\"Placa integrada\",\"La placa de 25,4 \\u00d7 8 mm forma parte del cuerpo y re\\u00fane fijaci\\u00f3n e identificaci\\u00f3n de peque\\u00f1os mazos.\"],[\"Identificaci\\u00f3n \\u00b7 Tipo 2\",\"Una placa exterior sobre la cabeza facilita la identificaci\\u00f3n del cableado el\\u00e9ctrico. En PA66 natural, con una superficie de 20,4 \\u00d7 9 mm para escribir con rotulador.\",\"Placa exterior\",\"La placa de 20,4 \\u00d7 9 mm se sit\\u00faa sobre la cabeza, fuera del cuerpo de la brida.\"],[\"Identificaci\\u00f3n \\u00b7 Tipo 3\",\"Para fijar e identificar mazos de mayor tama\\u00f1o. El cuerpo de PA66 natural integra bajo la cabeza una placa de 13 \\u00d7 28 mm que se puede escribir con rotulador.\",\"Placa longitudinal\",\"La placa integrada de 13 \\u00d7 28 mm bajo la cabeza ofrece una zona de marcado para mazos grandes.\"],[\"Instalaci\\u00f3n \\u00b7 PA66\",\"Cabeza plana, inserci\\u00f3n paralela y dentado exterior para una amplia superficie de apoyo sobre la pieza. En PA66 negro, tambi\\u00e9n apto para exteriores. Cabeza de cierre simple o doble.\",\"Cabeza plana\",\"La cinta entra en paralelo en la cabeza. El perfil plano reduce los salientes y ampl\\u00eda la superficie de apoyo.\"],[\"Instalaci\\u00f3n \\u00b7 PA12\",\"Para exteriores, incluso en entornos marinos: el PA12 negro ofrece alta resistencia a los rayos UV, a la intemperie y a las bajas temperaturas. Cabeza plana con inserci\\u00f3n paralela.\",\"Cierre paralelo\",\"La cabeza plana se acopla al dentado exterior. El apriete requiere la herramienta indicada en el cat\\u00e1logo.\"],[\"Bridas reutilizables\",\"Cierra, abre y reutiliza. El gran bot\\u00f3n de liberaci\\u00f3n facilita las fijaciones provisionales, la preparaci\\u00f3n de cableados y el cierre de rollos de manguera o cable. En PA66 natural o negro.\",\"Bot\\u00f3n de liberaci\\u00f3n\",\"El bot\\u00f3n libera el mecanismo de cierre para abrir la brida y volver a utilizarla.\"],[\"Bridas con ojal\",\"La sujeci\\u00f3n del mazo se combina con el montaje mediante tornillo. El ojal integrado permite fijar la brida a un panel u otro soporte, para cuadros el\\u00e9ctricos y cableados especiales.\",\"Ojal para tornillo\",\"El orificio sobre la cabeza permite atornillar el cableado al soporte.\"],[\"Anclaje con aletas el\\u00e1sticas\",\"Fijaci\\u00f3n estable al panel mediante inserci\\u00f3n en un orificio. El anclaje de PA66 con aletas el\\u00e1sticas est\\u00e1 indicado para cuadros el\\u00e9ctricos, cableados especiales y paneles interiores de electrodom\\u00e9sticos.\",\"Apoyo con aletas el\\u00e1sticas\",\"Las aletas flexibles acompa\\u00f1an la inserci\\u00f3n y estabilizan el apoyo sobre el panel.\"],[\"Push mount\",\"Fija el cableado directamente en un orificio del panel. El anclaje de PA66 y su saliente de apoyo mantienen la brida paralela al soporte y facilitan el montaje.\",\"Anclaje para panel\",\"El anclaje se inserta en el orificio; el saliente en la base mantiene el apoyo sobre el panel.\"]],\"pt\":[[\"Abra\\u00e7adeiras de cablagem\",\"\",\"\",\"\"],[\"Identifica\\u00e7\\u00e3o \\u00b7 Tipo 1\",\"Fixe e identifique pequenos feixes com um \\u00fanico componente em PA66 natural. A placa integrada sob a cabe\\u00e7a, de 25,4 \\u00d7 8 mm, permite a escrita com marcador.\",\"Placa integrada\",\"A placa de 25,4 \\u00d7 8 mm faz parte do corpo e re\\u00fane fixa\\u00e7\\u00e3o e identifica\\u00e7\\u00e3o de pequenos feixes.\"],[\"Identifica\\u00e7\\u00e3o \\u00b7 Tipo 2\",\"Uma placa exterior acima da cabe\\u00e7a facilita a identifica\\u00e7\\u00e3o da cablagem el\\u00e9trica. Em PA66 natural, com uma superf\\u00edcie de 20,4 \\u00d7 9 mm para escrever com marcador.\",\"Placa exterior\",\"A placa de 20,4 \\u00d7 9 mm fica acima da cabe\\u00e7a, no exterior do corpo da abra\\u00e7adeira.\"],[\"Identifica\\u00e7\\u00e3o \\u00b7 Tipo 3\",\"Para fixar e identificar feixes de maior dimens\\u00e3o. O corpo em PA66 natural integra sob a cabe\\u00e7a uma placa de 13 \\u00d7 28 mm que permite a escrita com marcador.\",\"Placa longitudinal\",\"A placa integrada de 13 \\u00d7 28 mm sob a cabe\\u00e7a oferece uma \\u00e1rea de marca\\u00e7\\u00e3o para feixes maiores.\"],[\"Instala\\u00e7\\u00e3o \\u00b7 PA66\",\"Cabe\\u00e7a plana, inser\\u00e7\\u00e3o paralela e dentado exterior para uma ampla superf\\u00edcie de apoio na pe\\u00e7a a fixar. Em PA66 preto, tamb\\u00e9m adequado ao exterior. Cabe\\u00e7a de fecho simples ou duplo.\",\"Cabe\\u00e7a plana\",\"A fita entra paralelamente na cabe\\u00e7a. O perfil plano reduz as sali\\u00eancias e aumenta a superf\\u00edcie de apoio.\"],[\"Instala\\u00e7\\u00e3o \\u00b7 PA12\",\"Para aplica\\u00e7\\u00f5es no exterior, incluindo ambientes mar\\u00edtimos: o PA12 preto oferece elevada resist\\u00eancia aos raios UV, \\u00e0s intemp\\u00e9ries e \\u00e0s baixas temperaturas. Cabe\\u00e7a plana com inser\\u00e7\\u00e3o paralela.\",\"Fecho paralelo\",\"A cabe\\u00e7a plana trabalha com o dentado exterior. O aperto exige o alicate indicado no cat\\u00e1logo.\"],[\"Abra\\u00e7adeiras reutiliz\\u00e1veis\",\"Feche, abra e reutilize. O grande bot\\u00e3o de desbloqueio facilita fixa\\u00e7\\u00f5es provis\\u00f3rias, a prepara\\u00e7\\u00e3o de cablagens e o fecho de rolos de tubo ou cabo. Em PA66 natural ou preto.\",\"Bot\\u00e3o de desbloqueio\",\"O bot\\u00e3o liberta o mecanismo de fecho para abrir a abra\\u00e7adeira e voltar a utiliz\\u00e1-la.\"],[\"Abra\\u00e7adeiras com olhal\",\"A fixa\\u00e7\\u00e3o do feixe combina-se com a montagem por parafuso. O olhal integrado permite a fixa\\u00e7\\u00e3o a um painel ou outro suporte, para quadros el\\u00e9tricos e cablagens especiais.\",\"Olhal para parafuso\",\"O orif\\u00edcio acima da cabe\\u00e7a permite aparafusar a cablagem ao suporte.\"],[\"Encaixe com abas el\\u00e1sticas\",\"Fixa\\u00e7\\u00e3o est\\u00e1vel ao painel por inser\\u00e7\\u00e3o num orif\\u00edcio. O encaixe em PA66 com abas el\\u00e1sticas \\u00e9 indicado para quadros el\\u00e9tricos, cablagens especiais e pain\\u00e9is interiores de eletrodom\\u00e9sticos.\",\"Apoio com abas el\\u00e1sticas\",\"As abas flex\\u00edveis acompanham o encaixe e estabilizam o apoio no painel.\"],[\"Push mount\",\"Fixe a cablagem diretamente num orif\\u00edcio do painel. O encaixe em PA66 e a sua sali\\u00eancia de apoio mant\\u00eam a abra\\u00e7adeira paralela ao suporte e facilitam a montagem.\",\"Encaixe para painel\",\"O encaixe entra no orif\\u00edcio; a sali\\u00eancia na base mant\\u00e9m o apoio no painel.\"]]};\r\nconst TYPE_UI={\"it\":[\"Tipologia\",\"Testa singola\",\"Testa doppia\",\"Materiale\",\"Il corpo in PA66 unisce fissaggio e praticit\\u00e0 di installazione.\",\"Il PA12 offre resistenza ai raggi UV, agli agenti atmosferici e alle basse temperature.\",\"Serraggio progressivo\",\"L\\u2019aggancio tra linguetta e cremagliera permette di adattare la chiusura al diametro del fascio.\",\"Serrare con la pinza per fascette indicata nel catalogo.\",\"Il nastro avvolge il fascio e aderisce al suo contorno durante il serraggio.\",\"Inserire la coda parallelamente nella testa piatta.\",\"Modello 3D ricostruttivo da catalogo\"],\"en\":[\"Type\",\"Single head\",\"Double head\",\"Material\",\"The PA66 body combines fastening with practical installation.\",\"PA12 offers resistance to UV, weathering and low temperatures.\",\"Progressive tightening\",\"The pawl and rack engage to adapt the closure to the bundle diameter.\",\"Tighten with the cable tie tool specified in the catalogue.\",\"The strap wraps around the bundle and follows its contour as it tightens.\",\"Insert the tail parallel to the flat head.\",\"3D reconstruction from catalogue\"],\"fr\":[\"Type\",\"T\\u00eate simple\",\"T\\u00eate double\",\"Mat\\u00e9riau\",\"Le corps en PA66 associe fixation et simplicit\\u00e9 de pose.\",\"Le PA12 r\\u00e9siste aux UV, aux intemp\\u00e9ries et aux basses temp\\u00e9ratures.\",\"Serrage progressif\",\"Le cliquet et la denture permettent d\\u2019adapter la fermeture au diam\\u00e8tre du faisceau.\",\"Serrez avec la pince pour colliers indiqu\\u00e9e dans le catalogue.\",\"La bande entoure le faisceau et \\u00e9pouse son contour pendant le serrage.\",\"Ins\\u00e9rez la pointe parall\\u00e8lement dans la t\\u00eate plate.\",\"Reconstitution 3D \\u00e0 partir du catalogue\"],\"de\":[\"Ausf\\u00fchrung\",\"Einfacher Kopf\",\"Doppelter Kopf\",\"Werkstoff\",\"Der PA66-K\\u00f6rper verbindet Befestigung mit praktischer Montage.\",\"PA12 ist best\\u00e4ndig gegen UV-Strahlung, Witterung und niedrige Temperaturen.\",\"Stufenweises Spannen\",\"Sperrklinke und Verzahnung passen den Verschluss an den B\\u00fcndeldurchmesser an.\",\"Mit der im Katalog angegebenen Kabelbinderzange spannen.\",\"Das Band umschlie\\u00dft das B\\u00fcndel und legt sich beim Spannen an seine Kontur an.\",\"Das Bandende parallel in den flachen Kopf einf\\u00fchren.\",\"3D-Nachbildung anhand des Katalogs\"],\"es\":[\"Tipo\",\"Cabeza simple\",\"Cabeza doble\",\"Material\",\"El cuerpo de PA66 combina sujeci\\u00f3n y facilidad de instalaci\\u00f3n.\",\"El PA12 ofrece resistencia a los rayos UV, a la intemperie y a las bajas temperaturas.\",\"Apriete progresivo\",\"La leng\\u00fceta y el dentado permiten adaptar el cierre al di\\u00e1metro del mazo.\",\"Apriete con la herramienta para bridas indicada en el cat\\u00e1logo.\",\"La cinta envuelve el mazo y se ajusta a su contorno durante el apriete.\",\"Introduzca la cola en paralelo en la cabeza plana.\",\"Reconstrucci\\u00f3n 3D a partir del cat\\u00e1logo\"],\"pt\":[\"Tipo\",\"Cabe\\u00e7a simples\",\"Cabe\\u00e7a dupla\",\"Material\",\"O corpo em PA66 combina fixa\\u00e7\\u00e3o e facilidade de instala\\u00e7\\u00e3o.\",\"O PA12 oferece resist\\u00eancia aos raios UV, \\u00e0s intemp\\u00e9ries e \\u00e0s baixas temperaturas.\",\"Aperto progressivo\",\"O linguete e o dentado permitem adaptar o fecho ao di\\u00e2metro do feixe.\",\"Aperte com o alicate para abra\\u00e7adeiras indicado no cat\\u00e1logo.\",\"A fita envolve o feixe e adapta-se ao seu contorno durante o aperto.\",\"Introduza a cauda paralelamente na cabe\\u00e7a plana.\",\"Reconstitui\\u00e7\\u00e3o 3D a partir do cat\\u00e1logo\"]};\r\n\r\nlet selectedType=TYPES.some(t=>t.id===root.dataset.type)?root.dataset.type:'cabling';\r\nlet selectedHead='double',modelResources=new Set();\r\nconst family=()=>TYPES.find(t=>t.id===selectedType);\r\nconst allowedColors=()=>{const only=(root.dataset.only||'').split(',').filter(Boolean),list=PALETTE.filter(c=>family().colors.includes(c.id));const f=only.length?list.filter(c=>only.includes(c.id)):list;return f.length?f:list};\r\nfunction familyCopy(locale){\r\n  const base=TEXT[locale],type=family(),idx=TYPES.indexOf(type),row=TYPE_COPY[locale][idx],ui=TYPE_UI[locale];\r\n  if(!idx)return base;\r\n  const copy={...base,title:row[0]+' Cieffeplast',description:row[1],parts:[\r\n    [ui[3],ui[type.id==='pa12'?5:4]],[ui[6],ui[7]],[row[2],row[3]],[base.parts[3][0],ui[9]]],\r\n    installation:{...base.installation,steps:base.installation.steps.map(s=>s.slice()),done:base.installation.done.slice()}};\r\n  copy.installation.steps[2][1]=type.id==='pa12'?ui[8]:ui[9];\r\n  if(type.flat)copy.installation.steps[1][1]=ui[10];\r\n  copy.colors={...base.colors,names:base.colors.names.slice()};\r\n  copy.colors.names[3]={it:'Nero',en:'Black',fr:'Noir',de:'Schwarz',es:'Negro',pt:'Preto'}[locale];\r\n  return copy;\r\n}\r\n\/\/ Custom listbox: native selects remain the source of values and change events.\r\nfunction syncFamilyPicker(select){\r\n let p=select._cfsPicker;\r\n if(!p){\r\n  const wrap=document.createElement('div'),button=document.createElement('button'),value=document.createElement('span'),list=document.createElement('div');\r\n  wrap.className='cfs-picker';button.type='button';button.className='cfs-picker-trigger';value.className='cfs-picker-value';list.className='cfs-picker-list';\r\n  list.id=root.id+'-picker-'+(select.hasAttribute('data-type-select')?'type':'head');list.setAttribute('role','listbox');list.hidden=true;\r\n  button.setAttribute('aria-haspopup','listbox');button.setAttribute('aria-controls',list.id);button.setAttribute('aria-expanded','false');button.append(value);\r\n  select.before(wrap);wrap.append(select,button,list);select.classList.add('cfs-picker-native');select.tabIndex=-1;select.setAttribute('aria-hidden','true');\r\n  p=select._cfsPicker={wrap,button,value,list,index:0,query:'',stamp:0};\r\n  const options=()=>[...list.children];\r\n  const focus=i=>{const opts=options();p.index=Math.max(0,Math.min(opts.length-1,i));opts.forEach((o,k)=>o.tabIndex=k===p.index?0:-1);opts[p.index]?.focus({preventScroll:true});opts[p.index]?.scrollIntoView({block:'nearest',inline:'nearest'})};\r\n  const close=restore=>{list.hidden=true;button.setAttribute('aria-expanded','false');wrap.classList.remove('is-open');root.classList.toggle('cfs-picker-open',!!root.querySelector('.cfs-picker.is-open'));if(restore&&!button.disabled)button.focus({preventScroll:true})};\r\n  const open=()=>{\r\n   if(button.disabled)return;\r\n   root.querySelectorAll('.cfs-picker-native').forEach(s=>{if(s!==select)s._cfsPicker?.close(false)});\r\n   const r=button.getBoundingClientRect(),stage=root.querySelector('.cfs-stage').getBoundingClientRect();\r\n   const below=Math.min(stage.bottom,window.innerHeight)-r.bottom-14,above=r.top-Math.max(stage.top,0)-14,up=below<160&&above>below;\r\n   wrap.classList.toggle('opens-up',up);list.style.maxHeight=Math.max(72,Math.min(330,up?above:below))+'px';\r\n   list.hidden=false;wrap.classList.add('is-open');root.classList.add('cfs-picker-open');button.setAttribute('aria-expanded','true');focus(select.selectedIndex);\r\n  };\r\n  const choose=i=>{const option=select.options[i];if(!option||select.disabled)return;select.value=option.value;close(true);select.dispatchEvent(new Event('change',{bubbles:true}))};\r\n  p.close=close;\r\n  on(button,'click',()=>list.hidden?open():close(true));\r\n  on(button,'keydown',e=>{if(['ArrowDown','ArrowUp','Home','End'].includes(e.key)){e.preventDefault();open();if(e.key==='Home')focus(0);if(e.key==='End')focus(select.options.length-1)}});\r\n  on(list,'click',e=>{const o=e.target.closest('[role=\"option\"]');if(o)choose(Number(o.dataset.index))});\r\n  on(list,'keydown',e=>{\r\n   if(e.key==='Escape'){e.preventDefault();e.stopPropagation();close(true);return}\r\n   if(e.key==='Tab'){close(true);return}\r\n   if(e.key==='Enter'||e.key===' '){e.preventDefault();choose(p.index);return}\r\n   if(['ArrowDown','ArrowUp','Home','End'].includes(e.key)){e.preventDefault();focus(e.key==='Home'?0:e.key==='End'?select.options.length-1:p.index+(e.key==='ArrowDown'?1:-1));return}\r\n   if(e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey){e.preventDefault();const now=Date.now();p.query=now-p.stamp>700?e.key:p.query+e.key;p.stamp=now;const i=[...select.options].findIndex(o=>o.textContent.toLocaleLowerCase().startsWith(p.query.toLocaleLowerCase()));if(i>=0)focus(i)}\r\n  });\r\n  on(document,'pointerdown',e=>{if(!wrap.contains(e.target))close(false)});\r\n  on(wrap,'focusout',e=>{if(!wrap.contains(e.relatedTarget))close(false)});\r\n  on(window,'resize',()=>close(false),{passive:true});\r\n }\r\n p.wrap.hidden=select.hidden;p.button.disabled=select.disabled;\r\n const label=select.getAttribute('aria-label')||'';p.list.setAttribute('aria-label',label);\r\n p.value.textContent=select.options[select.selectedIndex]?.textContent||label;p.button.setAttribute('aria-label',label+': '+p.value.textContent);\r\n if(p.list.children.length!==select.options.length){p.list.replaceChildren();[...select.options].forEach((o,i)=>{const item=document.createElement('div');item.setAttribute('role','option');item.dataset.index=i;item.tabIndex=-1;p.list.append(item)})}\r\n [...p.list.children].forEach((item,i)=>{item.textContent=select.options[i].textContent;item.setAttribute('aria-selected',String(i===select.selectedIndex))});\r\n if(select.disabled||select.hidden)p.close(false);\r\n}\r\n\r\nfunction familyUI(){\r\n  const select=$('[data-type-select]'),ui=TYPE_UI[lang||'it'];\r\n  if(!select)return;\r\n  text($('.cfs-type-label'),ui[0]);select.setAttribute('aria-label',ui[0]);\r\n  const current=[...select.options];\r\n  if(current.length!==TYPES.length){select.replaceChildren();TYPES.forEach(t=>{const o=document.createElement('option');o.value=t.id;select.append(o)})}\r\n  [...select.options].forEach((o,i)=>text(o,TYPE_COPY[lang||'it'][i][0]));select.value=selectedType;\r\n  select.disabled=!ready||loading||lost;\r\n  const headSelect=$('[data-head-select]');headSelect.hidden=!family().flat;\r\n  text(headSelect.options[0],ui[1]);text(headSelect.options[1],ui[2]);headSelect.value=selectedHead;\r\n  headSelect.setAttribute('aria-label',TYPE_COPY[lang||'it'][TYPES.indexOf(family())][2]||ui[0]);\r\n  headSelect.disabled=select.disabled;\r\n  syncFamilyPicker(select);syncFamilyPicker(headSelect);\r\n  root.dataset.type=selectedType;\r\n}\r\nfunction resetFamilyPath(){\r\n  WRAP.cx=PACK.openX;WRAP.cz=PACK.openZ;PACK.tightX=-17.90;PACK.tightZ=5.02;PACK.settle=0;\r\n  HEAD.angle=0;HEAD.c=1;HEAD.s=0;configureMold();TIP.k=mold()?.tipK??.325;\r\n  FEED.end=0;TAIL.memory=1;TAIL.a.length=TAIL.x.length=TAIL.theta.length=TAIL.u.length=TAIL.v.length=0;\r\n  prepareTail();PATH.r=NaN;PARALLEL.ready=false;\r\n  buildPath(WRAP.open);\r\n}\r\nfunction setFamily(id,head=selectedHead){\r\n  if(!ready||loading||lost||!TYPES.some(t=>t.id===id))return;\r\n  if(id===selectedType&&head===selectedHead)return;\r\n  stopIntro();stopZip();playback=null;colorTween=null;returning=null;\r\n  selectedType=id;selectedHead=head;configureMold();\r\n  if(!family().colors.includes(selectedColor))selectedColor=family().colors[0];\r\n  const color=PALETTE.find(c=>c.id===selectedColor);\r\n  translucency=color.glow||0;materialOpacity=color.opacity||1;metallicAmount=selectedColor==='gold'?1:0;\r\n  scene.remove(model);rack?.mesh.dispose();\r\n  modelResources.forEach(r=>{r.dispose();resources.delete(r)});modelResources.clear();\r\n  finishes.length=0;deformable.length=0;followers.length=0;cableMaterials=[];\r\n  resetFamilyPath();wrap=0;makeModel();\r\n  KEYS.forEach((k,i)=>k.splice(0,k.length,...BASE_KEYS[i].map(v=>Array.isArray(v)?v.slice():v)));\r\n  if(selectedType!=='cabling'){\r\n    for(const k of KEYS){\r\n      if(k[0]<=.07&&family().flat)k[3]=[.04,-.22,-1];\r\n      if(k[0]===.15||k[0]===.23){k[1]=family().focus;k[2]=family().span;if(family().flat)k[3]=k[0]===.15?[-.16,-.48,-1]:[-.24,-.64,-1]}\r\n      if(k[0]>=.45&&k[0]<=.55){k[1]=-6;k[2]=7}\r\n\r\n    }\r\n  }\r\n  manual=false;controls.enabled=!coarse.matches;createPalette();localize(true);\r\n  w=0;h=0;resize();applyTimeline(0);updateUI();kick();\r\n}\r\nfunction upgradeModel(){\r\n  upgradeQueued=false;\r\n  if(dead||!ready||loading||lost||tier!=='full')return;\r\n  if(playback){upgradeQueued=true;setTimeout(upgradeModel,1200);return}\r\n  scene.remove(model);rack?.mesh.dispose();\r\n  modelResources.forEach(r=>{r.dispose();resources.delete(r)});modelResources.clear();\r\n  finishes.length=0;deformable.length=0;followers.length=0;cableMaterials=[];\r\n  resetFamilyPath();wrap=0;makeModel();\r\n  w=0;h=0;resize();applyTimeline(0);updateUI();kick();\r\n}\r\nfunction queueUpgrade(){\r\n  if(tier==='full'||upgradeQueued)return;tier='full';upgradeQueued=true;\r\n  prefetchNative();\r\n  \/\/ after the full-screen transition, on an idle slice: never inside the click\r\n  setTimeout(()=>(window.requestIdleCallback||(f=>setTimeout(f,1)))(upgradeModel,{timeout:900}),450);\r\n}\r\nfunction prefetchNative(){\r\n  if(!renderer||dead)return;const n=surfaceSize('full');\r\n  if(!SURF.data['mold'+n])requestSurface('mold'+n,n,false);\r\n  if(!SURF.data['grip'+n])requestSurface('grip'+n,n,true);\r\n}\r\nfunction plateWidth(x){\r\n  const p=family().plate;if(!p||x<p[0]||x>p[1])return 0;\r\n  const r=selectedType==='id3'?.13:.11,d=Math.min(x-p[0],p[1]-x),half=p[2]\/2;\r\n  return d>=r?half:half-r+Math.sqrt(Math.max(0,r*r-(r-d)*(r-d)));\r\n}\r\n\/\/ Installation heads: an initially elliptical free band progressively seats on\r\n\/\/ the cable envelope. Arc length controls feeding through both locking bays.\r\n\/* Punta rigida: l'ultimo tratto resta dritto sul proprio asse (rigid) e la\r\n   piega si sposta piu' indietro sul corpo, prima della punta. alpha e'\r\n   l'inclinazione dell'avvicinamento: appena la punta entra nella testa le\r\n   pareti la guidano e il nastro si conforma al canale interno. *\/\r\nconst PARALLEL={ready:false,open:1.5,points:[],length:0,entry:0,exit:0,z:-.40,morph:0,rigid:2.8,alpha:0};\r\nfunction parallelContour(loose,morph=0){\r\n const pts=PARALLEL.points;pts.length=0;PARALLEL.morph=morph;\r\n const m=mold(),L=selectedHead==='single'?m.singleL:m.headL,start=STRAP_X0-L;\r\n const R=WRAP.cornerRadius,rr=WRAP.cableRadius+m.thick*.5+WRAP.clearance+loose;\r\n PARALLEL.entry=start-.18;PARALLEL.exit=STRAP_X0;PARALLEL.z=-.40;\r\n WRAP.cx=(start+STRAP_X0)*.5;\r\n WRAP.cz=lerp(R+rr,R*Math.sqrt(3)\/2+rr,morph);\r\n const add=(x,z)=>pts.push({x,z,a:0});\r\n const cubic=(bx,bz,cx,cz,dx,dz)=>{const p=pts[pts.length-1];for(let i=1;i<=96;i++){const t=i\/96,u=1-t;add(u*u*u*p.x+3*u*u*t*bx+3*u*t*t*cx+t*t*t*dx,u*u*u*p.z+3*u*u*t*bz+3*u*t*t*cz+t*t*t*dz)}};\r\n const polar=a=>{\r\n  const c=Math.cos(a),s=Math.sin(a);contactPoint(WRAP.cx+c*.001,WRAP.cz+s*.001,m.thick*.5+WRAP.clearance+loose);\r\n  const r=lerp(R+rr,SURFACE.limit,morph);return {x:WRAP.cx+c*r,z:WRAP.cz+s*r};\r\n };\r\n add(WRAP.s0,0);\r\n const seat=smooth((morph-.50)\/.50);\r\n const a0=Math.atan2(-WRAP.cz,WRAP.s0-WRAP.cx),a1=lerp(190,230,seat)*Math.PI\/180;\r\n \/\/ The short root fillet is the only departure from a circle while loose.\r\n const first=polar(a0+.08*morph);\r\n if(morph>1e-8){const next=polar(a0+.08*morph+.001),dx=next.x-first.x,dz=next.z-first.z,d=Math.hypot(dx,dz),h=Math.min(.28,Math.hypot(first.x-WRAP.s0,first.z)*.4);cubic(WRAP.s0+h,0,first.x-dx\/d*h,first.z-dz\/d*h,first.x,first.z)}\r\n for(let i=1;i<=960;i++){const p=polar(lerp(a0+.08*morph,a1,i\/960));add(p.x,p.z)}\r\n const last=pts[pts.length-1],prev=pts[pts.length-2],dx=last.x-prev.x,dz=last.z-prev.z,d=Math.hypot(dx,dz);\r\n \/\/ Straight lead-in: the free nose is already coaxial before insertion.\r\n \/\/ The temporary free lead is consumed by tightening; at full closure\r\n \/\/ only the short tangent connection to the fixed head remains.\r\n const entryZ=PARALLEL.z,leadX=PARALLEL.entry-lerp(PARALLEL.rigid,.06,seat),ta=Math.tan(PARALLEL.alpha),leadZ=entryZ+(PARALLEL.entry-leadX)*ta;\r\n const h=Math.min(lerp(3.0,1.35,seat),Math.hypot(leadX-last.x,leadZ-last.z)*lerp(.55,.42,seat)),hl=lerp(1.6,.12,seat);\r\n cubic(last.x+dx\/d*h,last.z+dz\/d*h,leadX-hl,leadZ+hl*ta,leadX,leadZ);\r\n for(let i=1;i<=120;i++)add(lerp(leadX,PARALLEL.entry,i\/120),lerp(leadZ,entryZ,i\/120));\r\n \/\/ Loose installation loop: a broad oval with a horizontal arrival.\r\n \/\/ The turn is distributed around the loop, never concentrated in the nose.\r\n if(morph<1){\r\n  const oval=[{x:WRAP.s0,z:0}],cx=WRAP.cx,ry=R+rr,rx=ry*1.18;\r\n  const segment=(bx,bz,cx1,cz,ex,ez)=>{const p=oval[oval.length-1];for(let i=1;i<=240;i++){const t=i\/240,u=1-t;oval.push({x:u*u*u*p.x+3*u*u*t*bx+3*u*t*t*cx1+t*t*t*ex,z:u*u*u*p.z+3*u*u*t*bz+3*u*t*t*cz+t*t*t*ez})}};\r\n  const lead=PARALLEL.entry-PARALLEL.rigid-1.1,right=cx+rx,left=Math.min(cx-rx,lead-ry*.8),bottom=2*ry,k=.55228475;\r\n  const ta=Math.tan(PARALLEL.alpha),leadZ=entryZ+(PARALLEL.entry-lead)*ta;\r\n  segment(WRAP.s0+(right-WRAP.s0)*k,0,right,ry*(1-k),right,ry);\r\n  segment(right,ry*(1+k),cx+rx*k,bottom,cx,bottom);\r\n  segment(cx-rx*k,bottom,left,ry*(1+k),left,ry);\r\n  segment(left,ry*(1-k),lead-(lead-left)*k,leadZ+(lead-left)*k*ta,lead,leadZ);\r\n  for(let i=1;i<=120;i++)oval.push({x:lerp(lead,PARALLEL.entry,i\/120),z:lerp(leadZ,entryZ,i\/120)});\r\n  const sample=(arr)=>{let sum=0;for(let i=0;i<arr.length;i++){if(i)sum+=Math.hypot(arr[i].x-arr[i-1].x,arr[i].z-arr[i-1].z);arr[i].a=sum}return sum};\r\n  const old=pts.map(p=>({...p})),la=sample(old),lb=sample(oval);let ia=0,ib=0;pts.length=0;\r\n  for(let i=0;i<=1200;i++){\r\n   const a=la*i\/1200,b=lb*i\/1200;\r\n   while(ia<old.length-2&&old[ia+1].a<a)ia++;\r\n   while(ib<oval.length-2&&oval[ib+1].a<b)ib++;\r\n   const fa=(a-old[ia].a)\/(old[ia+1].a-old[ia].a),fb=(b-oval[ib].a)\/(oval[ib+1].a-oval[ib].a);\r\n   add(lerp(lerp(oval[ib].x,oval[ib+1].x,fb),lerp(old[ia].x,old[ia+1].x,fa),morph),lerp(lerp(oval[ib].z,oval[ib+1].z,fb),lerp(old[ia].z,old[ia+1].z,fa),morph));\r\n  }\r\n }\r\n \/\/ Unilateral cable contact also applies to the bent entrance segment.\r\n \/\/ The small extra clearance covers the finite strip thickness after sampling.\r\n for(let i=1;i<pts.length-1;i++){const p=pts[i];contactPoint(p.x,p.z,m.thick*.5+.018);p.x=SURFACE.x;p.z=SURFACE.z}\r\n let length=0;for(let i=0;i<pts.length;i++){if(i)length+=Math.hypot(pts[i].x-pts[i-1].x,pts[i].z-pts[i-1].z);pts[i].a=length}\r\n PARALLEL.length=length;POSE.ex=PARALLEL.entry;POSE.ez=entryZ;POSE.angle=0;\r\n \/\/ Both parallel locking bays share one axis; no articulated bend inside.\r\n const channelSteps=Math.ceil((PARALLEL.exit-PARALLEL.entry)\/.025);\r\n for(let i=1;i<=channelSteps;i++)add(lerp(PARALLEL.entry,PARALLEL.exit,i\/channelSteps),entryZ);\r\n const exitIndex=pts.length-1;\r\n for(let i=1;i<=1200;i++)add(PARALLEL.exit+i*.04,-.40);\r\n for(let i=1;i<pts.length;i++)pts[i].a=pts[i-1].a+Math.hypot(pts[i].x-pts[i-1].x,pts[i].z-pts[i-1].z);\r\n POSE.feed=pts[exitIndex].a;POSE.guide=Math.max(0,TAIL.length-length);\r\n}\r\nfunction buildParallelPath(loose){\r\n if(!PARALLEL.ready){\r\n  PARALLEL.alpha=0;let lo=0,hi=4;\r\n  for(let i=0;i<26;i++){const mid=(lo+hi)\/2;parallelContour(mid,0);if(PARALLEL.length<TAIL.length+.80)lo=mid;else hi=mid}\r\n  PARALLEL.open=(lo+hi)\/2;FEED.start=POSE.feed;\r\n  parallelContour(0,1);PARALLEL.tight=PARALLEL.length;FEED.end=POSE.feed;PARALLEL.ready=true;\r\n }\r\n const pull=clamp(1-loose\/WRAP.open),morph=smooth((pull-.35)\/.65);\r\n const target=lerp(TAIL.length+.80,PARALLEL.tight,pull);\r\n \/* Profondita' della punta nella testa: fuori arriva appena inclinata,\r\n    dentro si allinea al canale guidata dalle pareti. *\/\r\n const depth=TAIL.length-target;PARALLEL.alpha=.11*(1-smooth((depth+.8)\/1.1));\r\n let low=0,high=PARALLEL.open+1;\r\n for(let i=0;i<24;i++){const mid=(low+high)*.5;parallelContour(mid,morph);if(PARALLEL.length<target)low=mid;else high=mid}\r\n parallelContour((low+high)*.5,morph);\r\n HEAD.angle=0;HEAD.c=1;HEAD.s=0;PACK.settle=pull;PATH.r=loose;PATH.len=TAIL.length;PATH.guide=PARALLEL.length;PATH.ds=TAIL.length\/(WRAP.n-1);\r\n let j=0;const pts=PARALLEL.points;\r\n for(let i=0;i<WRAP.n;i++){\r\n  const a=i*PATH.ds;while(j<pts.length-2&&pts[j+1].a<a)j++;\r\n  const f=(a-pts[j].a)\/Math.max(1e-9,pts[j+1].a-pts[j].a);PATH.x[i]=lerp(pts[j].x,pts[j+1].x,f);PATH.z[i]=lerp(pts[j].z,pts[j+1].z,f);\r\n }\r\n let actual=0;\r\n for(let i=0;i<WRAP.n;i++){\r\n  if(i)actual+=Math.hypot(PATH.x[i]-PATH.x[i-1],PATH.z[i]-PATH.z[i-1]);\r\n  const lo=Math.max(0,i-1),hi=Math.min(WRAP.n-1,i+1),dx=PATH.x[hi]-PATH.x[lo],dz=PATH.z[hi]-PATH.z[lo],d=Math.hypot(dx,dz);PATH.c[i]=dx\/d;PATH.s[i]=dz\/d;\r\n }\r\n PATH.arcError=TAIL.length-actual;PATH.c[0]=1;PATH.s[0]=0;\r\n}\r\n\r\n\/* Base per finitura: [ruvidita', clearcoat, ruvidita' clearcoat, velluto di bordo].\r\n   L'ordine segue finishes[]: corpo, zona di presa, testa, cavita'. *\/\r\nconst FINISH=[[.44,.55,.17,.30],[.88,0,.60,.18],[.52,.50,.21,.30],[.60,.34,.30,.34]];\r\n\/* Fascio a nido d'ape: 19 cavi. Distanze e raggi sono in unita' del modello. *\/\r\nconst CABLES=[['#cf5518',0,0],['#2b52a0',1.95,0],['#9ea19c',1.95,60],['#1c7c46',1.95,120],\r\n  ['#5e4025',1.95,180],['#b8b09f',1.95,240],['#8f2620',1.95,300],\r\n  ['#2b52a0',4.10,0],['#1c7c46',4.10,60],['#cf5518',4.10,120],['#8f2620',4.10,180],\r\n  ['#9ea19c',4.10,240],['#5e4025',4.10,300],\r\n  ['#b8b09f',3.55,30],['#cf5518',3.55,90],['#2b52a0',3.55,150],\r\n  ['#1c7c46',3.55,210],['#8f2620',3.55,270],['#9ea19c',3.55,330]];\r\nconst STOP=[0,.19,.49,.65,.84],ORDER=[-1,2,0,1,3];\r\nconst $=s=>root.querySelector(s);\r\nconst stage=$('.cfs-stage'),mount=$('.cfs-mount'),card=$('.cfs-card');\r\nconst status=$('.cfs-status'),path=$('.cfs-lines path'),pin=$('.cfs-pin');\r\nconst nav=[...root.querySelectorAll('[data-stop]')];\r\nconst abort=new AbortController(),resources=new Set(),hosts=[],finishes=[];\r\n\/\/ Natural nylon: native rough transmission with depth-tested opaque cable occluders.\r\nconst nylonGlass={map:{value:null},screen:{value:null},texel:{value:null},amount:{value:0}};\r\n\/\/ Satin edge scattering supplements the native thickness-dependent transmission.\r\n\/\/ No additive back-face accumulation and no disabled depth tests.\r\nfunction nylonShader(material,index){\r\n const amount={value:index>=2?.018:.055};\r\n material.onBeforeCompile=shader=>{\r\n  shader.uniforms.nylonAmount=nylonGlass.amount;shader.uniforms.nylonScatter=amount;\r\n  shader.fragmentShader='uniform float nylonAmount;\\n uniform float nylonScatter;\\n'+shader.fragmentShader;\r\n  shader.fragmentShader=shader.fragmentShader.replace('#include <opaque_fragment>',`\r\n   float grazing=pow(1.0-abs(dot(normalize(normal),normalize(vViewPosition))),3.0);\r\n   outgoingLight+=diffuseColor.rgb*grazing*nylonScatter*nylonAmount;\r\n   #include <opaque_fragment>`);\r\n };\r\n material.depthTest=true;material.depthWrite=true;material.transparent=false;material.opacity=1;\r\n material.customProgramCacheKey=()=> 'cobra-nylon-volume-v6';\r\n}\r\n\/\/ Opaque internal teeth participate in the transmission background. The opaque\r\n\/\/ cable depth still hides the rear strap; no overlay or depth bypass is used.\r\nlet nylonRackMaterial=null;\r\nfunction renderNylonScene(){\r\n const original=rack?.mesh.material;\r\n if(original&&translucency>.001){\r\n  if(!nylonRackMaterial)nylonRackMaterial=keep(new T.MeshStandardMaterial());\r\n  nylonRackMaterial.color.copy(original.color);\r\n  nylonRackMaterial.roughness=.52;nylonRackMaterial.metalness=original.metalness;\r\n  nylonRackMaterial.envMapIntensity=original.envMapIntensity;\r\n  nylonRackMaterial.depthTest=true;nylonRackMaterial.depthWrite=true;\r\n  rack.mesh.material=nylonRackMaterial;\r\n }\r\n try{renderer.render(scene,camera)}finally{if(original)rack.mesh.material=original}\r\n}\r\nconst deformable=[],followers=[];\r\nconst coarse=matchMedia('(pointer:coarse)'),motion=matchMedia('(prefers-reduced-motion:reduce)');\r\nlet T,renderer,scene,camera,controls,model,environment,key,rim,edgeA,edgeB,gloss;\r\nlet rack,cables,cableMaterials=[];\r\nlet observer,resizeObserver,languageObserver,removalObserver,glassObserver;\r\nlet ready=false,loading=false,dead=false,lost=false,visible=false,manual=false;\r\nlet reduced=motion.matches,narrow=false,w=0,h=0,top=0,travel=1,homeDistance=70;\r\nlet lang='',copy,active=-1,dismissed=-2,cardBox=null,measure=true;\r\nlet raf=0,last=0,inFrame=false,dirty=true,scrollRead=true,p=0,targetP=0;\r\nlet intro=5,engaged=false,returning=null,viewX=0,viewY=0,pinVisible=false;\r\nlet selectedColor=allowedColors().some(c=>c.id===root.dataset.color)?root.dataset.color:allowedColors()[0].id;\r\nconst initialFinish=PALETTE.find(c=>c.id===selectedColor);\r\nlet colorTween=null,translucency=initialFinish.glow||0,materialOpacity=initialFinish.opacity||1;\r\nlet metallicAmount=selectedColor==='gold'?1:0;\r\nconst goldFinish={amount:{value:metallicAmount}};\r\nlet wrap=0,tip=0;\r\nconst lowPower=(navigator.hardwareConcurrency||8)<=4||(navigator.deviceMemory||8)<=4;\r\n\/\/ Pixel budget, not device class, determines sharpness. The final still frame\r\n\/\/ is sharper than moving frames and is rendered once, then the GPU goes idle.\r\nlet qualityDpr=1,motionQuality=1,slowFrames=0,fastFrames=0,qualityMotion=false;\r\nfunction desiredDpr(moving){\r\n const zoom=Math.max(1,window.visualViewport?.scale||1);\r\n const native=Math.max(1,window.devicePixelRatio||1)*zoom;\r\n const desktop=!coarse.matches&&w>=1000;\r\n const budget=desktop?(moving?3840*2160:4480*2520):(moving?4200000:6500000);\r\n const ceiling=desktop?4:3*Math.min(zoom,1.5);\r\n const limit=renderer?.capabilities.maxTextureSize||4096;\r\n const ratio=Math.min(native,ceiling,Math.sqrt(budget\/Math.max(1,w*h)),limit\/Math.max(1,w,h));\r\n const floor=Math.min(ratio,desktop?1.75:2);\r\n return Math.max(floor,ratio*(moving?motionQuality:1));\r\n}\r\nfunction setRenderQuality(moving,force=false){\r\n const next=Math.floor(desiredDpr(moving)*100)\/100;\r\n const changed=Math.abs(next-qualityDpr)>.025;\r\n if(force||changed){qualityDpr=next;renderer.setPixelRatio(next);renderer.setSize(w,h,false)}\r\n \/\/ Full-resolution transmission when stationary makes the rack legible.\r\n const transmissionScale=moving?.75:1;\r\n const opticsChanged=renderer.transmissionResolutionScale!==transmissionScale;\r\n renderer.transmissionResolutionScale=transmissionScale;qualityMotion=moving;\r\n return changed||opticsChanged||force;\r\n}\r\nfunction adaptQuality(ms){\r\n \/\/ Only consecutive active frames are sampled. A 30 fps battery cap is not\r\n \/\/ interpreted as a slow GPU; idle gaps and shader compilation are excluded.\r\n if(ms>200){slowFrames=fastFrames=0;return}\r\n const slow=ms>(lowPower?48:29);\r\n slowFrames=slow?slowFrames+1:Math.max(0,slowFrames-1);\r\n fastFrames=!slow&&ms<(lowPower?37:22)?fastFrames+1:0;\r\n if(slowFrames>=36){motionQuality=Math.max(.75,motionQuality-.1);slowFrames=0}\r\n if(fastFrames>=180){motionQuality=Math.min(1,motionQuality+.05);fastFrames=0}\r\n}\r\nconst INSTALL={start:.79,end:1,duration:12};\r\nlet playback=null,installStage=-1;\r\n\/\/ Physical scroll uses less travel for details, more for the installation.\r\nconst scrollToTimeline=x=>x<=.48?x\/.48*.79:.79+(x-.48)\/.52*.21;\r\nconst timelineToScroll=x=>x<=.79?x\/.79*.48:.48+(x-.79)\/.21*.52;\r\nlet tourScrollY=null;\r\n\/\/ One deliberate wheel\/swipe gesture advances one action; inertia never queues steps.\r\nconst ACTIONS=[0,.19,.49,.65,.84,.888,.934,1];\r\nlet wheelStamp=0,wheelSum=0,wheelConsumed=false,touchOrigin=null;\r\nfunction nextAction(direction,value=p){\r\n return direction>0?ACTIONS.find(x=>x>value+.002):ACTIONS.slice().reverse().find(x=>x<value-.002);\r\n}\r\nfunction stepScope(target){\r\n const r=root.getBoundingClientRect();\r\n return ready&&!loading&&!lost&&!manual&&r.top<=top+4&&r.bottom>=top+stage.clientHeight-4&&\r\n !target?.closest?.('button,a,input,select,textarea,.cfs-picker,.cfs-card');\r\n}\r\nfunction startAction(to){\r\n if(to===undefined)return false;\r\n mode(false);stopIntro();stopZip();returning=null;dismissed=-2;\r\n const from=p,finale=to===1,travel=from<.98?3:0,duration=finale?travel+THERMAL_SECONDS*clamp((1-Math.max(from,.98))\/.02):to>=.79?2.35:1.15;\r\n playback={step:true,from,to,time:0,duration:Math.max(.1,duration),finale,travel,playing:true};\r\n if(reduced){p=targetP=to;playback=null;syncTourScroll();applyTimeline(0);updateUI()}else tourUI();\r\n kick();return true;\r\n}\r\nfunction wheelAction(e){\r\n if(embedCompact())return;\r\n if(e.ctrlKey||Math.abs(e.deltaX)>Math.abs(e.deltaY)||!stepScope(e.target))return;\r\n const direction=Math.sign(e.deltaY);if(!direction)return;\r\n const now=performance.now();if(now-wheelStamp>180){wheelSum=0;wheelConsumed=false}wheelStamp=now;\r\n if(playback?.step&&playback.playing){e.preventDefault();wheelConsumed=true;return}\r\n if(nextAction(direction)===undefined){return}\r\n e.preventDefault();if(wheelConsumed)return;\r\n cancelTour();\r\n const delta=e.deltaY*(e.deltaMode===1?18:e.deltaMode===2?stage.clientHeight:1);\r\n if(Math.sign(wheelSum)!==direction)wheelSum=0;wheelSum+=delta;\r\n if(Math.abs(wheelSum)>=36){wheelConsumed=true;startAction(nextAction(direction))}\r\n}\r\nfunction tourUI(){\r\n const b=$('[data-action=\"tour-play\"]');if(!copy||!b)return;\r\n const playing=!!(playback?.tour&&playback.playing);\r\n const title=playing?copy.installation.pause:copy.playAll||TEXT[lang].playAll;\r\n iconLabel(b,playing?'pause':'play',playing?copy.installation.pause:copy.installation.play);b.title=title;b.setAttribute('aria-label',title);\r\n b.setAttribute('aria-pressed',String(playing));\r\n}\r\nconst HUD_TEXT={it:['Riduci comandi','Mostra comandi'],en:['Hide controls','Show controls'],fr:['Masquer les commandes','Afficher les commandes'],de:['Bedienung ausblenden','Bedienung anzeigen'],es:['Ocultar controles','Mostrar controles'],pt:['Ocultar controlos','Mostrar controlos']};\r\nconst ICONS={play:'M7 4.8v14.4a.8.8 0 0 0 1.2.7l11.3-7.2a.8.8 0 0 0 0-1.4L8.2 4.1A.8.8 0 0 0 7 4.8z',pause:'M7 4.5h3.2v15H7zM13.8 4.5H17v15h-3.2z',menu:'M4 7h16M4 12h16M4 17h16',minus:'M5 12h14'};\r\nfunction iconLabel(b,name,label){\r\n if(!b)return;const key=name+'|'+label;if(b._cfsIcon===key)return;b._cfsIcon=key;\r\n const svg=document.createElementNS('http:\/\/www.w3.org\/2000\/svg','svg'),path=document.createElementNS('http:\/\/www.w3.org\/2000\/svg','path');\r\n svg.setAttribute('viewBox','0 0 24 24');svg.setAttribute('aria-hidden','true');svg.setAttribute('focusable','false');svg.classList.add('cfs-ico','cfs-ico-'+name);\r\n path.setAttribute('d',ICONS[name]);svg.append(path);const span=document.createElement('span');span.textContent=label;b.replaceChildren(svg,span);\r\n}\r\nfunction hudUI(){const b=$('[data-action=\"hud\"]'),closed=root.dataset.hud==='compact',t=HUD_TEXT[lang||'it'][closed?1:0];iconLabel(b,closed?'menu':'minus',t);b.setAttribute('aria-expanded',String(!closed));b.setAttribute('aria-label',t)}\r\nlet hudUser=null,hudGhosts=[];\r\nfunction setHUD(state,animate=true){\r\n if(root.dataset.hud===state)return;\r\n const run=()=>{root.dataset.hud=state;requestAnimationFrame(placeOpenProduct);root.querySelectorAll('.cfs-picker-native').forEach(s=>s._cfsPicker?.close(false));hudUI();scheduleResize();kick()};\r\n if(!animate||reduced||!ready||!Element.prototype.animate){run();return}\r\n flipHUD(run);\r\n}\r\nfunction toggleHUD(){hudUser={p};setHUD(root.dataset.hud==='compact'?'expanded':'compact')}\r\n\/\/ Scroll collapses the controls once the journey starts and reopens them\r\n\/\/ (desktop) back at the intro. A manual toggle wins until the view moves on.\r\nfunction autoHUD(){\r\n if(PRODUCT)return;\r\n if(manual||!ready)return;\r\n if(hudUser){if(Math.abs(p-hudUser.p)<.04)return;hudUser=null}\r\n const current=root.dataset.hud,wide=innerWidth>600;\r\n const want=!wide?'compact':p<.07?'expanded':p>.12?'compact':current;\r\n if(want!==current)setHUD(want,true);\r\n}\r\n\/\/ FLIP: survivors glide to their new place, leavers fade out as inert ghosts,\r\n\/\/ newcomers fade in. Transform\/opacity only, one short burst per change.\r\nfunction flipHUD(run){\r\n hudGhosts.forEach(g=>g.remove());hudGhosts=[];\r\n const els=[...stage.querySelectorAll('.cfs-type-switch,.cfs-colors,.cfs-nav,.cfs-help,.cfs-tools,.cfs-tools>button,[data-action=\"skip\"]')].filter(e=>!e.classList.contains('cfs-hud-ghost'));\r\n const shown=e=>e.getClientRects().length>0&&getComputedStyle(e).visibility!=='hidden';\r\n const before=new Map(els.map(e=>[e,shown(e)?e.getBoundingClientRect():null])),display=new Map(els.map(e=>[e,getComputedStyle(e).display]));\r\n run();\r\n const D=440,E='cubic-bezier(.2,.7,.2,1)';\r\n for(const e of els){\r\n  const a=before.get(e),b=shown(e)?e.getBoundingClientRect():null;\r\n  if(a&&b){\r\n   let dx=a.left-b.left,dy=a.top-b.top;\r\n   const box=e.parentElement?.closest('.cfs-tools');\r\n   if(box&&box!==e){const pa=before.get(box);if(pa){const pb=box.getBoundingClientRect();dx-=pa.left-pb.left;dy-=pa.top-pb.top}}\r\n   if(Math.abs(dx)+Math.abs(dy)>.5)e.animate([{transform:'translate('+dx+'px,'+dy+'px)'},{transform:'translate(0px,0px)'}],{duration:D,easing:E,composite:'add'});\r\n   if(e.classList.contains('cfs-tools')&&Math.abs(a.width-b.width)>.5)e.animate([{width:a.width+'px'},{width:b.width+'px'}],{duration:D,easing:E});\r\n  }else if(a&&!b&&e.parentElement){\r\n   const g=e.cloneNode(true);g.removeAttribute('id');g.querySelectorAll('[id]').forEach(n=>n.removeAttribute('id'));\r\n   g.classList.add('cfs-hud-ghost');g.setAttribute('aria-hidden','true');g.inert=true;\r\n   Object.assign(g.style,{position:'absolute',margin:'0',width:a.width+'px',height:a.height+'px',pointerEvents:'none',zIndex:'6',boxSizing:'border-box',left:'0px',top:'0px'});\r\n   g.style.setProperty('display',display.get(e)==='none'?'block':display.get(e),'important');\r\n   e.parentElement.append(g);\r\n   const cb=(g.offsetParent||stage).getBoundingClientRect(),c=g.getBoundingClientRect();\r\n   g.style.left=(a.left-c.left)+'px';g.style.top=(a.top-c.top)+'px';void cb;\r\n   hudGhosts.push(g);\r\n   const anim=g.animate([{opacity:1,transform:'translateY(0) scale(1)'},{opacity:0,transform:'translateY(6px) scale(.97)'}],{duration:D*.7,easing:E,fill:'forwards'});\r\n   anim.onfinish=anim.oncancel=()=>{g.remove();hudGhosts=hudGhosts.filter(x=>x!==g)};\r\n  }else if(!a&&b){\r\n   e.animate([{opacity:0,transform:'translateY(8px)'},{opacity:1,transform:'translateY(0)'}],{duration:D,delay:D*.25,easing:E,fill:'backwards'});\r\n  }\r\n }\r\n}\r\nfunction playTour(){\r\n if(!ready||loading||lost)return;\r\n if(playback?.tour){const resume=!playback.playing;mode(false);playback.playing=resume;if(resume)unlockZip();else stopZip();tourUI();kick();return}\r\n mode(false);stopIntro();unlockZip();returning=null;dismissed=-2;\r\n const cuts=tourCuts();playback={tour:true,value:0,playing:true,cuts,duration:cuts[cuts.length-1][0]};p=targetP=0;\r\n syncTourScroll();applyTimeline(0);updateUI();kick();\r\n}\r\n\/\/ The page never moves during the thermal finale: from .98 on the scroll stays\r\n\/\/ where the installation ended and finaleHold keeps p at the end afterwards.\r\nlet finaleHold=false;\r\nfunction syncTourScroll(){\r\n if(reduced||PRODUCT)return;\r\n finaleHold=p>.98;\r\n const y=root.getBoundingClientRect().top+scrollY-top+travel*timelineToScroll(Math.min(p,.98));\r\n tourScrollY=Math.max(0,Math.min(y,document.documentElement.scrollHeight-innerHeight));\r\n if(Math.abs(scrollY-tourScrollY)<1)return;\r\n try{window.scrollTo({top:tourScrollY,behavior:'instant'})}catch{window.scrollTo(0,tourScrollY)}\r\n}\r\nfunction cancelTour(){if(playback?.tour){playback=null;tourScrollY=null;stopZip();tourUI();scrollRead=true;kick()}}\r\n\r\n\r\nlet vA,vB,vC,vD,qA,qB,normal,projected,spherical,axis,bundle,aim,slot,matrix,lift;\r\nconst clamp=(x,a=0,b=1)=>Math.max(a,Math.min(b,x));\r\nconst smooth=x=>{x=clamp(x);return x*x*(3-2*x)};\r\nconst ease=x=>{x=clamp(x);return x*x*x*(x*(x*6-15)+10)};\r\nconst lerp=(a,b,t)=>a+(b-a)*t;\r\nfunction on(el,event,fn,options={}){el.addEventListener(event,fn,{...options,signal:abort.signal})}\r\nfunction keep(o){resources.add(o);return o}\r\nfunction readableText(value){\r\n  let out=String(value??'');\r\n  const named={amp:'&',lt:'<',gt:'>',quot:'\"',apos:\"'\",nbsp:'\\u00a0',reg:'\\u00ae',copy:'\\u00a9',times:'\\u00d7',middot:'\\u00b7',rsquo:'\\u2019',lsquo:'\\u2018',ndash:'\\u2013',mdash:'\\u2014',egrave:'\\u00e8',eacute:'\\u00e9',agrave:'\\u00e0',igrave:'\\u00ec',ograve:'\\u00f2',ugrave:'\\u00f9'};\r\n  for(let i=0;i<3;i++){\r\n    const next=out.replace(\/&(#x[0-9a-f]+|#\\d+|[a-z]+);\/gi,(all,code)=>{\r\n      if(code[0]!=='#')return named[code.toLowerCase()]??all;\r\n      const n=code[1].toLowerCase()==='x'?parseInt(code.slice(2),16):Number(code.slice(1));\r\n      return n>0&&n<=0x10ffff&&!(n>=0xd800&&n<=0xdfff)?String.fromCodePoint(n):all;\r\n    });if(next===out)break;out=next;\r\n  }return out;\r\n}\r\nfunction text(el,s){s=readableText(s);if(el.textContent!==s){el.textContent=s;el.removeAttribute('aria-label')}}\r\nfunction language(s){\r\n  const c=String(s||'').trim().toLowerCase().replace(\/_\/g,'-').split('-')[0];\r\n  return Object.hasOwn(TEXT,c)?c:'';\r\n}\r\nfunction urlKey(value){\r\n  try{\r\n    const u=new URL(value,document.baseURI);u.hash='';\r\n    [...u.searchParams.keys()].forEach(k=>{\r\n      if(\/^utm_|^(gclid|fbclid|_gl|elementor-preview|preview|preview_id|preview_nonce)$\/i.test(k))u.searchParams.delete(k);\r\n    });\r\n    u.searchParams.sort();\r\n    return u.origin+(u.pathname.replace(\/\\\/+$\/,'')||'\/')+u.search;\r\n  }catch{return ''}\r\n}\r\n\/* Seleziona l'hreflang che corrisponde all'URL corrente, non il primo link. *\/\r\nfunction pickLocale(current,canonical,links,html,urlLanguage){\r\n  function match(url){\r\n    if(!url)return '';\r\n    const found=[...new Set(links.filter(l=>l.href===url).map(l=>language(l.lang)).filter(Boolean))];\r\n    return found.length===1?found[0]:found.includes(language(html))?language(html):'';\r\n  }\r\n  return match(current)||language(html)||match(canonical)||language(urlLanguage)||'it';\r\n}\r\nfunction detectLanguage(){\r\n  if(language(root.dataset.language))return language(root.dataset.language);\r\n  const links=[...document.querySelectorAll('head link[rel~=\"alternate\"][hreflang][href]')]\r\n    .map(l=>({href:urlKey(l.href),lang:l.hreflang}));\r\n  const canonical=document.querySelector('head link[rel~=\"canonical\"][href]'),u=new URL(location.href);\r\n  return pickLocale(urlKey(u.href),canonical?urlKey(canonical.href):'',links,document.documentElement.lang,\r\n    u.searchParams.get('lang')||u.searchParams.get('locale')||u.pathname.match(\/^\\\/([a-z]{2}(?:-[a-z]{2})?)(?:\\\/|$)\/i)?.[1]);\r\n}\r\n\/* Colore: modifica soltanto gli uniform dei materiali esistenti. *\/\r\nfunction paletteUI(){\r\n  if(!copy)return;\r\n  const index=PALETTE.findIndex(c=>c.id===selectedColor);\r\n  text($('.cfs-color-label'),copy.colors.label);\r\n  text($('.cfs-color-name'),label(index));openProductUI();\r\n  root.querySelectorAll('[data-color-option]').forEach((input,i)=>{\r\n    i=PALETTE.findIndex(c=>c.id===input.value);input.checked=input.value===selectedColor;\r\n    input.disabled=!ready||loading||lost;\r\n    input.setAttribute('aria-label',label(i));\r\n    input.parentElement.title=label(i);\r\n  });\r\n}\r\nfunction label(i){\r\n  \/\/ Standard ties use the same black pigment as the UV range, named plain \"black\".\r\n  if(PRODUCT&&PALETTE[i]?.id==='black'&&!allowedColors().some(c=>c.id==='dark-green'))return {it:'Nero',en:'Black',fr:'Noir',de:'Schwarz',es:'Negro',pt:'Preto'}[lang||root.dataset.language||'it']||'Nero';\r\n  return copy.colors.names[i]+(PALETTE[i].ral?' \\u00b7 RAL '+PALETTE[i].ral:'');\r\n}\r\nfunction createPalette(){\r\n  const list=$('.cfs-color-list');list.replaceChildren();\r\n  for(const color of allowedColors()){\r\n    const slot=document.createElement('label'),input=document.createElement('input'),dot=document.createElement('span');\r\n    input.type='radio';input.name=root.id+'-color';input.value=color.id;input.dataset.colorOption='';\r\n    dot.className='cfs-swatch';dot.setAttribute('aria-hidden','true');dot.style.setProperty('--swatch',color.hex);\r\n    slot.append(input,dot);list.append(slot);\r\n  }\r\n}\r\nfunction selectColor(id){\r\n  const color=PALETTE.find(c=>c.id===id);\r\n  if(!color||!allowedColors().some(c=>c.id===id)||!ready||loading||lost||id===selectedColor)return;\r\n  stopIntro();selectedColor=id;\r\n  const target=new T.Color(color.hex),glow=color.glow||0,opacity=color.opacity||1;\r\n  if(reduced){colorTween=null;metallicAmount=id==='gold'?1:0;translucency=glow;materialOpacity=opacity;finishes.forEach(m=>m.color.copy(target));tune()}\r\n  else colorTween={metalFrom:metallicAmount,metalTo:id==='gold'?1:0,from:finishes[0].color.clone(),to:target,glowFrom:translucency,glowTo:glow,opacityFrom:materialOpacity,opacityTo:opacity,now:0};\r\n  paletteUI();updateProductLink();kick();if(!selectColor.quiet)postParent({type:'color',color:id});\r\n}\r\nfunction updateColor(dt){\r\n  if(!colorTween)return false;\r\n  colorTween.now+=dt;const amount=reduced?1:ease(colorTween.now\/.28);\r\n  for(const material of finishes)material.color.lerpColors(colorTween.from,colorTween.to,amount);\r\n  metallicAmount=lerp(colorTween.metalFrom,colorTween.metalTo,amount);\r\n  translucency=lerp(colorTween.glowFrom,colorTween.glowTo,amount);\r\n  materialOpacity=lerp(colorTween.opacityFrom,colorTween.opacityTo,amount);\r\n  if(amount===1)colorTween=null;\r\n  tune();\r\n  return true;\r\n}\r\n\/* Luce e finitura seguono la luminanza del colore: sui colori scuri salgono\r\n   controluce, riflesso ambientale e velluto di bordo, cosi' anche il nero\r\n   mantiene un profilo leggibile sullo sfondo nero. Il naturale, non pigmentato,\r\n   non e' un vetro lucido ma un semicristallino satinato: usa un backdrop\r\n   sfocato separato a opacita' piena, senza alpha blending. Le altre varianti\r\n   mantengono le finiture originali. *\/\r\n\/* Optical presets are visual approximations, not measurements of the production resin.\r\n   Reference model: Three.js MeshPhysicalMaterial transmission\/thickness\/attenuation.\r\n   Nominal path length in scene units: thin strip, grip skin, thick molded head, pawl.\r\n   Roughness provides frosted transmission; exponential extinction adds diffuse loss.\r\n   https:\/\/threejs.org\/docs\/pages\/MeshPhysicalMaterial.html *\/\r\nfunction nylonOptics(index){\r\n const m=mold(),strip=m?m.thick*2:.244;\r\n const thickness=index===0?strip:index===1?strip*.8:index===2?(m?m.headD:.94):.66;\r\n const glass=parseFloat(root.dataset.glass),strength=Number.isFinite(glass)?clamp(glass\/.72,0,1.15):1;\r\n return {thickness,transmission:Math.min(.88,.92*strength*Math.exp(-1.1*thickness))*translucency};\r\n}\r\nfunction tune(){\r\n  if(!finishes.length)return;\r\n  const c=finishes[0].color,luminance=.2126*c.r+.7152*c.g+.0722*c.b;\r\n  const dark=1-smooth(luminance\/.17),deep=dark*dark;\r\n  finishes.forEach((material,i)=>{\r\n    const f=FINISH[i];\r\n    \/* Sul naturale (translucency=1) la base diventa piu' satinata,\r\n       come i pezzi non pigmentati. L'oro viene regolato separatamente sotto. *\/\r\n    material.roughness=lerp(f[0]*(1+.08*dark),i===1?.65:i===0?.32:.43,translucency);\r\n    material.clearcoat=Math.min(1,f[1]*(1+.15*dark));\r\n    material.clearcoatRoughness=lerp(f[2]*(1+.38*dark),i===1?.44:.15,translucency);\r\n    \/* Il velluto di bordo legge come opacita': sul naturale diventa il velo\r\n       lattiginoso che si vede sul profilo dei pezzi vergini. *\/\r\n    material.sheen=lerp(f[3]*(.22+1.18*deep),i===1?.24:.46,translucency);\r\n    material.sheenRoughness=lerp(.55,.93,translucency);\r\n    material.envMapIntensity=lerp(.95+.42*deep,1.25,translucency);\r\n    \/\/ Keep opacity=1. Native transmission samples the opaque scene and retains depth.\r\n    \/\/ The opaque cable depth rejects the rear strand before shading it.\r\n    material.emissive.copy(c).multiplyScalar(.035*translucency);\r\n    const optical=nylonOptics(i),wasTransmitting=material.transmission>0;\r\n    material.transmission=optical.transmission;\r\n    material.thickness=optical.thickness;\r\n    if(wasTransmitting!==(material.transmission>0))material.needsUpdate=true;\r\n    material.ior=lerp(1.5,1.53,translucency);\r\n    material.attenuationColor.set('#ddd5bd');\r\n    material.attenuationDistance=.8;\r\n    material.metalness=0.72*metallicAmount;\r\n    material.roughness=lerp(material.roughness,i===1?0.42:0.33,metallicAmount);\r\n    material.clearcoat=lerp(material.clearcoat,0.35,metallicAmount);\r\n    material.clearcoatRoughness=lerp(material.clearcoatRoughness,.16,metallicAmount);\r\n    material.sheen*=1-metallicAmount;\r\n    material.envMapIntensity=lerp(material.envMapIntensity,2.0,metallicAmount);\r\n    if(material.userData.moldFinish){\r\n      const role=material.userData.moldFinish.index,natural=translucency;\r\n      material.roughness=lerp(role===2?.67:.71,role===2?.43:.36,natural);\r\n      material.clearcoat=.035;material.clearcoatRoughness=.64;\r\n      material.sheen=lerp(.055,.13,natural);material.sheenRoughness=.85;\r\n      material.specularIntensity=lerp(.42,.56,natural);material.envMapIntensity=lerp(.82,1.0,natural);\r\n      material.metalness=0;\r\n      const glossyBlack=material.userData.moldFinish.kind==='pa66'&&selectedColor==='black';\r\n      material.bumpScale=glossyBlack?.0007:(role===2?.004:.0025);\r\n      if(glossyBlack){\r\n        material.color.set('#080809');material.emissive.set(0);\r\n        material.roughness=role===3?.23:.16;\r\n        material.clearcoat=.90;material.clearcoatRoughness=.09;\r\n        material.sheen=0;material.specularIntensity=1;material.envMapIntensity=1.18;\r\n      }\r\n    }\r\n    material.opacity=1;material.transparent=false;material.depthWrite=true;material.depthTest=true;\r\n  });\r\n  \/* data-glass controls natural translucency; opaque cables always retain depth. *\/\r\n  goldFinish.amount.value=metallicAmount;\r\n  const glass=parseFloat(root.dataset.glass);\r\n  nylonGlass.amount.value=(Number.isFinite(glass)?clamp(glass,0,.85):.72)*translucency;\r\n  \/* La zona di presa e' opaca e granulare: diffonde di piu' e si legge un po'\r\n     piu' chiara del resto del nastro, come nelle fotografie di prodotto. *\/\r\n  \/* La zona di presa ha lo stesso colore del nastro: la carta vetrata cambia\r\n     solo la finitura, opaca e granulare. *\/\r\n  finishes[1].color.copy(c);\r\n  if(!key)return;\r\n  key.intensity=2.05-.45*dark;\r\n  rim.intensity=2.40+2.90*dark;\r\n  edgeA.intensity=1.85+7.50*deep;\r\n  edgeB.intensity=1.05+3.70*deep;\r\n  gloss.intensity=.55+.95*dark;\r\n}\r\nfunction updateUI(){\r\n  if(!copy)return;\r\n  text($('[data-action=\"mode\"]'),copy.ui[manual?2:1]);\r\n  $('[data-action=\"mode\"]').setAttribute('aria-pressed',String(manual));\r\n  text($('.cfs-help'),copy.ui[manual?8:reduced?11:0]);root.dataset.manual=String(manual);\r\n  nav.forEach((b,i)=>{\r\n    text(b.querySelector('b'),String(i).padStart(2,'0'));\r\n    text(b.querySelector('span'),i?copy.parts[ORDER[i]][0]:copy.ui[3]);\r\n    if(active===ORDER[i])b.setAttribute('aria-current','step');else b.removeAttribute('aria-current');\r\n    b.disabled=!ready||loading||lost;\r\n  });\r\n  root.querySelectorAll('.cfs-tools button').forEach(b=>b.disabled=!ready||loading||lost);\r\n  const open=active>=0&&dismissed!==active&&!lost;\r\n  card.classList.toggle('is-open',open);card.inert=!open;card.setAttribute('aria-hidden',String(!open));if(root.dataset.compact==='true'){zoneSettling=true;kick()}\r\n  if(active>=0){\r\n    text($('.cfs-count'),String(ORDER.indexOf(active)).padStart(2,'0')+' \/ 04');\r\n    text(card.querySelector('h3'),copy.parts[active][0]);text($('.cfs-copy'),copy.parts[active][1]);\r\n    pin.setAttribute('aria-label',copy.parts[active][0]);\r\n  }\r\n  installationUI();paletteUI();familyUI();tourUI();presentationUI();measure=true;\r\n}\r\n\/* La stessa sequenza puo' essere percorsa con lo scroll, con il cursore o\r\n   con Riproduci. Un gesto di scroll restituisce subito il controllo alla pagina. *\/\r\nfunction installationUI(){\r\n  const open=active===3,ui=copy.installation;\r\n  root.dataset.installation=String(open);\r\n  $('.cfs-install-controls').hidden=!open;\r\n  $('.cfs-products').hidden=true;root.dataset.cta='false';\r\n  if(!open)return;\r\n  const progress=clamp((p-INSTALL.start)\/(INSTALL.end-INSTALL.start));\r\n  const step=progress<.34?0:progress<.66?1:2,done=progress>=.9999;\r\n  const pd=PRODUCT&&(PDONE[lang]||PDONE.it),title=done?(pd?pd[0]:ui.done[0]):ui.steps[step][0],body=done?(pd?pd[1]:ui.done[1]):ui.steps[step][1];\r\n  text($('.cfs-count'),copy.parts[3][0]+' \\u00b7 '+String(done?4:step+1).padStart(2,'0')+' \/ 04');\r\n  $('.cfs-products').hidden=!(done||p>=.9966);root.dataset.cta=String(!$('.cfs-products').hidden);if(root.dataset.cta==='true')prefetchProduct($('.cfs-products').href);\r\n  text(card.querySelector('h3'),title);text($('.cfs-copy'),body);\r\n  text($('.cfs-install-label'),ui.progress);\r\n  text($('.cfs-install-value'),Math.round(progress*100)+'%');\r\n  const slider=$('[data-install-progress]');slider.value=String(Math.round(progress*1000));\r\n  slider.setAttribute('aria-label',ui.progress);slider.setAttribute('aria-valuetext',title+' '+Math.round(progress*100)+'%');\r\n  const button=$('[data-action=\"install-play\"]'),playing=!!playback?.playing;\r\n  text(button,playing?ui.pause:done?ui.replay:ui.play);\r\n  button.setAttribute('aria-pressed',String(playing));text($('[data-action=\"details\"]'),ui.back);\r\n  soundUI();\r\n  const key=done?3:step;if(key!==installStage){installStage=key;measure=true}\r\n}\r\nfunction seekInstallation(value,play=false,audible=false){\r\n  if(!ready||loading||lost)return;\r\n  const before=POSE.feed;\r\n  mode(false);stopIntro();dismissed=-2;returning=null;\r\n  tourScrollY=null;playback={value:clamp(value),playing:play};tourUI();\r\n  p=targetP=lerp(INSTALL.start,INSTALL.end,playback.value);\r\n  applyTimeline(0);updateUI();kick();\r\n  if(audible){const now=Date.now();syncZip(before,POSE.feed,Math.min(.06,(now-ZIP.inputTime)\/1000||.04));ZIP.inputTime=now}else stopZip();\r\n}\r\nfunction playInstallation(){\r\n  if(playback?.playing){playback.playing=false;stopZip();installationUI();kick();return}\r\n  unlockZip();\r\n  const current=clamp((p-INSTALL.start)\/(INSTALL.end-INSTALL.start));\r\n  seekInstallation(current>=.9999?0:current,true);\r\n}\r\n\/* Suono sintetico del cricchetto, generato localmente senza file audio.\r\n   Un impulso per ogni dente che supera la linguetta; la parte liscia tace. *\/\r\nconst ZIP={enabled:true,unavailable:!(window.AudioContext||window.webkitAudioContext),context:null,\r\n  master:null,clicks:[],friction:null,rubbing:null,rubGain:null,voices:new Set(),timer:0,serial:0,inputTime:0};\r\nfunction soundUI(){\r\n  if(!copy)return;\r\n  const b=$('[data-action=\"sound\"]'),ui=copy.installation;\r\n  b.disabled=ZIP.unavailable;text(b.querySelector('span'),ui.sound);\r\n  const audible=ZIP.enabled&&!ZIP.unavailable&&ZIP.context?.state==='running';\r\n  b.setAttribute('aria-pressed',String(!!audible));\r\n  b.setAttribute('aria-label',ZIP.unavailable?ui.soundUnavailable:ui.sound);\r\n  b.title=ZIP.unavailable?ui.soundUnavailable:audible?ui.soundMute:ui.soundEnable;\r\n}\r\nfunction buildZipBuffers(ctx){\r\n  let seed=937264;const noise=()=>{seed=(Math.imul(seed,1664525)+1013904223)>>>0;return seed\/2147483648-1};\r\n  for(let k=0;k<4;k++){\r\n    const buffer=ctx.createBuffer(1,Math.ceil(ctx.sampleRate*.050),ctx.sampleRate),data=buffer.getChannelData(0);\r\n    let old=0;\r\n    for(let i=0;i<data.length;i++){\r\n      const t=i\/ctx.sampleRate,n=noise(),attack=Math.min(1,t\/.00022),v=n-old*.72;old=n;\r\n      const impact=v*Math.exp(-t\/(.0045+k*.0003));\r\n      const shell=(Math.sin(t*2*Math.PI*(2600+k*95))*.15+Math.sin(t*2*Math.PI*5100)*.08)*Math.exp(-t\/.007);\r\n      const bounce=t>.0028?(n*.24)*Math.exp(-(t-.0028)\/.004):0;\r\n      data[i]=(impact+shell+bounce)*attack*.48;\r\n    }\r\n    ZIP.clicks.push(buffer);\r\n  }\r\n  const buffer=ctx.createBuffer(1,Math.ceil(ctx.sampleRate*.73),ctx.sampleRate),data=buffer.getChannelData(0);\r\n  let old=0;\r\n  for(let i=0;i<data.length;i++){const n=noise();data[i]=(n-old*.80)*.36;old=n}\r\n  ZIP.friction=buffer;\r\n}\r\nfunction unlockZip(){\r\n  if(!ZIP.enabled||ZIP.unavailable||dead)return;\r\n  try{\r\n    if(!ZIP.context){\r\n      const Context=window.AudioContext||window.webkitAudioContext,ctx=new Context({latencyHint:'interactive'});\r\n      ZIP.context=ctx;ZIP.master=ctx.createGain();ZIP.master.gain.value=.34;ZIP.master.connect(ctx.destination);\r\n      buildZipBuffers(ctx);\r\n    }\r\n    if(ZIP.context.state!=='running')ZIP.context.resume().then(soundUI).catch(()=>{if(!dead){ZIP.unavailable=true;stopZip();soundUI()}});\r\n    soundUI();\r\n  }catch{ZIP.unavailable=true;stopZip();soundUI()}\r\n}\r\nfunction stopZip(cancelClicks=true){\r\n  clearTimeout(ZIP.timer);ZIP.timer=0;\r\n  if(ZIP.rubbing){try{ZIP.rubbing.stop()}catch{}ZIP.rubbing.disconnect();ZIP.rubbing=null}\r\n  if(ZIP.rubGain){ZIP.rubGain.disconnect();ZIP.rubGain=null}\r\n  if(cancelClicks){for(const o of ZIP.voices){try{o.stop()}catch{}o.disconnect()}ZIP.voices.clear()}\r\n}\r\nfunction toothClick(when,speed){\r\n  const ctx=ZIP.context,source=ctx.createBufferSource(),gain=ctx.createGain();\r\n  source.buffer=ZIP.clicks[ZIP.serial++%ZIP.clicks.length];\r\n  source.playbackRate.value=.90+Math.min(.25,speed*.07);\r\n  gain.gain.value=.58+.36*clamp(speed\/2);source.connect(gain);gain.connect(ZIP.master);\r\n  ZIP.voices.add(source);source.onended=()=>{ZIP.voices.delete(source);source.disconnect();gain.disconnect()};\r\n  source.start(when);\r\n}\r\nfunction rubZip(speed){\r\n  const ctx=ZIP.context;\r\n  if(!ZIP.rubbing){\r\n    const source=ctx.createBufferSource(),gain=ctx.createGain();source.buffer=ZIP.friction;source.loop=true;\r\n    gain.gain.value=0;source.connect(gain);gain.connect(ZIP.master);source.start();ZIP.rubbing=source;ZIP.rubGain=gain;\r\n  }\r\n  const phase=ratchetPosition(),ramp=Number.isFinite(phase)?phase-Math.floor(phase):0;\r\n  ZIP.rubGain.gain.setTargetAtTime((.013+.016*ramp)*clamp(speed\/1.3,.08,1),ctx.currentTime,.008);\r\n  clearTimeout(ZIP.timer);ZIP.timer=setTimeout(()=>stopZip(false),100);\r\n}\r\nfunction syncZip(before,after,dt){\r\n  const ctx=ZIP.context,d=before-after;\r\n  if(!ZIP.enabled||ZIP.unavailable||!ctx||ctx.state!=='running'||document.hidden||!visible||manual||active!==3||wrap<.999||d<0||dt<=0){\r\n    stopZip();return;\r\n  }\r\n  if(d<=1e-7){stopZip(false);return}\r\n  const first=materialDistance(rack.x0+.187*.78),lastTooth=first+(rack.count-1)*rack.dx;\r\n  if(after>lastTooth+.0412||before<first){stopZip();return}\r\n  const speed=d\/Math.max(.008,dt),span=Math.min(.060,dt),now=ctx.currentTime+.003;\r\n  const lower=Math.max(0,Math.ceil((after-first)\/rack.dx-1e-9));\r\n  const upper=Math.min(rack.count-1,Math.ceil((before-first)\/rack.dx-1e-9)-1);\r\n  for(let i=upper,played=0;i>=lower&&played<16;i--,played++){\r\n    const at=first+i*rack.dx,fraction=clamp((before-at)\/d);\r\n    toothClick(now+fraction*span,speed);\r\n  }\r\n  rubZip(speed);\r\n}\r\nfunction toggleSound(){\r\n  if(ZIP.enabled&&ZIP.context?.state!=='running'){unlockZip();soundUI();return}\r\n  ZIP.enabled=!ZIP.enabled;if(ZIP.enabled)unlockZip();else stopZip();soundUI();\r\n}\r\n\r\nconst PRODUCT_LINKS={\"standard\":{\"it\":[\"https:\/\/www.cieffeplast.com\/it\/prodotto\/fascette-standard-nylon\/\",\"attribute_pa_colore\",{\"natural\":\"naturale\",\"black\":\"nero\"}],\"en\":[\"https:\/\/www.cieffeplast.com\/en\/product\/standard-cable-tie-nylon\/\",\"attribute_pa_colore\",{\"natural\":\"natural\",\"black\":\"black\"}],\"fr\":[\"https:\/\/www.cieffeplast.com\/fr\/produit\/colliers-de-cablage-standard-nylon\/\",\"attribute_pa_colore\",{\"natural\":\"natural-fr\",\"black\":\"noire\"}],\"de\":[\"https:\/\/www.cieffeplast.com\/de\/produkte\/standard-kabelbinder-nylon\/\",\"attribute_pa_colore\",{\"natural\":\"natural-de\",\"black\":\"schwarz\"}],\"es\":[\"https:\/\/www.cieffeplast.com\/es\/producto\/bridas-estandar-nylon\/\",\"attribute_pa_colore\",{\"natural\":\"natural-es\",\"black\":\"negro\"}],\"pt\":[\"https:\/\/www.cieffeplast.com\/pt-pt\/produto\/abracadeiras-standard-nylon\/\",\"attribute_pa_colore\",{\"natural\":\"naturale-pt\",\"black\":\"nero-pt\"}]},\"colored\":{\"it\":[\"https:\/\/www.cieffeplast.com\/it\/prodotto\/fascette-colorate-nylon\/\",\"attribute_pa_colore\",{\"yellow\":\"giallo\",\"red\":\"rosso\",\"blue\":\"blu\",\"green\":\"verde\",\"orange\":\"arancio\",\"brown\":\"marrone\",\"grey\":\"grigio\",\"pink\":\"rosa\"}],\"en\":[\"https:\/\/www.cieffeplast.com\/en\/product\/coloured-cable-ties-nylon\/\",\"attribute_pa_colore\",{\"yellow\":\"yellow\",\"red\":\"red\",\"blue\":\"blue\",\"green\":\"green\",\"orange\":\"orange\",\"brown\":\"brown\",\"grey\":\"grey\",\"pink\":\"pink\"}],\"fr\":[\"https:\/\/www.cieffeplast.com\/fr\/produit\/colliers-de-cablage-colores-nylon\/\",\"attribute_pa_colore\",{\"yellow\":\"jaune\",\"red\":\"rouge\",\"blue\":\"bleu\",\"green\":\"vert\",\"orange\":\"orange-fr\",\"brown\":\"marron\",\"grey\":\"gris\",\"pink\":\"rosa-fr\"}],\"de\":[\"https:\/\/www.cieffeplast.com\/de\/produkte\/farbige-kabelbinder-nylon\/\",\"attribute_pa_colore\",{\"yellow\":\"gelb\",\"red\":\"rot\",\"blue\":\"blau\",\"green\":\"grun\",\"orange\":\"orange-de\",\"brown\":\"braun\",\"grey\":\"grau\",\"pink\":\"rose-de\"}],\"es\":[\"https:\/\/www.cieffeplast.com\/es\/producto\/bridas-de-colores-nylon\/\",\"attribute_pa_colore\",{\"yellow\":\"amarillo\",\"red\":\"rojo\",\"blue\":\"azul\",\"green\":\"verde-es\",\"orange\":\"naranja\",\"brown\":\"marron-es\",\"grey\":\"gris-es\",\"pink\":\"rosa-es\"}],\"pt\":[\"https:\/\/www.cieffeplast.com\/pt-pt\/produto\/abracadeiras-coloridas-nylon\/\",\"attribute_pa_colore\",{\"yellow\":\"giallo-pt\",\"red\":\"rosso-pt\",\"blue\":\"blu-pt\",\"green\":\"verde-pt\",\"orange\":\"arancio-pt\",\"brown\":\"marrone-pt\",\"grey\":\"grigio-pt\",\"pink\":\"rosa-pt\"}]},\"uv\":{\"it\":[\"https:\/\/www.cieffeplast.com\/it\/prodotto\/fascette-stabilizzate-uv-nylon\/\",\"attribute_pa_colore\",{\"black\":\"nero-uv\",\"dark-green\":\"verde-uv\"}],\"en\":[\"https:\/\/www.cieffeplast.com\/en\/product\/uv-stabilized-cable-ties\/\",\"attribute_pa_colore\",{\"black\":\"black-uv\",\"dark-green\":\"uv-green\"}],\"fr\":[\"https:\/\/www.cieffeplast.com\/fr\/produit\/collier-de-cablage-stabilise-uv\/\",\"attribute_pa_colore\",{\"black\":\"noire-uv-fr\",\"dark-green\":\"vert-uv\"}],\"de\":[\"https:\/\/www.cieffeplast.com\/de\/produkte\/kabelbinder-uv-bestaendig\/\",\"attribute_pa_colore\",{\"black\":\"schwarz-uv-de\",\"dark-green\":\"grun-uv\"}],\"es\":[\"https:\/\/www.cieffeplast.com\/es\/producto\/bridas-resistentes-uv\/\",\"attribute_pa_colore\",{\"black\":\"negro-uv-es\",\"dark-green\":\"verde-uv-es\"}],\"pt\":[\"https:\/\/www.cieffeplast.com\/pt-pt\/produto\/abracadeiras-estabilizadas-uv-nylon\/\",\"attribute_pa_colore\",{\"black\":\"nero-uv-pt\",\"dark-green\":\"verde-uv-pt\"}]},\"heat\":{\"it\":[\"https:\/\/www.cieffeplast.com\/it\/prodotto\/fascette-termoresistenti-nylon\/\",\"attribute_pa_colore\",{\"ruby\":\"rosso-rubino\"}],\"en\":[\"https:\/\/www.cieffeplast.com\/en\/product\/heat-stabilized-cable-ties\/\",\"attribute_pa_colore\",{\"ruby\":\"ruby-red\"}],\"fr\":[\"https:\/\/www.cieffeplast.com\/fr\/produit\/colliers-de-cablage-thermoresistant\/\",\"attribute_pa_colore\",{\"ruby\":\"rouge-rubis\"}],\"de\":[\"https:\/\/www.cieffeplast.com\/de\/produkte\/kabelbinder-hitzebestaendig\/\",\"attribute_pa_colore\",{\"ruby\":\"rubinrot\"}],\"es\":[\"https:\/\/www.cieffeplast.com\/es\/producto\/bridas-termorresistentes\/\",\"attribute_pa_colore\",{\"ruby\":\"rojo-rubi\"}],\"pt\":[\"https:\/\/www.cieffeplast.com\/pt-pt\/produto\/abracadeiras-termorresistentes-nylon\/\",\"attribute_pa_colore\",{\"ruby\":\"rosso-rubino-pt\"}]},\"white\":{\"it\":[\"https:\/\/www.cieffeplast.com\/it\/prodotto\/fascette-autoestinguenti-v0\/\",\"attribute_pa_colore\",{\"white\":\"naturale\"}],\"en\":[\"https:\/\/www.cieffeplast.com\/en\/product\/flame-retardant-cable-ties\/\",\"attribute_pa_colore\",{\"white\":\"natural\"}],\"fr\":[\"https:\/\/www.cieffeplast.com\/fr\/produit\/colliers-auto-extinguibles\/\",\"attribute_pa_colore\",{\"white\":\"natural-fr\"}],\"de\":[\"https:\/\/www.cieffeplast.com\/de\/produkte\/selbstverloeschende-kabelbinder\/\",\"attribute_pa_colore\",{\"white\":\"natural-de\"}],\"es\":[\"https:\/\/www.cieffeplast.com\/es\/producto\/bridas-autoextinguibles\/\",\"attribute_pa_colore\",{\"white\":\"natural-es\"}],\"pt\":[\"https:\/\/www.cieffeplast.com\/pt-pt\/produto\/abracadeiras-autoextinguiveis\/\",\"attribute_pa_colore\",{\"white\":\"naturale-pt\"}]},\"gold\":{\"it\":[\"https:\/\/www.cieffeplast.com\/it\/prodotto\/fascette-oro\/\",\"attribute_pa_colore\",{\"gold\":\"oro\"}],\"en\":[\"https:\/\/www.cieffeplast.com\/en\/product\/gold-cable-ties\/\",\"attribute_pa_colore\",{\"gold\":\"gold-en\"}],\"fr\":[\"https:\/\/www.cieffeplast.com\/fr\/produit\/collier-de-serrage-plastique-or\/\",\"attribute_pa_colore\",{\"gold\":\"or\"}],\"de\":[\"https:\/\/www.cieffeplast.com\/de\/produkte\/kabelbinder-gold\/\",\"attribute_pa_colore\",{\"gold\":\"gold-de\"}],\"es\":[\"https:\/\/www.cieffeplast.com\/es\/producto\/bridas-de-cableado-oro\/\",\"attribute_pa_colore\",{\"gold\":\"oro-es\"}],\"pt\":[\"https:\/\/www.cieffeplast.com\/pt-pt\/produto\/abracadeiras-de-ouro\/\",\"attribute_pa_colore\",{\"gold\":\"ouro\"}]},\"id1\":{\"it\":[\"https:\/\/www.cieffeplast.com\/it\/prodotto\/fascette-didentificazione-con-targhetta-tipo-1\/\",\"attribute_pa_colore\",{\"natural\":\"naturale\"}],\"en\":[\"https:\/\/www.cieffeplast.com\/en\/product\/cable-ties-with-marker-plate-type-1\/\",\"attribute_pa_colore\",{\"natural\":\"natural\"}],\"fr\":[\"https:\/\/www.cieffeplast.com\/fr\/produit\/colliers-de-cablage-avec-porte-etiquette-type-1\/\",\"attribute_pa_colore\",{\"natural\":\"natural-fr\"}],\"de\":[\"https:\/\/www.cieffeplast.com\/de\/produkte\/kabelbinder-mit-beschriftungsflaeche-typ-1\/\",\"attribute_pa_colore\",{\"natural\":\"natural-de\"}],\"es\":[\"https:\/\/www.cieffeplast.com\/es\/producto\/bridas-de-identificacion-con-etiqueta-tipo-1\/\",\"attribute_pa_colore\",{\"natural\":\"natural-es\"}],\"pt\":[\"https:\/\/www.cieffeplast.com\/pt-pt\/produto\/abracadeiras-identificacao-com-etiqueta-tipo-1\/\",\"attribute_pa_colore\",{\"natural\":\"naturale-pt\"}]},\"id2\":{\"it\":[\"https:\/\/www.cieffeplast.com\/it\/prodotto\/fascette-didentificazione-con-targhetta-tipo-2\/\",\"attribute_pa_colore\",{\"natural\":\"naturale\"}],\"en\":[\"https:\/\/www.cieffeplast.com\/en\/product\/cable-ties-with-marker-plate-type-2\/\",\"attribute_pa_colore\",{\"natural\":\"natural\"}],\"fr\":[\"https:\/\/www.cieffeplast.com\/fr\/produit\/colliers-de-cablage-avec-porte-etiquette-type-2\/\",\"attribute_pa_colore\",{\"natural\":\"natural-fr\"}],\"de\":[\"https:\/\/www.cieffeplast.com\/de\/produkte\/kabelbinder-mit-beschriftungsflaeche-typ-2\/\",\"attribute_pa_colore\",{\"natural\":\"natural-de\"}],\"es\":[\"https:\/\/www.cieffeplast.com\/es\/producto\/bridas-de-identificacion-con-etiqueta-tipo-2\/\",\"attribute_pa_colore\",{\"natural\":\"natural-es\"}],\"pt\":[\"https:\/\/www.cieffeplast.com\/pt-pt\/produto\/abracadeiras-identificacao-com-etiqueta-tipo-2\/\",\"attribute_pa_colore\",{\"natural\":\"naturale-pt\"}]},\"id3\":{\"it\":[\"https:\/\/www.cieffeplast.com\/it\/prodotto\/fascette-didentificazione-con-targhetta-tipo-3\/\",\"attribute_pa_colore\",{\"natural\":\"naturale\"}],\"en\":[\"https:\/\/www.cieffeplast.com\/en\/product\/cable-ties-with-marker-plate-type-3\/\",\"attribute_pa_colore\",{\"natural\":\"natural\"}],\"fr\":[\"https:\/\/www.cieffeplast.com\/fr\/produit\/colliers-de-cablage-avec-porte-etiquette-type-3\/\",\"attribute_pa_colore\",{\"natural\":\"natural-fr\"}],\"de\":[\"https:\/\/www.cieffeplast.com\/de\/produkte\/kabelbinder-mit-beschriftungsflaeche-typ-3\/\",\"attribute_pa_colore\",{\"natural\":\"natural-de\"}],\"es\":[\"https:\/\/www.cieffeplast.com\/es\/producto\/bridas-de-identificacion-con-etiqueta-tipo-3\/\",\"attribute_pa_colore\",{\"natural\":\"natural-es\"}],\"pt\":[\"https:\/\/www.cieffeplast.com\/pt-pt\/produto\/abracadeiras-identificacao-com-etiqueta-tipo-3\/\",\"attribute_pa_colore\",{\"natural\":\"naturale-pt\"}]},\"pa66\":{\"it\":[\"https:\/\/www.cieffeplast.com\/it\/prodotto\/fascette-dinstallazione-pa66\/\",\"attribute_pa_colore\",{\"black\":\"nero\"}],\"en\":[\"https:\/\/www.cieffeplast.com\/en\/product\/installation-cable-ties-pa66\/\",\"attribute_pa_colore\",{\"black\":\"black\"}],\"fr\":[\"https:\/\/www.cieffeplast.com\/fr\/produit\/colliers-de-cablage-dinstallation-pa66\/\",\"attribute_pa_colore\",{\"black\":\"noire\"}],\"de\":[\"https:\/\/www.cieffeplast.com\/de\/produkte\/kabelbinder-mit-flachkopf-pa66\/\",\"attribute_pa_colore\",{\"black\":\"schwarz\"}],\"es\":[\"https:\/\/www.cieffeplast.com\/es\/producto\/bridas-de-instalacion-pa66\/\",\"attribute_pa_colore\",{\"black\":\"negro\"}],\"pt\":[\"https:\/\/www.cieffeplast.com\/pt-pt\/produto\/abracadeiras-instalacao-pa66\/\",\"attribute_pa_colore\",{\"black\":\"nero-pt\"}]},\"pa12\":{\"it\":[\"https:\/\/www.cieffeplast.com\/it\/prodotto\/fascette-dinstallazione-pa12\/\",\"attribute_pa_colore\",{\"black\":\"nero\"}],\"en\":[\"https:\/\/www.cieffeplast.com\/en\/product\/installation-cable-ties-pa12\/\",\"attribute_pa_colore\",{\"black\":\"black\"}],\"fr\":[\"https:\/\/www.cieffeplast.com\/fr\/produit\/colliers-de-cablage-dinstallation-pa12\/\",\"attribute_pa_colore\",{\"black\":\"noire\"}],\"de\":[\"https:\/\/www.cieffeplast.com\/de\/produkte\/kabelbinder-mit-flachkopf-pa12\/\",\"attribute_pa_colore\",{\"black\":\"schwarz\"}],\"es\":[\"https:\/\/www.cieffeplast.com\/es\/producto\/bridas-de-instalacion-pa12\/\",\"attribute_pa_colore\",{\"black\":\"negro\"}],\"pt\":[\"https:\/\/www.cieffeplast.com\/pt-pt\/produto\/abracadeiras-instalacao-pa12\/\",\"attribute_pa_colore\",{\"black\":\"nero-pt\"}]},\"releasable\":{\"it\":[\"https:\/\/www.cieffeplast.com\/it\/prodotto\/fascette-riapribili\/\",\"attribute_pa_colore\",{\"natural\":\"naturale\",\"black\":\"nero\"}],\"en\":[\"https:\/\/www.cieffeplast.com\/en\/product\/releasable-cable-ties\/\",\"attribute_pa_colore\",{\"natural\":\"natural\",\"black\":\"black\"}],\"fr\":[\"https:\/\/www.cieffeplast.com\/fr\/produit\/colliers-de-cablage-reouvrables\/\",\"attribute_pa_colore\",{\"natural\":\"natural-fr\",\"black\":\"noire\"}],\"de\":[\"https:\/\/www.cieffeplast.com\/de\/produkte\/kabelbinder-loesbar-wiederverwendbare\/\",\"attribute_pa_colore\",{\"natural\":\"natural-de\",\"black\":\"schwarz\"}],\"es\":[\"https:\/\/www.cieffeplast.com\/es\/producto\/bridas-recuperables\/\",\"attribute_pa_colore\",{\"natural\":\"natural-es\",\"black\":\"negro\"}],\"pt\":[\"https:\/\/www.cieffeplast.com\/pt-pt\/produto\/abracadeiras-reutilizaveis\/\",\"attribute_pa_colore\",{\"natural\":\"naturale-pt\",\"black\":\"nero-pt\"}]},\"eyelet\":{\"it\":[\"https:\/\/www.cieffeplast.com\/it\/prodotto\/fascette-con-occhiello\/\",\"attribute_pa_colore\",{\"natural\":\"naturale\",\"black\":\"nero\"}],\"en\":[\"https:\/\/www.cieffeplast.com\/en\/product\/mounting-cable-ties\/\",\"attribute_pa_colore\",{\"natural\":\"natural\",\"black\":\"black\"}],\"fr\":[\"https:\/\/www.cieffeplast.com\/fr\/produit\/colliers-de-cablage-a-oeillet\/\",\"attribute_pa_colore\",{\"natural\":\"natural-fr\",\"black\":\"noire\"}],\"de\":[\"https:\/\/www.cieffeplast.com\/de\/produkte\/kabelbinder-mit-montageloch\/\",\"attribute_pa_colore\",{\"natural\":\"natural-de\",\"black\":\"schwarz\"}],\"es\":[\"https:\/\/www.cieffeplast.com\/es\/producto\/bridas-con-ojal\/\",\"attribute_pa_colore\",{\"natural\":\"natural-es\",\"black\":\"negro\"}],\"pt\":[\"https:\/\/www.cieffeplast.com\/pt-pt\/produto\/abracadeiras-com-olhal\/\",\"attribute_pa_colore\",{\"natural\":\"naturale-pt\",\"black\":\"nero-pt\"}]},\"crossbow\":{\"it\":[\"https:\/\/www.cieffeplast.com\/it\/prodotto\/fascette-ad-innesto-a-balestra-per-pannello\/\",\"attribute_pa_colore\",{\"natural\":\"naturale\",\"black\":\"nero\"}],\"en\":[\"https:\/\/www.cieffeplast.com\/en\/product\/push-mount-cable-ties-for-panels\/\",\"attribute_pa_colore\",{\"natural\":\"natural\",\"black\":\"black\"}],\"fr\":[\"https:\/\/www.cieffeplast.com\/fr\/produit\/colliers-de-cablage-enfichable-sur-panneau\/\",\"attribute_pa_colore\",{\"natural\":\"natural-fr\",\"black\":\"noire\"}],\"de\":[\"https:\/\/www.cieffeplast.com\/de\/produkte\/kabelbinder-mit-steckfuss-fuer-wand\/\",\"attribute_pa_colore\",{\"natural\":\"natural-de\",\"black\":\"schwarz\"}],\"es\":[\"https:\/\/www.cieffeplast.com\/es\/producto\/bridas-de-montaje-de-montaje-en-panel\/\",\"attribute_pa_colore\",{\"natural\":\"natural-es\",\"black\":\"negro\"}],\"pt\":[\"https:\/\/www.cieffeplast.com\/pt-pt\/produto\/abracadeira-push-mounth-com-asas\/\",\"attribute_pa_colore\",{\"natural\":\"naturale-pt\",\"black\":\"nero-pt\"}]},\"push\":{\"it\":[\"https:\/\/www.cieffeplast.com\/it\/prodotto\/fascette-ad-innesto-per-pannello\/\",\"attribute_pa_colore\",{\"natural\":\"naturale\",\"black\":\"nero\"}],\"en\":[\"https:\/\/www.cieffeplast.com\/en\/product\/push-mount-cable-ties-for-panels-2\/\",\"attribute_pa_colore\",{\"natural\":\"natural\",\"black\":\"black\"}],\"fr\":[\"https:\/\/www.cieffeplast.com\/fr\/produit\/colliers-de-cablage-enfichable-pour-panneau\/\",\"attribute_pa_colore\",{\"natural\":\"natural-fr\",\"black\":\"noire\"}],\"de\":[\"https:\/\/www.cieffeplast.com\/de\/produkte\/kabelbinder-mit-steckfuss-fuer-wand-2\/\",\"attribute_pa_colore\",{\"natural\":\"natural-de\",\"black\":\"schwarz\"}],\"es\":[\"https:\/\/www.cieffeplast.com\/es\/producto\/bridas-de-montaje-en-panel\/\",\"attribute_pa_colore\",{\"natural\":\"natural-es\",\"black\":\"negro\"}],\"pt\":[\"https:\/\/www.cieffeplast.com\/pt-pt\/produto\/abracadeiras-push-mount\/\",\"attribute_pa_colore\",{\"natural\":\"naturale-pt\",\"black\":\"nero-pt\"}]}};\r\n\r\n\r\nconst PRODUCT_FACTS={\"standard\":{\"it\":\"32 misure, da 80 a 1500 mm|Tenuta da 8 a 114 kg|-40 \/ +85 \\u00b0C|Naturale per interni, nera per esterni\",\"en\":\"32 sizes, 80 to 1500 mm|Tensile strength 8 to 114 kg|-40 \/ +85 \\u00b0C|Natural indoors, black outdoors\",\"fr\":\"32 dimensions, de 80 \\u00e0 1500 mm|R\\u00e9sistance de 8 \\u00e0 114 kg|-40 \/ +85 \\u00b0C|Naturel en int\\u00e9rieur, noir en ext\\u00e9rieur\",\"de\":\"32 Gr\\u00f6\\u00dfen, 80 bis 1500 mm|Zugfestigkeit 8 bis 114 kg|-40 \/ +85 \\u00b0C|Natur f\\u00fcr innen, schwarz f\\u00fcr au\\u00dfen\",\"es\":\"32 medidas, de 80 a 1500 mm|Resistencia de 8 a 114 kg|-40 \/ +85 \\u00b0C|Natural en interior, negro en exterior\",\"pt\":\"32 medidas, de 80 a 1500 mm|Resist\\u00eancia de 8 a 114 kg|-40 \/ +85 \\u00b0C|Natural para interior, preto para exterior\"},\"colored\":{\"it\":\"8 colori, 5 misure|Da 100 \\u00d7 2,5 a 290 \\u00d7 4,8 mm|Tenuta da 8,1 a 22,2 kg|-40 \/ +85 \\u00b0C\",\"en\":\"8 colours, 5 sizes|From 100 \\u00d7 2.5 to 290 \\u00d7 4.8 mm|Tensile strength 8.1 to 22.2 kg|-40 \/ +85 \\u00b0C\",\"fr\":\"8 coloris, 5 dimensions|De 100 \\u00d7 2,5 \\u00e0 290 \\u00d7 4,8 mm|R\\u00e9sistance de 8,1 \\u00e0 22,2 kg|-40 \/ +85 \\u00b0C\",\"de\":\"8 Farben, 5 Gr\\u00f6\\u00dfen|Von 100 \\u00d7 2,5 bis 290 \\u00d7 4,8 mm|Zugfestigkeit 8,1 bis 22,2 kg|-40 \/ +85 \\u00b0C\",\"es\":\"8 colores, 5 medidas|De 100 \\u00d7 2,5 a 290 \\u00d7 4,8 mm|Resistencia de 8,1 a 22,2 kg|-40 \/ +85 \\u00b0C\",\"pt\":\"8 cores, 5 medidas|De 100 \\u00d7 2,5 a 290 \\u00d7 4,8 mm|Resist\\u00eancia de 8,1 a 22,2 kg|-40 \/ +85 \\u00b0C\"},\"uv\":{\"it\":\"Nylon additivato contro i raggi UV|4 misure|Nero e verde RAL 6005|Per esterni e integrazione estetica\",\"en\":\"Nylon with UV-resistant additive|4 sizes|Black and RAL 6005 green|For outdoor use and visual integration\",\"fr\":\"Nylon additiv\\u00e9 anti-UV|4 dimensions|Noir et vert RAL 6005|Pour l'ext\\u00e9rieur et l'int\\u00e9gration esth\\u00e9tique\",\"de\":\"Nylon mit UV-Additiv|4 Gr\\u00f6\\u00dfen|Schwarz und Gr\\u00fcn RAL 6005|F\\u00fcr au\\u00dfen und optische Integration\",\"es\":\"Nylon aditivado contra los rayos UV|4 medidas|Negro y verde RAL 6005|Para exterior e integraci\\u00f3n est\\u00e9tica\",\"pt\":\"Nylon aditivado contra raios UV|4 medidas|Preto e verde RAL 6005|Para exterior e integra\\u00e7\\u00e3o est\\u00e9tica\"},\"heat\":{\"it\":\"16 misure|Uso continuo 125 \\u00b0C, picchi 150 \\u00b0C|Rosso rubino RAL 3003|Alta resistenza al calore\",\"en\":\"16 sizes|Continuous use 125 \\u00b0C, peaks 150 \\u00b0C|Ruby red RAL 3003|High heat resistance\",\"fr\":\"16 dimensions|Usage continu 125 \\u00b0C, pics 150 \\u00b0C|Rouge rubis RAL 3003|Haute r\\u00e9sistance \\u00e0 la chaleur\",\"de\":\"16 Gr\\u00f6\\u00dfen|Dauereinsatz 125 \\u00b0C, Spitzen 150 \\u00b0C|Rubinrot RAL 3003|Hohe Hitzebest\\u00e4ndigkeit\",\"es\":\"16 medidas|Uso continuo 125 \\u00b0C, picos 150 \\u00b0C|Rojo rub\\u00ed RAL 3003|Alta resistencia al calor\",\"pt\":\"16 medidas|Uso cont\\u00ednuo 125 \\u00b0C, picos 150 \\u00b0C|Vermelho rubi RAL 3003|Elevada resist\\u00eancia ao calor\"},\"white\":{\"it\":\"Classe di autoestinguenza UL 94 V-0|Colore bianco autoestinguente|Conformi EN 45545-2|-40 \/ +85 \\u00b0C\",\"en\":\"UL 94 V-0 flame rating|Flame-retardant white|EN 45545-2 compliant|-40 \/ +85 \\u00b0C\",\"fr\":\"Classement au feu UL 94 V-0|Blanc auto-extinguible|Conformes EN 45545-2|-40 \/ +85 \\u00b0C\",\"de\":\"Brandklasse UL 94 V-0|Selbstverl\\u00f6schendes Wei\\u00df|Konform EN 45545-2|-40 \/ +85 \\u00b0C\",\"es\":\"Clase de autoextinci\\u00f3n UL 94 V-0|Blanco autoextinguible|Conformes EN 45545-2|-40 \/ +85 \\u00b0C\",\"pt\":\"Classe de autoextin\\u00e7\\u00e3o UL 94 V-0|Branco autoextingu\\u00edvel|Conformes EN 45545-2|-40 \/ +85 \\u00b0C\"},\"gold\":{\"it\":\"Colore oro per identificazione cromatica premium|RoHS e EN ISO 105-B02:2014\",\"en\":\"Gold colour for premium colour coding|RoHS and EN ISO 105-B02:2014\",\"fr\":\"Couleur or pour un rep\\u00e9rage chromatique premium|RoHS et EN ISO 105-B02:2014\",\"de\":\"Goldfarbe f\\u00fcr hochwertige Farbkennzeichnung|RoHS und EN ISO 105-B02:2014\",\"es\":\"Color oro para identificaci\\u00f3n crom\\u00e1tica premium|RoHS y EN ISO 105-B02:2014\",\"pt\":\"Cor ouro para identifica\\u00e7\\u00e3o crom\\u00e1tica premium|RoHS e EN ISO 105-B02:2014\"},\"releasable\":{\"it\":\"Per fissaggi temporanei e regolabili|Apertura e riutilizzo senza attrezzi|Naturali e nere|-40 \/ +75 \\u00b0C\",\"en\":\"For temporary, adjustable fastening|Open and reuse without tools|Natural and black|-40 \/ +75 \\u00b0C\",\"fr\":\"Pour fixations temporaires et r\\u00e9glables|Ouverture et r\\u00e9utilisation sans outil|Naturel et noir|-40 \/ +75 \\u00b0C\",\"de\":\"F\\u00fcr tempor\\u00e4re, verstellbare Befestigung|\\u00d6ffnen und wiederverwenden ohne Werkzeug|Natur und schwarz|-40 \/ +75 \\u00b0C\",\"es\":\"Para fijaciones temporales y regulables|Apertura y reutilizaci\\u00f3n sin herramientas|Natural y negro|-40 \/ +75 \\u00b0C\",\"pt\":\"Para fixa\\u00e7\\u00f5es tempor\\u00e1rias e ajust\\u00e1veis|Abertura e reutiliza\\u00e7\\u00e3o sem ferramentas|Natural e preto|-40 \/ +75 \\u00b0C\"},\"id1\":{\"it\":\"Targhetta sotto testa, 25,4 \\u00d7 8 mm|Rivolta verso i cavi|Per spazi laterali ridotti|Non intralcia i componenti adiacenti\",\"en\":\"Marker plate under the head, 25.4 \\u00d7 8 mm|Facing the cables|For tight lateral spaces|Clears adjacent components\",\"fr\":\"Porte-\\u00e9tiquette sous la t\\u00eate, 25,4 \\u00d7 8 mm|Orient\\u00e9 vers les c\\u00e2bles|Pour espaces lat\\u00e9raux r\\u00e9duits|N'encombre pas les composants voisins\",\"de\":\"Schild unter dem Kopf, 25,4 \\u00d7 8 mm|Zu den Kabeln gerichtet|F\\u00fcr enge seitliche R\\u00e4ume|Beh\\u00e4lt Nachbarbauteile frei\",\"es\":\"Etiqueta bajo la cabeza, 25,4 \\u00d7 8 mm|Orientada hacia los cables|Para espacios laterales reducidos|No estorba a los componentes contiguos\",\"pt\":\"Etiqueta sob a cabe\\u00e7a, 25,4 \\u00d7 8 mm|Voltada para os cabos|Para espa\\u00e7os laterais reduzidos|N\\u00e3o interfere com componentes adjacentes\"},\"id2\":{\"it\":\"Targhetta sopra la testa, 20,4 \\u00d7 9 mm|Rivolta verso l'operatore|Massima leggibilit\\u00e0 in rack e canaline|Per installazioni a vista\",\"en\":\"Marker plate above the head, 20.4 \\u00d7 9 mm|Facing the operator|Maximum legibility in racks and trunking|For open installations\",\"fr\":\"Porte-\\u00e9tiquette sur la t\\u00eate, 20,4 \\u00d7 9 mm|Orient\\u00e9 vers l'op\\u00e9rateur|Lisibilit\\u00e9 maximale en baie et goulotte|Pour installations apparentes\",\"de\":\"Schild \\u00fcber dem Kopf, 20,4 \\u00d7 9 mm|Zum Bediener gerichtet|Beste Lesbarkeit in Racks und Kan\\u00e4len|F\\u00fcr offene Installationen\",\"es\":\"Etiqueta sobre la cabeza, 20,4 \\u00d7 9 mm|Orientada al operario|M\\u00e1xima legibilidad en racks y canaletas|Para instalaciones vistas\",\"pt\":\"Etiqueta sobre a cabe\\u00e7a, 20,4 \\u00d7 9 mm|Voltada para o operador|M\\u00e1xima legibilidade em racks e calhas|Para instala\\u00e7\\u00f5es \\u00e0 vista\"},\"id3\":{\"it\":\"Targhetta sotto testa maggiorata, 13 \\u00d7 28 mm|Superficie ampia per codici a barre e QR|Per testi lunghi|Stessa posizione del tipo 1\",\"en\":\"Oversized plate under the head, 13 \\u00d7 28 mm|Wide surface for barcodes and QR codes|For long text|Same position as type 1\",\"fr\":\"Porte-\\u00e9tiquette agrandi sous la t\\u00eate, 13 \\u00d7 28 mm|Grande surface pour codes-barres et QR|Pour textes longs|M\\u00eame position que le type 1\",\"de\":\"Vergr\\u00f6\\u00dfertes Schild unter dem Kopf, 13 \\u00d7 28 mm|Gro\\u00dfe Fl\\u00e4che f\\u00fcr Barcodes und QR-Codes|F\\u00fcr lange Texte|Gleiche Position wie Typ 1\",\"es\":\"Etiqueta ampliada bajo la cabeza, 13 \\u00d7 28 mm|Superficie amplia para c\\u00f3digos de barras y QR|Para textos largos|Misma posici\\u00f3n que el tipo 1\",\"pt\":\"Etiqueta ampliada sob a cabe\\u00e7a, 13 \\u00d7 28 mm|Superf\\u00edcie ampla para c\\u00f3digos de barras e QR|Para textos longos|Mesma posi\\u00e7\\u00e3o do tipo 1\"},\"pa66\":{\"it\":\"Testina piatta a inserimento parallelo|Da 200 a 760 mm di lunghezza|Larghezza 9 mm|Colore nero\",\"en\":\"Flat head, parallel entry|Length from 200 to 760 mm|9 mm width|Black\",\"fr\":\"T\\u00eate plate \\u00e0 insertion parall\\u00e8le|Longueur de 200 \\u00e0 760 mm|Largeur 9 mm|Noir\",\"de\":\"Flachkopf mit parallelem Einzug|L\\u00e4nge von 200 bis 760 mm|Breite 9 mm|Schwarz\",\"es\":\"Cabeza plana de inserci\\u00f3n paralela|Longitud de 200 a 760 mm|Anchura 9 mm|Negro\",\"pt\":\"Cabe\\u00e7a plana de inser\\u00e7\\u00e3o paralela|Comprimento de 200 a 760 mm|Largura 9 mm|Preto\"},\"pa12\":{\"it\":\"Resistenti agli agenti atmosferici|Per ambienti marini e fotovoltaico galleggiante|3 misure da 180 a 360 mm, larghezza 9 mm|Colore nero\",\"en\":\"Weather resistant|For marine environments and floating solar|3 sizes from 180 to 360 mm, 9 mm width|Black\",\"fr\":\"R\\u00e9sistants aux agents atmosph\\u00e9riques|Pour milieux marins et solaire flottant|3 dimensions de 180 \\u00e0 360 mm, largeur 9 mm|Noir\",\"de\":\"Witterungsbest\\u00e4ndig|F\\u00fcr Meeresumgebungen und schwimmende Solaranlagen|3 Gr\\u00f6\\u00dfen von 180 bis 360 mm, Breite 9 mm|Schwarz\",\"es\":\"Resistentes a los agentes atmosf\\u00e9ricos|Para entornos marinos y solar flotante|3 medidas de 180 a 360 mm, anchura 9 mm|Negro\",\"pt\":\"Resistentes aos agentes atmosf\\u00e9ricos|Para ambientes marinhos e solar flutuante|3 medidas de 180 a 360 mm, largura 9 mm|Preto\"},\"crossbow\":{\"it\":\"Clip a forma di balestra|Per fissaggi su pannello con foro|Nessun accessorio aggiuntivo|Naturali e nere\",\"en\":\"Leaf-spring shaped clip|For panel fixing through a hole|No extra hardware needed|Natural and black\",\"fr\":\"Clip en forme de ressort \\u00e0 lames|Pour fixation sur panneau perc\\u00e9|Aucun accessoire suppl\\u00e9mentaire|Naturel et noir\",\"de\":\"Clip in Blattfederform|F\\u00fcr die Befestigung in Plattenbohrungen|Kein Zubeh\\u00f6r erforderlich|Natur und schwarz\",\"es\":\"Clip en forma de ballesta|Para fijaci\\u00f3n en panel con taladro|Sin accesorios adicionales|Natural y negro\",\"pt\":\"Clipe em forma de mola de l\\u00e2minas|Para fixa\\u00e7\\u00e3o em painel com furo|Sem acess\\u00f3rios adicionais|Natural e preto\"},\"push\":{\"it\":\"Punta a freccia per innesto rapido|Ideali per fissaggi in ambienti stretti|Naturali e nere\",\"en\":\"Arrowhead tip for quick push-mount|Ideal for fixing in tight spaces|Natural and black\",\"fr\":\"Pointe en fl\\u00e8che pour enfichage rapide|Id\\u00e9ales pour les espaces restreints|Naturel et noir\",\"de\":\"Pfeilspitze f\\u00fcr schnelles Einstecken|Ideal f\\u00fcr beengte Einbausituationen|Natur und schwarz\",\"es\":\"Punta de flecha para encaje r\\u00e1pido|Ideales para fijaciones en espacios estrechos|Natural y negro\",\"pt\":\"Ponta em seta para encaixe r\\u00e1pido|Ideais para fixa\\u00e7\\u00f5es em espa\\u00e7os apertados|Natural e preto\"},\"eyelet\":{\"it\":\"Fissaggio a vite con occhiello integrato|Foro da 3,2 a 6,3 mm|Naturali e nere\",\"en\":\"Screw fixing with integrated eyelet|Hole from 3.2 to 6.3 mm|Natural and black\",\"fr\":\"Fixation par vis avec \\u0153illet int\\u00e9gr\\u00e9|Trou de 3,2 \\u00e0 6,3 mm|Naturel et noir\",\"de\":\"Schraubbefestigung mit integriertem Montageloch|Bohrung von 3,2 bis 6,3 mm|Natur und schwarz\",\"es\":\"Fijaci\\u00f3n por tornillo con ojal integrado|Orificio de 3,2 a 6,3 mm|Natural y negro\",\"pt\":\"Fixa\\u00e7\\u00e3o por parafuso com olhal integrado|Furo de 3,2 a 6,3 mm|Natural e preto\"}};\r\nconst FACT_LABELS={it:['In breve','Scheda prodotto'],en:['At a glance','Product details'],fr:['En bref','Fiche produit'],de:['Auf einen Blick','Produktdetails'],es:['En breve','Ficha del producto'],pt:['Em resumo','Ficha do produto']};\r\nfunction productCategory(){return selectedType==='cabling'?({gold:'gold',white:'white',natural:'standard',black:'uv','dark-green':'uv',ruby:'heat'}[selectedColor]||'colored'):selectedType}\r\nlet presentationKey='';\r\nlet cardRevealKey='',cardRevealRAF=0,cardRevealBody=null;\r\nfunction revealWords(element,delay=0){\r\n if(!element||reduced)return;\r\n const value=element.textContent;\r\n element.setAttribute('aria-label',value);\r\n const fragment=document.createDocumentFragment(),tokens=value.split(\/(\\s+)\/);\r\n const count=tokens.filter(t=>t.trim()).length,interval=Math.min(62,1050\/Math.max(1,count));\r\n let index=0;\r\n for(const token of tokens){\r\n  if(!token.trim()){fragment.append(document.createTextNode(token));continue}\r\n  const word=document.createElement('span');word.className='cfs-typed-word';\r\n  word.textContent=token;word.setAttribute('aria-hidden','true');fragment.append(word);\r\n }\r\n element.replaceChildren(fragment);\r\n for(const word of element.children){\r\n  word.animate?.([{opacity:0,transform:'translateY(.18em)'},{opacity:1,transform:'translateY(0)'}],\r\n   {duration:180,delay:delay+index++*interval,easing:'cubic-bezier(.2,.7,.2,1)',fill:'backwards'});\r\n }\r\n}\r\n\r\nfunction revealCard(){\r\n const open=card.classList.contains('is-open')&&card.getAttribute('aria-hidden')==='false';\r\n if(!open){cardRevealKey='';cancelAnimationFrame(cardRevealRAF);cardRevealRAF=0;return}\r\n const key=[selectedType,selectedColor,lang,card.querySelector('h3').textContent,$('.cfs-count').textContent].join('|');\r\n if(key===cardRevealKey)return;cardRevealKey=key;\r\n if(!cardRevealBody){\r\n  cardRevealBody=document.createElement('div');cardRevealBody.className='cfs-card-body';\r\n  [...card.children].filter(e=>!e.classList.contains('cfs-close')).forEach(e=>cardRevealBody.append(e));\r\n  card.append(cardRevealBody);\r\n  const frame=document.createElement('span');frame.className='cfs-technical-frame';frame.setAttribute('aria-hidden','true');card.append(frame);\r\n }\r\n cancelAnimationFrame(cardRevealRAF);\r\n cardRevealRAF=requestAnimationFrame(()=>{\r\n  cardRevealRAF=0;if(dead||reduced||!card.classList.contains('is-open'))return;\r\n  const body=cardRevealBody;\r\n  const frame=card.querySelector('.cfs-technical-frame');frame?.getAnimations?.().forEach(a=>a.cancel());\r\n  frame?.animate?.([{opacity:0,transform:'scale(.94)'},{opacity:1,transform:'scale(1)'}],{duration:600,easing:'cubic-bezier(.16,1,.3,1)'});\r\n  body.getAnimations?.().forEach(a=>a.cancel());\r\n  \/\/ Animate a dedicated inner surface: legacy card transform!important rules\r\n  \/\/ cannot suppress this entrance. Playback starts after the visible layout.\r\n  body.animate?.([{opacity:0,transform:'translateY(24px)'},{opacity:1,transform:'translateY(0)'}],\r\n   {duration:720,easing:'cubic-bezier(.16,1,.3,1)',fill:'backwards'});\r\n  revealWords(body.querySelector('h3'),80);revealWords(body.querySelector('.cfs-copy'),240);\r\n  [...body.querySelectorAll('.cfs-facts li')].filter(Boolean).forEach((element,i)=>{\r\n   element.getAnimations?.().forEach(a=>a.cancel());\r\n   element.animate?.([{opacity:0,transform:'translateY(14px)'},{opacity:1,transform:'translateY(0)'}],\r\n    {duration:620,delay:90+i*65,easing:'cubic-bezier(.16,1,.3,1)',fill:'backwards'});\r\n  });\r\n });\r\n}\r\n\r\nconst HEAD_FACTS={standard:[1],id1:[0,2],id2:[0,2],id3:[0,1],pa66:[0],releasable:[0,1],eyelet:[0,1],crossbow:[0,1],push:[0,1]};\r\nfunction presentationUI(){\r\n revealCard();\r\n const panel=$('.cfs-facts');if(!panel||!copy)return;\r\n const category=productCategory(),stageIndex=active===3?Math.min(3,Math.floor(clamp((p-INSTALL.start)\/(INSTALL.end-INSTALL.start)) * 4)):Math.max(0,ORDER.indexOf(active)-1);\r\n const key=[category,selectedColor,lang,active,stageIndex,dismissed,p>=INSTALL.end-.00002].join('|');if(key===presentationKey)return;\r\n presentationKey=key;\r\n const allItems=(PRODUCT_FACTS[category]?.[lang]||'').split('|').filter(Boolean);\r\n \/\/ Head\/plate-specific facts only. No UV, temperature, packaging or colour\r\n \/\/ claims beside a generic tail\/collar close-up.\r\n const items=active===2?(HEAD_FACTS[category]||[]).map(i=>allItems[i]).filter(Boolean):[];\r\n const origin=$('.cfs-origin');if(origin)origin.hidden=!(active===3&&p>=INSTALL.end-.00002);\r\n const compactPair=0,labels=FACT_LABELS[lang]||FACT_LABELS.it;\r\n text(panel.querySelector('.cfs-facts-label'),labels[0]);\r\n const list=panel.querySelector('ul');list.replaceChildren();\r\n items.forEach((value,i)=>{\r\n  const row=document.createElement('li'),number=document.createElement('span'),body=document.createElement('span');\r\n  number.className='cfs-fact-number';number.textContent=String(i+1).padStart(2,'0');number.setAttribute('aria-hidden','true');\r\n  body.textContent=value;row.append(number,body);\r\n  row.dataset.current=String(items.length<=2||i>=compactPair&&i<compactPair+2);\r\n  list.append(row);\r\n });\r\n const link=panel.querySelector('a'),product=$('.cfs-products');\r\n link.href=product.href;link.hreflang=root.lang;link.textContent=labels[1]+' \\u2192';\r\n link.hidden=active===3;panel.hidden=!items.length||active===3;\r\n\r\n measure=true;\r\n}\r\n\r\n\/\/ Persistent \"Apri prodotto <colour>\" pill beside the swatches; it glides to the\r\n\/\/ header corner when the selectors fold away and yields to the step-4 CTA.\r\nfunction openProductUI(){\r\n const a=$('.cfs-open-product');if(!a||!copy)return;\r\n const main=$('.cfs-products'),i=PALETTE.findIndex(c=>c.id===selectedColor);\r\n a.href=main?.href||TEXT[lang].products.url;a.hreflang=root.lang;\r\n const name=(copy.colors.names[i]||'').trim();\r\n const cta=TEXT[lang].products.label;text(a.querySelector('.cfs-open-label'),cta);text(a.querySelector('.cfs-open-color'),name);\r\n a.setAttribute('aria-label',cta+' \\u00b7 '+label(i));\r\n placeOpenProduct();\r\n}\r\nfunction placeOpenProduct(){\r\n const a=$('.cfs-open-product'),head=$('.cfs-header');if(!a||!head)return;\r\n const list=$('.cfs-colors'),h=head.getBoundingClientRect(),listOn=list&&list.getClientRects().length&&getComputedStyle(list).display!=='none';\r\n const phone=innerWidth<=600;let x=0,y=0;\r\n if(listOn&&!phone){const r=(list.querySelector('.cfs-color-list')||list).getBoundingClientRect();x=r.right-h.left+14;y=r.top-h.top+(r.height-a.offsetHeight)\/2}\r\n else if(phone){const sk=$('[data-action=\"skip\"]'),r=sk?.getBoundingClientRect();y=r&&r.height?r.top-h.top+(r.height-a.offsetHeight)\/2:0;x=0}\r\n a.style.transform='translate('+Math.round(x)+'px,'+Math.round(y)+'px)';\r\n}\r\n\/\/ CTR: prefetch the product page on intent (hover\/focus\/touch, and when the\r\n\/\/ final CTA appears) and push a dataLayer event per click, so GA4\/GTM can\r\n\/\/ report widget -> product-page conversion by language, family and colour.\r\nconst prefetched=new Set();\r\nfunction prefetchProduct(href){\r\n try{if(PRODUCT||!href||prefetched.has(href)||navigator.connection?.saveData)return;prefetched.add(href);\r\n  const l=document.createElement('link');l.rel='prefetch';l.href=href;l.as='document';document.head.append(l)}catch{}\r\n}\r\nfunction trackProduct(where,href){\r\n try{(window.dataLayer=window.dataLayer||[]).push({event:'cfs_product_click',cfs_cta:where,cfs_family:selectedType,cfs_category:productCategory(),cfs_color:selectedColor,cfs_language:lang,cfs_progress:Math.round(p*100),link_url:href})}catch{}\r\n}\r\nconst PDONE={\"it\": [\"Fissaggio completato\", \"Hai visto come lavora. Ora scegli misura e imballo nella tabella di questa pagina e aggiungili alla tua richiesta di quotazione.\"], \"en\": [\"Fastening complete\", \"You have seen how it works. Now choose size and packaging in the table on this page and add them to your quote request.\"], \"fr\": [\"Fixation termin\\u00e9e\", \"Vous avez vu comment il fonctionne. Choisissez maintenant la taille et le conditionnement dans le tableau de cette page et ajoutez-les \\u00e0 votre demande de devis.\"], \"de\": [\"Befestigung abgeschlossen\", \"Sie haben gesehen, wie er funktioniert. W\\u00e4hlen Sie jetzt Gr\\u00f6\\u00dfe und Verpackung in der Tabelle auf dieser Seite und f\\u00fcgen Sie sie Ihrer Angebotsanfrage hinzu.\"], \"es\": [\"Fijaci\\u00f3n completada\", \"Ya has visto c\\u00f3mo funciona. Ahora elige medida y embalaje en la tabla de esta p\\u00e1gina y a\\u00f1\\u00e1delos a tu solicitud de presupuesto.\"], \"pt\": [\"Fixa\\u00e7\\u00e3o conclu\\u00edda\", \"J\\u00e1 viu como funciona. Agora escolha a medida e a embalagem na tabela desta p\\u00e1gina e adicione-as ao seu pedido de or\\u00e7amento.\"]},PCTA={\"it\": \"Scegli la misura e richiedi la quotazione\", \"en\": \"Choose size and request a quote\", \"fr\": \"Choisir la taille et demander un devis\", \"de\": \"Gr\\u00f6\\u00dfe w\\u00e4hlen und Angebot anfordern\", \"es\": \"Elegir medida y pedir presupuesto\", \"pt\": \"Escolher medida e pedir or\\u00e7amento\"};\r\nfunction updateProductLink(){\r\n if(PRODUCT){const link=$('.cfs-products'),t=PCTA[lang]||PCTA.it;link.href='#cfs-quote';link.removeAttribute('hreflang');text(link.querySelector('span'),t);link.setAttribute('aria-label',t);link.title=t;return}\r\n const category=productCategory();queueMicrotask(()=>{if(!dead&&copy)seoContent()});\r\n const entry=PRODUCT_LINKS[category]?.[lang];if(!entry)return;\r\n const [path,attribute,colors]=entry,url=new URL(path);\r\n if(colors[selectedColor])url.searchParams.set(attribute,colors[selectedColor]);\r\n const link=$('.cfs-products');link.href=url.href;link.hreflang=root.lang;queueMicrotask(()=>{if(!dead)openProductUI()});\r\n text(link.querySelector('span'),TEXT[lang].products.label);\r\n link.setAttribute('aria-label',TEXT[lang].products.label+' \\u00b7 '+label(PALETTE.findIndex(c=>c.id===selectedColor)));link.title=link.getAttribute('aria-label');\r\n}\r\n\r\n\/* SEO: the same copy the 3D tells, as crawlable semantic text (visually\r\n   hidden, read by search engines and screen readers) plus HowTo JSON-LD.\r\n   Product schema stays on the product pages, where offers exist. *\/\r\nconst HOWTO_NAME={it:'Come installare una fascetta di cablaggio COBRA\\u00ae',en:'How to install a COBRA\\u00ae cable tie',fr:'Comment poser un collier de c\\u00e2blage COBRA\\u00ae',de:'So montieren Sie einen COBRA\\u00ae Kabelbinder',es:'C\\u00f3mo instalar una brida de cableado COBRA\\u00ae',pt:'Como instalar uma bra\\u00e7adeira de cablagem COBRA\\u00ae'};\r\nfunction seoContent(){\r\n const fallback=$('.cfs-fallback');if(!fallback||!copy||PRODUCT)return;fallback.replaceChildren();fallback.lang=root.lang;\r\n const el=(tag,value,parent)=>{const n=document.createElement(tag);if(value!=null)n.textContent=value;parent?.append(n);return n};\r\n for(const [title,body]of copy.parts){const a=el('article',null,fallback);el('h3',title,a);el('p',body,a)}\r\n const inst=el('article',null,fallback);el('h3',copy.parts[3][0],inst);const ol=el('ol',null,inst);\r\n const steps=[...copy.installation.steps,copy.installation.done];\r\n steps.forEach(([a,b])=>{const li=el('li',null,ol);el('strong',a,li);li.append(' '+b)});\r\n const range=THERMAL_RANGES[productCategory()]||[-40,85],temp=el('article',null,fallback);\r\n el('h3',THERMAL_COPY[lang]||THERMAL_COPY.it,temp);\r\n el('p','\\u2212'+Math.abs(range[0])+' \\u00b0C \/ +'+range[1]+' \\u00b0C'+(productCategory()==='heat'?' \\u00b7 '+(THERMAL_PEAK[lang]||THERMAL_PEAK.it):''),temp);\r\n const col=el('article',null,fallback);el('h3',copy.colors.label,col);\r\n el('p',allowedColors().map(c=>label(PALETTE.indexOf(c))).join(', '),col);\r\n const link=$('.cfs-products'),p=el('p',null,fallback),a=el('a',(TEXT[lang].products.label)+': '+copy.title,p);\r\n a.href=link?.href||TEXT[lang].products.url;a.hreflang=root.lang;\r\n let ld=document.getElementById(root.id+'-ld');\r\n if(!ld){ld=document.createElement('script');ld.type='application\/ld+json';ld.id=root.id+'-ld';root.append(ld)}\r\n const page=location.href.split('#')[0];\r\n ld.textContent=JSON.stringify({'@context':'https:\/\/schema.org','@type':'HowTo','@id':page+'#'+root.id+'-howto-'+lang,url:page,name:HOWTO_NAME[lang]||HOWTO_NAME.it,\r\n  description:copy.parts[3][1],inLanguage:root.lang,\r\n  supply:[{'@type':'HowToSupply',name:TYPE_COPY[lang]?.[TYPES.indexOf(family())]?.[0]||copy.title}],\r\n  step:copy.installation.steps.map(([name,text],i)=>({'@type':'HowToStep',position:i+1,name,text,url:location.href.split('#')[0]+'#'+root.id})),\r\n  isPartOf:{'@type':'WebPage','@id':page,url:page,inLanguage:root.lang},\r\n  about:{'@type':'Brand',name:'COBRA\\u00ae Cable Ties'},\r\n  publisher:{'@type':'Organization',name:'Cieffeplast s.r.l.',url:'https:\/\/www.cieffeplast.com\/'}});\r\n}\r\nfunction localize(force=false){\r\n  const next=detectLanguage();if(lang===next&&force!==true)return;\r\n  lang=next;copy=familyCopy(lang);root.lang=lang==='pt'?'pt-PT':lang;\r\n  root.setAttribute('aria-label',copy.title);text($('.cfs-title'),copy.title);\r\n  text($('.cfs-kicker'),copy.kicker);text($('.cfs-description'),copy.description);\r\n  updateProductLink();tourUI();hudUI();\r\n  text($('[data-action=\"skip\"]'),copy.ui[4]);text($('[data-action=\"close\"]'),'\\u00d7');\r\n  $('[data-action=\"close\"]').setAttribute('aria-label',copy.ui[5]);\r\n  text($('[data-action=\"zoom-in\"]'),'+');text($('[data-action=\"zoom-out\"]'),'\\u2212');\r\n  $('[data-action=\"zoom-in\"]').setAttribute('aria-label',copy.ui[9]);\r\n  $('[data-action=\"zoom-out\"]').setAttribute('aria-label',copy.ui[10]);\r\n  $('.cfs-nav').setAttribute('aria-label',copy.ui[11]);text(status,copy.ui[lost?7:6]);\r\n  renderer?.domElement.setAttribute('aria-label',copy.title);\r\n  seoContent();\r\n  updateUI();kick();\r\n}\r\n\r\n\/* Special families: independent mold profiles reconstructed from the product\r\n   photographs and dimensioned catalogue views. These builders never call the\r\n   cabling head, its pawl, its raised-edge strap or its sandpaper tip builder.\r\n   Coordinates without catalogue dimensions are photographic approximations.\r\n   Source: uploaded 0001-00015-06741-6.pdf, pages 28-45 (front, side and application views).\r\n   Product galleries: https:\/\/www.cieffeplast.com\/it\/fascette\/.\r\n   Nominal transverse scale: one scene unit = 4.8 mm for these special families. *\/\r\nconst MOLDS={\r\n id1:{width:2.5\/4.8,thick:.145,neck:.54,neckLen:.30,headW:.99,headL:1.15,headD:.92,headTop:.105,aperture:.67,plate:[-18.60,-16.9333,25.4\/4.8],pitch:.095,rackStart:-16.72,rackEnd:16.5,rackH:.028,tipStart:16.35,tipWidth:.50,tipK:.36,focus:-18.15,span:7.3},\r\n id2:{width:2.5\/4.8,thick:.145,neck:.52,neckLen:.35,headW:1.03,headL:1.15,headD:.90,headTop:.105,aperture:.66,pitch:.095,rackStart:-18.76,rackEnd:16.2,rackH:.028,tipStart:16.30,tipWidth:.48,tipK:.32,focus:-21.20,span:6.2},\r\n id3:{width:1,thick:.195,neck:1.00,neckLen:.32,headW:1.95,headL:1.67,headD:1.03,headTop:.115,aperture:1.13,plate:[-18.37,-12.5367,13\/4.8],pitch:.133,rackStart:-10.4,rackEnd:13.0,rackH:.038,tipStart:13.1,tipWidth:.43,tipK:0,focus:-16.8,span:9.7},\r\n releasable:{width:7.6\/4.8,thick:.225,neck:1.95,neckLen:2.08,headW:2.37,headL:1.48,headD:1.14,headTop:.135,aperture:1.73,pitch:.16,rackStart:-15.0,rackEnd:16.2,rackH:.053,tipStart:20.15,tipWidth:1,tipK:0,focus:-19.0,span:6.1},\r\n eyelet:{width:1,thick:.21,neck:1.05,neckLen:.38,headW:1.76,headL:1.72,headD:1.14,headTop:.13,aperture:1.08,pitch:.14,rackStart:-18.77,rackEnd:15.6,rackH:.045,tipStart:15.8,tipWidth:.30,tipK:.32,focus:-21.9,span:7.8},\r\n crossbow:{width:1,thick:.20,neck:1.13,neckLen:.32,headW:1.57,headL:1.34,headD:1.04,headTop:.12,aperture:1.09,pitch:.14,rackStart:-18.72,rackEnd:16.0,rackH:.043,tipStart:20.15,tipWidth:.38,tipK:.30,focus:-21.45,span:6.6},\r\n push:{width:1,thick:.20,neck:1.07,neckLen:.26,headW:1.75,headL:1.75,headD:1.10,headTop:.12,aperture:1.10,pitch:.14,rackStart:-18.85,rackEnd:16.0,rackH:.044,tipStart:20.10,tipWidth:.34,tipK:.32,focus:-22.0,span:8.5},\r\n pa66:{width:9\/4.8,thick:.255,neck:3.10,neckLen:1.55,headW:3.10,headL:5.40,singleL:3.02,headD:.76,headTop:.08,pitch:.22,rackStart:-7.2,rackEnd:15.75,rackH:.084,tipStart:15.9,tipWidth:.73,tipK:0,focus:-22.5,span:9.5,flat:true},\r\n pa12:{width:9\/4.8,thick:.245,neck:2.77,neckLen:1.42,headW:2.77,headL:5.42,singleL:3.24,headD:.70,headTop:.08,pitch:.205,rackStart:-5.2,rackEnd:15.25,rackH:.074,tipStart:15.25,tipWidth:.43,tipK:0,focus:-22.5,span:9.5,flat:true}\r\n};\r\nconst mold=()=>MOLDS[selectedType];\r\nfunction configureMold(){\r\n const m=mold();WRAP.slotX=m&&!m.flat?-20.14-(.21+m.thick*.5+m.rackH+.008):-20.313;if(!m)return;\r\n const f=family();f.width=m.width;f.focus=m.focus;f.span=m.span;f.plate=m.plate;\r\n}\r\nfunction kindPlateRadius(){return selectedType==='id3'?.18:.16}\r\n\/\/ Tip dimensions come from each technical silhouette. Rounded noses are\r\n\/\/ exact circular arcs, joined tangentially to a taper with rounded shoulders.\r\nfunction specialTip(){\r\n const m=mold();let start=m.tipStart,w=m.width*m.tipWidth;\r\n if(selectedType==='pa12'&&selectedHead==='single'){start=17.1;w=m.width*.53}\r\n if(selectedType==='releasable'){w=m.width;start=TAIL_END_X-w*.5}\r\n const r=w*.5,cap=TAIL_END_X-r,H=m.width*.5,L=cap-start;\r\n const k=(selectedType==='releasable'||selectedType==='pa66')?0:(H*H-r*r)\/(H*L+r*Math.sqrt(Math.max(0,L*L+H*H-r*r)));\r\n return {start,width:w,r,cap,k,join:cap+r*k\/Math.sqrt(1+k*k)};\r\n}\r\nfunction softenedRamp(q){\r\n q=clamp(q);const e=.12;\r\n if(q<e)return q*q\/(2*e*(1-e));\r\n if(q>1-e)return 1-(1-q)*(1-q)\/(2*e*(1-e));\r\n return (q-e*.5)\/(1-e);\r\n}\r\nfunction specialWidth(x){\r\n const m=mold(),tip=specialTip(),d=x-STRAP_X0;\r\n let width=lerp(m.neck,m.width,smooth(d\/m.neckLen));\r\n if(selectedType==='pa66'){\r\n  const stations=[[15.9,1],[16.10,.83],[17.65,.83],[17.85,.89],[tip.cap,m.tipWidth]];\r\n  for(let i=0;i<stations.length-1;i++){\r\n   const [a,wa]=stations[i],[b,wb]=stations[i+1];\r\n   if(x>=a&&x<b)width=m.width*lerp(wa,wb,softenedRamp((x-a)\/(b-a)));\r\n  }\r\n }else if(x>tip.start){\r\n  const d=x-tip.start,fillet=Math.min(.14,(tip.join-tip.start)*.15);\r\n  const travel=d<fillet?fillet*(2*(d\/fillet)**2-(d\/fillet)**3):d;\r\n  width=m.width-2*tip.k*travel;\r\n }\r\n if(x>=(selectedType==='pa66'?tip.cap:tip.join)){const q=clamp((x-tip.cap)\/tip.r);width=tip.width*Math.sqrt(Math.max(0,1-q*q))}\r\n let half=width*.5;\r\n if(m.plate){\r\n  const r=kindPlateRadius(),[a,b]=m.plate,d=x<a?a-x:x>b?x-b:Infinity;\r\n  if(d<r)half+=r-Math.sqrt(Math.max(0,r*r-(r-d)*(r-d)));\r\n }\r\n return Math.max(half,plateWidth(x));\r\n}\r\nfunction specialThickness(x){\r\n const m=mold(),tip=specialTip(),plate=plateWidth(x)>0;\r\n let h=(plate?Math.min(m.thick,.155):m.thick)*lerp(1,.70,smooth((x-tip.start)\/(TAIL_END_X-tip.start)));\r\n \/\/ Round the last edge through the thickness as well as in plan view.\r\n const r=m.thick*.35,remaining=TAIL_END_X-x;\r\n if(remaining<r)h*=Math.sqrt(Math.max(0,1-(1-remaining\/r)**2));\r\n return h;\r\n}\r\nfunction specialHeadSupport(){\r\n const m=mold();if(selectedType==='releasable')return [-21.05,-17.66,.18];return m?[-20.14-(m.headL-.60),-19.54,m.headTop]:[-20.967,-19.313,.245];\r\n}\r\nfunction makeSpecialModel(){\r\n const ownedBefore=new Set(resources),m=mold(),kind=selectedType;\r\n const refined=['releasable','pa66','pa12'].includes(kind);\r\n \/\/ Angle-weighted welded normals keep the broad faces flat while smoothing\r\n \/\/ the fillets. ExtrudeGeometry otherwise splits every bevel band.\r\n function moldNormals(g){return smoothHead(g)}\r\n const extrude=(shape,depth,bevel=.015)=>moldNormals(new T.ExtrudeGeometry(shape,{depth,steps:1,curveSegments:LOD(refined?96:64),bevelEnabled:bevel>0,bevelSize:bevel,bevelThickness:bevel,bevelSegments:LOD(refined?12:8)}));\r\n model=new T.Group();model.name='tie-'+kind;model.userData.mold=kind;scene.add(model);\r\n const body=keep(new T.MeshPhysicalMaterial({color:PALETTE.find(c=>c.id===selectedColor).hex,roughness:.57,metalness:0,bumpMap:grain(),bumpScale:.005,clearcoat:.035,clearcoatRoughness:.58,envMapIntensity:1,specularIntensity:.8}));\r\n const headMaterial=keep(body.clone());headMaterial.bumpScale=.009;\r\n \/\/ Four material roles keep the existing optical controls, each without grit.\r\n const tipMaterial=keep(body.clone()),inside=keep(headMaterial.clone());\r\n if(refined)[body,tipMaterial,headMaterial,inside].forEach((mat,i)=>{mat.userData.moldFinish={kind,index:i};mat.bumpScale=i===2?.004:.0025});\r\n finishes.push(body,tipMaterial,headMaterial,inside);\r\n nylonGlass.screen.value=new T.Vector2(1,1);nylonGlass.texel.value=new T.Vector2(1,1);\r\n finishes.forEach((mat,i)=>{nylonShader(mat,i);goldShader(mat)});tune();\r\n function part(g,mat,name,parent=model,x=0,y=0,z=0){const o=new T.Mesh(keep(g),mat);o.name=name;o.position.set(x,y,z);parent.add(o);return o}\r\n function poly(points){const s=new T.Shape();s.moveTo(...points[0]);for(const p of points.slice(1))s.lineTo(...p);s.closePath();return s}\r\n function rect(w,h,r=.035){return round(-w\/2,-h\/2,w,h,r)}\r\n function voidWidth(x){\r\n  if(kind!=='releasable')return 0;\r\n  const a=STRAP_X0+.045,b=STRAP_X0+2.02,half=.535,r=.48;\r\n  if(x<=a||x>=b)return 0;\r\n  const d=Math.min(x-a,b-x);return d<r?half*Math.sqrt(Math.max(0,1-(1-d\/r)**2)):half;\r\n }\r\n \/\/ Independently tessellated strap. The releasable's U opening is an actual\r\n \/\/ void between two deforming side rails, not a lever stuck onto a solid band.\r\n const tip=specialTip(),xs=[],rackStart=kind==='pa12'&&selectedHead==='single'?-15.0:m.rackStart;\r\n const groove=(x,u)=>{if(kind!=='pa12')return 0;const au=Math.abs(u);\r\n  if(selectedHead==='single'){const q=smooth((x-STRAP_X0-.75)\/.25)*(1-smooth((x-rackStart+.55)\/.3));return au<=.40?.095*q*smooth((.40-au)\/.07):0}\r\n  const q=smooth((x-STRAP_X0-.9)\/.3)*(1-smooth((x-rackStart+.8)\/.8));return au<=.16?.030*q*(1-au\/.16):0};\r\n for(let x=STRAP_X0;x<TAIL_END_X;x+=.085)xs.push(x);\r\n for(let x=tip.start-.20;x<tip.cap;x+=.025)xs.push(x);\r\n \/\/ Angle-spaced rings prevent the polygonal end seen with uniform axial steps.\r\n for(let i=0;i<64;i++)xs.push(tip.cap+tip.r*Math.sin(i*Math.PI\/128));\r\n const noseR=m.thick*.35;\r\n for(let i=0;i<32;i++)xs.push(TAIL_END_X-noseR+noseR*Math.sin(i*Math.PI\/64));\r\n if(kind==='pa12')for(let x=STRAP_X0;x<STRAP_X0+2.4;x+=.03)xs.push(x);\r\n if(kind==='pa66')for(const x of [15.9,16.1,17.65,17.85])for(let j=-4;j<=4;j++)xs.push(x+j*.008);\r\n if(m.plate)for(const edge of [m.plate[0],m.plate[1]])for(let j=-10;j<=10;j++)xs.push(edge+j*.015);\r\n if(kind==='releasable')for(const x of [STRAP_X0+.045,STRAP_X0+2.02])for(let j=-8;j<=8;j++)xs.push(x+j*.012);\r\n xs.sort((a,b)=>a-b);\r\n const unique=xs.filter((x,i)=>x>=STRAP_X0&&x<TAIL_END_X-1e-7&&(i===0||x-xs[i-1]>1e-7));\r\n \/\/ Physical edge radii: do not stretch a bevel across the entire tip width.\r\n const section=[];\r\n for(let corner=0;corner<4;corner++){\r\n  for(let i=0;i<=8;i++)section.push({corner,angle:Math.PI+(corner*8+i)*Math.PI\/16});\r\n  if(corner===0)for(const u of [-.72,-.69,-.56,0,.56,.69,.72])section.push({u,v:-1});\r\n  if(corner===2)for(const u of [.78,.72,.69,0,-.69,-.72,-.78])section.push({u,v:1});\r\n }\r\n \/* Installazione: sezione ellissoidale schiacciata, piatta e larga\r\n    (superellisse 2.4, bordi pieni e non a lama). *\/\r\n if(m.flat){section.length=0;for(let i=0;i<72;i++)section.push({e:Math.PI+i\/72*Math.PI*2})}\r\n const pos=[],uv=[],index=[],axial=[],pn=section.length,split=kind==='releasable';\r\n const a=STRAP_X0+.045,b=STRAP_X0+2.02;\r\n const regions=split?[[STRAP_X0,a,0],[a,b,-1],[a,b,1],[b,TAIL_END_X,0]]:[[STRAP_X0,TAIL_END_X,0]];\r\n for(const [start,end,side] of regions){\r\n  const base=pos.length\/3,terminal=end===TAIL_END_X;\r\n  const rows=[start,...unique.filter(x=>x>start+1e-7&&x<end-1e-7),...(terminal?[]:[end])];\r\n  for(const x of rows){\r\n   const half=specialWidth(x),gap=voidWidth(x),lo=side>0?gap:-half,hi=side<0?-gap:half;\r\n   const plate=plateWidth(x)>0,thick=specialThickness(x),hw=(hi-lo)*.5,mid=(lo+hi)*.5;\r\n   const radius=Math.min(thick*.23,hw*.42),h=thick*.5;\r\n   const angle=Math.atan(slope(x)),c=Math.cos(angle),s=Math.sin(angle);\r\n   const railFade=1-smooth((x-(m.rackEnd-.15))\/.55);\r\n   for(let j=0;j<pn;j++){\r\n    const p=section[j];let y,z;\r\n    if(p.e!==undefined){\r\n     const c=Math.cos(p.e),sn=Math.sin(p.e),q=2\/2.4,u=Math.sign(c)*Math.abs(c)**q;\r\n     y=mid+hw*u;z=h*Math.sign(sn)*Math.abs(sn)**q;\r\n     if(!plate&&z>0&&Math.abs(u)<=.72)z-=thick*.10*railFade*smooth((.78-Math.abs(u))\/.06);\r\n     if(z<0)z+=groove(x,u);\r\n    }else if(p.corner!==undefined){\r\n     const cy=(p.corner===0||p.corner===3)?-hw+radius:hw-radius;\r\n     const cz=p.corner<2?-h+radius:h-radius;\r\n     y=mid+cy+radius*Math.cos(p.angle);z=cz+radius*Math.sin(p.angle);\r\n    }else{\r\n     y=mid+p.u*(hw-radius);z=p.v*h;\r\n     if(!plate&&p.v>0&&Math.abs(p.u)<=.72)z-=thick*.10*railFade*smooth((.78-Math.abs(p.u))\/.06);\r\n     if(p.v<0)z+=groove(x,p.u);\r\n    }\r\n    pos.push(x-z*s,y,bend(x)+z*c);axial.push(x);uv.push(x,j\/pn);\r\n   }\r\n  }\r\n  for(let i=0;i<rows.length-1;i++)for(let j=0;j<pn;j++){\r\n   const a=base+i*pn+j,b=a+pn,c=base+i*pn+(j+1)%pn,d=c+pn;index.push(a,c,b,b,c,d);\r\n  }\r\n  if(start===STRAP_X0)for(let j=1;j<pn-1;j++)index.push(base,base+j+1,base+j);\r\n  if(terminal){\r\n   \/\/ One watertight pole, instead of a thin end face with overlapping vertices.\r\n   const pole=pos.length\/3,last=base+(rows.length-1)*pn;\r\n   pos.push(TAIL_END_X,0,bend(TAIL_END_X));axial.push(TAIL_END_X);uv.push(TAIL_END_X,.5);\r\n   for(let j=0;j<pn;j++)index.push(last+j,last+(j+1)%pn,pole);\r\n  }\r\n }\r\n const g=new T.BufferGeometry();g.setAttribute('position',new T.Float32BufferAttribute(pos,3));g.setAttribute('uv',new T.Float32BufferAttribute(uv,2));g.setIndex(index);g.computeVertexNormals();\r\n const strap=part(g,body,kind+'-strap');bendable(strap,axial);\r\n const teeth=Math.floor((m.rackEnd-rackStart)\/m.pitch)+1;\r\n const tooth=poly([[0,0],[m.pitch*.81,0],[m.pitch*.81,m.rackH*.80],[m.pitch*.66,m.rackH],[m.pitch*.07,m.rackH*.05]]);\r\n const toothWidth=m.width*(m.flat?.72:.73),tg=extrude(tooth,toothWidth,.002);\r\n tg.rotateX(Math.PI\/2);tg.translate(0,toothWidth\/2,0);if(m.flat)tg.rotateX(Math.PI);\r\n rack={x0:rackStart,dx:m.pitch,z:m.flat?-m.thick*.5*.82:m.thick*.40,count:teeth,mesh:new T.InstancedMesh(keep(tg),body,teeth)};\r\n rack.mesh.name=kind+'-ratchet-rack';rack.mesh.frustumCulled=false;rack.mesh.instanceMatrix.setUsage(T.DynamicDrawUsage);model.add(rack.mesh);\r\n const head=new T.Group();head.name='head-assembly';model.add(head);head.position.x=-20.14;head.rotation.z=Math.PI\/2;\r\n function hp(s,d,name,z=0,bev=.018){return part(extrude(s,d,bev),headMaterial,name,head,0,0,z)}\r\n function hb(name,u,v,z,w,l,d,r=.035){return part(extrude(rect(w,l,r),d,.012),headMaterial,name,head,u,v,z)}\r\n function aperture(w){\r\n  const top=.21+m.thick+m.rackH+.058,step=.10;\r\n  \/\/ One clean rounded-rectangle window: the pawl stands inside it with a\r\n  \/\/ visible clearance on both sides, as on the molded parts.\r\n  return round(-w\/2,-.15,w,top+.15,.035,new T.Path());\r\n }\r\n function shell(outline,w=m.aperture){outline.holes.push(aperture(w));return hp(outline,m.headD,kind+'-head-shell',m.headTop-m.headD,.020)}\r\n function pawl(w=m.aperture*.57){\r\n  const s=round(-w\/2,-.22,w,.43,.016);\r\n  hp(s,m.headD*.64,kind+'-locking-tongue',m.headTop-m.headD*.76,.008);\r\n  \/\/ Two visible transverse edges belong to the inset locking tongue.\r\n  for(let i=0;i<2;i++)hb(kind+'-pawl-tooth-'+i,0,.14-i*.11,m.headTop-m.headD*.10,w,.027,.018,.007);\r\n }\r\n if(kind==='id1'){\r\n  const s=new T.Shape();s.moveTo(-.42,.55);s.lineTo(.42,.55);s.quadraticCurveTo(.495,.55,.495,.475);s.lineTo(.495,-.40);s.quadraticCurveTo(.495,-.48,.39,-.50);s.quadraticCurveTo(.29,-.53,.27,-.60);s.lineTo(-.27,-.60);s.quadraticCurveTo(-.29,-.53,-.39,-.50);s.quadraticCurveTo(-.495,-.48,-.495,-.40);s.lineTo(-.495,.475);s.quadraticCurveTo(-.495,.55,-.42,.55);s.closePath();\r\n  \/\/ Slot top is kept within the smaller head by a shallow crown extension.\r\n  shell(s);pawl();\r\n }else if(kind==='id2'){\r\n  const s=round(-m.headW\/2,-.60,m.headW,m.headL,.09);shell(s);pawl();\r\n  \/\/ Direct, flush connection to the plate: no added stand-off stalk.\r\n  const marker=new T.Shape(),w=20.4\/9.6,h=9\/4.8,r=.08;\r\n  marker.moveTo(-.50,.37);marker.lineTo(.50,.37);marker.lineTo(.50,.46);marker.quadraticCurveTo(.50,.62,.66,.62);marker.lineTo(w-r,.62);marker.quadraticCurveTo(w,.62,w,.62+r);marker.lineTo(w,.62+h-r);marker.quadraticCurveTo(w,.62+h,w-r,.62+h);marker.lineTo(-w+r,.62+h);marker.quadraticCurveTo(-w,.62+h,-w,.62+h-r);marker.lineTo(-w,.62+r);marker.quadraticCurveTo(-w,.62,-w+r,.62);marker.lineTo(-.66,.62);marker.quadraticCurveTo(-.50,.62,-.50,.46);marker.closePath();hp(marker,.155,'id2-external-marker-plate',-.0775,.012);\r\n }else if(kind==='id3'){\r\n  const s=new T.Shape();s.moveTo(-.34,1.07);s.lineTo(.34,1.07);s.bezierCurveTo(.75,1.03,.98,.67,.975,.31);s.bezierCurveTo(.975,-.10,.65,-.33,.50,-.47);s.lineTo(.50,-.60);s.lineTo(-.50,-.60);s.lineTo(-.50,-.47);s.bezierCurveTo(-.65,-.33,-.975,-.10,-.975,.31);s.bezierCurveTo(-.98,.67,-.75,1.03,-.34,1.07);s.closePath();shell(s);pawl();\r\n }else if(kind==='releasable'){\r\n  const s=new T.Shape();s.moveTo(-.87,.88);s.lineTo(.87,.88);s.quadraticCurveTo(1.18,.88,1.18,.57);s.lineTo(1.18,.13);s.quadraticCurveTo(1.18,-.02,1.10,-.16);s.lineTo(.975,-.60);s.lineTo(-.975,-.60);s.lineTo(-1.10,-.16);s.quadraticCurveTo(-1.18,-.02,-1.18,.13);s.lineTo(-1.18,.57);s.quadraticCurveTo(-1.18,.88,-.87,.88);s.closePath();\r\n  s.holes.push(aperture(m.aperture));\r\n  const shellMesh=hp(s,m.headD,'releasable-rounded-head-shell',m.headTop-m.headD,.060);\r\n  const sp=shellMesh.geometry.attributes.position;\r\n  for(let i=0;i<sp.count;i++){const v=sp.getY(i),q=smooth((.12-v)\/.72);sp.setZ(i,m.headD+(sp.getZ(i)-m.headD)*(1-.20*q))}\r\n  moldNormals(shellMesh.geometry);pawl(.66);\r\n  \/\/ The side profile is a sculpted spring paddle with a concave back,\r\n  \/\/ not a straight rectangular bar hanging from a box.\r\n  const lever=new T.Shape();lever.moveTo(-20.15,-.035);lever.lineTo(-19.57,-.035);\r\n  lever.bezierCurveTo(-19.38,-.04,-19.34,-.19,-19.11,-.20);\r\n  lever.lineTo(-17.97,-.20);lever.quadraticCurveTo(-17.75,-.20,-17.73,-.39);\r\n  lever.quadraticCurveTo(-17.74,-.58,-17.99,-.57);\r\n  lever.bezierCurveTo(-18.38,-.32,-18.92,-.44,-19.28,-.79);\r\n  lever.quadraticCurveTo(-19.46,-.96,-19.70,-.95);lever.lineTo(-20.15,-.95);lever.closePath();\r\n  const lg=extrude(lever,.66,.035);lg.rotateX(Math.PI\/2);lg.translate(0,.33,0);\r\n  lg.rotateZ(-Math.PI\/2);lg.translate(0,-20.14,0);\r\n  part(lg,headMaterial,'releasable-concave-release-paddle',head);\r\n }else if(kind==='eyelet'){\r\n  const cy=3.18,outer=1.16,inner=5.5\/9.6;\r\n  const s=new T.Shape();s.moveTo(-.69,-.60);s.quadraticCurveTo(-.88,-.60,-.88,-.42);s.lineTo(-.88,1.02);s.lineTo(-outer,cy);s.absarc(0,cy,outer,Math.PI,0,true);s.lineTo(.88,1.02);s.lineTo(.88,-.42);s.quadraticCurveTo(.88,-.60,.69,-.60);s.closePath();\r\n  const eyeHole=new T.Path();eyeHole.absellipse(0,cy,inner,inner,0,Math.PI*2,true);s.holes.push(eyeHole);s.holes.push(aperture(m.aperture));\r\n  hp(s,.265,'eyelet-tapered-mounting-web',-.1325,.024);\r\n  shell(round(-.88,-.60,1.76,1.72,.105));pawl();\r\n  const boss=new T.Shape();boss.absellipse(0,cy,outer-.012,outer-.012,0,Math.PI*2,false);boss.holes.push(eyeHole);hp(boss,m.headD,'eyelet-screw-bearing-ring',m.headTop-m.headD,.025);\r\n }else if(kind==='crossbow'){\r\n  shell(round(-.785,-.60,1.57,1.34,.125));pawl();\r\n  const a=poly([[-.56,.78],[-.40,1.04],[-.61,1.23],[-.83,1.23],[-.46,2.98],[.46,2.98],[.83,1.23],[.61,1.23],[.40,1.04],[.56,.78]]);\r\n  for(const sign of [-1,1]){\r\n   const h=new T.Path();h.moveTo(sign*.20,.80);h.lineTo(sign*.43,.80);h.lineTo(sign*.30,1.04);h.lineTo(sign*.51,1.24);h.lineTo(sign*.20,2.50);h.closePath();a.holes.push(h);\r\n  }\r\n  const anchor=hp(a,.90,'crossbow-three-rib-anchor',-.45,.016);\r\n  const ap=anchor.geometry.attributes.position;for(let i=0;i<ap.count;i++){const q=clamp((ap.getY(i)-.78)\/2.20);ap.setZ(i,(ap.getZ(i)-.45)*lerp(1,.48,q)+.45)}ap.needsUpdate=true;anchor.geometry.computeVertexNormals();hb('crossbow-panel-bearing-shelf',0,.74,-.94,1.72,.23,1.03,.035);\r\n  for(const sign of [-1,1]){\r\n   const w=new T.Shape();w.moveTo(sign*.51,.64);w.lineTo(sign*1.50,1.15);w.quadraticCurveTo(sign*1.72,1.17,sign*1.65,1.45);w.quadraticCurveTo(sign*1.48,1.65,sign*1.41,1.36);w.lineTo(sign*.44,.91);w.closePath();hp(w,.25,'crossbow-spring-wing-'+sign,-.125,.018);\r\n  }\r\n }else if(kind==='push'){\r\n  shell(round(-m.headW\/2,-.60,m.headW,m.headL,.10));pawl();\r\n  const loop=new T.Shape();loop.moveTo(-.48,1.12);loop.lineTo(-.30,4.24);loop.lineTo(-.16,4.24);loop.quadraticCurveTo(0,3.98,.16,4.24);loop.lineTo(.30,4.24);loop.lineTo(.48,1.12);loop.closePath();\r\n  const slot=new T.Path();slot.moveTo(-.24,1.17);slot.lineTo(-.13,3.96);slot.quadraticCurveTo(0,4.10,.13,3.96);slot.lineTo(.24,1.17);slot.closePath();loop.holes.push(slot);\r\n  const anchor=hp(loop,.90,'push-hollow-spring-loop',-.45,.015);\r\n  const ap=anchor.geometry.attributes.position;for(let i=0;i<ap.count;i++){const q=clamp((ap.getY(i)-1.12)\/3.12);ap.setZ(i,(ap.getZ(i)-.45)*lerp(1,.39,q)+.45)}ap.needsUpdate=true;anchor.geometry.computeVertexNormals();\r\n  for(const sign of [-1,1]){\r\n   const wing=poly([[sign*.28,3.98],[sign*.80,1.94],[sign*.31,1.94]]);hp(wing,.28,'push-flexible-barb-'+sign,-.14,.014);\r\n   const pin=new T.Shape();pin.absellipse(sign*.34,1.49,.20,.15,0,Math.PI*2,false);hp(pin,.27,'push-retention-bump-'+sign,-.135,.014);\r\n  }\r\n  hb('push-rear-panel-spacer',0,1.02,-1.00,1.78,.22,1.12);\r\n }else if(m.flat){\r\n  \/* Teste piatte d'installazione ricostruite dalle foto frontali:\r\n     PA66: telaio con feritoia in testa, piastre a U con finestra passante e\r\n     linguetta trapezoidale inclinata a vista, rullo trasversale, dentatura a\r\n     sega sui fianchi, ruota datario sul collo.\r\n     PA12: telaio con feritoie passanti prima e dopo ogni ponte, ponti pieni con\r\n     bordo incassato e bollino, zona centrale con asola in rilievo, dentatura a\r\n     sega continua, collo a Y con numero stampato. Singola = un solo modulo. *\/\r\n  head.position.set(0,0,0);head.rotation.set(0,0,0);\r\n  const single=selectedHead==='single',W=m.headW,end=STRAP_X0,L=single?m.singleL:m.headL,start=end-L;\r\n  const pa66=kind==='pa66',rail=pa66?.54:.415,inner=W-2*rail,X=u=>start+u;\r\n  const LAY=pa66?(single?\r\n    {slits:[[.62,.70]],plates:[[.74,2.26,1.38]],rollers:[[2.26,2.68]],serr:[[.90,2.14]],pitch:.26,prot:.13}:\r\n    {slits:[[.80,.88],[2.96,3.08]],plates:[[.92,2.44,1.56],[3.12,4.60,3.74]],rollers:[[2.44,2.91],[4.60,5.02]],serr:[[1.06,2.32],[3.26,4.48]],pitch:.26,prot:.13}):\r\n   (single?\r\n    {slits:[[.62,.74],[1.98,2.10]],blocks:[[.78,1.94]],pads:[[2.14,2.84]],serr:[[.80,1.92]],pitch:.33,prot:.17}:\r\n    {slits:[[.925,1.06],[2.30,2.41],[3.09,3.21],[4.46,4.62]],blocks:[[1.09,2.22],[3.24,4.40]],mids:[[2.41,3.09]],serr:[[1.10,4.38]],pitch:.33,prot:.17});\r\n  const winW=inner-.02;\r\n  \/\/ Back plate: the strap plane of the head, open where the photos show light.\r\n  const base=round(start,-W\/2,L,W,.12);\r\n  for(const [a,b] of LAY.slits)base.holes.push(round(X(a)-.02,-winW\/2,b-a+.04,winW,Math.min(.03,(b-a+.04)*.45),new T.Path()));\r\n  for(const [a,b,wa] of LAY.plates||[])base.holes.push(round(X(wa)+.02,-winW\/2,b-wa-.04,winW,.035,new T.Path()));\r\n  hp(base,.18,kind+'-back-plate-with-through-slots',-.09,.02);\r\n  \/\/ Side rails: full length, rounded top edges.\r\n  for(const sign of [-1,1])hp(round(start,sign>0?W\/2-rail:-W\/2,L,rail,.11),1.0,kind+'-side-rail-'+(sign>0?'r':'l'),-1.08,.04);\r\n  \/\/ Saw-tooth retainers on both flanks (slanted face toward the neck side).\r\n  for(const [a,b] of LAY.serr)for(const sign of [-1,1]){\r\n   const pts=[],p=LAY.pitch,n=Math.max(1,Math.floor((b-a)\/p)),y0=sign*(W\/2-.03),y1=sign*(W\/2+LAY.prot);\r\n   pts.push([X(a),y0]);\r\n   for(let i=0;i<n;i++){const x0=X(a)+i*p;pts.push([x0,sign*(W\/2)],[x0+p*.80,y1],[x0+p*.92,y1],[x0+p*.94,sign*(W\/2)])}\r\n   pts.push([X(a)+n*p,y0]);\r\n   hp(poly(pts),.80,kind+'-saw-retainers-'+sign,-1.04,.012);\r\n  }\r\n  \/\/ PA12 bridges: raised full-width blocks, inset panel line and molded dot.\r\n  for(const [i,[a,b]] of (LAY.blocks||[]).entries()){\r\n   hp(round(X(a)+.04,-W\/2-.03,b-a-.08,W+.06,.06),.34,kind+'-bridge-'+i,-1.12,.04);\r\n   hp(round(X(a)+.11,-W\/2+.14,b-a-.22,W-.28,.04),.004,kind+'-bridge-panel-'+i,-1.170,.006);\r\n   const dot=part(new T.TorusGeometry(.23,.016,8,LOD(64)),headMaterial,kind+'-bridge-dot-'+i,head,X((a+b)\/2)-.06,0,-1.176);dot.scale.z=.6;\r\n  }\r\n  for(const [i,[a,b]] of (LAY.mids||[]).entries()){\r\n   hp(round(X(a)+.02,-inner\/2-.06,b-a-.04,inner+.12,.03),.24,kind+'-centre-cross-member-'+i,-1.00,.02);\r\n   const c=X((a+b)\/2);hp(round(c-.165,-.56,.33,1.12,.16),.02,kind+'-molded-slot-boss-'+i,-1.05,.012);\r\n  }\r\n  for(const [i,[a,b]] of (LAY.pads||[]).entries())hp(round(X(a)+.035,-inner\/2-.04,b-a-.07,inner+.08,.05),.30,kind+'-lower-bridge-'+i,-1.08,.035);\r\n  \/\/ PA66 bay plates: U-shaped, open toward the roller, with the inclined tongue.\r\n  for(const [i,[a,b,wa]] of (LAY.plates||[]).entries()){\r\n   const H=W\/2+.03,h=winW\/2,r=.05,xa=X(a),xb=X(b),xw=X(wa),u=new T.Shape();\r\n   u.moveTo(xa+r,-H);u.lineTo(xb,-H);u.lineTo(xb,-h);u.lineTo(xw+r,-h);u.quadraticCurveTo(xw,-h,xw,-h+r);\r\n   u.lineTo(xw,h-r);u.quadraticCurveTo(xw,h,xw+r,h);u.lineTo(xb,h);u.lineTo(xb,H);u.lineTo(xa+r,H);u.quadraticCurveTo(xa,H,xa,H-r);\r\n   u.lineTo(xa,-H+r);u.quadraticCurveTo(xa,-H,xa+r,-H);u.closePath();\r\n   hp(u,.30,kind+'-bay-plate-'+i,-1.10,.04);\r\n   const len=xb-xw-.06,tw=winW*.68,tongue=hp(round(xw+.03,-tw\/2,len,tw,.04),.24,kind+'-inclined-locking-tongue-'+i,-.98,.02);\r\n   const face=hp(poly([[xw+.10,-winW*.235],[xw+.10,winW*.235],[xb-.07,winW*.255],[xb-.07,-winW*.255]]),.012,kind+'-tongue-face-'+i,-1.018,.008);\r\n   for(const o of [tongue,face]){const q=o.geometry.attributes.position;for(let k=0;k<q.count;k++)q.setZ(k,q.getZ(k)+.16*clamp((q.getX(k)-xw)\/(xb-xw)));q.needsUpdate=true;moldNormals(o.geometry)}\r\n  }\r\n  for(const [i,[a,b]] of (LAY.rollers||[]).entries()){\r\n   const r=Math.min(.21,(b-a)*.48),g=new T.CylinderGeometry(r,r,inner+.08,LOD(48));\r\n   part(g,headMaterial,kind+'-transverse-roller-'+i,head,X((a+b)\/2),0,-.92);\r\n  }\r\n  \/* Relief details made from a drawn height map (no invented text): PA66\r\n     datario 1-12 with arrow, PA12 cavity number \"9\". *\/\r\n  function reliefTexture(draw,size=512){\r\n   const c=document.createElement('canvas');c.width=c.height=size;const g=c.getContext('2d');g.fillStyle='#000';g.fillRect(0,0,size,size);g.fillStyle='#fff';g.strokeStyle='#fff';draw(g,size);\r\n   const t=keep(new T.CanvasTexture(c));t.colorSpace=T.NoColorSpace;t.anisotropy=Math.min(8,renderer.capabilities.getMaxAnisotropy());return t;\r\n  }\r\n  function reliefMaterial(map,bump,alpha){\r\n   const mat=keep(body.clone());mat.bumpMap=map;mat.bumpScale=bump;if(alpha){mat.alphaMap=map;mat.alphaTest=.45}\r\n   nylonShader(mat,2);return mat;\r\n  }\r\n  const faceZ=x=>-specialThickness(x)*.5;\r\n  if(pa66){\r\n   const x=-17.14,R=.78,tex=reliefTexture((g,S)=>{\r\n    const c=S\/2;g.lineWidth=S*.022;g.beginPath();g.arc(c,c,S*.47,0,Math.PI*2);g.stroke();\r\n    g.font='700 '+Math.round(S*.105)+'px Arial,Helvetica,sans-serif';g.textAlign='center';g.textBaseline='middle';\r\n    for(let k=1;k<=12;k++){const a=k*Math.PI\/6;g.save();g.translate(c+Math.sin(a)*S*.36,c-Math.cos(a)*S*.36);g.rotate(a);g.fillText(String(k),0,0);g.restore()}\r\n    g.lineWidth=S*.03;g.beginPath();g.moveTo(c+S*.16,c);g.lineTo(c-S*.10,c);g.stroke();\r\n    g.beginPath();g.moveTo(c-S*.17,c);g.lineTo(c-S*.08,c-S*.06);g.lineTo(c-S*.08,c+S*.06);g.closePath();g.fill();\r\n   });\r\n   tex.center.set(.5,.5);tex.rotation=Math.PI;\r\n   const wheel=new T.CylinderGeometry(R,R,.03,LOD(96));wheel.rotateX(-Math.PI\/2);\r\n   const o=part(wheel,reliefMaterial(tex,1.6),'pa66-date-wheel',model,x,0,faceZ(x)-.012);follower(o,x,0,faceZ(x)-.012);\r\n  }else{\r\n   \/\/ Y-shaped neck ridges continuing the side rails into the strap centre line.\r\n   const conv=single?.36:.10,x1=end+(single?.90:1.0);\r\n   for(const sign of [-1,1]){\r\n    const a=[end-.02,sign*(W\/2-rail*.55)],b=[x1,sign*conv],dx=b[0]-a[0],dy=b[1]-a[1],l=Math.hypot(dx,dy),nx=-dy\/l*.035,ny=dx\/l*.035;\r\n    const ridge=poly([[a[0]-nx,a[1]-ny],[b[0]-nx,b[1]-ny],[b[0]+nx,b[1]+ny],[a[0]+nx,a[1]+ny]]);\r\n    const x=(a[0]+b[0])\/2,rg=extrude(ridge,.02,.008);rg.translate(-x,0,0);const o=part(rg,body,'pa12-neck-ridge-'+sign,model,x,0,faceZ(x)-.03);follower(o,x,0,faceZ(x)-.03);\r\n   }\r\n   const x=end+.43,tex=reliefTexture((g,S)=>{g.font='600 '+Math.round(S*.86)+'px Arial,Helvetica,sans-serif';g.textAlign='center';g.textBaseline='middle';g.fillText('9',S\/2,S*.54)},256);\r\n   const dg=new T.PlaneGeometry(.46,.46);dg.rotateX(Math.PI);dg.rotateZ(-Math.PI\/2);\r\n   const o=part(dg,reliefMaterial(tex,1.2,true),'pa12-cavity-number',model,x,0,faceZ(x)-.006);follower(o,x,0,faceZ(x)-.006);\r\n  }\r\n }\r\n \/\/ Gripping patterns belong to the end shape: PA12 double is diagonal;\r\n \/\/ the narrow natural tips have only shallow molding ribs, the releasable none.\r\n {\r\n  const n=kind==='releasable'?0:m.flat?10:7;\r\n  const from=kind==='pa66'?18.0:kind==='pa12'?(selectedHead==='double'?15.8:18.0):17.2;\r\n  const to=m.flat?20.26:19.9;\r\n  for(let i=0;i<n;i++){\r\n   const x=lerp(from,to,i\/(n-1)),w=specialWidth(x)*1.50,z=(m.flat?-.5:.5)*specialThickness(x);\r\n   const rib=extrude(rect(m.flat?.040:.023,w,.008),m.flat?.013:.004,.002);\r\n   if(kind==='pa12'&&selectedHead==='double')rib.rotateZ(-.43);\r\n   if(m.flat)rib.translate(0,0,-.013);\r\n   const o=part(rib,tipMaterial,kind+'-tip-grip-'+i,model,x,0,z+bend(x));follower(o,x,0,z);\r\n  }\r\n }\r\n if(kind==='pa12'){const x=selectedHead==='single'?17.20:15.50,z=-specialThickness(x)*.5;const o=part(new T.TorusGeometry(.125,.008,8,48),body,'pa12-tip-molding-ring',model,x,0,z+bend(x));follower(o,x,0,z)}\r\n makeCables();deform();model.updateMatrixWorld(true);\r\n const bounds=new T.Box3();model.children.forEach(o=>{if(o!==cables)bounds.expandByObject(o)});model.userData.restBounds=bounds;\r\n modelResources=new Set([...resources].filter(r=>!ownedBefore.has(r)));\r\n}\r\n\r\n\/* GEOMETRIA. Unita' relative alla larghezza del nastro.\r\n   Le dimensioni non quotate nelle foto sono parametri ricostruttivi. *\/\r\nfunction round(x,y,a,b,r,p=new T.Shape()){\r\n  p.moveTo(x+r,y);p.lineTo(x+a-r,y);p.quadraticCurveTo(x+a,y,x+a,y+r);\r\n  p.lineTo(x+a,y+b-r);p.quadraticCurveTo(x+a,y+b,x+a-r,y+b);\r\n  p.lineTo(x+r,y+b);p.quadraticCurveTo(x,y+b,x,y+b-r);\r\n  p.lineTo(x,y+r);p.quadraticCurveTo(x,y,x+r,y);p.closePath();return p;\r\n}\r\n\/\/ Angle-weighted shared normals smooth mold fillets while preserving planar faces.\r\nfunction smoothHead(g){\r\n \/\/ Preserve planar cap normals. Welding caps into bevel normals produces\r\n \/\/ diagonal highlights across the triangulation of an otherwise flat face.\r\n const pos=g.attributes.position,idx=g.index,keys=[],sums=new Map(),caps=new Map();\r\n const capVertex=new Uint8Array(pos.count),capNormals=new Float32Array(pos.count*3);\r\n for(let i=0;i<pos.count;i++){\r\n  const k=[pos.getX(i),pos.getY(i),pos.getZ(i)].map(x=>Math.round(x*1e6)).join(',');\r\n  keys.push(k);if(!sums.has(k))sums.set(k,new T.Vector3());\r\n }\r\n const groups=g.groups||[],ab=new T.Vector3(),ac=new T.Vector3(),n=new T.Vector3();\r\n for(let i=0;i<(idx?idx.count:pos.count);i+=3){\r\n  const ids=[0,1,2].map(j=>idx?idx.getX(i+j):i+j);\r\n  const v=ids.map(j=>new T.Vector3().fromBufferAttribute(pos,j));\r\n  n.subVectors(v[1],v[0]).cross(ac.subVectors(v[2],v[0])).normalize();\r\n  const cap=groups.some(group=>group.materialIndex===0&&i>=group.start&&i<group.start+group.count);\r\n  for(let j=0;j<3;j++){\r\n   const id=ids[j],key=keys[id];\r\n   if(cap){capVertex[id]=1;capNormals.set([n.x,n.y,n.z],id*3);caps.set(key,n.clone());continue}\r\n   ab.subVectors(v[(j+1)%3],v[j]).normalize();ac.subVectors(v[(j+2)%3],v[j]).normalize();\r\n   sums.get(key).addScaledVector(n,Math.acos(Math.max(-1,Math.min(1,ab.dot(ac)))));\r\n  }\r\n }\r\n const out=new Float32Array(pos.count*3);\r\n keys.forEach((key,i)=>{\r\n  if(capVertex[i]){out.set(capNormals.subarray(i*3,i*3+3),i*3);return}\r\n  const normal=caps.get(key)||sums.get(key).clone().normalize();\r\n  out.set([normal.x,normal.y,normal.z],i*3);\r\n });\r\n g.setAttribute('normal',new T.BufferAttribute(out,3));return g;\r\n}\r\nfunction extrude(shape,depth,bevel=.015){\r\n  return smoothHead(new T.ExtrudeGeometry(shape,{depth,steps:1,curveSegments:LOD(64),\r\n    bevelEnabled:bevel>0,bevelSize:bevel,bevelThickness:bevel,bevelSegments:LOD(8)}));\r\n}\r\nfunction mesh(g,m,x=0,y=0,z=0){const o=new T.Mesh(keep(g),m);o.position.set(x,y,z);model.add(o);return o}\r\n\/* Quote longitudinali, riferite a una fascetta di 25 cm: il nastro va da\r\n   STRAP_X0 a TAIL_END_X, l'inclinazione della coda inizia a 22 cm e la\r\n   superficie ruvida a 23 cm. Bordi rialzati, rastremazione e cremagliera\r\n   finiscono tutti dove inizia l'inclinazione. *\/\r\nconst STRAP_X0=-19.54,TAIL_END_X=20.999,STRAP_SPAN=TAIL_END_X-STRAP_X0;\r\nconst BEND_X=STRAP_X0+STRAP_SPAN*22\/25,SAND_X=STRAP_X0+STRAP_SPAN*23\/25;\r\n\/* Raccordo sotto la testa: nessun angolo vivo. La semilarghezza lascia il\r\n   fianco della testa e rientra sul nastro con un arco tangente, cosi' il\r\n   passaggio e' un raccordo e non uno scalino. *\/\r\nconst NECK={x0:STRAP_X0,x1:-18.62,w:.80};\r\nNECK.r=((NECK.w-.5)**2+(NECK.x1-NECK.x0)**2)\/(2*(NECK.w-.5));\r\nfunction widthAt(x){return selectedType==='cabling'?baseWidthAt(x):specialWidth(x)}\r\nfunction baseWidthAt(x){\r\n  if(x<NECK.x1){\r\n    const d=Math.min(NECK.r,NECK.x1-x);\r\n    return .5+NECK.r-Math.sqrt(Math.max(0,NECK.r*NECK.r-d*d));\r\n  }\r\n  if(x<=BEND_X)return .5;\r\n  if(x<20.68)return lerp(.5,.32,(x-BEND_X)\/(20.68-BEND_X));\r\n  return Math.sqrt(Math.max(.000009,.32*.32-(x-20.68)**2));\r\n}\r\nfunction thicknessAt(x){return lerp(1,.52,smooth((x-BEND_X)\/4.9))}\r\n\/* Coda inclinata: l'ultimo tratto piega di 18 gradi e ci resta (non torna\r\n   dritto), cosi' la punta si presenta da sola al foro della testa. L'angolo\r\n   sale con uno smoothstep, quindi bend e' il suo integrale. *\/\r\nconst TIP={x:BEND_X,w:1.3,k:.325};\r\nfunction bend(x){\r\n  const u=clamp((x-TIP.x)\/TIP.w);\r\n  return TIP.k*(TIP.w*(u*u*u-u*u*u*u*.5)+Math.max(0,x-TIP.x-TIP.w));\r\n}\r\nfunction slope(x){return (bend(x+.002)-bend(x-.002))\/.004}\r\nfunction noise(size,seed,fill){\r\n  const a=new Uint8Array(size*size*4),v=new Float32Array(size*size);\r\n  let s=seed>>>0;const rnd=()=>{s=(Math.imul(s,1664525)+1013904223)>>>0;return s\/4294967296};\r\n  fill(v,rnd,size);\r\n  for(let i=0;i<v.length;i++){\r\n    const n=Math.max(0,Math.min(255,Math.round(v[i]*255)));\r\n    a[i*4]=a[i*4+1]=a[i*4+2]=n;a[i*4+3]=255;\r\n  }\r\n  const t=keep(new T.DataTexture(a,size,size,T.RGBAFormat));\r\n  t.wrapS=t.wrapT=T.RepeatWrapping;t.generateMipmaps=true;\r\n  t.minFilter=T.LinearMipmapLinearFilter;t.magFilter=T.LinearFilter;\r\n  t.anisotropy=Math.min(4,renderer.capabilities.getMaxAnisotropy());\r\n  t.colorSpace=T.NoColorSpace;t.needsUpdate=true;return t;\r\n}\r\n\/* Native 4096\\u00b2 single-channel height maps: 16 MiB per map before mipmaps.\r\n   Generated from a deterministic seed, never enlarged from a small bitmap.\r\n   One mold map is shared by all material roles in the active model. *\/\r\n\/* Generatore puro delle mappe native 4K: nessun riferimento esterno, cosi'\r\n   puo' girare in un Web Worker. Generare 16 milioni di texel sul thread\r\n   principale bloccava il rendering e lo scroll della homepage. *\/\r\nfunction surfaceData(size,grip){\r\n  const data=new Uint8Array(size*size);\r\n  let seed=grip?20260923:9268;\r\n  const random=()=>{seed=(Math.imul(seed,1664525)+1013904223)>>>0;return seed\/4294967296};\r\n  if(!grip){\r\n    for(let y=0;y<size;y++){\r\n      const flow=Math.sin(y*Math.PI*2\/size*12)*1.4;\r\n      for(let x=0;x<size;x++)data[y*size+x]=123+Math.floor(random()*11+flow);\r\n    }\r\n    return data;\r\n  }\r\n  \/* Carta vetrata: granuli finissimi e fitti, ognuno una faccetta piana con\r\n     pendenza e orientamento casuali. *\/\r\n  const scale=size\/4096,count=Math.round(1400000*scale*scale);\r\n  for(let i=0;i<size*size;i++)data[i]=100+Math.floor(random()*24);\r\n  for(let i=0;i<count;i++){\r\n    const cx=random()*size,cy=random()*size,r=Math.max(.8,(1+random()*2.2)*scale),base=110+random()*70;\r\n    const t=random()*Math.PI*2,gx=Math.cos(t)*(20+random()*40)\/Math.max(r,1),gy=Math.sin(t)*(20+random()*40)\/Math.max(r,1);\r\n    for(let y=Math.ceil(cy-r);y<=cy+r;y++)for(let x=Math.ceil(cx-r);x<=cx+r;x++){\r\n      const dx=x-cx,dy=y-cy;if(dx*dx+dy*dy>r*r)continue;\r\n      const k=((y+size)%size)*size+(x+size)%size;\r\n      data[k]=Math.max(0,Math.min(255,Math.round(base+gx*dx+gy*dy)));\r\n    }\r\n  }\r\n  return data;\r\n}\r\n\/* Le mappe si calcolano una sola volta per sessione, in un worker, e restano\r\n   in cache: il cambio tipologia non le rigenera. Finche' non arrivano il\r\n   materiale usa un texel neutro; poi la mappa 4K viene sostituita al volo. *\/\r\nconst SURF={data:{},pending:{},worker:null,url:''};\r\nfunction surfaceTexture(data,size,grip){\r\n  const map=new T.DataTexture(data,size,size,T.RedFormat,T.UnsignedByteType);\r\n  map.name=grip?'Grip \/ native 4K':'Injection mold \/ native 4K';\r\n  map.wrapS=map.wrapT=T.RepeatWrapping;map.generateMipmaps=size>1;\r\n  map.minFilter=size>1?T.LinearMipmapLinearFilter:T.LinearFilter;map.magFilter=T.LinearFilter;\r\n  map.anisotropy=Math.min(8,renderer.capabilities.getMaxAnisotropy());map.colorSpace=T.NoColorSpace;\r\n  map.userData={resolution:size,source:'procedural-native',role:grip?'grip':'mold'};\r\n  map.needsUpdate=true;return map;\r\n}\r\nfunction surfaceSize(t=tier){const limit=renderer.capabilities.maxTextureSize||4096;return Math.min(t==='lite'?1024:4096,2**Math.floor(Math.log2(limit)))}\r\nfunction surface4K(grip=false){\r\n  const size=surfaceSize(),key=(grip?'grip':'mold')+size,ready=SURF.data[key];\r\n  if(ready)return keep(surfaceTexture(ready.data,ready.size,grip));\r\n  const role=grip?'grip':'mold',low=Object.keys(SURF.data).filter(k=>k.startsWith(role)).map(k=>SURF.data[k]).sort((a,b)=>b.size-a.size)[0];\r\n  const map=keep(low?surfaceTexture(low.data,low.size,grip):surfaceTexture(new Uint8Array([grip?112:128]),1,grip));map.userData.pending=key;\r\n  requestSurface(key,size,grip);return map;\r\n}\r\nfunction applySurface(key){\r\n  if(dead||!SURF.data[key])return;const {data,size}=SURF.data[key];let map=null;\r\n  for(const material of finishes){\r\n    const old=material.bumpMap;if(!old||old.userData.pending!==key)continue;\r\n    if(!map){map=keep(surfaceTexture(data,size,key.startsWith('grip')));modelResources.add(map)}\r\n    material.bumpMap=map;resources.delete(old);modelResources.delete(old);old.dispose();\r\n  }\r\n  kick();\r\n}\r\nfunction requestSurface(key,size,grip){\r\n  if(SURF.pending[key])return;SURF.pending[key]=true;\r\n  const local=()=>{\r\n    \/* Senza worker (CSP restrittiva): 2K generata a pagina ferma. *\/\r\n    const idle=window.requestIdleCallback||(f=>setTimeout(f,300)),s=Math.min(size,2048);\r\n    idle(()=>{if(dead)return;SURF.data[key]={data:surfaceData(s,grip),size:s};applySurface(key)},{timeout:4000});\r\n  };\r\n  try{\r\n    if(!SURF.worker){\r\n      const src='const surfaceData='+surfaceData.toString()+';onmessage=e=>{const d=surfaceData(e.data.size,e.data.grip);postMessage({key:e.data.key,size:e.data.size,data:d},[d.buffer])};';\r\n      SURF.url=URL.createObjectURL(new Blob([src],{type:'text\/javascript'}));SURF.worker=new Worker(SURF.url);\r\n      SURF.worker.onmessage=e=>{SURF.data[e.data.key]={data:e.data.data,size:e.data.size};applySurface(e.data.key)};\r\n      SURF.worker.onerror=e=>{e.preventDefault?.();SURF.worker?.terminate();SURF.worker=null;for(const k in SURF.pending)if(!SURF.data[k]){SURF.pending[k]=false;const g=k.startsWith('grip');SURF.pending[k]=true;const s=parseInt(k.replace(\/\\D\/g,''),10)||size;(()=>{const idle=window.requestIdleCallback||(f=>setTimeout(f,300)),t=Math.min(s,2048);idle(()=>{if(dead)return;SURF.data[k]={data:surfaceData(t,g),size:t};applySurface(k)},{timeout:4000})})()}};\r\n    }\r\n    SURF.worker.postMessage({key,size,grip});\r\n  }catch{local()}\r\n}\r\nfunction grain(){return surface4K(false)}\r\nfunction sandpaper(){return surface4K(true)}\r\n\/* Pigmento oro satinato: grana in coordinate del materiale, solidale al\r\n   nastro durante la deformazione. Il filtro per pixel evita scintillii lontani. *\/\r\n\/* Carta vetrata: granuli finissimi calcolati per pixel in coordinate del\r\n   materiale (solidali al nastro anche quando si piega). Ogni granulo e' una\r\n   faccetta con inclinazione propria; circa uno su tre e' piu' liscio e\r\n   accende una scintilla, come i pigmenti di una vernice metallizzata. Il\r\n   colore non cambia: variano solo normale e ruvidita'. Il filtro sulla\r\n   dimensione del pixel spegne i granuli quando sono piu' piccoli di un\r\n   pixel, cosi' da lontano resta una superficie opaca e non uno sfarfallio. *\/\r\n\/* Il nome del chunk e' spezzato: la sequenza letterale verrebbe letta come\r\n   un tag meta dalla pipeline di WordPress. *\/\r\nconst SAND_METAL='#include <'+'metalnessmap_fragment>';\r\nfunction sandFlake(material){\r\n  const inner=material.onBeforeCompile;\r\n  material.onBeforeCompile=shader=>{\r\n    inner(shader);\r\n    shader.fragmentShader=`\r\n      float sandHash(vec3 p){p=fract(p*.1031);p+=dot(p,p.zyx+31.32);return fract((p.x+p.y)*p.z);}\r\n      vec3 sandHash3(vec3 p){return vec3(sandHash(p),sandHash(p+17.13),sandHash(p+41.71));}\r\n      `+shader.fragmentShader;\r\n    shader.fragmentShader=shader.fragmentShader.replace('#include <roughnessmap_fragment>',`\r\n      #include <roughnessmap_fragment>\r\n      vec3 sandUV=vFinishPosition*120.0;\r\n      vec3 sandCell=floor(sandUV);\r\n      vec3 sandRnd=sandHash3(sandCell);\r\n      float sandFilter=1.0-smoothstep(.85,1.9,max(length(dFdx(sandUV)),length(dFdy(sandUV))));\r\n      roughnessFactor=clamp(roughnessFactor+(sandRnd.z-.5)*.12*sandFilter,.6,1.0);\r\n    `).replace('#include <normal_fragment_maps>',`\r\n      #include <normal_fragment_maps>\r\n      {\r\n        vec3 tilt=(sandRnd*2.0-1.0);\r\n        vec3 dp1=dFdx(-vViewPosition),dp2=dFdy(-vViewPosition);\r\n        vec3 t1=normalize(dp1-normal*dot(dp1,normal)),t2=normalize(cross(normal,t1));\r\n        normal=normalize(normal+(t1*tilt.x+t2*tilt.y)*.24*sandFilter);\r\n      }\r\n    `);\r\n  };\r\n  material.customProgramCacheKey=()=> 'cobra-frost-matte-sand-v3';\r\n}\r\n\/* Gold metallic powder, baked once: a 256x256 RGBA8 tile (256 KB on the GPU,\r\n   mipmapped, anisotropic) instead of per-pixel noise. R tone, G height,\r\n   B metallic flake mask, A flake orientation. Sampled triplanar at two\r\n   non-integer scales (6 fetches) so the tile never repeats visibly; the mip\r\n   chain filters grain and glitter at distance, so there is no shimmer. *\/\r\nlet goldTexture=null;\r\nfunction goldTile(){\r\n if(goldTexture)return goldTexture;\r\n const N=256,d=new Uint8Array(N*N*4);let seed=1337;const rnd=()=>(seed=(seed*16807)%2147483647)\/2147483647;\r\n const lat=(P)=>{const a=new Float32Array(P*P);for(let i=0;i<a.length;i++)a[i]=rnd();return a};\r\n const vn=(a,P,x,y)=>{const X=Math.floor(x),Y=Math.floor(y),fx=x-X,fy=y-Y,u=fx*fx*(3-2*fx),v=fy*fy*(3-2*fy);\r\n  const i0=((X%P)+P)%P,j0=((Y%P)+P)%P,i1=(i0+1)%P,j1=(j0+1)%P;\r\n  return (a[j0*P+i0]*(1-u)+a[j0*P+i1]*u)*(1-v)+(a[j1*P+i0]*(1-u)+a[j1*P+i1]*u)*v};\r\n const A=lat(96),B=lat(160),C=lat(24),F=lat(128),O=lat(128);\r\n for(let y=0;y<N;y++)for(let x=0;x<N;x++){\r\n  const n1=vn(A,96,x*96\/N,y*96\/N),n2=vn(B,160,x*160\/N,y*160\/N),n3=vn(C,24,x*24\/N,y*24\/N);\r\n  const m1=Math.max(0,(n1-.30)\/.70),m2=Math.max(0,(n2-.35)\/.65),h=m1*m1*.65+m2*m2*.35;\r\n  const tone=.5+(h-.22)*.9+(n3-.5)*.10;\r\n  const cx=Math.floor(x*128\/N),cy=Math.floor(y*128\/N),fr=F[cy*128+cx];\r\n  const lx=x*128\/N-cx-.5,ly=y*128\/N-cy-.5,flake=fr>.80?Math.max(0,1-Math.hypot(lx,ly)\/.46):0;\r\n  const k=(y*N+x)*4;d[k]=Math.round(Math.min(1,Math.max(0,tone))*255);d[k+1]=Math.round(Math.min(1,h)*255);\r\n  d[k+2]=Math.round(Math.min(1,flake*1.25)*255);d[k+3]=Math.round(O[cy*128+cx]*255);\r\n }\r\n const t=new T.DataTexture(d,N,N,T.RGBAFormat,T.UnsignedByteType);\r\n t.wrapS=t.wrapT=T.RepeatWrapping;t.magFilter=T.LinearFilter;t.minFilter=T.LinearMipmapLinearFilter;t.generateMipmaps=true;\r\n t.anisotropy=Math.min(8,renderer?.capabilities.getMaxAnisotropy?.()||1);t.colorSpace=T.NoColorSpace;t.needsUpdate=true;\r\n goldTexture=keep(t);return t;\r\n}\r\nfunction goldShader(material){\r\n  const nylonCompile=material.onBeforeCompile;\r\n  material.onBeforeCompile=shader=>{\r\n    nylonCompile(shader);shader.uniforms.goldAmount=goldFinish.amount;shader.uniforms.goldTex={value:goldTile()};\r\n    shader.vertexShader='attribute vec3 finishPosition;\\nvarying vec3 vFinishPosition;\\n'+shader.vertexShader;\r\n    shader.vertexShader=shader.vertexShader.replace('#include <begin_vertex>',\r\n      '#include <begin_vertex>\\nvFinishPosition=finishPosition;');\r\n    shader.fragmentShader=`uniform float goldAmount;uniform sampler2D goldTex;\r\n      varying vec3 vFinishPosition;\r\n      vec4 goldTri(vec3 p,vec3 w,float k,vec2 o){\r\n        return texture(goldTex,p.yz*k+o)*w.x+texture(goldTex,p.zx*k+o.yx)*w.y+texture(goldTex,p.xy*k-o)*w.z;\r\n      }\r\n      `+shader.fragmentShader;\r\n    shader.fragmentShader=shader.fragmentShader.replace('#include <color_fragment>',`\r\n      #include <color_fragment>\r\n      vec4 goldS=vec4(.5,0.0,0.0,.5);float goldH=0.0;\r\n      if(goldAmount>.001){\r\n        vec3 fn=abs(normalize(cross(dFdx(vFinishPosition),dFdy(vFinishPosition))));\r\n        vec3 w=pow(fn,vec3(6.0));w\/=max(w.x+w.y+w.z,1e-4);\r\n        vec4 s1=goldTri(vFinishPosition,w,GK1,vec2(.13,.71)),s2=goldTri(vFinishPosition,w,GK2,vec2(.47,.29));\r\n        goldS=vec4(mix(s1.r,s2.r,.45),0.0,max(s1.b,s2.b*.8),mix(s1.a,s2.a,step(s1.b,s2.b)));\r\n        goldH=s1.g*.6+s2.g*.4;\r\n      }\r\n      diffuseColor.rgb*=mix(1.0,mix(1.0-GTONE,1.0+GTONE,goldS.r)+goldS.b*GFLAKEC,goldAmount);\r\n    `).replace('#include <roughnessmap_fragment>',`\r\n      #include <roughnessmap_fragment>\r\n      roughnessFactor=clamp(mix(roughnessFactor+goldAmount*(goldS.r-.5)*.08,GFLAKER,goldS.b*goldAmount),.08,1.0);\r\n    `).replace('#include <normal_fragment_maps>',`\r\n      #include <normal_fragment_maps>\r\n      if(goldAmount>.001){\r\n        vec3 dp1=dFdx(-vViewPosition),dp2=dFdy(-vViewPosition);\r\n        vec3 r1=cross(dp2,normal),r2=cross(normal,dp1);float det=dot(dp1,r1);\r\n        vec3 grad=sign(det)*(dFdx(goldH)*r1+dFdy(goldH)*r2);\r\n        normal=normalize(abs(det)*normal-goldAmount*GRELIEF*grad+normal*1e-12);\r\n        \/\/ each metallic flake is a tiny tilted mirror: glitter that follows the view\r\n        float an=goldS.a*6.2832;vec3 t1=normalize(dp1-normal*dot(dp1,normal)),t2=cross(normal,t1);\r\n        normal=normalize(normal+(t1*cos(an)+t2*sin(an))*GTILT*goldS.b*goldAmount);\r\n      }\r\n    `);\r\n    shader.fragmentShader=shader.fragmentShader.replace(\/GK1\/g,'0.45').replace(\/GK2\/g,'1.63')\r\n      .replace(\/GTONE\/g,'0.09').replace(\/GFLAKEC\/g,'0.32').replace(\/GFLAKER\/g,'0.10')\r\n      .replace(\/GRELIEF\/g,'0.0009').replace(\/GTILT\/g,'0.16');\r\n  };\r\n  material.customProgramCacheKey=()=> 'cobra-gold-baked-v1';\r\n}\r\nfunction makeModel(){\r\n  if(selectedType!=='cabling'){makeSpecialModel();return}\r\n  const ownedBefore=new Set(resources);\r\n  model=new T.Group();scene.add(model);\r\n  const bump=grain(),grit=sandpaper();\r\n  const body=keep(new T.MeshPhysicalMaterial({color:PALETTE.find(c=>c.id===selectedColor).hex,\r\n    metalness:0,roughness:FINISH[0][0],bumpMap:bump,bumpScale:.008,envMapIntensity:1,\r\n    clearcoat:FINISH[0][1],clearcoatRoughness:FINISH[0][2],specularIntensity:1,\r\n    sheen:FINISH[0][3],sheenColor:new T.Color(0xdee6f2),sheenRoughness:.55}));\r\n  const gripMaterial=keep(body.clone());gripMaterial.bumpMap=grit;gripMaterial.bumpScale=.022;\r\n  \/* Carta vetrata 4K: stesso colore del nastro, solo opaca. I granuli\r\n     finissimi, ciascuno con la propria inclinazione, accendono micro\r\n     riflessi puntiformi come una vernice metallizzata. *\/\r\n  const headMaterial=keep(body.clone());headMaterial.bumpMap=null;headMaterial.bumpScale=0;\r\n  const cavityMaterial=keep(headMaterial.clone());cavityMaterial.vertexColors=true;\r\n  finishes.push(body,gripMaterial,headMaterial,cavityMaterial);\r\n  nylonGlass.screen.value=new T.Vector2(1,1);nylonGlass.texel.value=new T.Vector2(1,1);\r\n  finishes.forEach((m,i)=>{nylonShader(m,i);goldShader(m)});sandFlake(gripMaterial);tune();\r\n  \/* Sezione continua: i bordi pieni fanno parte del nastro.\r\n     Il fondo centrale e i denti rimangono incassati fra i bordi. *\/\r\n  const profile=[\r\n    [-1,-.080],[-.994,-.100],[-.972,-.116],[-.94,-.122],\r\n    [.94,-.122],[.972,-.116],[.994,-.100],[1,-.080],\r\n    [1,.105],[.994,.125],[.975,.143],[.94,.150],[.85,.150],\r\n    [.825,.145],[.805,.130],[.80,.103],[.78,.075],[.76,.066],\r\n    [-.76,.066],[-.78,.075],[-.80,.103],[-.805,.130],[-.825,.145],\r\n    [-.85,.150],[-.94,.150],[-.975,.143],[-.994,.125],[-1,.105]\r\n  ];\r\n  const xs=[];\r\n  for(let x=STRAP_X0;x<NECK.x1;x+=.055)xs.push(x);\r\n  for(let x=NECK.x1;x<BEND_X-.2;x+=.28)xs.push(x);\r\n  for(let x=BEND_X-.2;x<20.68;x+=.07)xs.push(x);\r\n  for(let x=20.68;x<20.999;x+=.012)xs.push(x);\r\n  xs.push(20.999);\r\n  if(family().plate){const [a,b]=family().plate;for(const edge of [a,b])for(let d=-.14;d<=.14;d+=.014)xs.push(edge+d);xs.sort((a,b)=>a-b)}\r\n  const positions=[],uv=[],index=[],axial=[],N=profile.length,g=new T.BufferGeometry();\r\n  for(const x of xs){\r\n    const rails=plateWidth(x)>0||family().flat?0:smooth((x-STRAP_X0-.99)\/.28)*(1-smooth((x-BEND_X+.13)\/.4));\r\n    const a=Math.atan(slope(x)),c=Math.cos(a),s=Math.sin(a);\r\n    profile.forEach(([y,z],j)=>{\r\n      let flat=z;if(j>=8)flat=Math.abs(y)>.99?.092:Math.abs(y)>.97?.112:.116;\r\n      const zz=lerp(flat,z,rails)*thicknessAt(x);\r\n      positions.push(x-zz*s,y*widthAt(x),bend(x)+zz*c);axial.push(x);uv.push(x*1.8,j\/N*2.2);\r\n    });\r\n  }\r\n  for(let i=0;i<xs.length-1;i++){\r\n    for(let j=0;j<N;j++){\r\n      const a=i*N+j,b=(i+1)*N+j,c=i*N+(j+1)%N,d=(i+1)*N+(j+1)%N;\r\n      index.push(a,c,b,b,c,d);\r\n    }\r\n  }\r\n  \/\/ Tappi reali alle estremita', con normali indipendenti dalle pareti.\r\n  for(const side of [0,1]){\r\n    const row=side?xs.length-1:0,x=xs[row],base=positions.length\/3;\r\n    positions.push(x,0,bend(x));axial.push(x);uv.push(x*1.8,0);\r\n    for(let j=0;j<N;j++){\r\n      const k=(row*N+j)*3;positions.push(...positions.slice(k,k+3));axial.push(x);uv.push(x*1.8,j\/N*2.2);\r\n    }\r\n    for(let j=0;j<N;j++){\r\n      const a=base+1+j,b=base+1+(j+1)%N;index.push(base,side?a:b,side?b:a);\r\n    }\r\n  }\r\n  g.setAttribute('position',new T.Float32BufferAttribute(positions,3));\r\n  g.setAttribute('uv',new T.Float32BufferAttribute(uv,2));g.setIndex(index);g.computeVertexNormals();\r\n  const strap=mesh(g,body);strap.name='tie-strap';bendable(strap,axial);\r\n  function wedge(length,height,width){\r\n    const s=new T.Shape();s.moveTo(0,0);s.lineTo(length,0);s.lineTo(length,height*.78);\r\n    s.lineTo(length*.78,height);s.lineTo(length*.07,height*.06);s.closePath();\r\n    const geo=extrude(s,width,.002);geo.rotateX(Math.PI\/2);geo.translate(0,width\/2,0);return geo;\r\n  }\r\n  \/* Dentatura interna: 128 denti nel canale incassato, uguali a prima.\r\n     Restano gli unici elementi ripetuti: la zigrinatura sul retro della coda\r\n     e il dentino di preaggancio sono stati rimossi. *\/\r\n  const rackStart=Math.max(-16.8,family().plate?family().plate[1]+.20:-16.8);\r\n  const teeth=Math.floor((BEND_X-rackStart)\/.249)+1;\r\n  const rackGeometry=wedge(.187,.067,.744*family().width);if(family().flat)rackGeometry.rotateX(Math.PI);\r\n  rack={x0:rackStart,dx:.249,z:family().flat?-.122:.066,count:teeth,\r\n    mesh:new T.InstancedMesh(keep(rackGeometry),body,teeth)};\r\n  rack.mesh.frustumCulled=false;rack.mesh.instanceMatrix.setUsage(T.DynamicDrawUsage);model.add(rack.mesh);\r\n  \/* Zona di presa in punta: lamina sottile appoggiata sulla faccia anteriore,\r\n     con la grana della carta abrasiva. Segue la rastremazione e la piega. *\/\r\n  \/* La zona di presa ha la sagoma della punta: i lati seguono la rastremazione\r\n     e l'ultimo tratto segue il raggio dell'estremita', quindi niente angoli\r\n     squadrati. Verso la punta i campioni si infittiscono. *\/\r\n  const cols=[],rows=4,gp=[],gn=[],gu=[],gi=[];\r\n  \/* La mescola sabbiosa parte dalla quota dei 23 cm e arriva in punta,\r\n     seguendo la rastremazione. *\/\r\n  const sandStart=SAND_X;\r\n  const sandEnd=20.985;\r\n  const sandMid=sandEnd-.44;\r\n  for(let x=sandStart;x<sandMid;x+=.135)cols.push(x);\r\n  for(let x=sandMid;x<sandEnd;x+=.035)cols.push(x);\r\n  cols.push(sandEnd);\r\n  for(const x of cols){\r\n    const a=Math.atan(slope(x)),c=Math.cos(a),s=Math.sin(a);\r\n    const zz=(.116+.004)*thicknessAt(x);\r\n    for(let j=0;j<=rows;j++){\r\n      const y=(j\/rows*2-1)*.88*widthAt(x);\r\n      gp.push(x-zz*s,y,bend(x)+zz*c);gn.push(-s,0,c);gu.push(x*.16,y*.16);\r\n    }\r\n  }\r\n  for(let i=0;i<cols.length-1;i++)for(let j=0;j<rows;j++){\r\n    const a=i*(rows+1)+j,b=a+rows+1;gi.push(a,b,a+1,a+1,b,b+1);\r\n  }\r\n  const gg=new T.BufferGeometry();\r\n  gg.setAttribute('position',new T.Float32BufferAttribute(gp,3));\r\n  gg.setAttribute('normal',new T.Float32BufferAttribute(gn,3));\r\n  gg.setAttribute('uv',new T.Float32BufferAttribute(gu,2));gg.setIndex(gi);\r\n  const grip=mesh(gg,gripMaterial);grip.name='sandy-tail';bendable(grip,cols.flatMap(x=>Array(rows+1).fill(x)));\r\n  \/* Testa disegnata nelle coordinate delle foto: u orizzontale, v verticale.\r\n     I tratti alto\/basso sono linee; soltanto i lati destro\/sinistro sono bombati.\r\n     Il gruppo ruota poi di 90 gradi per raccordarsi al nastro disposto lungo X. *\/\r\n  const headGroup=new T.Group();headGroup.name='head-assembly';\r\n  headGroup.position.x=-20.14;headGroup.rotation.z=Math.PI\/2;model.add(headGroup);\r\n  function headPart(geometry,material,name,x=0,y=0,z=0){\r\n    const part=new T.Mesh(keep(geometry),material);part.name=name;\r\n    part.position.set(x,y,z);headGroup.add(part);return part;\r\n  }\r\n  function cavityShade(geometry,lower=.48,upper=.95){\r\n    const position=geometry.attributes.position,color=new Float32Array(position.count*3);\r\n    geometry.computeBoundingBox();const box=geometry.boundingBox;\r\n    for(let i=0;i<position.count;i++){\r\n      const t=smooth((position.getY(i)-box.min.y)\/Math.max(.0001,box.max.y-box.min.y));\r\n      const shade=lerp(lower,upper,t);color[i*3]=color[i*3+1]=color[i*3+2]=shade;\r\n    }\r\n    geometry.setAttribute('color',new T.BufferAttribute(color,3));return geometry;\r\n  }\r\n  const head=new T.Shape();head.moveTo(-.63,.80);head.lineTo(.63,.80);\r\n  head.quadraticCurveTo(.765,.80,.785,.68);\r\n  head.bezierCurveTo(.823,.52,.857,.23,.857,0);\r\n  head.bezierCurveTo(.857,-.23,.823,-.52,.785,-.68);\r\n  head.quadraticCurveTo(.766,-.80,.60,-.80);head.lineTo(-.60,-.80);\r\n  head.quadraticCurveTo(-.766,-.80,-.785,-.68);\r\n  head.bezierCurveTo(-.823,-.52,-.857,-.23,-.857,0);\r\n  head.bezierCurveTo(-.857,.23,-.823,.52,-.785,.68);\r\n  head.quadraticCurveTo(-.765,.80,-.63,.80);head.closePath();\r\n\r\n  \/* Finestra passante a gradini: le spallette non sono disegnate su una texture. *\/\r\n  const opening=new T.Path();opening.moveTo(-.49,.34);\r\n  opening.quadraticCurveTo(-.57,.34,-.57,.25);opening.lineTo(-.57,-.065);\r\n  opening.quadraticCurveTo(-.57,-.105,-.52,-.105);opening.lineTo(-.445,-.105);\r\n  opening.quadraticCurveTo(-.425,-.105,-.425,-.135);opening.lineTo(-.425,-.48);\r\n  opening.quadraticCurveTo(-.425,-.55,-.35,-.55);opening.lineTo(.35,-.55);\r\n  opening.quadraticCurveTo(.425,-.55,.425,-.48);opening.lineTo(.425,-.135);\r\n  opening.quadraticCurveTo(.425,-.105,.445,-.105);opening.lineTo(.52,-.105);\r\n  opening.quadraticCurveTo(.57,-.105,.57,-.065);opening.lineTo(.57,.25);\r\n  opening.quadraticCurveTo(.57,.34,.49,.34);opening.closePath();\r\n  head.holes.push(opening);\r\n\r\n  \/* La scocca e' liscia sulle due facce: nessuna incassatura rettangolare,\r\n     ne' davanti ne' dietro. *\/\r\n  headPart(smoothHead(new T.ExtrudeGeometry(head,{depth:.94,steps:1,curveSegments:LOD(128),bevelEnabled:true,bevelSize:.027,bevelThickness:.027,bevelSegments:LOD(16)})),headMaterial,'head-case',0,0,-.75);\r\n\r\n  \/* Linguetta di bloccaggio: UN SOLO CORPO, colore unico, nessuno scalino.\r\n     Il profilo si disegna di fianco (orizzontale = profondita' della testa,\r\n     verticale = altezza) e si estrude in larghezza:\r\n       - davanti la faccia verticale piena, il lato rettangolare, dal lato\r\n         della cremagliera: e' il lato PIU' BASSO;\r\n       - dietro un piatto verticale sottile, PIU' ALTO, e sotto lo smusso a 45\r\n         gradi esatti, cioe' la parte tagliata del trapezio;\r\n       - sopra l'inclinazione parte dal retro, dal punto alto, e finisce\r\n         davanti; sotto il piano corto.\r\n     Tutti gli spigoli sono raggiati leggermente, come su un pezzo stampato:\r\n     il raccordo e' nel profilo e il bevel dell'estrusione arrotonda i bordi\r\n     in larghezza. *\/\r\n  function roundPoly(points,radius){\r\n    const n=points.length,shape=new T.Shape();\r\n    const trim=(c,t)=>{\r\n      const dx=t[0]-c[0],dy=t[1]-c[1],d=Math.hypot(dx,dy)||1,k=Math.min(.49,radius\/d);\r\n      return [c[0]+dx*k,c[1]+dy*k];\r\n    };\r\n    const first=trim(points[0],points[1]);\r\n    shape.moveTo(first[0],first[1]);\r\n    for(let i=1;i<n;i++){\r\n      const c=points[i],a=trim(c,points[i-1]),b=trim(c,points[(i+1)%n]);\r\n      shape.lineTo(a[0],a[1]);shape.quadraticCurveTo(c[0],c[1],b[0],b[1]);\r\n    }\r\n    const c=points[0],a=trim(c,points[n-1]);\r\n    shape.lineTo(a[0],a[1]);shape.quadraticCurveTo(c[0],c[1],first[0],first[1]);\r\n    shape.closePath();return shape;\r\n  }\r\n  function pawlProfile(depth,slant,flat,rake,fillet){\r\n    return roundPoly([\r\n      [slant,0],              \/* sotto: piano corto *\/\r\n      [depth,0],\r\n      [depth,slant+flat-rake],\/* davanti: rettangolo pieno, il lato piu' BASSO *\/\r\n      [0,slant+flat],         \/* sopra: l'inclinazione parte da dietro, in alto,\r\n                                 e finisce davanti, in basso *\/\r\n      [0,slant]               \/* dietro: piatto verticale, poi smusso a 45 *\/\r\n    ],fillet);\r\n  }\r\n  const pawlGeometry=extrude(pawlProfile(PAWL.depth,PAWL.slant,PAWL.flat,PAWL.rake,PAWL.fillet),PAWL.width,PAWL.bevel);\r\n  pawlGeometry.rotateY(-Math.PI\/2);pawlGeometry.translate(PAWL.width\/2,0,0);\r\n  \/* Colore unico su tutta la linguetta: nessuna sfumatura fra base e punta. *\/\r\n  headPart(cavityShade(pawlGeometry,.62,.62),cavityMaterial,'locking-pawl',0,PAWL.base,PAWL.z);\r\n  \/* La linguetta lascia liberi il traverso superiore e i due varchi laterali,\r\n     formando l'apertura a U visibile nelle fotografie. *\/\r\n  \/* Tondino stampato sul collarino: sta SOLO sulla faccia posteriore, quella\r\n     liscia senza cremagliera. Davanti il nastro e' pulito. *\/\r\n  follower(mesh(new T.TorusGeometry(.185,.004,4,40),body,-18.78,0,-.122),-18.78,0,-.122);\r\n  makeCables();deform();model.updateMatrixWorld(true);\r\n  const bounds=new T.Box3();\r\n  model.children.forEach(o=>{if(o!==cables)bounds.expandByObject(o)});\r\n  model.userData.restBounds=bounds;\r\n  modelResources=new Set([...resources].filter(r=>!ownedBefore.has(r)));\r\n}\r\n\/* Fascio di cavi: diciannove cilindri a nido d'ape dentro l'anello, visibili\r\n   soltanto durante l'installazione. *\/\r\n\/\/ Original thermal-to-line signature. Temperatures come only from supplied\r\n\/\/ summaries; this is an illustration of operating range, not a test recording.\r\nconst frostUniform={value:0},heatUniform={value:0},climateTime={value:0},THERMAL_SECONDS=6;\r\nlet climateAura=null,climateLive=false,logoURLs=[];\r\nlet finaleLabel='';\r\nconst THERMAL_RANGES={standard:[-40,85],colored:[-40,85],white:[-40,85],gold:[-40,85],uv:[-40,85],heat:[-40,125],releasable:[-40,75],eyelet:[-40,85],id1:[-40,85],id2:[-40,85],id3:[-40,85],pa66:[-40,85],pa12:[-40,85],crossbow:[-40,85],push:[-40,85]};\r\nconst THERMAL_PEAK={it:'Fino a +150 \\u00b0C per brevi periodi',en:'Up to +150 \\u00b0C for short periods',fr:'Jusqu\\u2019\\u00e0 +150 \\u00b0C pendant de courtes p\\u00e9riodes',de:'Kurzzeitig bis +150 \\u00b0C',es:'Hasta +150 \\u00b0C durante per\\u00edodos breves',pt:'At\\u00e9 +150 \\u00b0C por per\\u00edodos curtos'};\r\nconst THERMAL_EDGE={it:['Temperatura massima di utilizzo','Temperatura minima di utilizzo'],en:['Maximum operating temperature','Minimum operating temperature'],fr:['Temp\\u00e9rature maximale d\\u2019utilisation','Temp\\u00e9rature minimale d\\u2019utilisation'],de:['Maximale Einsatztemperatur','Minimale Einsatztemperatur'],es:['Temperatura m\\u00e1xima de uso','Temperatura m\\u00ednima de uso'],pt:['Temperatura m\\u00e1xima de utiliza\\u00e7\\u00e3o','Temperatura m\\u00ednima de utiliza\\u00e7\\u00e3o']};\r\nconst THERMAL_COPY={it:'Temperature di utilizzo',en:'Operating temperatures',fr:\"Temp\\u00e9ratures d\\u2019utilisation\",de:'Einsatztemperaturen',es:'Temperaturas de uso',pt:'Temperaturas de utiliza\\u00e7\\u00e3o'};\r\n\/\/ Hoarfrost: isotropic 3D noise on the cable surface (radius units), no stripes.\r\nconst CFS_FROST_GLSL=`\r\nfloat cfsHash(vec3 p){p=fract(p*.3183099+.1);p*=17.0;return fract(p.x*p.y*p.z*(p.x+p.y+p.z));}\r\nfloat cfsNoise(vec3 x){vec3 i=floor(x),f=fract(x);f=f*f*(3.0-2.0*f);\r\n return mix(mix(mix(cfsHash(i),cfsHash(i+vec3(1,0,0)),f.x),mix(cfsHash(i+vec3(0,1,0)),cfsHash(i+vec3(1,1,0)),f.x),f.y),\r\n  mix(mix(cfsHash(i+vec3(0,0,1)),cfsHash(i+vec3(1,0,1)),f.x),mix(cfsHash(i+vec3(0,1,1)),cfsHash(i+1.0),f.x),f.y),f.z);}\r\nfloat cfsFbm(vec3 p){float v=0.0,a=.5;for(int i=0;i<4;i++){v+=a*cfsNoise(p);p=p*2.03+vec3(1.7,9.2,4.1);a*=.5;}return v;}\r\nvec3 cfsFrostP(){return cfsFrostPosition*vec3(1.0,12.4,1.0);}\r\n`;\r\nfunction cableFrost(material){\r\n material.onBeforeCompile=shader=>{\r\n  shader.uniforms.cfsFrost=frostUniform;shader.uniforms.cfsHeat=heatUniform;shader.uniforms.cfsTime=climateTime;\r\n  shader.vertexShader='varying vec3 cfsFrostPosition;\\n'+shader.vertexShader;\r\n  shader.vertexShader=shader.vertexShader.replace('#include <begin_vertex>','#include <begin_vertex>\\n cfsFrostPosition=position;');\r\n  shader.fragmentShader='uniform float cfsHeat;\\n uniform float cfsFrost;\\n uniform float cfsTime;\\n varying vec3 cfsFrostPosition;\\n'+CFS_FROST_GLSL+shader.fragmentShader;\r\n  shader.fragmentShader=shader.fragmentShader.replace('#include <color_fragment>',`#include <color_fragment>\r\n   diffuseColor.rgb=mix(diffuseColor.rgb,diffuseColor.rgb*vec3(1.18,.88,.72),cfsHeat*.42);\r\n   float cfsCover=0.0,cfsGrain=0.0;\r\n   if(cfsFrost>0.001){\r\n    vec3 fp=cfsFrostP();\r\n    float cfsPatch=cfsFbm(fp*2.2);\r\n    cfsGrain=cfsNoise(fp*34.0)*.6+cfsNoise(fp*71.0)*.4;\r\n    cfsCover=clamp(smoothstep(.28,.66,cfsPatch)*.75+.25,0.0,1.0);\r\n    vec3 rime=vec3(.84,.90,.96)*(.80+.24*cfsGrain);\r\n    float a=cfsFrost*(.35+.60*cfsCover)*(.78+.22*cfsGrain);\r\n    diffuseColor.rgb=mix(diffuseColor.rgb*(1.0-.25*cfsFrost),rime,a);\r\n   }`);\r\n  shader.fragmentShader=shader.fragmentShader.replace('#include <roughnessmap_fragment>','#include <roughnessmap_fragment>\\n roughnessFactor=mix(roughnessFactor,.78+.18*cfsGrain,cfsFrost);');\r\n  \/\/ Crystalline micro-relief: frost grains tilt the shading normal.\r\n  shader.fragmentShader=shader.fragmentShader.replace('#include <normal_fragment_maps>',`#include <normal_fragment_maps>\r\n   if(cfsFrost>0.001){vec3 fq=cfsFrostP()*48.0;normal=normalize(normal+cfsFrost*.34*(vec3(cfsNoise(fq),cfsNoise(fq+17.3),cfsNoise(fq+41.7))-.5));}`);\r\n  shader.fragmentShader=shader.fragmentShader.replace('#include <emissivemap_fragment>',`#include <emissivemap_fragment>\r\n   if(cfsHeat+cfsFrost>0.001){\r\n    float cfsRim=pow(1.0-clamp(abs(dot(normal,normalize(vViewPosition))),0.0,1.0),2.2);\r\n    float cfsA=atan(cfsFrostPosition.z,cfsFrostPosition.x);\r\n    float cfsWave=.5+.5*sin(cfsFrostPosition.y*46.0-cfsTime*3.1+sin(cfsA*3.0+cfsTime*1.3)*1.6);\r\n    totalEmissiveRadiance+=vec3(1.0,.34,.07)*cfsHeat*(.04+.52*cfsRim+.07*cfsWave);\r\n    vec3 cq=cfsFrostP()*30.0,ci=floor(cq),cf=fract(cq);\r\n    float cs=cfsHash(ci),cd=length(cf-vec3(cfsHash(ci+3.1),cfsHash(ci+7.7),cfsHash(ci+11.3)));\r\n    float cfsSpark=step(.90,cs)*(1.0-smoothstep(.0,.16,cd))*pow(.5+.5*sin(cs*83.0+cfsTime*2.4+dot(normalize(vViewPosition),vec3(9.0,7.0,5.0))),3.0);\r\n    totalEmissiveRadiance+=cfsFrost*(vec3(.62,.80,1.0)*(.03+.34*cfsRim)*(.6+.4*cfsCover)+vec3(.92,.97,1.0)*cfsSpark*1.1);\r\n   }`);\r\n };\r\n material.customProgramCacheKey=()=> 'cobra-original-frost-v3';\r\n}\r\nfunction finaleUI(){\r\n const t=clamp((p-.98)\/.02),range=THERMAL_RANGES[productCategory()];\r\n const thermal=!reduced;\r\n const warm=thermal?ease(t\/.20)*(1-ease((t-.28)\/.20)):0;\r\n const cold=thermal?ease((t-.30)\/.20)*(1-ease((t-.64)\/.18)):0;\r\n frostUniform.value=cold;heatUniform.value=warm;\r\n climateLive=thermal&&warm+cold>.004&&!!cables?.visible;if(climateAura)climateAura.visible=climateLive;\r\n const climate=$('.cfs-climate');climate.style.setProperty('--warm',warm.toFixed(3));climate.style.setProperty('--cold',cold.toFixed(3));\r\n if(climateLive&&bundle){vB.copy(bundle).applyMatrix4(model.matrixWorld).project(camera);climate.style.setProperty('--bx',((vB.x*.5+.5)*100).toFixed(1)+'%');climate.style.setProperty('--by',((-vB.y*.5+.5)*100).toFixed(1)+'%')}\r\n \/\/ The range is legible only while the bundle changes colour, then yields to the CTA.\r\n const spec=$('.cfs-thermal-spec'),fade=reduced?(t>.01&&t<1?1:0):ease(t\/.05)*(1-ease((t-.70)\/.13)),show=fade>.002;\r\n if(spec.hidden===show)measure=true;\r\n spec.hidden=!show;spec.style.opacity=fade.toFixed(3);spec.style.maxHeight=(fade*9).toFixed(2)+'em';\r\n spec.style.transform='translateY('+((1-fade)*-6).toFixed(1)+'px)';if(show&&fade<1)measure=true;\r\n \/\/ Hot first (+max while the bundle glows), then cold (-min while it frosts).\r\n const category=productCategory(),phase=reduced?'both':t<.40?'hot':'cold';\r\n const value=show?[category,lang,phase].join('|'):'';\r\n if(value!==finaleLabel){\r\n  const edge=THERMAL_EDGE[lang]||THERMAL_EDGE.it;\r\n  text($('.cfs-thermal-label'),phase==='both'?(THERMAL_COPY[lang]||THERMAL_COPY.it):edge[phase==='hot'?0:1]);\r\n  text($('.cfs-thermal-range'),!range?'':phase==='hot'?'+'+range[1]+' \\u00b0C':phase==='cold'?'\\u2212'+Math.abs(range[0])+' \\u00b0C':'\\u2212'+Math.abs(range[0])+' \\u00b0C \/ +'+range[1]+' \\u00b0C');\r\n  const peak=$('.cfs-thermal-peak'),hotPeak=category==='heat'&&phase!=='cold';peak.hidden=!hotPeak;\r\n  text(peak,hotPeak?(THERMAL_PEAK[lang]||THERMAL_PEAK.it):'');\r\n  spec.dataset.phase=phase;finaleLabel=value;measure=true;\r\n }\r\n if(show&&!reduced){const swap=t<.40?1-ease((t-.34)\/.06):ease((t-.40)\/.06);spec.style.setProperty('--cfs-swap',swap.toFixed(3))}\r\n const signature=$('.cfs-signature'),draw=reduced?(t>=1?1:0):ease((t-.62)\/.38);\r\n signature.hidden=draw<=0;signature.style.setProperty('--draw',draw.toFixed(4));\r\n if(draw>0){logo3D();signature.style.setProperty('--spin',((1-draw)*-58).toFixed(2)+'deg')}\r\n \/\/ The logos stand on their own (no leader line); the head only seeds the strike.\r\n if(draw<=0){logoFX(0);return}\r\n if(signature.dataset.form)return;\r\n vB.copy(slot).applyMatrix4(model.matrixWorld).project(camera);\r\n logoFX(draw,(vB.x*.5+.5)*w+mount.offsetLeft,(-vB.y*.5+.5)*h+mount.offsetTop);\r\n}\r\n\/* Alone climatico attorno al fascio: calore tremolante e nebbia di gelo con\r\n   cristalli. Additivo, senza scrittura di profondita': il nastro e la testa\r\n   davanti lo coprono in modo naturale. *\/\r\n\/* Loghi in rilievo: ogni PNG diventa un solido CSS 3D (strati estrusi con\r\n   fianchi in ombra e riflesso che scorre sulla faccia). Una sola decodifica:\r\n   tutti gli strati condividono lo stesso data URI. *\/\r\nfunction logo3D(){\r\n \/\/ Logos are data-* sources, never image tags: page optimisers (lazy-load)\r\n \/\/ rewrite image tags into empty placeholders. Face and extruded layers share one URL.\r\n const sig=$('.cfs-signature');if(!sig||sig.dataset.depth)return;sig.dataset.depth='1';\r\n const N=coarse.matches?12:16,G=coarse.matches?1.55:1.85;\r\n sig.querySelectorAll(':scope>.cfs-logo-src,:scope>img').forEach((el,k)=>{\r\n  let src=el.dataset.logo||el.dataset.lazySrc||el.dataset.src||'';\r\n  if(!src&&el.tagName==='IMG'){const ns=el.nextElementSibling;const m=ns&&ns.tagName==='NOSCRIPT'&&\/src=\"([^\"]+)\"\/.exec(ns.textContent||ns.innerHTML);src=m?m[1]:(el.currentSrc||el.src)}\r\n  if(!src||\/^data:image\\\/svg\\+xml\/.test(src)&&!el.dataset.logo)return;\r\n  const tilt=document.createElement('div'),solid=document.createElement('div'),face=document.createElement('span'),shine=document.createElement('span');\r\n  tilt.className='cfs-logo-tilt';tilt.setAttribute('role','img');tilt.setAttribute('aria-label',el.getAttribute('aria-label')||el.getAttribute('alt')||'');\r\n  solid.className='cfs-logo3d';solid.style.setProperty('--delay',(-k*1.7)+'s');\r\n  tilt.style.setProperty('--cfs-logo','url(\"'+src+'\")');tilt.dataset.src=src;\r\n  tilt.style.aspectRatio=(el.dataset.width||el.getAttribute('width')||3)+'\/'+(el.dataset.height||el.getAttribute('height')||1);\r\n  for(let i=N;i>=1;i--){const l=document.createElement('span');l.className='cfs-logo-layer';l.setAttribute('aria-hidden','true');l.style.transform='translateZ('+(-i*G).toFixed(2)+'px)';l.style.filter='brightness('+(i===1?.92:.24+.46*Math.pow(1-i\/N,1.4)).toFixed(3)+') saturate(1.3)';solid.append(l)}\r\n  face.className='cfs-logo-layer cfs-logo-face';face.setAttribute('aria-hidden','true');\r\n  shine.className='cfs-logo-shine';shine.setAttribute('aria-hidden','true');\r\n  const ns=el.nextElementSibling;if(ns&&ns.tagName==='NOSCRIPT')ns.remove();\r\n  el.replaceWith(tilt);solid.append(face,shine);tilt.append(solid);\r\n });\r\n}\r\n\/* COBRA grip. An original particle cobra rises from the real head of the tie:\r\n   a hood built from curved ribs (the rack teeth of the tie), a wedge head with\r\n   red eyes and a forked tongue, a coiled neck. It holds, the ribs tighten like\r\n   the grip of the reptile, then it strikes head-first and its particles become\r\n   the COBRA mark; a red shock ring closes the strike and the solid 3D logo\r\n   takes over. Canvas 2D, ~3.4 s, then removed. Skipped with reduced motion. *\/\r\nlet fx=null;\r\nfunction logoFX(draw,ox,oy){\r\n const sig=$('.cfs-signature');if(!sig)return;\r\n if(draw<=0){if(fx){fx.stop();fx=null}if(sig.dataset.form)sig.dataset.form='';return}\r\n if(sig.dataset.form)return;\r\n const tilt=sig.querySelector('.cfs-logo-tilt');\r\n if(reduced||!tilt||!tilt.dataset.src){sig.dataset.form='done';if(!playback)releaseScroll();return}\r\n sig.dataset.form='run';\r\n const img=new Image();\r\n img.onload=()=>{if(!dead&&sig.dataset.form==='run')requestAnimationFrame(()=>runFX(sig,tilt,img,ox,oy))};\r\n img.onerror=()=>{sig.dataset.form='done'};img.src=tilt.dataset.src;\r\n}\r\n\/\/ Stylized cobra (original drawing, frontal): wide flat head with red eye\r\n\/\/ slits and forked tongue, hood of two sweeping bands with a thin inner\r\n\/\/ contour, chevron belly scutes, and a coil wrapped around the tie head.\r\n\/\/ Drawn once on a 400x520 raster, then sampled as particle targets.\r\nfunction cobraDraw(g){\r\n const W='#fff',RED='#f00';g.clearRect(0,0,400,520);\r\n const band=(o,i)=>{g.beginPath();g.moveTo(o[0],o[1]);g.bezierCurveTo(o[2],o[3],o[4],o[5],o[6],o[7]);g.lineTo(i[6],i[7]);g.bezierCurveTo(i[4],i[5],i[2],i[3],i[0],i[1]);g.closePath();g.fill()};\r\n const mir=a=>a.map((v,k)=>k%2?v:400-v);\r\n g.fillStyle=W;\r\n \/\/ hood: two sweeping bands, wide at the shoulders, tapering into the neck\r\n const outer=[146,66, 52,64, 40,262, 168,478], inner=[156,104, 102,118, 92,272, 176,478];\r\n band(outer,inner);band(mir(outer),mir(inner));\r\n \/\/ inner hood contour, thin\r\n const o2=[170,168, 128,206, 126,330, 184,470], i2=[176,170, 138,210, 136,330, 188,470];\r\n band(o2,i2);band(mir(o2),mir(i2));\r\n \/\/ head: flat wide crown, angular brows, wedge to a rounded snout\r\n const head=()=>{g.beginPath();g.moveTo(132,74);g.quadraticCurveTo(200,44,268,74);g.lineTo(259,101);g.quadraticCurveTo(244,142,214,166);\r\n g.quadraticCurveTo(200,174,186,166);g.quadraticCurveTo(156,142,141,101);g.closePath()};\r\n \/\/ a dark gap separates the head from the hood, then the head is filled\r\n head();g.save();g.globalCompositeOperation='destination-out';g.lineWidth=12;g.lineJoin='round';g.stroke();g.restore();head();g.fill();\r\n \/\/ belly scutes: shallow chevrons, narrowing downwards\r\n for(let k=0;k<6;k++){const y=262+k*24,hw=40-k*4.2,d=5;g.beginPath();g.moveTo(200-hw,y);g.lineTo(200,y+d);g.lineTo(200+hw,y);g.lineTo(200+hw,y+5);g.lineTo(200,y+d+5);g.lineTo(200-hw,y+5);g.closePath();g.fill()}\r\n \/\/ coil wrapped around the tie head\r\n g.lineWidth=7;g.strokeStyle=W;g.beginPath();g.ellipse(200,488,96,17,0,0,Math.PI*2);g.stroke();\r\n \/\/ eyes (red slits) and forked tongue\r\n g.fillStyle=RED;\r\n for(const s of[-1,1]){g.beginPath();g.moveTo(200+s*22,98);g.lineTo(200+s*44,92);g.lineTo(200+s*30,118);g.closePath();g.fill()}\r\n g.strokeStyle=RED;g.lineWidth=3.2;g.lineCap='round';g.beginPath();g.moveTo(200,170);g.lineTo(200,198);g.moveTo(200,198);g.lineTo(191,214);g.moveTo(200,198);g.lineTo(209,214);g.stroke();\r\n}\r\nlet cobraCache=null;\r\nfunction cobraPoints(n){\r\n if(!cobraCache){const c=document.createElement('canvas');c.width=400;c.height=520;const g=c.getContext('2d');cobraDraw(g);\r\n  const d=g.getImageData(0,0,400,520).data,pts=[];\r\n  for(let y=0;y<520;y+=2)for(let x=(y\/2)%2;x<400;x+=2){const k=(y*400+x)*4;if(d[k+3]>120)pts.push([(x-200)\/520,(y-505)\/520,d[k+1]<80?1:0])}\r\n  let seed=7;const rnd=()=>(seed=(seed*16807)%2147483647)\/2147483647;\r\n  for(let k=pts.length-1;k>0;k--){const j=Math.floor(rnd()*(k+1));[pts[k],pts[j]]=[pts[j],pts[k]]}\r\n  \/\/ keep every eye\/tongue point: they carry the expression\r\n  cobraCache=[...pts.filter(p=>p[2]),...pts.filter(p=>!p[2])];}\r\n const out=[];for(let k=0;k<n;k++)out.push(cobraCache[k%cobraCache.length]);return out;\r\n}\r\nfunction runFX(sig,tilt,img,ox,oy){\r\n const sr=stage.getBoundingClientRect(),r=tilt.getBoundingClientRect();\r\n const W=Math.max(1,Math.round(r.width)),H=Math.max(1,Math.round(r.height));\r\n const off=document.createElement('canvas');off.width=W;off.height=H;const og=off.getContext('2d');\r\n let data;try{og.drawImage(img,0,0,W,H);data=og.getImageData(0,0,W,H).data}catch{sig.dataset.form='done';return}\r\n let filled=0;for(let i=3;i<data.length;i+=4)if(data[i]>140)filled++;\r\n const phone=coarse.matches||innerWidth<=600,step=Math.max(1.1,Math.sqrt(filled\/(phone?1400:2800))),lx=r.left-sr.left,ly=r.top-sr.top,L=[];\r\n for(let y=0;y<H;y+=step)for(let x=0;x<W;x+=step){const k=(Math.floor(y)*W+Math.floor(x))*4;if(data[k+3]>140)L.push([lx+x,ly+y,data[k],data[k+1],data[k+2]])}\r\n if(!L.length){sig.dataset.form='done';return}\r\n \/\/ Cobra size and anchor: rises from the head, or sits on it when space is short.\r\n let Hc=Math.min(sr.height*(phone?.5:.66),phone?330:500),room=oy-24;\r\n let base=room>=Hc?oy-4:Math.min(sr.height-20,oy+(Hc-room)*.9);\r\n \/\/ Phones: keep the whole cobra inside the free band above the card.\r\n if(root.dataset.compact==='true'){const [zt,zb]=freeZone();Hc=Math.min(Hc,Math.max(120,zb-zt-8));base=Math.min(base,zb-4);if(base-Hc<zt)base=zt+Hc}\r\n \/\/ The cobra needs more particles than the logo: extra ones share logo pixels.\r\n const NC=phone?3200:7000;\r\n const C=cobraPoints(NC).map(([x,y,kind])=>[ox+x*Hc*1.05,base+y*Hc,kind]);\r\n \/\/ Head-first strike: cobra points ordered top-down, logo points left-right.\r\n const ci=C.map((c,i)=>i).sort((a,b)=>C[a][1]-C[b][1]),li=L.map((c,i)=>i).sort((a,b)=>L[a][0]-L[b][0]),LN=li.length;\r\n const P=ci.map((c,k)=>{const q=C[c],l=L[li[Math.floor(k*LN\/C.length)]],hgt=clamp((base-q[1])\/Hc);\r\n  return {cx:q[0],cy:q[1],kind:q[2],h:hgt,tx:l[0],ty:l[1],c:[l[2],l[3],l[4]],sx:ox+(Math.random()-.5)*10,sy:oy+(Math.random()-.5)*10,\r\n   amp:(18+Math.random()*34)*(Math.random()<.5?-1:1),ph:Math.random()*.6,j:Math.random()*6.283}});\r\n const dpr=Math.min(2,devicePixelRatio||1),cv=document.createElement('canvas');\r\n cv.className='cfs-logo-fx';cv.setAttribute('aria-hidden','true');cv.width=Math.round(sr.width*dpr);cv.height=Math.round(sr.height*dpr);stage.append(cv);\r\n let T0=null;const g=cv.getContext('2d'),RISE=.8,S0=1.95,STRIKE=.5,END=S0+.3+STRIKE,cx0=lx+W*.5,cy0=ly+H*.5;\r\n const eOut=t=>1-Math.pow(1-t,3),eIn=t=>t*t*(3-2*t);\r\n let dx2=0,dy2=0;\r\n const place=(q,s)=>{\r\n  const d=.05+q.h*.6;if(s<d)return null;\r\n  \/\/ breathing hood and tightening ribs (the grip) while holding\r\n  const hold=clamp((s-d-RISE)\/.9),grip=Math.sin(hold*Math.PI)*.06,br=1+.03*Math.sin(s*5.2);\r\n  const kx=(q.cx-ox)*(1-grip)*br+ox,ky=q.cy+Math.sin(s*9+q.j)*.6;\r\n  const t1=Math.min(1,(s-d)\/RISE);\r\n  let x,y;\r\n  if(t1<1){const e=eOut(t1),vx=kx-q.sx,vy=ky-q.sy,len=Math.hypot(vx,vy)||1,w=Math.sin((e*1.8+q.ph)*Math.PI*2)*q.amp*(1-e)*(1-e);x=q.sx+vx*e-vy\/len*w;y=q.sy+vy*e+vx\/len*w}\r\n  else{x=kx;y=ky}\r\n  const sd=S0+(1-q.h)*.3,t2=clamp((s-sd)\/STRIKE);\r\n  if(t2>0){const e=eIn(t2),tx=q.tx+dx2,ty=q.ty+dy2,lift=Math.sin(e*Math.PI)*-40*(1-q.h*.5);x=x+(tx-x)*e;y=y+(ty-y)*e+lift}\r\n  return [x,y,t1,t2];\r\n };\r\n const me={raf:0,stop(){cancelAnimationFrame(me.raf);cv.remove()}};fx=me;\r\n const tick=now=>{\r\n  if(fx!==me)return;if(T0===null)T0=now;\r\n  const cr=tilt.getBoundingClientRect();dx2=cr.left-r.left;dy2=cr.top-r.top;\r\n  const s=(now-T0)\/1000;g.setTransform(dpr,0,0,dpr,0,0);g.clearRect(0,0,sr.width,sr.height);\r\n  const fade=s>END?Math.max(0,1-(s-END)\/.35):1;\r\n  \/\/ Dim the scene behind the cobra so the particles read like light.\r\n  const veil=clamp(s\/.6)*(1-clamp((s-S0-.1)\/.5))*.62;\r\n  if(veil>.004){const vx=ox,vy=base-Hc*.5,vr=Hc*.95,vg=g.createRadialGradient(vx,vy,vr*.2,vx,vy,vr);\r\n   vg.addColorStop(0,'rgba(0,0,0,'+veil.toFixed(3)+')');vg.addColorStop(1,'rgba(0,0,0,0)');g.globalCompositeOperation='source-over';g.fillStyle=vg;g.fillRect(vx-vr,vy-vr,vr*2,vr*2)}\r\n  g.globalCompositeOperation='lighter';g.lineCap='round';\r\n  for(const q of P){\r\n   const a=place(q,s);if(!a)continue;const [x,y,t1,t2]=a,b=place(q,s-.045)||a;\r\n   const m=t2*t2,base=q.kind===1||q.kind===2?[255,42,34]:[235,240,248];\r\n   const cr_=Math.round(base[0]+(q.c[0]-base[0])*m),cg=Math.round(base[1]+(q.c[1]-base[1])*m),cb=Math.round(base[2]+(q.c[2]-base[2])*m);\r\n   const moving=(t1<1||(t2>0&&t2<1)),al=(q.kind?1:.78)*fade;\r\n   if(q.kind===2&&t2<=0&&Math.sin(s*7)<.2)continue;\r\n   g.strokeStyle=g.fillStyle='rgba('+cr_+','+cg+','+cb+','+al.toFixed(3)+')';\r\n   if(moving){g.lineWidth=1.25;g.beginPath();g.moveTo(b[0],b[1]);g.lineTo(x+.01,y);g.stroke()}\r\n   else{const z=(q.kind===1?2.2:1.6)*(phone?.8:1);g.fillRect(x-z\/2,y-z\/2,z,z);if(q.kind){g.globalAlpha=.18;g.fillRect(x-z*1.6,y-z*1.6,z*3.2,z*3.2);g.globalAlpha=1}}\r\n  }\r\n  if(s>END-.3){const k=Math.min(1,(s-END+.3)\/.55),R=W*(.35+k*.95),X=cx0+dx2,Y=cy0+dy2,gr=g.createRadialGradient(X,Y,R*.55,X,Y,R);\r\n   gr.addColorStop(0,'rgba(227,9,22,0)');gr.addColorStop(.82,'rgba(255,70,60,'+(.42*(1-k)).toFixed(3)+')');gr.addColorStop(1,'rgba(255,255,255,0)');\r\n   g.globalCompositeOperation='source-over';g.fillStyle=gr;g.beginPath();g.arc(X,Y,R,0,Math.PI*2);g.fill()}\r\n  if(s>=END-.1&&sig.dataset.form==='run')sig.dataset.form='land';\r\n  if(s>=END+.3&&sig.dataset.form==='land')sig.dataset.form='done';\r\n  if(s<END+.45)me.raf=requestAnimationFrame(tick);else{cv.remove();if(fx===me)fx=null;if(sig.dataset.form)sig.dataset.form='done';if(!playback)releaseScroll()}\r\n };\r\n me.raf=requestAnimationFrame(tick);\r\n}\r\nfunction makeAura(){\r\n const group=new T.Group();group.name='climate-aura';group.visible=false;\r\n const cam={value:new T.Vector3()},u={heat:heatUniform,frost:frostUniform,time:climateTime,cam};\r\n const shell=new T.Mesh(keep(new T.CylinderGeometry(10.5,10.5,15,72,1,true)),keep(new T.ShaderMaterial({uniforms:u,transparent:true,depthWrite:false,side:T.BackSide,blending:T.AdditiveBlending,\r\n  vertexShader:'varying vec3 vp;void main(){vp=position;gl_Position=projectionMatrix*modelViewMatrix*vec4(position,1.0);}',\r\n  fragmentShader:`uniform float heat,frost,time;uniform vec3 cam;varying vec3 vp;\r\nfloat hh(vec2 p){return fract(sin(dot(p,vec2(127.1,311.7)))*43758.5453);}\r\nfloat nn(vec2 p){vec2 i=floor(p),f=fract(p);f=f*f*(3.0-2.0*f);return mix(mix(hh(i),hh(i+vec2(1,0)),f.x),mix(hh(i+vec2(0,1)),hh(i+1.0),f.x),f.y);}\r\nvoid main(){\r\n vec3 d=normalize(vp-cam);vec2 o=cam.xz,q=d.xz;float l2=max(dot(q,q),1e-5);\r\n float t=-dot(o,q)\/l2;vec3 c=cam+d*t;float r=length(c.xz);\r\n float e=clamp((r-5.15)\/5.2,0.0,1.0);\r\n float g=exp(-e*3.6)*(1.0-smoothstep(.72,1.0,e))*(1.0-smoothstep(5.2,7.3,abs(c.y)))*smoothstep(.02,.18,l2);\r\n float w1=nn(vec2(c.y*.75+sin(e*5.0-time*1.7)*.35,e*3.2-time*1.9));\r\n float w2=nn(vec2(c.y*1.9-time*.6,e*6.5-time*3.1));\r\n float shimmer=.55+.45*w1+.22*sin(e*18.0-time*6.0+w2*5.0)*(1.0-e);\r\n vec3 hot=mix(vec3(1.0,.48,.12),vec3(1.0,.22,.04),e)*heat*g*shimmer*.62;\r\n float m=nn(vec2(c.y*.45+time*.16,e*2.6-time*.10))*.65+nn(vec2(c.y*1.3-time*.07,e*5.0+time*.05))*.35;\r\n vec3 cold=mix(vec3(.80,.92,1.0),vec3(.42,.66,1.0),e)*frost*g*(.30+.70*m)*.46;\r\n gl_FragColor=vec4(hot+cold,1.0);\r\n}`})));\r\n shell.frustumCulled=false;shell.renderOrder=3;\r\n shell.onBeforeRender=(r,s,camera)=>{cam.value.copy(camera.position);shell.worldToLocal(cam.value)};\r\n group.add(shell);\r\n const N=coarse.matches?140:240,pos=new Float32Array(N*3),seed=new Float32Array(N);\r\n for(let i=0;i<N;i++){const a=Math.random()*Math.PI*2,rr=5.5+Math.random()*3.8;pos.set([Math.cos(a)*rr,(Math.random()-.5)*11,Math.sin(a)*rr],i*3);seed[i]=Math.random()}\r\n const pg=keep(new T.BufferGeometry());pg.setAttribute('position',new T.BufferAttribute(pos,3));pg.setAttribute('seed',new T.BufferAttribute(seed,1));\r\n const px={value:600};u.px=px;\r\n const dots=new T.Points(pg,keep(new T.ShaderMaterial({uniforms:u,transparent:true,depthWrite:false,blending:T.AdditiveBlending,\r\n  vertexShader:`uniform float heat,frost,time,px;attribute float seed;varying float vs,va,vk;\r\nvoid main(){\r\n vec3 p=position;float a=atan(p.z,p.x),r=length(p.xz);\r\n float life=fract(seed*7.31+time*(.16+.22*seed));\r\n float out1=r+heat*life*2.4;a+=frost*time*.035*(seed-.5);\r\n p=vec3(cos(a)*out1,p.y+heat*(life-.5)*1.4+frost*sin(time*.4+seed*20.0)*.35,sin(a)*out1);\r\n vec4 mv=modelViewMatrix*vec4(p,1.0);gl_Position=projectionMatrix*mv;\r\n vk=step(frost,heat);\r\n va=vk>.5?heat*sin(life*3.14159):frost*(.35+.65*pow(.5+.5*sin(time*2.3+seed*47.0),6.0));\r\n vs=seed;gl_PointSize=px*mix(.05+.07*seed,.07+.10*seed,1.0-vk)\/-mv.z;\r\n}`,\r\n  fragmentShader:`varying float vs,va,vk;\r\nvoid main(){\r\n vec2 q=gl_PointCoord-.5;float d=length(q);\r\n float soft=exp(-d*d*28.0);\r\n float star=max(0.0,1.0-abs(q.x)*22.0)*max(0.0,1.0-abs(q.y)*2.4)+max(0.0,1.0-abs(q.y)*22.0)*max(0.0,1.0-abs(q.x)*2.4);\r\n vec3 col=vk>.5?vec3(1.0,.50,.16)*soft:vec3(.82,.93,1.0)*(soft+star*.7);\r\n gl_FragColor=vec4(col*va,1.0);\r\n}`})));\r\n dots.frustumCulled=false;dots.renderOrder=4;dots.onBeforeRender=()=>{px.value=h*renderer.getPixelRatio()\/(2*Math.tan(camera.fov*Math.PI\/360))};\r\n group.add(dots);return group;\r\n}\r\nfunction makeCables(){\r\n  \/* Il fascio conserva la propria sezione durante tutta la posa. *\/\r\n  cables=new T.Group();cables.visible=false;model.add(cables);\r\n  const geo=keep(new T.CylinderGeometry(1,1,1,40,1)),r=WRAP.cableRadius;\r\n  for(const [hex,ring,angle] of CABLES){\r\n    const material=keep(new T.MeshStandardMaterial({color:hex,roughness:.58,metalness:0,\r\n      envMapIntensity:.75,transparent:false,depthTest:true,depthWrite:true,opacity:1}));\r\n    cableFrost(material);cableMaterials.push(material);\r\n    const o=new T.Mesh(geo,material);\r\n    const t=angle*Math.PI\/180;\r\n    o.position.set(ring*r*Math.cos(t),0,ring*r*Math.sin(t));\r\n    o.scale.set(r,13,r);o.frustumCulled=false;cables.add(o);\r\n  }\r\n  climateAura=makeAura();cables.add(climateAura);\r\n  model.traverse(o=>{\r\n    if(o.isMesh&&finishes.includes(o.material)&&!o.geometry.getAttribute('finishPosition'))\r\n      o.geometry.setAttribute('finishPosition',o.geometry.attributes.position.clone());\r\n  });\r\n  placeBundle();\r\n}\r\n\r\n\/* La coda preformata conserva la sua geometria. Solo il corpo prende una\r\n   curvatura libera e poi, sotto trazione, si appoggia al fascio di cavi. *\/\r\nconst WRAP={open:3.20,tight:0,s0:-19.54,n:1025,slotX:-20.313,guide:.31,\r\n  cableRadius:1.05,cornerRadius:4.305,cx:-13.95,cz:5.138239363292008,clearance:.010};\r\n\/* Assestamento sotto trazione: il nastro si appoggia al fascio e i due\r\n   rami orientano la testa. La scocca rimane rigida; la flessione si\r\n   distribuisce nel corpo, senza una cerniera o un gomito all'imbocco.\r\n   Il fine corsa e' risolto sulla lunghezza disponibile e sui contatti. *\/\r\nconst PACK={openX:-13.95,tightX:-17.90,openZ:5.138239363292008,tightZ:5.02,settle:0};\r\n\/* Appoggio della testa sul profilo del fascio a serraggio completato. *\/\r\n\/* Piano solidale alla testa: attacco, foro e coda condividono la stessa\r\n   trasformazione rigida. La posa considera entrambi i rami in tensione. *\/\r\nconst HEAD={angle:0,c:1,s:0};\r\nfunction seatHead(amount){\r\n  const px=-20.14-PACK.tightX,pz=.22-PACK.tightZ,R=WRAP.cornerRadius;\r\n  let distance=Infinity,nx=0,nz=-1;\r\n  for(let k=0;k<6;k++){\r\n    const a=k*Math.PI\/3,b=a+Math.PI\/3;\r\n    const ax=R*Math.cos(a),az=R*Math.sin(a),dx=R*Math.cos(b)-ax,dz=R*Math.sin(b)-az;\r\n    const t=clamp(((px-ax)*dx+(pz-az)*dz)\/(dx*dx+dz*dz));\r\n    const x=px-ax-t*dx,z=pz-az-t*dz,d=Math.hypot(x,z);\r\n    if(d<distance){distance=d;nx=x\/d;nz=z\/d}\r\n  }\r\n  \/\/ Nella scocca l'attacco del corpo e l'asse del passaggio sono a 90 gradi.\r\n  \/\/ Tilt toward the bundle. Root tension handles seating independently;\r\n  \/\/ never rotate the head outward to close a gap in the flexible band.\r\n  const surfaceAngle=clamp(Math.atan2(nx,-nz),-.70,.70);\r\n  HEAD.angle=clamp(surfaceAngle,-.22,-.08)*amount;\r\n  HEAD.c=Math.cos(HEAD.angle);HEAD.s=Math.sin(HEAD.angle);\r\n}\r\nfunction seatPoint(x,z){\r\n  const dx=x-WRAP.s0;\r\n  return [WRAP.s0+HEAD.c*dx-HEAD.s*z,HEAD.s*dx+HEAD.c*z];\r\n}\r\n\/* Linguetta di bloccaggio. Profondita' 0.66, il 70 per cento dei 0.94 della\r\n   testa; altezza e smusso nelle proporzioni del modello di riferimento.\r\n   La base e' annegata nella parete inferiore. In profondita' il dente e'\r\n   centrato nella testa: stesso incasso visto da davanti e visto da dietro.\r\n   Il piano superiore non e' orizzontale: parte alto dietro e scende fino\r\n   davanti, di rake. Il punto piu' alto e' percio' lo spigolo posteriore e la\r\n   quota base lo tiene appena sotto i denti. fillet raggia gli spigoli del\r\n   profilo, bevel quelli in larghezza. *\/\r\nconst PAWL={depth:.66,slant:.5525,flat:.19,rake:.148,width:.84,base:-.769,z:-.615,fillet:.038,bevel:.022};\r\nconst PATH={len:0,r:NaN,ds:0,x:new Float64Array(1025),z:new Float64Array(1025),\r\n  c:new Float64Array(1025),s:new Float64Array(1025),guide:0,blend:0};\r\nconst TAIL={a:[],x:[],theta:[],u:[],v:[],start:TIP.x-WRAP.s0,length:0,memory:1};\r\nconst FEED={start:0,end:0};\r\nconst POSE={feed:0,angle:0,bx:0,bz:0,ex:0,ez:0,guide:0};\r\nfunction prepareTail(){\r\n  let a=TAIL.start,px=TIP.x,pz=bend(px);\r\n  for(let i=0;i<=192;i++){\r\n    const x=lerp(TIP.x,TAIL_END_X,i\/192),z=bend(x);\r\n    if(i)a+=Math.hypot(x-px,z-pz);\r\n    TAIL.a.push(a);TAIL.x.push(x);TAIL.theta.push(Math.atan(slope(x)));\r\n    TAIL.u.push(x-WRAP.s0);TAIL.v.push(z);px=x;pz=z;\r\n  }\r\n  TAIL.length=a;FEED.start=a+.80;\r\n}\r\nfunction ratchetPosition(){\r\n  if(!rack||wrap<.999)return NaN;\r\n  const last=materialDistance(rack.x0+(rack.count-1)*rack.dx+.187*.78);\r\n  return (last-POSE.feed)\/rack.dx;\r\n}\r\nfunction materialDistance(x){\r\n  if(x<=TIP.x)return x-WRAP.s0;\r\n  const t=clamp((x-TIP.x)\/(TAIL_END_X-TIP.x))*192,i=Math.min(191,Math.floor(t));\r\n  return lerp(TAIL.a[i],TAIL.a[i+1],t-i);\r\n}\r\nconst REST=[0,0,0];\r\n\/* Coda preformata: memory 1 e' la piega di stampo, 0 la coda distesa dal\r\n   passaggio nella testa. Solo il posizionamento cambia, mai la sezione. *\/\r\nfunction straighten(a){const m=TAIL.memory;if(m>=1)return;REST[0]=lerp(a,REST[0],m);REST[1]*=m;REST[2]*=m}\r\nfunction freePoint(a){\r\n  if(a<=TAIL.start){REST[0]=a;REST[1]=0;REST[2]=0;return}\r\n  const last=TAIL.a.length-1;\r\n  if(a>=TAIL.length){\r\n    const angle=TAIL.theta[last],d=a-TAIL.length;\r\n    REST[0]=TAIL.u[last]+d*Math.cos(angle);REST[1]=TAIL.v[last]+d*Math.sin(angle);REST[2]=angle;straighten(a);return;\r\n  }\r\n  let lo=0,hi=last;\r\n  while(hi-lo>1){const mid=(lo+hi)>>1;if(TAIL.a[mid]<a)lo=mid;else hi=mid}\r\n  const f=(a-TAIL.a[lo])\/(TAIL.a[hi]-TAIL.a[lo]);\r\n  REST[0]=lerp(TAIL.u[lo],TAIL.u[hi],f);REST[1]=lerp(TAIL.v[lo],TAIL.v[hi],f);\r\n  REST[2]=lerp(TAIL.theta[lo],TAIL.theta[hi],f);\r\n  straighten(a);\r\n}\r\nfunction rigidPose(feed){\r\n  \/* Il tratto che occupa il passaggio determina la rotazione dell'intera\r\n     coda preformata, senza modificarne l'angolo o la curvatura originari. *\/\r\n  freePoint(feed-.51);const x0=REST[0],z0=REST[1];freePoint(feed+.51);\r\n  const mx=(x0+REST[0])*.5,mz=(z0+REST[1])*.5;\r\n  const angle=-Math.PI*.5-Math.atan2(REST[1]-z0,REST[0]-x0),c=Math.cos(angle),s=Math.sin(angle);\r\n  POSE.feed=feed;POSE.angle=angle;\r\n  POSE.bx=WRAP.slotX+c*(TAIL.start-mx)+s*mz;\r\n  POSE.bz=-.28+s*(TAIL.start-mx)-c*mz;\r\n  POSE.guide=Math.max(0,(WRAP.guide-POSE.bz)\/(-s));\r\n  POSE.ex=POSE.bx-POSE.guide*c;POSE.ez=POSE.bz-POSE.guide*s;\r\n  [POSE.bx,POSE.bz]=seatPoint(POSE.bx,POSE.bz);\r\n  [POSE.ex,POSE.ez]=seatPoint(POSE.ex,POSE.ez);\r\n  POSE.angle+=HEAD.angle;\r\n}\r\nconst CONTACT=[];\r\nlet contactLength=0;\r\nfunction makeContact(){\r\n  CONTACT.length=0;\r\n  const rr=WRAP.cableRadius+.150+WRAP.clearance,R=WRAP.cornerRadius;\r\n  const cx=WRAP.cx,cz=WRAP.cz,zTop=cz-R*Math.sqrt(3)\/2-rr;\r\n  const add=(x,z)=>CONTACT.push({x,z});\r\n  function line(x0,z0,x1,z1){\r\n    const n=Math.max(2,Math.ceil(Math.hypot(x1-x0,z1-z0)\/.045));\r\n    for(let i=1;i<=n;i++)add(lerp(x0,x1,i\/n),lerp(z0,z1,i\/n));\r\n  }\r\n  add(WRAP.s0,0);line(WRAP.s0,0,cx+R*.5,zTop);\r\n  for(let k=0;k<5;k++){\r\n    const vertex=(-60+k*60)*Math.PI\/180,vx=cx+R*Math.cos(vertex),vz=cz+R*Math.sin(vertex);\r\n    const start=(-90+k*60)*Math.PI\/180,end=k===4?lerp(POSE.angle+Math.PI*1.5,Math.PI*7\/6,PACK.settle):start+Math.PI\/3;\r\n    const n=Math.max(12,Math.ceil((end-start)*48\/(Math.PI\/3)));\r\n    for(let j=1;j<=n;j++){const a=lerp(start,end,j\/n);add(vx+rr*Math.cos(a),vz+rr*Math.sin(a))}\r\n    if(k<4){\r\n      const nv=vertex+Math.PI\/3;\r\n      line(vx+rr*Math.cos(end),vz+rr*Math.sin(end),cx+R*Math.cos(nv)+rr*Math.cos(end),cz+R*Math.sin(nv)+rr*Math.sin(end));\r\n    }\r\n  }\r\n  const p=CONTACT[CONTACT.length-1],d=Math.hypot(POSE.ex-p.x,POSE.ez-p.z)\/3;\r\n  const c=Math.cos(POSE.angle),s=Math.sin(POSE.angle);\r\n  const angle=lerp(POSE.angle,-Math.PI\/3,PACK.settle),ac=Math.cos(angle),as=Math.sin(angle);\r\n  const endHandle=lerp(d,Math.min(d,.40),PACK.settle);\r\n  const ax=p.x,az=p.z,bx=ax+ac*d,bz=az+as*d,cx1=POSE.ex-c*endHandle,cz1=POSE.ez-s*endHandle;\r\n  for(let i=1;i<=96;i++){\r\n    const t=i\/96,u=1-t;\r\n    add(u*u*u*ax+3*u*u*t*bx+3*u*t*t*cx1+t*t*t*POSE.ex,\r\n      u*u*u*az+3*u*u*t*bz+3*u*t*t*cz1+t*t*t*POSE.ez);\r\n  }\r\n  contactLength=0;\r\n  for(let i=0;i<CONTACT.length;i++){\r\n    if(i)contactLength+=Math.hypot(CONTACT[i].x-CONTACT[i-1].x,CONTACT[i].z-CONTACT[i-1].z);\r\n    CONTACT[i].a=contactLength;\r\n  }\r\n}\r\nconst CIRCLE={r:0,l1:0,l2:0,arc:0};\r\nfunction regularLoop(){\r\n  const localAngle=POSE.angle-HEAD.angle,c=Math.cos(localAngle),s=Math.sin(localAngle),a=localAngle+Math.PI*2;\r\n  const ox=POSE.ex-WRAP.s0,dx=HEAD.c*ox+HEAD.s*POSE.ez,z=-HEAD.s*ox+HEAD.c*POSE.ez,length=TAIL.start-POSE.guide;\r\n  const r=(length-dx-(1-c)*z\/s)\/(a-s-(1-c)*(1-c)\/s);\r\n  const l2=(z-r*(1-c))\/s,l1=dx-r*s-l2*c;\r\n  CIRCLE.r=r;CIRCLE.l1=l1;CIRCLE.l2=l2;CIRCLE.arc=r*a;\r\n}\r\nconst REGULAR=[0,0];\r\nfunction regularPoint(a){\r\n  if(a<=CIRCLE.l1){REGULAR[0]=WRAP.s0+a;REGULAR[1]=0;return}\r\n  const arc=Math.min(CIRCLE.arc,a-CIRCLE.l1),angle=arc\/CIRCLE.r;\r\n  REGULAR[0]=WRAP.s0+CIRCLE.l1+CIRCLE.r*Math.sin(angle);\r\n  REGULAR[1]=CIRCLE.r*(1-Math.cos(angle));\r\n  if(a>CIRCLE.l1+CIRCLE.arc){\r\n    const d=a-CIRCLE.l1-CIRCLE.arc;REGULAR[0]+=d*Math.cos(POSE.angle-HEAD.angle);REGULAR[1]+=d*Math.sin(POSE.angle-HEAD.angle);\r\n  }\r\n}\r\nconst RAW={n:385,x:new Float64Array(385),z:new Float64Array(385),a:new Float64Array(385),\r\n  dx:new Float64Array(385),dz:new Float64Array(385),r:new Float64Array(385),limit:new Float64Array(385),weight:new Float64Array(385),px:new Float64Array(385),pz:new Float64Array(385),span:.1};\r\n\/* Vincolo unilaterale: nessuna sagoma del fascio viene trasferita al nastro\r\n   libero. Solo i punti che raggiungono la superficie ricevono una reazione. *\/\r\nconst SURFACE={x:0,z:0};\r\nfunction contactPoint(x,z,padding=.150+WRAP.clearance){\r\n  const px=x-WRAP.cx,pz=z-WRAP.cz,radius=Math.hypot(px,pz),R=WRAP.cornerRadius;\r\n  const rr=WRAP.cableRadius+padding,ax=Math.abs(px),az=Math.abs(pz),h=Math.sqrt(3)\/2;\r\n  const c=(az<=ax\/Math.sqrt(3)?ax:ax*.5+az*h)\/Math.max(radius,1e-10);\r\n  const s=(az<=ax\/Math.sqrt(3)?az:Math.abs(ax*h-az*.5))\/Math.max(radius,1e-10);\r\n  const limit=s*(R+rr*h)<=c*rr*.5?R*c+Math.sqrt(Math.max(0,rr*rr-R*R*s*s)):\r\n    (R*h+rr)\/(h*c+.5*s);\r\n  if(radius<limit){const safe=Math.max(radius,1e-10);x=WRAP.cx+(radius?px\/safe:1)*limit;z=WRAP.cz+pz\/safe*limit}\r\n  SURFACE.x=x;SURFACE.z=z;SURFACE.limit=limit;\r\n}\r\nconst RELAX={x:new Float64Array(385),z:new Float64Array(385),nx:new Float64Array(385),nz:new Float64Array(385)};\r\n\/* I due capi del giro sono vincolati anche in direzione: alla radice il nastro\r\n   esce dalla testa lungo il proprio asse, all'altro capo vi rientra lungo\r\n   l'asse del passaggio. Bloccare solo il punto finale non basta: la curva ci\r\n   arriverebbe di traverso e il nastro mostrerebbe uno spigolo, come spezzato.\r\n   Fissando anche il campione precedente si fissa la tangente, e il resto del\r\n   giro ci si raccorda da solo con la rilassatura. *\/\r\nfunction anchorEnds(x,z){\r\n  const d=RAW.span,n=RAW.n,c=Math.cos(POSE.angle),s=Math.sin(POSE.angle);\r\n  x[0]=WRAP.s0;z[0]=0;x[1]=WRAP.s0+d*HEAD.c;z[1]=d*HEAD.s;\r\n  x[n-1]=POSE.ex;z[n-1]=POSE.ez;x[n-2]=POSE.ex-d*c;z[n-2]=POSE.ez-d*s;\r\n}\r\nfunction contactLengthAt(amount,write=false){\r\n  let x=RELAX.x,z=RELAX.z,nx=RELAX.nx,nz=RELAX.nz,contacts=0;\r\n  for(let i=0;i<RAW.n;i++){\r\n    const candidate=RAW.r[i]+amount*RAW.weight[i],radius=Math.max(RAW.limit[i],candidate);\r\n    x[i]=WRAP.cx+RAW.dx[i]*radius;z[i]=WRAP.cz+RAW.dz[i]*radius;\r\n    if(candidate<RAW.limit[i])contacts++;\r\n  }\r\n  anchorEnds(x,z);\r\n  \/* La reazione di contatto si distribuisce con una flessione morbida ai\r\n     punti vicini; i tratti liberi non vengono interpolati verso un esagono. *\/\r\n  \/\/ La trazione elimina la pancia libera e distribuisce la curvatura sui\r\n  \/\/ campioni vicini. Il vincolo di contatto viene ripristinato ad ogni passo.\r\n  const passes=18+Math.round(18*PACK.settle);\r\n  for(let pass=0;pass<passes;pass++){\r\n    nx.set(x);nz.set(z);\r\n    \/* Stencil sui primi vicini: con i secondi vicini i campioni pari e quelli\r\n       dispari formano due reticoli indipendenti e il nastro si increspa. *\/\r\n    for(let i=2;i<RAW.n-2;i++){\r\n      const sx=x[i]+.46*((x[i-1]+x[i+1])*.5-x[i]),sz=z[i]+.46*((z[i-1]+z[i+1])*.5-z[i]);\r\n      contactPoint(sx,sz);nx[i]=SURFACE.x;nz[i]=SURFACE.z;\r\n      \/\/ Local tension seats the flexible root independently of head rotation.\r\n      \/\/ Preserve the rigid exit tangent, then distribute bending over the band.\r\n      const rootSeat=.16*PACK.settle*smooth((i-1)\/12)*(1-smooth((i-40)\/35));\r\n      if(rootSeat>0){\r\n        const dx=nx[i]-WRAP.cx,dz=nz[i]-WRAP.cz,r=Math.hypot(dx,dz);\r\n        const seated=lerp(r,Math.min(r,SURFACE.limit),rootSeat);\r\n        nx[i]=WRAP.cx+dx*seated\/r;nz[i]=WRAP.cz+dz*seated\/r;\r\n      }\r\n    }\r\n    [x,nx]=[nx,x];[z,nz]=[nz,z];anchorEnds(x,z);\r\n  }\r\n  let length=0;\r\n  for(let i=0;i<RAW.n;i++){\r\n    if(i)length+=Math.hypot(x[i]-x[i-1],z[i]-z[i-1]);\r\n    if(write){RAW.px[i]=x[i];RAW.pz[i]=z[i];RAW.a[i]=length}\r\n  }\r\n  if(write)PATH.contactCount=contacts;\r\n  return length;\r\n}\r\nfunction buildPath(loose){\r\n  if(family().flat)return buildParallelPath(loose);\r\n  \/* Rami della testa indipendenti. Il ramo inferiore nasce dalla testa ed e'\r\n     solidale alla scocca: nessuna rotazione della testa, nessun gomito, il\r\n     nastro prosegue rettilineo e tangente alla faccia del fascio. Tutta la\r\n     flessione sta nel giro attorno al fascio e nel ramo di ritorno, che si\r\n     raccorda al foro con una curva ampia a curvatura continua. *\/\r\n  if(!FEED.end)initLoop();\r\n  PATH.r=loose;\r\n  const pull=clamp(1-loose\/WRAP.open),feed=lerp(FEED.start,FEED.end,pull);\r\n  headTilt(pull);\r\n  TAIL.memory=tailMemory(feed);rigidPose(feed);\r\n  const length=TAIL.start-POSE.guide;\r\n  \/* Il serraggio stringe l'anello: il fascio scorre sotto il ramo inferiore\r\n     verso la testa, il contorno passa da tondo a esagono raggiato e il gioco\r\n     residuo si ricava dalla lunghezza di nastro disponibile. *\/\r\n  LOOP.t=pull;let lo=0,hi=9;\r\n  for(let i=0;i<28;i++){const mid=(lo+hi)*.5;if(loopAt(mid)<length)lo=mid;else hi=mid}\r\n  const actual=loopAt((lo+hi)*.5);PACK.settle=smooth(pull);\r\n  PATH.arcError=actual-length;PATH.len=TAIL.start;PATH.guide=length;PATH.ds=TAIL.start\/(WRAP.n-1);\r\n  const X=LOOP.x,Z=LOOP.z,A=LOOP.a;let j=0;\r\n  for(let i=0;i<WRAP.n;i++){\r\n    const a=i*PATH.ds;\r\n    if(a>=length){PATH.x[i]=POSE.ex+(a-length)*Math.cos(POSE.angle);PATH.z[i]=POSE.ez+(a-length)*Math.sin(POSE.angle);continue}\r\n    const value=a\/length*actual;\r\n    while(j<X.length-2&&A[j+1]<value)j++;\r\n    const f=(value-A[j])\/Math.max(1e-12,A[j+1]-A[j]);\r\n    PATH.x[i]=lerp(X[j],X[j+1],f);PATH.z[i]=lerp(Z[j],Z[j+1],f);\r\n  }\r\n  for(let i=0;i<WRAP.n;i++){\r\n    const lo=Math.max(0,i-1),hi=Math.min(WRAP.n-1,i+1),dx=PATH.x[hi]-PATH.x[lo],dz=PATH.z[hi]-PATH.z[lo],r=Math.hypot(dx,dz);\r\n    PATH.c[i]=dx\/r;PATH.s[i]=dz\/r;\r\n  }\r\n  PATH.c[0]=1;PATH.s[0]=0;PATH.c[WRAP.n-1]=Math.cos(POSE.angle);PATH.s[WRAP.n-1]=Math.sin(POSE.angle);\r\n}\r\n\/* Anello chiuso: faccia del nastro sul fascio (sezione a nido d'ape, quindi\r\n   un esagono raggiato). Con gioco d il contorno si allarga restando tangente\r\n   al ramo inferiore, e cresce il raggio degli spigoli: l'anello largo e'\r\n   tondo, quello serrato copia il fascio. *\/\r\nconst LOOP={pad:.16,bz:0,t:1,round:.18,tightX:-16.8,openX:-13.95,reach:2.7,reachOpen:6.2,handle:1.05,x:[],z:[],k:[],a:[]};\r\nfunction loopPad(){const m=mold();return m&&!m.flat?Math.max(m.thick*.5,m.thick*.4+m.rackH)+.014:.16}\r\n\/* Coda inclinata permanente: la piega di stampo resta anche dopo il\r\n   passaggio nella testa. Il tratto che esce e' dritto e coassiale al foro\r\n   fino alla quota della piega, poi prosegue inclinato come nel pezzo reale. *\/\r\nfunction tailMemory(){return 1}\r\n\/* Durante il serraggio la testa passa da dritta a leggermente inclinata\r\n   verso il fascio: ruota attorno all'attacco del ramo inferiore, che resta\r\n   rettilineo e appoggiato ai cavi; la flessione sta tutta nel colletto. *\/\r\nconst TILT=-.10;\r\nfunction headTilt(pull){HEAD.angle=TILT*smooth(pull);HEAD.c=Math.cos(HEAD.angle);HEAD.s=Math.sin(HEAD.angle)}\r\nfunction loopAt(s){\r\n  const bx=lerp(LOOP.openX,LOOP.tightX,ease(LOOP.t)),bz=LOOP.bz;\r\n  WRAP.cx=bx;WRAP.cz=bz;return loopShape(bx,Math.max(0,s));\r\n}\r\n\/* Contorno in coordinate polari attorno al fascio: raggio del vincolo di\r\n   contatto piu' il gioco. Il gioco e' nullo sulla faccia superiore, dove il\r\n   ramo inferiore resta appoggiato e rettilineo, e cresce verso il fondo; con\r\n   gioco l'anello si arrotonda verso il cerchio circoscritto. *\/\r\nfunction loopShape(bx,s){\r\n  const X=LOOP.x,Z=LOOP.z,K=LOOP.k,A=LOOP.a;X.length=Z.length=K.length=A.length=0;\r\n  const add=(x,z,k)=>{X.push(x);Z.push(z);K.push(k)};\r\n  const cz=WRAP.cz,top=-Math.PI\/2,rmax=WRAP.cornerRadius+WRAP.cableRadius+LOOP.pad,round=.8*smooth(s\/1.4),grow=.55*s;\r\n  add(WRAP.s0,0,0);const tilt=HEAD.angle>1e-6;\r\n  const n=720,first=Math.atan2(-cz,WRAP.s0-bx)>top?0:0;\r\n  for(let i=0;i<=n;i++){\r\n    const phi=top+i\/n*Math.PI*2,c=Math.cos(phi),sn=Math.sin(phi);\r\n    contactPoint(bx+c*.001,cz+sn*.001,LOOP.pad);const env=SURFACE.limit;\r\n    const off=Math.abs(Math.atan2(Math.sin(phi-top),Math.cos(phi-top))),w=smooth((off-Math.PI\/6)\/(Math.PI\/2.2));\r\n    const r=env+w*(round*(rmax-env)+grow),x=bx+c*r,z=cz+sn*r;\r\n    if(i===0&&x<WRAP.s0)continue;\r\n    if(X.length===1&&x<=WRAP.s0)continue;\r\n    add(x,z,0);\r\n  }\r\n  if(tilt){\r\n    \/* tangente dalla radice al contorno: la prima retta che, ruotando dalla\r\n       testa verso il fascio, tocca il contorno; il tratto prima e' sostituito\r\n       dal ramo rettilineo *\/\r\n    let best=1,ang=Infinity;\r\n    for(let i=1;i<X.length*.3;i++){if(X[i]<=WRAP.s0+.05)continue;const a=Math.atan2(Z[i],X[i]-WRAP.s0);if(a<ang){ang=a;best=i}}\r\n    if(best>1){X.splice(1,best-1);Z.splice(1,best-1);K.splice(1,best-1)}\r\n  }\r\n  \/* curvatura discreta per la continuita' G2 del raccordo *\/\r\n  for(let i=1;i<X.length-1;i++){\r\n    const ax=X[i]-X[i-1],az=Z[i]-Z[i-1],bx2=X[i+1]-X[i],bz=Z[i+1]-Z[i],la=Math.hypot(ax,az),lb=Math.hypot(bx2,bz);\r\n    K[i]=2*(ax*bz-az*bx2)\/Math.max(1e-9,la*lb*(la+lb))*1;\r\n  }\r\n  \/* Punto di distacco: il primo punto del ramo di ritorno a distanza\r\n     \"reach\" dall'imbocco. La ricerca parte dall'arco inferiore sinistro,\r\n     quindi il punto scorre con continuita' mentre il fascio si stringe. *\/\r\n  const ex=POSE.ex,ez=POSE.ez,start=Math.floor(X.length*.5),reach=lerp(LOOP.reachOpen,LOOP.reach,smooth(LOOP.t));let cut=X.length-1,f=1;\r\n  let dPrev=Math.hypot(X[start]-ex,Z[start]-ez);\r\n  if(dPrev<=reach){cut=start;f=0}\r\n  else for(let i=start+1;i<X.length;i++){\r\n    const di=Math.hypot(X[i]-ex,Z[i]-ez);\r\n    if(di<=reach){cut=i;f=(dPrev-reach)\/Math.max(1e-9,dPrev-di);break}\r\n    dPrev=di;\r\n  }\r\n  const i0=Math.max(1,cut),px=lerp(X[i0-1],X[i0],f),pz=lerp(Z[i0-1],Z[i0],f);\r\n  let tx=X[i0]-X[i0-1],tz=Z[i0]-Z[i0-1];const tl=Math.hypot(tx,tz)||1;tx\/=tl;tz\/=tl;\r\n  const kappa=Math.max(0,K[i0]);X.length=Z.length=K.length=i0;add(px,pz,kappa);\r\n  \/* Raccordo quintico di Hermite: tangente e curvatura continue sul fascio,\r\n     curvatura nulla all'imbocco, dove il nastro e' gia' coassiale al foro. *\/\r\n  const qx=Math.cos(POSE.angle),qz=Math.sin(POSE.angle),chord=Math.hypot(ex-px,ez-pz),m=chord*LOOP.handle;\r\n  const v0x=tx*m,v0z=tz*m,v1x=qx*m,v1z=qz*m,a0x=-tz*kappa*m*m,a0z=tx*kappa*m*m;\r\n  for(let i=1;i<=96;i++){\r\n    const t=i\/96,t2=t*t,t3=t2*t,t4=t3*t,t5=t4*t;\r\n    const h0=1-10*t3+15*t4-6*t5,h1=t-6*t3+8*t4-3*t5,h2=.5*t2-1.5*t3+1.5*t4-.5*t5,h4=-4*t3+7*t4-3*t5,h5=10*t3-15*t4+6*t5;\r\n    add(h0*px+h1*v0x+h2*a0x+h4*v1x+h5*ex,h0*pz+h1*v0z+h2*a0z+h4*v1z+h5*ez,0);\r\n  }\r\n  \/* Vincolo unilaterale sul fascio reale: il nastro non entra mai nei cavi. *\/\r\n  for(let i=1;i<X.length-1;i++){contactPoint(X[i],Z[i],LOOP.pad);X[i]=SURFACE.x;Z[i]=SURFACE.z}\r\n  let length=0;A.push(0);\r\n  for(let i=1;i<X.length;i++){length+=Math.hypot(X[i]-X[i-1],Z[i]-Z[i-1]);A.push(length)}\r\n  return length;\r\n}\r\nfunction headClear(bx){\r\n  WRAP.cx=bx;WRAP.cz=LOOP.bz;const [left,support,top]=specialHeadSupport(),right=Math.min(support,WRAP.s0);\r\n  const test=(x,z,pad)=>{const [sx,sz]=seatPoint(x,z);contactPoint(sx,sz,pad);return Math.hypot(SURFACE.x-sx,SURFACE.z-sz)<=1e-6};\r\n  \/* Conta la sola scocca: le leve che si stendono sul ramo inferiore ne\r\n     seguono la faccia e non spostano il fascio. *\/\r\n  for(let j=0;j<=24;j++)if(!test(lerp(left,right,j\/24),top,.03))return false;\r\n  for(let j=0;j<=10;j++)if(!test(WRAP.slotX,WRAP.guide+j*.06,LOOP.pad+.03))return false;\r\n  return true;\r\n}\r\nfunction initLoop(){\r\n  headTilt(1);LOOP.pad=loopPad();LOOP.bz=WRAP.cornerRadius*Math.sqrt(3)\/2+WRAP.cableRadius+LOOP.pad;\r\n  \/* Fine corsa: il fascio scorre sotto il ramo inferiore fino a portare lo\r\n     spigolo del contorno a ridosso della testa, senza compenetrarla. *\/\r\n  let lo=-26,hi=-8;\r\n  for(let i=0;i<34;i++){const mid=(lo+hi)*.5;if(headClear(mid))hi=mid;else lo=mid}\r\n  LOOP.tightX=hi+.02;LOOP.openX=Math.max(-13.95,LOOP.tightX+2.5);\r\n  PACK.tightX=LOOP.tightX;PACK.tightZ=LOOP.bz;\r\n  TAIL.memory=1;headTilt(1);rigidPose(TAIL.start);const through2=TAIL.start-POSE.guide;\r\n  LOOP.t=1;const tight=loopAt(0);FEED.end=TAIL.start+tight-through2;\r\n  rigidPose(FEED.end);TAIL.memory=1;\r\n}\r\nconst FRAME=[0,0,1,0];\r\nfunction pathFrame(a){\r\n  if(family().flat&&a>=PARALLEL.length){\r\n    FRAME[0]=PARALLEL.entry+a-PARALLEL.length;FRAME[1]=PARALLEL.z;FRAME[2]=1;FRAME[3]=0;return;\r\n  }\r\n  if(family().flat&&a>0){\r\n    const value=Math.min(a,TAIL.length),t=value\/PATH.ds,i=Math.min(WRAP.n-2,Math.floor(t)),f=t-i;\r\n    FRAME[0]=lerp(PATH.x[i],PATH.x[i+1],f);FRAME[1]=lerp(PATH.z[i],PATH.z[i+1],f);\r\n    const c=lerp(PATH.c[i],PATH.c[i+1],f),s=lerp(PATH.s[i],PATH.s[i+1],f),d=Math.hypot(c,s);\r\n    FRAME[2]=c\/d;FRAME[3]=s\/d;if(a>value){FRAME[0]+=(a-value)*FRAME[2];FRAME[1]+=(a-value)*FRAME[3]}return;\r\n  }\r\n  if(a<=0){FRAME[0]=WRAP.s0+a*HEAD.c;FRAME[1]=a*HEAD.s;FRAME[2]=HEAD.c;FRAME[3]=HEAD.s;return}\r\n  if(a>=PATH.guide){\r\n    const c=Math.cos(POSE.angle),s=Math.sin(POSE.angle);\r\n    FRAME[0]=POSE.ex+(a-PATH.guide)*c;FRAME[1]=POSE.ez+(a-PATH.guide)*s;FRAME[2]=c;FRAME[3]=s;return;\r\n  }\r\n  const t=a\/PATH.ds,i=Math.min(WRAP.n-2,Math.floor(t)),f=t-i;\r\n  FRAME[0]=lerp(PATH.x[i],PATH.x[i+1],f);FRAME[1]=lerp(PATH.z[i],PATH.z[i+1],f);\r\n  const c=lerp(PATH.c[i],PATH.c[i+1],f),s=lerp(PATH.s[i],PATH.s[i+1],f),r=Math.hypot(c,s);\r\n  FRAME[2]=c\/r;FRAME[3]=s\/r;\r\n}\r\nfunction bodyFrame(a,formed){\r\n  const lim=Math.min(a,formed);pathFrame(lim);\r\n  if(a>formed){FRAME[0]+=(a-lim)*FRAME[2];FRAME[1]+=(a-lim)*FRAME[3]}\r\n}\r\n\/\/ Distribute curvature over a moving flex zone instead of a rigid hinge.\r\n\/\/ The fully formed path is untouched, including the validated final closure.\r\nconst FORM={formed:NaN,r:NaN,x:new Float64Array(1025),z:new Float64Array(1025),angle:new Float64Array(1025)};\r\nfunction formingFrame(a,formed){\r\n  if(FORM.formed!==formed||FORM.r!==PATH.r||FORM.kind!==selectedType||FORM.head!==selectedHead){\r\n    FORM.formed=formed;FORM.r=PATH.r;FORM.kind=selectedType;FORM.head=selectedHead;\r\n    const centre=lerp(-1,TAIL.length+4,clamp(formed\/TAIL.start)),ds=PATH.ds;\r\n    let previous=Math.atan2(PATH.s[0],PATH.c[0]),angle=0;\r\n    FORM.x[0]=WRAP.s0;FORM.z[0]=0;FORM.angle[0]=0;\r\n    for(let i=1;i<WRAP.n;i++){\r\n      const current=Math.atan2(PATH.s[i],PATH.c[i]);\r\n      const turn=Math.atan2(Math.sin(current-previous),Math.cos(current-previous));previous=current;\r\n      const old=angle;angle+=turn*smooth((centre+5-i*ds)\/10);\r\n      FORM.angle[i]=angle;FORM.x[i]=FORM.x[i-1]+ds*Math.cos((old+angle)*.5);FORM.z[i]=FORM.z[i-1]+ds*Math.sin((old+angle)*.5);\r\n    }\r\n  }\r\n  const t=clamp(a\/PATH.ds,0,WRAP.n-1),i=Math.min(WRAP.n-2,Math.floor(t)),f=t-i,angle=lerp(FORM.angle[i],FORM.angle[i+1],f);\r\n  FRAME[0]=lerp(FORM.x[i],FORM.x[i+1],f);FRAME[1]=lerp(FORM.z[i],FORM.z[i+1],f);FRAME[2]=Math.cos(angle);FRAME[3]=Math.sin(angle);\r\n}\r\nfunction frameAt(a,formed=wrap*TAIL.start){\r\n  if(family().flat&&formed>1e-9){\r\n    if(formed<TAIL.start-1e-8){formingFrame(a,formed);return}\r\n    const fullFormed=formed\/TAIL.start*TAIL.length;\r\n    bodyFrame(a,fullFormed);\r\n    \/\/ The preformed end straightens before reaching the parallel channel.\r\n    if(a>TAIL.start&&fullFormed<TAIL.start){\r\n      const memory=1-smooth(fullFormed\/(TAIL.length*.72));\r\n      if(memory>0){freePoint(a);const z=REST[1]*memory,c=FRAME[2],s=FRAME[3],angle=REST[2]*memory;FRAME[0]-=s*z;FRAME[1]+=c*z;FRAME[2]=c*Math.cos(angle)-s*Math.sin(angle);FRAME[3]=s*Math.cos(angle)+c*Math.sin(angle)}\r\n    }\r\n    return;\r\n  }\r\n  if(a<=TAIL.start){bodyFrame(a,formed);return}\r\n  bodyFrame(TAIL.start,formed);\r\n  const x=FRAME[0],z=FRAME[1],c=FRAME[2],s=FRAME[3];freePoint(a);\r\n  const dx=REST[0]-TAIL.start,dz=REST[1],ca=Math.cos(REST[2]),sa=Math.sin(REST[2]);\r\n  FRAME[0]=x+c*dx-s*dz;FRAME[1]=z+s*dx+c*dz;\r\n  FRAME[2]=c*ca-s*sa;FRAME[3]=s*ca+c*sa;\r\n}\r\nfunction bendable(o,axial){\r\n  const pos=o.geometry.attributes.position,nor=o.geometry.attributes.normal;\r\n  pos.setUsage(T.DynamicDrawUsage);nor.setUsage(T.DynamicDrawUsage);\r\n  o.userData.rp=Float32Array.from(pos.array);o.userData.rn=Float32Array.from(nor.array);\r\n  o.userData.axial=Float64Array.from(axial);o.userData.material=new Float64Array(axial.length*4);\r\n  for(let i=0;i<axial.length;i++){\r\n    const x=axial[i],a=Math.atan(slope(x)),c=Math.cos(a),s=Math.sin(a),k=i*3;\r\n    o.userData.material.set([materialDistance(x),-(pos.array[k]-x)*s+(pos.array[k+2]-bend(x))*c,c,s],i*4);\r\n  }\r\n  o.frustumCulled=false;deformable.push(o);return o;\r\n}\r\nfunction follower(o,x,y,z){followers.push({o,x,y,z});return o}\r\nfunction deform(){\r\n  const formed=wrap*TAIL.start;\r\n  \/* La curvatura preformata della coda resta invariata in tutte le fasi. *\/\r\n  for(const o of deformable){\r\n    const rp=o.userData.rp,rn=o.userData.rn,material=o.userData.material;\r\n    const pos=o.geometry.attributes.position.array,nor=o.geometry.attributes.normal.array;\r\n    if(!wrap){pos.set(rp);nor.set(rn)}\r\n    else{\r\n      let mark=NaN;\r\n      for(let i=0,j=0;i<rp.length;i+=3,j+=4){\r\n        const a=material[j];if(a!==mark){mark=a;frameAt(a,formed)}\r\n        const z=material[j+1],c=FRAME[2],s=FRAME[3],rc=material[j+2],rs=material[j+3];\r\n        pos[i]=FRAME[0]-s*z;pos[i+1]=rp[i+1];pos[i+2]=FRAME[1]+c*z;\r\n        const dc=c*rc+s*rs,ds=s*rc-c*rs;\r\n        nor[i]=rn[i]*dc-rn[i+2]*ds;nor[i+1]=rn[i+1];nor[i+2]=rn[i]*ds+rn[i+2]*dc;\r\n      }\r\n    }\r\n    o.geometry.attributes.position.needsUpdate=true;o.geometry.attributes.normal.needsUpdate=true;\r\n  }\r\n  for(const f of followers){\r\n    frameAt(materialDistance(f.x),formed);\r\n    f.o.position.set(FRAME[0]-FRAME[3]*f.z,f.y,FRAME[1]+FRAME[2]*f.z);\r\n    f.o.rotation.set(0,-Math.atan2(FRAME[3],FRAME[2]),0);\r\n  }\r\n  for(let i=0;i<rack.count;i++){\r\n    frameAt(materialDistance(rack.x0+i*rack.dx),formed);\r\n    const c=FRAME[2],s=FRAME[3];\r\n    matrix.set(c,0,-s,FRAME[0]-s*rack.z,0,1,0,0,s,0,c,FRAME[1]+c*rack.z,0,0,0,1);\r\n    rack.mesh.setMatrixAt(i,matrix);\r\n  }\r\n  rack.mesh.instanceMatrix.needsUpdate=true;\r\n  \/* La linguetta cede leggermente al passaggio del nastro; la scocca della\r\n     testa resta ferma. La flessione e' limitata al contatto interno. *\/\r\n  \/* La linguetta non si stacca MAI dalla cremagliera ed e' solidale alla\r\n     scocca: non ruota, perche' la pendenza dei denti e' gia' nel suo piano\r\n     superiore. Sono i denti a scorrere sulla sua faccia. *\/\r\n  \/* La posa di equilibrio ruota insieme scocca, foro, attacco e coda. *\/\r\n  const head=model.getObjectByName('head-assembly');\r\n  if(head){\r\n    if(family().flat){head.position.set(0,0,0);head.rotation.set(0,0,0);slot.set((PARALLEL.entry+PARALLEL.exit)*.5,0,PARALLEL.z)}\r\n    else{const [x,z]=seatPoint(-20.14,0);head.position.set(x,0,z);head.rotation.set(0,-HEAD.angle,Math.PI\/2);const p=seatPoint(WRAP.slotX,.19);slot.set(p[0],0,p[1])}\r\n  }\r\n  \/* Il dente interno segue la cremagliera e la tocca sempre: la punta della\r\n     linguetta appoggia sulla cresta dei denti del nastro nel passaggio, sale\r\n     lungo la rampa di ogni dente e, superato lo spigolo, ricade di scatto\r\n     verso il vano successivo. La quota si calcola dal nastro reale (asse del\r\n     passaggio, piano della cremagliera, altezza del dente), non a occhio. *\/\r\n  if(head&&!family().flat){\r\n    const parts=head.children.filter(o=>\/locking-pawl|locking-tongue|pawl-tooth\/.test(o.name));\r\n    const main=parts.find(o=>\/locking-pawl|locking-tongue\/.test(o.name));\r\n    if(main){\r\n      for(const o of parts)if(o.userData.v0===undefined)o.userData.v0=o.position.y;\r\n      if(main.userData.top===undefined){main.geometry.computeBoundingBox();main.userData.top=main.geometry.boundingBox.max.y+main.userData.v0}\r\n      let shift=0;\r\n      if(wrap>=.999&&POSE.feed<TAIL.length){\r\n        const m=mold(),H=m?m.rackH:.067,r=ratchetPosition();\r\n        let k=1;\r\n        if(Number.isFinite(r)&&r>0&&r<rack.count){const f=r-Math.floor(r);k=.35+.65*(f<.82?f\/.82:(1-f)\/.18)}\r\n        const tip=-(WRAP.slotX+20.14+rack.z+H*k)-.004;\r\n        shift=tip-main.userData.top;\r\n      }\r\n      for(const o of parts)o.position.y=o.userData.v0+shift;\r\n    }\r\n  }\r\n  const fade=clamp(wrap\/.10);cables.visible=fade>0;\r\n  for(const material of cableMaterials){material.opacity=1;material.transparent=false;material.depthTest=true;material.depthWrite=true}\r\n}\r\nfunction placeBundle(){\r\n  bundle.set(WRAP.cx,0,WRAP.cz);cables.position.set(bundle.x,-2.0,bundle.z);\r\n  aim.set(bundle.x,0,bundle.z-1.8);\r\n}\r\nfunction setLoop(value,radius){\r\n  value=clamp(value);\r\n  if(value===wrap&&radius===PATH.r)return;\r\n  if(radius!==PATH.r)buildPath(radius);\r\n  wrap=value;placeBundle();deform();\r\n}\r\n\r\n\/* Ambiente di studio calcolato una volta: softbox principale in alto a sinistra,\r\n   due strisce verticali di controluce ai lati e una striscia lunga sopra il\r\n   nastro, che e' cio' che disegna il filo di luce per tutta la lunghezza.\r\n   Lo sfondo della scena resta nero pieno: la separazione la fanno i riflessi. *\/\r\nfunction studio(){\r\n  environment?.dispose();\r\n  const room=new T.Scene(),panels=[];room.background=new T.Color(0x000000);\r\n  function panel(a,b,k,x,y,z,color=0xffffff){\r\n    const o=new T.Mesh(new T.PlaneGeometry(a,b),new T.MeshBasicMaterial({\r\n      color:new T.Color(color).multiplyScalar(k),side:T.DoubleSide,toneMapped:false}));\r\n    o.position.set(x,y,z);o.lookAt(0,0,0);room.add(o);panels.push(o);\r\n  }\r\n  panel(16,8,3.2,-7,8,8,0xfff4e9);\r\n  panel(40,1.8,3.6,0,9,-3);\r\n  panel(1.5,26,7.6,-9,2,-5,0xecf2ff);\r\n  panel(1.5,26,6.0,9,1,-6,0xfff3e4);\r\n  panel(26,4,2.0,0,-3,-11,0xe4ecfa);\r\n  panel(30,15,.25,0,1,14,0xf2f6ff);\r\n  panel(20,5,.6,0,-8,3,0xb4bfd0);\r\n  const pmrem=new T.PMREMGenerator(renderer);\r\n  try{environment=pmrem.fromScene(room,.025);scene.environment=environment.texture}\r\n  finally{pmrem.dispose();panels.forEach(o=>{o.geometry.dispose();o.material.dispose()})}\r\n}\r\n\/* Product gallery: photographic drop shadow on an invisible backdrop that\r\n   always faces the camera, cast by a soft key light fixed to the view (upper\r\n   left, like a studio softbox). The shadow fades out when the tie is turned\r\n   edge-on, so orbiting never reveals the catcher. Gallery box only. *\/\r\nlet shadowRig=null;\r\n\/\/ Gallery box: light grey studio. Full screen: the original black stage.\r\nfunction backdrop(){const full=!embedCompact();document.documentElement.classList.toggle('cfs3d-full',full);if(renderer)renderer.setClearColor(full?0x000000:0xf8f8f8,1)}\r\nfunction makeShadowRig(){\r\n  renderer.shadowMap.enabled=true;renderer.shadowMap.type=T.VSMShadowMap;renderer.shadowMap.autoUpdate=true;\r\n  const l=new T.DirectionalLight(0xfff8f0,0);l.castShadow=false;\r\n  l.shadow.mapSize.set(1024,1024);l.shadow.radius=9;l.shadow.blurSamples=16;l.shadow.bias=-.0004;\r\n  scene.add(l,l.target);\r\n  const m=keep(new T.ShadowMaterial({color:0x14171c,opacity:.24,transparent:true,depthWrite:false}));\r\n  const g=keep(new T.PlaneGeometry(1,1)),plane=new T.Mesh(g,m);plane.receiveShadow=true;plane.renderOrder=-1;plane.frustumCulled=false;\r\n  scene.add(plane);shadowRig={light:l,plane,material:m,owner:null,c:new T.Vector3(),n:new T.Vector3(),u:new T.Vector3(),r:new T.Vector3(),box:new T.Box3()};\r\n}\r\nfunction placeShadow(){\r\n  const S=shadowRig;if(!S||!model)return;\r\n  const on=embedCompact()&&!model.userData.installing;\r\n  S.plane.visible=on;S.light.castShadow=on;S.light.intensity=on?.85:0;if(!on)return;\r\n  if(S.owner!==model){S.owner=model;model.traverse(o=>{if(o.isMesh)o.castShadow=true});if(cables)cables.traverse(o=>{if(o.isMesh)o.castShadow=false})}\r\n  const b=model.userData.restBounds;if(!b)return;\r\n  S.box.copy(b).applyMatrix4(model.matrixWorld);S.box.getCenter(S.c);const R=Math.max(1,S.box.getSize(S.n).length()*.5);\r\n  vA.copy(camera.position).sub(S.c).normalize();\r\n  S.u.set(0,1,0).applyQuaternion(camera.quaternion);S.r.set(1,0,0).applyQuaternion(camera.quaternion);\r\n  \/\/ backdrop just behind the part, square to the lens\r\n  S.plane.position.copy(S.c).addScaledVector(vA,-Math.max(1.2,R*.09));S.plane.quaternion.copy(camera.quaternion);S.plane.scale.setScalar(R*4);\r\n  S.light.target.position.copy(S.c);S.light.target.updateMatrixWorld();\r\n  S.light.position.copy(S.c).addScaledVector(vA,R*1.6).addScaledVector(S.u,R*.62).addScaledVector(S.r,-R*.38);\r\n  const cam=S.light.shadow.camera,e=R*1.15;\r\n  if(cam.right!==e){cam.left=-e;cam.right=e;cam.top=e;cam.bottom=-e;cam.near=.1;cam.far=R*5;cam.updateProjectionMatrix()}\r\n  \/\/ fade when the broad face turns away from the lens\r\n  S.n.set(0,0,1).applyQuaternion(model.quaternion);const f=Math.abs(S.n.dot(vA));\r\n  S.material.opacity=.34*clamp((f-.35)\/.45);\r\n}\r\nfunction light(color,power,x,y,z){const l=new T.DirectionalLight(color,power);l.position.set(x,y,z);scene.add(l);return l}\r\n\/* Tre luci solidali alla camera: due controluce a 135 gradi che disegnano il\r\n   profilo da qualsiasi angolo di vista, anche quando la timeline passa dietro\r\n   al pezzo, e una luce di lucido appena fuori asse che accende le facce\r\n   rivolte verso chi guarda. *\/\r\nfunction placeEdges(){\r\n  vA.copy(camera.position).sub(controls.target).normalize();\r\n  vB.copy(vA).applyAxisAngle(axis,2.36).setY(.42).normalize().multiplyScalar(60);\r\n  edgeA.position.copy(vB);\r\n  vB.copy(vA).applyAxisAngle(axis,-2.36).setY(-.16).normalize().multiplyScalar(60);\r\n  edgeB.position.copy(vB);\r\n  vB.copy(vA).applyAxisAngle(axis,.30);vB.y+=.26;\r\n  gloss.position.copy(vB.normalize().multiplyScalar(60));\r\n}\r\n\r\n\/* Keyframe: [scroll, ascissa inquadrata, campo, direzione camera, spazio testo,\r\n   peso verso il centro del fascio]. *\/\r\nconst KEYS=[\r\n  [0,0,0,[.04,.22,1],0,0],[.025,-3,36,[.02,.12,1],0,0],\r\n  [.15,-20.14,4.2,[-.28,-.45,1],1,0],[.23,-20.14,4.2,[-.16,-.58,1],1,0],\r\n  [.29,-11,8.0,[-.12,-.65,1],0,0],[.39,11,8.0,[.12,-.65,1],0,0],\r\n  [.45,18.7,5.2,[.35,-.65,1],1,0],[.49,18.7,4.8,[.30,-.72,.9],1,0],\r\n  [.55,18.7,5.8,[.30,-1,.30],1,0],\r\n  [.61,18.9,3.5,[.18,-.48,1],1,0],[.69,18.9,3.5,[.24,-.58,1],1,0],\r\n  [.72,0,0,[.08,.16,1],0,0],[.76,-2,40,[.10,.40,.8],0,0],\r\n  \/\/ Four supplied frames, shared by every tie family. +Y is the visible\r\n  \/\/ cable end; crossing +Z to -Z moves that end from screen right to left.\r\n  \/\/ Wrapping: hold a medium shot on the bundle, almost along the cables, so the\r\n  \/\/ strap body is seen closing its loop around them.\r\n  [.79,0,27,[-.60,.80,.85],.55,1,0],\r\n  [.80,0,22,[-.60,.80,.85],.7,1,0],\r\n  [.832,0,21,[-.60,.80,.85],.8,1,0],\r\n  \/\/ Push in before the tip reaches the aperture; keep its approach in frame.\r\n  [.843,-20.14,7.2,[-.60,.80,.85],1,0,1],\r\n  [.846,-20.14,6.6,[-.60,.80,.85],1,0,1],\r\n  [.858,-20.14,6.6,[-.60,.80,.85],1,0,1],\r\n  [.864,-20.14,6.8,[-.60,.80,.85],1,0,1],\r\n  [.882,0,18,[-.65,1,.15],.85,1,.25],\r\n  [.896,0,24,[-.60,.98,-.04],.85,1,0],\r\n  [.928,0,25,[-.42,.65,-1],.85,1,0],\r\n  [.938,0,23,[-.42,.65,-1],.85,1,0],\r\n  \/\/ Descend under the outgoing strap while pushing toward the pawl.\r\n  [.957,-20.14,6.2,[.24,.65,-1],1,0,1],\r\n  [.972,-20.14,5.3,[.30,.65,-1],1,0,1],\r\n  [.98,-20.14,5.2,[.32,.67,-1],1,0,1],\r\n  [.985,0,25,[-.42,.65,-1],.85,1,0],\r\n  [1,0,25,[-.42,.65,-1],.85,1,0]\r\n];\r\nconst BASE_KEYS=KEYS.map(k=>k.map(v=>Array.isArray(v)?v.slice():v));\r\n\/\/ Shape-preserving cubic motion: continuous velocity through shot markers,\r\n\/\/ no overshoot and no full stop at each key. Pure time sampling also supports\r\n\/\/ reverse scrolling without accumulating drift or allocating scene objects.\r\nfunction cinemaSample(rows,value,column,component=-1,logarithmic=false){\r\n let i=0;while(i<rows.length-2&&value>rows[i+1][0])i++;\r\n const read=j=>{const cell=rows[j][column];const v=component<0?(cell??0):cell[component];return logarithmic?Math.log(Math.max(.001,v)):v};\r\n const slope=j=>(read(j+1)-read(j))\/(rows[j+1][0]-rows[j][0]);\r\n const tangent=j=>{\r\n  if(j===0||j===rows.length-1)return 0;\r\n  const a=slope(j-1),b=slope(j);if(a*b<=0)return 0;\r\n  const h0=rows[j][0]-rows[j-1][0],h1=rows[j+1][0]-rows[j][0];\r\n  const w0=2*h1+h0,w1=h1+2*h0;return (w0+w1)\/(w0\/a+w1\/b);\r\n };\r\n const h=rows[i+1][0]-rows[i][0],t=clamp((value-rows[i][0])\/h),t2=t*t,t3=t2*t;\r\n const v=(2*t3-3*t2+1)*read(i)+(t3-2*t2+t)*h*tangent(i)+(-2*t3+3*t2)*read(i+1)+(t3-t2)*h*tangent(i+1);\r\n return logarithmic?Math.exp(v):v;\r\n}\r\n\/\/ Fast travel between views, longer observation of insertion and tooth contact.\r\nconst TOUR_CUTS=[[0,0],[.75,.15],[1.8,.23],[2.45,.45],[3.6,.51],[4.25,.61],[5.4,.69],[6.2,.79],[6.7,.807],[7.4,.830],[9.0,.846],[9.6,.858],[10.3,.882],[10.7,.896],[11.5,.928],[11.8,.938],[12.6,.957],[14.2,.972],[15,.98],[15.5,.982],[16.9,.986],[18.3,.991],[19.2,.995],[21,1]];\r\nconst TOUR_DURATION=TOUR_CUTS[TOUR_CUTS.length-1][0];\r\n\/* \"Riproduci\": a short, even pause on Testa, Collare and Coda so each card\r\n   stays on screen about 2.3 s in total (pause + camera travel inside the zone),\r\n   the same pace as a step change of the installation. Scroll is unchanged. *\/\r\nconst TOUR_HOLD=1.2;\r\nfunction tourCuts(){\r\n const holds=[[1.25,.19,TOUR_HOLD],[3.0,.49,TOUR_HOLD],[4.8,.65,TOUR_HOLD]],out=[];let shift=0;\r\n for(const [t,v] of TOUR_CUTS){\r\n  while(holds.length&&holds[0][0]<t){const [ht,hv,hd]=holds.shift();out.push([ht+shift,hv]);shift+=hd;out.push([ht+shift,hv])}\r\n  out.push([t+shift,v]);\r\n }\r\n return out;\r\n}\r\n\r\nfunction segment(value){\r\n  let i=0;while(i<KEYS.length-2&&value>KEYS[i+1][0])i++;\r\n  const a=KEYS[i],b=KEYS[i+1];return [a,b,smooth((value-a[0])\/(b[0]-a[0]))];\r\n}\r\nfunction section(value,previous){\r\n  const zones=[[2,.13,.25],[0,.445,.535],[1,.60,.70],[3,.777,1]],old=zones.find(z=>z[0]===previous);\r\n  if(old&&value>=old[1]-.006&&value<=old[2]+.006)return previous;\r\n  return zones.find(z=>value>=z[1]&&value<=z[2])?.[0]??-1;\r\n}\r\n\/* Mobile: the canvas always fills the stage (nothing is cropped by the HUD).\r\n   The subject is framed inside the free band between the top bar and the card,\r\n   measured with the controls closed, so opening the controls never reframes. *\/\r\nlet zoneCache=null,zoneY=null,zoneFit=1,zoneSettling=false;\r\nfunction freeZone(){\r\n const st=root.style,px=k=>parseFloat(st.getPropertyValue(k))||0;\r\n if(!zoneCache||root.dataset.hud==='compact'){const sk=$('[data-action=\"skip\"]'),sr=sk?.offsetParent?sk.getBoundingClientRect():null,top=stage.getBoundingClientRect().top;const op=$('.cfs-open-product'),or=op&&op.offsetParent?op.getBoundingClientRect():null;zoneCache={head:Math.max(px('--cfs-head-h'),sr&&sr.height?sr.bottom-top:0,or&&or.height?or.bottom-top:0),foot:px('--cfs-foot-h')}}\r\n const open=card.classList.contains('is-open')&&active>=0&&dismissed!==active;\r\n \/\/ From the thermal finale on, reserve the card's maximum height: the range box and\r\n \/\/ the CTA can swap without the view gliding.\r\n const cardH=p>=.975?Math.max(card.offsetHeight,parseFloat(getComputedStyle(card).maxHeight)||0):card.offsetHeight;\r\n const top=Math.min(zoneCache.head||64,h*.2)+4;\r\n const bottom=h-Math.min(h*.62,(zoneCache.foot||72)+(open?cardH+10:0)+4);\r\n return [top,Math.max(top+h*.28,bottom)];\r\n}\r\nfunction compactFrame(dt){\r\n if(root.dataset.compact!=='true'){zoneY=null;zoneFit=1;zoneSettling=false;return 0}\r\n const [a,b]=freeZone(),target=h\/2-(a+b)\/2,fit=(b-a)\/h;\r\n if(zoneY===null||!dt){zoneY=target;zoneFit=fit}\r\n else{const k=1-Math.exp(-dt*7);zoneY+=(target-zoneY)*k;zoneFit+=(fit-zoneFit)*k;if(Math.abs(target-zoneY)<.4&&Math.abs(fit-zoneFit)<.002){zoneY=target;zoneFit=fit}}\r\n zoneSettling=zoneY!==target||zoneFit!==fit;return zoneY;\r\n}\r\nfunction shotDistance(span){if(!span)return homeDistance;const f=root.dataset.compact==='true'?Math.min(.96,w\/(h*zoneFit)*.72)*zoneFit:Math.min(.82,w\/h*.52);return span\/(2*Math.tan(Math.PI\/12)*f)}\r\nfunction slerpDirection(a,b,t,out){qB.setFromUnitVectors(a,b);qA.identity().slerp(qB,t);return out.copy(a).applyQuaternion(qA).normalize()}\r\nfunction setOffset(x,y){\r\n  if(Math.abs(x-viewX)+Math.abs(y-viewY)<.05)return;\r\n  viewX=x;viewY=y;camera.setViewOffset(w,h,x,y,w,h);\r\n}\r\n\/* Il modello si corica di 90 gradi attorno al proprio asse prima di avvolgersi:\r\n   l'anello si forma nel piano dello schermo e scende SOTTO la testa, che resta\r\n   in cima al fascio come quando si monta davvero. Nel frattempo il rollio della\r\n   vista stretta si annulla, cosi' l'assieme e' dritto anche su telefono. *\/\r\nfunction orient(direction,focus,distance){\r\n  if(!direction){\r\n    const [a,b,t]=segment(p);vB.fromArray(a[3]).normalize();vC.fromArray(b[3]).normalize();\r\n    slerpDirection(vB,vC,t,vD);direction=vD;\r\n  }\r\n  \/\/ The strap's +X root points down in the installation. A fixed roll avoids\r\n  \/\/ the 180-degree flips of an atan2 evaluated around the outgoing tail.\r\n  const amount=ease((p-.74)\/.05);\r\n  const roll=lerp(restRoll(),-Math.PI\/2,amount);\r\n  model.rotation.set(tip,0,roll,'ZXY');model.updateMatrixWorld(true);\r\n}\r\nfunction threading(t){return ease(t)}\r\nfunction pathPoint(s,out){frameAt(materialDistance(s),wrap*TAIL.start);return out.set(FRAME[0],0,FRAME[1])}\r\nfunction applyTimeline(dt){\r\n  \/* La vista cambia, la testa rimane solidale al nastro. La forma a riposo\r\n     della coda e' quella originale; durante la posa il materiale si flette. *\/\r\n  root.dataset.focused=String(p>.10);\r\n  \/\/ Phones: the product pill waits for Testa so it never covers the intro text.\r\n  const early=String(p<.13);if(root.dataset.early!==early)root.dataset.early=early;\r\n  if(root.dataset.compact==='true')compactFrame(dt);\r\n  const next=.68*ease((p-.74)\/.05);\r\n  tip=next;\r\n  setLoop(threading((p-.79)\/.06),lerp(WRAP.open,WRAP.tight,ease((p-.91)\/.07)));\r\n  const [a,b,t]=segment(p);\r\n  vB.fromArray(a[3]).normalize();vC.fromArray(b[3]).normalize();slerpDirection(vB,vC,t,vD);\r\n  pathPoint(lerp(a[1],b[1],t),vA);\r\n  const focus=lerp(a[5],b[5],t);\r\n  if(focus)vA.lerp(aim,focus);\r\n  let distance=Math.exp(lerp(Math.log(shotDistance(a[2])),Math.log(shotDistance(b[2])),t));\r\n  \/\/ Leaving the rest view never pulls back past it: no shrink between view 0 and 1.\r\n  if(p<.15)distance=Math.min(distance,homeDistance);\r\n  let offset=lerp(a[4],b[4],t);\r\n  if(p>=.79){\r\n    vD.set(cinemaSample(KEYS,p,3,0),cinemaSample(KEYS,p,3,1),cinemaSample(KEYS,p,3,2)).normalize();\r\n    if(p>=.79&&p<=.928){\r\n      \/\/ Wrapping completes at .85: hold the entry angle until the tip seats.\r\n      const orbit=ease((p-.850)\/.078);\r\n      const azimuth=lerp(Math.atan2(.85,.80),Math.atan2(-1,.65),orbit);\r\n      const elevation=lerp(Math.atan2(-.60,Math.hypot(.80,.85)),Math.atan2(-.42,Math.hypot(.65,1)),orbit);\r\n      const planar=Math.cos(elevation);\r\n      vD.set(Math.sin(elevation),planar*Math.cos(azimuth),planar*Math.sin(azimuth));\r\n      \/\/ Early wrap: look nearly down the cables, the loop reads as a ring.\r\n      if(p<.843){vB.set(-.22,.90,.38).normalize();vC.copy(vD);slerpDirection(vB,vC,ease((p-.826)\/.017),vD)}\r\n    }\r\n    const macro=cinemaSample(KEYS,p,6);\r\n    \/\/ Real entry\/locking point for each mould, not a fixed world coordinate.\r\n    vA.copy(aim).lerp(slot,macro);\r\n    const m=mold(),headSpan=m?Math.max(m.headW,m.headL,m.headD)*2.7:5.2;\r\n    const span=Math.max(cinemaSample(KEYS,p,2,-1,true),headSpan);\r\n    distance=shotDistance(span);offset=cinemaSample(KEYS,p,4);\r\n  }\r\n  orient(vD,vA,distance);\r\n  vA.applyMatrix4(model.matrixWorld);vD.applyQuaternion(model.quaternion);\r\n  let ox=root.dataset.compact==='true'?0:w*.20*offset,oy=compactFrame(dt);\r\n  if(returning){\r\n    returning.time+=dt;const k=ease(returning.time\/.75);\r\n    vA.lerpVectors(returning.target,vA,k);slerpDirection(returning.direction,vD,k,vB);vD.copy(vB);\r\n    distance=Math.exp(lerp(Math.log(returning.distance),Math.log(distance),k));\r\n    ox=lerp(returning.x,ox,k);oy=lerp(returning.y,oy,k);if(k===1)returning=null;\r\n  }\r\n  controls.target.copy(vA);camera.position.copy(vA).addScaledVector(vD,distance);\r\n  setOffset(ox,oy);camera.lookAt(vA);\r\n  const zone=section(p,active);if(zone!==active){active=zone;dismissed=-2;updateUI()}\r\n  if(active===3)installationUI();\r\n}\r\nfunction beginReturn(){\r\n  if(!ready||manual)return;\r\n  returning={target:controls.target.clone(),direction:camera.position.clone().sub(controls.target).normalize(),\r\n    distance:camera.position.distanceTo(controls.target),x:viewX,y:viewY,time:0};\r\n}\r\nfunction stopIntro(){\r\n  if(controls?.autoRotate)beginReturn();engaged=true;intro=0;if(controls)controls.autoRotate=false;\r\n}\r\nfunction mode(value){\r\n  if(!ready||loading||lost)return;\r\n  stopIntro();if(manual===value)return;\r\n  if(value&&playback){playback.playing=false;installationUI();}\r\n  const position=camera.position.clone(),target=controls.target.clone();\r\n  controls.enableDamping=false;controls.update();camera.position.copy(position);controls.target.copy(target);\r\n  manual=value;if(!value)beginReturn();else returning=null;\r\n  controls.enableDamping=manual&&!reduced;controls.enabled=manual||!coarse.matches;controls.enableZoom=manual;\r\n  renderer.domElement.style.touchAction=manual?'none':'pan-y';embedInput();updateUI();kick();\r\n}\r\n\/* Gallery box on touch screens: one finger rotates, two fingers pinch-zoom,\r\n   double tap returns to the rest pose. The box has no story to scroll. *\/\r\nfunction embedInput(){\r\n  if(!PRODUCT||!controls||!renderer)return;\r\n  if(embedCompact()){controls.enabled=true;controls.enableZoom=true;controls.enableRotate=true;controls.touches.ONE=T.TOUCH.ROTATE;controls.touches.TWO=T.TOUCH.DOLLY_ROTATE;renderer.domElement.style.touchAction='none'}\r\n  else{controls.enabled=manual||!coarse.matches;controls.enableZoom=manual;renderer.domElement.style.touchAction=manual?'none':'pan-y'}\r\n}\r\nlet pinRAF=0,pinY=-1,resizeRAF=0;\r\n\/\/ Native sticky owns positioning: scroll handlers only track visibility.\r\n\/\/ No animation-frame translation opposing the browser's scroll compositor.\r\nfunction syncPin(){\r\n  pinRAF=0;if(dead)return;\r\n  if(reduced||root.classList.contains('is-failed')){\r\n    stage.style.transform='';root.classList.remove('is-offscreen');pinY=-1;return;\r\n  }\r\n  const rect=root.getBoundingClientRect(),offset=top-rect.top;\r\n  const y=Math.max(0,Math.min(travel,offset));\r\n  if(y!==pinY){pinY=y;measure=true;}\r\n  root.classList.toggle('is-offscreen',rect.bottom<0||rect.top>window.innerHeight);\r\n  root.dataset.pinned=String(offset>=0&&offset<=travel);\r\n  scrollRead=true;kick();\r\n}\r\nfunction schedulePin(){if(!pinRAF&&!dead)pinRAF=requestAnimationFrame(syncPin)}\r\n\/* resize() scrive height, variabili CSS e dimensione del canvas: chiamata\r\n   dentro la consegna di una ResizeObserver rientrerebbe nello stesso ciclo e\r\n   il browser segnala \"ResizeObserver loop completed with undelivered\r\n   notifications\". Rimandata di un frame, la consegna si chiude pulita. *\/\r\nfunction scheduleResize(){\r\n  if(dead||resizeRAF)return;\r\n  resizeRAF=requestAnimationFrame(()=>{resizeRAF=0;if(!dead)resize()});\r\n}\r\nfunction readScroll(){scrollRead=false;if(PRODUCT||reduced||playback)return;const x=clamp((top-root.getBoundingClientRect().top)\/travel);if(finaleHold){if(x>=timelineToScroll(.98)-.004)return;finaleHold=false}targetP=scrollToTimeline(x);\r\n if(touchLock&&!finaleSeen&&targetP>=.978)mobileFinale()}\r\n\/* Phones: once the scroll reaches the thermal finale, it plays in full (colour\r\n   change, cobra, logos) with the page held still; scrolling resumes when the\r\n   last animation has finished. *\/\r\nconst touchLock=coarse.matches||innerWidth<=600;\r\nlet scrollLock=false,finaleSeen=false,lockTimer=0;\r\nfunction mobileFinale(){\r\n if(reduced)return;finaleSeen=true;mode(false);stopIntro();returning=null;dismissed=-2;\r\n const from=Math.min(p,.98),travel=from<.98?.6:0;\r\n playback={step:true,from,to:1,time:0,duration:travel+THERMAL_SECONDS,finale:true,travel,playing:true};\r\n lockScroll();syncTourScroll();tourUI();kick();\r\n}\r\nfunction lockScroll(){if(!touchLock||reduced)return;scrollLock=true;clearTimeout(lockTimer);lockTimer=setTimeout(releaseScroll,16000)}\r\nfunction releaseScroll(){scrollLock=false;clearTimeout(lockTimer)}\r\nfunction resize(){\r\n  root.style.setProperty('--cfs-viewport-width',document.documentElement.clientWidth+'px');\r\n  const rootWidth=root.clientWidth||root.getBoundingClientRect().width;\r\n  const layoutStyle=getComputedStyle(root);\r\n  top=Math.max(0,parseFloat(layoutStyle.getPropertyValue('--cfs-top'))||0);\r\n  const bottom=Math.max(0,parseFloat(layoutStyle.getPropertyValue('--cfs-bottom'))||0);\r\n  \/\/ CSS svh stays stable while mobile browser bars expand\/collapse.\r\n  const heightAvailable=Math.max(1,Math.round(stage.clientHeight));\r\n  \/* Durata del viaggio: unica fonte nel CSS (--cfs-scroll), fallback storico. *\/\r\n  const ratio=PRODUCT?0:parseFloat(layoutStyle.getPropertyValue('--cfs-scroll'))||(rootWidth<=600?4.8:5.8);\r\n  if(reduced||root.classList.contains('is-failed'))root.style.removeProperty('height');\r\n  else root.style.height=(heightAvailable+Math.round(Math.max(320,heightAvailable)*ratio))+'px';\r\n  root.dataset.compact=String(rootWidth<=600);\r\n  root.dataset.narrow=String(rootWidth<600);\r\n  root.dataset.landscape=String(heightAvailable<480&&rootWidth>heightAvailable);\r\n  const width=Math.round(mount.clientWidth),height=Math.round(mount.clientHeight);\r\n  travel=Math.max(1,root.offsetHeight-stage.clientHeight);scrollRead=true;measure=true;syncPin();\r\n  if(!ready||width<=0||height<=0)return;\r\n  if(w===width&&h===height){if(setRenderQuality(false))dirty=true;kick();return}\r\n  w=width;h=height;narrow=rootWidth<600;\r\n  setRenderQuality(false,true);\r\n  camera.aspect=w\/h;camera.clearViewOffset();viewX=viewY=0;camera.updateProjectionMatrix();\r\n  if(!manual)orient();\r\n  \/* Il fascio non entra nell'inquadratura di riposo: resta fuori dal calcolo. *\/\r\n  const box=model.userData.restBounds.clone().applyMatrix4(new T.Matrix4().makeRotationZ(restRoll()));\r\n  const size=box.getSize(new T.Vector3());\r\n  zoneY=null;compactFrame(0);\r\n  homeDistance=embedCompact()?Math.max(size.y\/.80,size.x\/(camera.aspect*.80))\/(2*Math.tan(Math.PI\/12))+size.z*.5:Math.max(size.y\/(.64*zoneFit),size.x\/(camera.aspect*.86))\/(2*Math.tan(Math.PI\/12))+size.z;\r\n  controls.maxDistance=homeDistance*2;returning=null;\r\n  if(manual)camera.position.sub(controls.target).clampLength(controls.minDistance,controls.maxDistance).add(controls.target);\r\n  else{readScroll();applyTimeline(0)}\r\n  kick();\r\n}\r\nfunction measureCard(){\r\n  measure=false;const a=stage.getBoundingClientRect(),b=card.getBoundingClientRect();\r\n  cardBox={x:b.left-a.left,y:b.top-a.top,w:b.width,h:b.height};\r\n}\r\nfunction annotations(){\r\n  presentationUI();\r\n  if(measure)measureCard();\r\n  if(active<0||dismissed===active||lost){pinVisible=false;pin.classList.remove('is-visible');path.setAttribute('d','');return}\r\n  normal.set(0,0,1).applyQuaternion(model.quaternion);vA.copy(camera.position).sub(controls.target).normalize();\r\n  const face=normal.dot(vA),back=active===0&&face<0;\r\n  let facing=true;\r\n  if(active===3)vB.copy(slot);\r\n  else if(active===2)vB.set(selectedType==='cabling'?-19.61:family().focus,.15,.23);\r\n  else if(active===1)vB.set(18.95,0,bend(18.95)+.13*thicknessAt(18.95));\r\n  else if(selectedType==='cabling'){\r\n    \/* Hotspot del collare sulla piega della coda inclinata, sul fianco. *\/\r\n    const x=TIP.x+TIP.w*.55;vB.set(x,widthAt(x)*.96,bend(x)+(back?-.02:.02)*thicknessAt(x));\r\n  }\r\n  else vB.set(19.6,0,bend(19.6)+(back?-.122:.116)*thicknessAt(19.6));\r\n  if(active!==3)facing=active===0||face>(pinVisible?-.06:.08);\r\n  projected.copy(vB).applyMatrix4(model.matrixWorld).project(camera);\r\n  const mx=mount.offsetLeft,my=mount.offsetTop;\r\n  const x=(projected.x*.5+.5)*w+mx,y=(-projected.y*.5+.5)*h+my,margin=pinVisible?10:20;\r\n  pinVisible=facing&&projected.z>-1&&projected.z<1&&x>mx+margin&&x<mx+w-margin&&y>my+margin&&y<my+h-margin;\r\n  pin.classList.toggle('is-visible',pinVisible);\r\n  if(!pinVisible){path.setAttribute('d','');return}\r\n  pin.style.left=x.toFixed(2)+'px';pin.style.top=y.toFixed(2)+'px';\r\n  const endX=narrow?clamp(x,cardBox.x+25,cardBox.x+cardBox.w-25):cardBox.x;\r\n  const endY=narrow?cardBox.y:cardBox.y+Math.min(cardBox.h*.5,130);\r\n  path.setAttribute('d','M'+x.toFixed(1)+','+y.toFixed(1)+' L'+endX.toFixed(1)+','+endY.toFixed(1));\r\n}\r\n\r\n\/* Nessun loop permanente a riposo, nessun shadow map o postprocessing. *\/\r\nfunction kick(){\r\n  dirty=true;\r\n  if(!raf&&!inFrame&&ready&&!loading&&visible&&!dead&&!lost&&!document.hidden)raf=requestAnimationFrame(frame);\r\n}\r\nfunction frame(now){\r\n  raf=0;if(dead||lost||loading||!ready||!visible||document.hidden)return;\r\n  \/\/ 60 fps on capable phones\/tablets; conserve power on constrained devices.\r\n  if(last&&now-last<(lowPower?1000\/30:1000\/60)-1){raf=requestAnimationFrame(frame);return}\r\n  if(touchLock&&playback?.playing&&p>=.979&&!scrollLock&&!reduced&&$('.cfs-signature')?.dataset.form!=='done')lockScroll();\r\n  if(p<.95&&!playback)finaleSeen=false;\r\n  const elapsed=last?now-last:16;if(last&&qualityMotion)adaptQuality(elapsed);const dt=Math.min(.06,elapsed\/1000);last=now;inFrame=true;if(scrollRead)readScroll();\r\n  const soundBefore=POSE.feed;let moving=false;\r\n  if(playback?.playing){\r\n    if(playback.step){\r\n      playback.time+=dt;const t=clamp(playback.time\/playback.duration);\r\n      if(playback.finale){\r\n       const {from,travel,time,duration}=playback;\r\n       p=targetP=travel&&time<travel?lerp(from,.98,ease(time\/travel)):lerp(Math.max(from,.98),1,clamp((time-travel)\/(duration-travel)));\r\n      }else p=targetP=lerp(playback.from,playback.to,ease(t));\r\n      syncTourScroll();\r\n      if(t>=1)playback=null;\r\n    }else if(playback.tour){\r\n      const cuts=playback.cuts||TOUR_CUTS,duration=playback.duration||TOUR_DURATION;\r\n      playback.value=clamp(playback.value+dt\/duration);\r\n      p=targetP=cinemaSample(cuts,playback.value*duration,1);\r\n      syncTourScroll();\r\n    }else{\r\n      \/\/ Preserve scrub\/resume semantics; reserve twelve seconds for readable temperatures.\r\n      const thermalStart=(.98-INSTALL.start)\/(INSTALL.end-INSTALL.start);\r\n      const rate=playback.value>=thermalStart?(1-thermalStart)\/THERMAL_SECONDS:1\/INSTALL.duration;\r\n      const next=clamp(playback.value+dt*rate);\r\n      playback.value=playback.value<thermalStart?Math.min(next,thermalStart):next;\r\n      p=targetP=lerp(INSTALL.start,INSTALL.end,playback.value);\r\n    }\r\n    if(playback&&!playback.step&&playback.value>=1){playback.playing=false;if(playback.tour){playback=null;tourUI()}}\r\n    dirty=true;moving=true;\r\n  }\r\n  if(!manual){\r\n    if(reduced)p=targetP;\r\n    else{p=lerp(p,targetP,1-Math.exp(-dt*18));if(Math.abs(p-targetP)<.000025)p=targetP}\r\n    moving=moving||p!==targetP||!!returning;\r\n    const auto=intro>0&&!engaged&&p<.02&&!reduced;\r\n    if(auto){\r\n      intro-=dt;controls.autoRotate=true;controls.autoRotateSpeed=.3;moving=true;\r\n      if(intro<=0){controls.autoRotate=false;beginReturn()}\r\n    }else{controls.autoRotate=false;if(dirty||moving){applyTimeline(dt);autoHUD()}}\r\n  }\r\n  syncZip(soundBefore,POSE.feed,dt);\r\n  const recolored=updateColor(dt),changed=controls.update(dt);\r\n  const aura=climateLive&&!reduced&&!document.hidden;if(aura)climateTime.value=(climateTime.value+dt)%1000;\r\n  const animating=!!(moving||changed||colorTween);\r\n  const qualityChanged=setRenderQuality(animating);\r\n  if(zoneSettling&&!manual){moving=true;applyTimeline(dt)}\r\n  if(dirty||moving||changed||recolored||qualityChanged||aura){\r\n    camera.updateMatrixWorld();placeEdges();placeShadow();annotations();finaleUI();\r\n    $('.cfs-progress i').style.transform='scaleX('+p.toFixed(5)+')';\r\n    renderNylonScene();\r\n  }\r\n  dirty=false;inFrame=false;if(moving||changed||colorTween||zoneSettling||(climateLive&&!reduced))raf=requestAnimationFrame(frame);\r\n}\r\nfunction jump(index){\r\n if(!ready||loading||lost)return;\r\n startAction(STOP[index]);\r\n}\r\nfunction zoom(factor){\r\n  if(!ready||loading||lost)return;mode(true);\r\n  vA.copy(camera.position).sub(controls.target).multiplyScalar(factor).clampLength(controls.minDistance,controls.maxDistance);\r\n  camera.position.copy(controls.target).add(vA);controls.update();kick();\r\n}\r\nfunction fail(){\r\n  stopZip();lost=true;loading=false;status.hidden=false;text(status,copy.ui[7]);root.classList.add('is-failed');mount.hidden=true;\r\n  root.style.removeProperty('height');syncPin();\r\n  card.classList.remove('is-open');pin.classList.remove('is-visible');path.setAttribute('d','');updateUI();\r\n  cancelAnimationFrame(raf);raf=0;\r\n}\r\n\/* Sorgenti del motore, in ordine di tentativo. Le due voci di ogni coppia\r\n   vanno caricate dallo stesso provider: fornitori diversi significano due\r\n   istanze distinte di three, con OrbitControls agganciato alla copia sbagliata.\r\n   Con data-three e data-three-controls sulla section si punta a file ospitati\r\n   sul dominio, che diventano il primo tentativo. *\/\r\nfunction engineSources(){\r\n  const list=[];\r\n  if(root.dataset.three)list.push([root.dataset.three,root.dataset.threeControls||'']);\r\n  \/* jsDelivr per primo: e' la sorgente che risponde in modo affidabile.\r\n     esm.sh e esm.run restano come rete di sicurezza, ma non vanno piu'\r\n     provate per prime, perche' un loro fallimento e' due secondi persi e\r\n     due warning in console a ogni caricamento di pagina. *\/\r\n  list.push(\r\n    ['https:\/\/cdn.jsdelivr.net\/npm\/three@'+VERSION+'\/+esm',\r\n     'https:\/\/cdn.jsdelivr.net\/npm\/three@'+VERSION+'\/examples\/jsm\/controls\/OrbitControls.js\/+esm'],\r\n    ['https:\/\/esm.sh\/three@'+VERSION+'?target=es2022',\r\n     'https:\/\/esm.sh\/three@'+VERSION+'\/examples\/jsm\/controls\/OrbitControls.js?target=es2022'],\r\n    ['https:\/\/esm.run\/three@'+VERSION,\r\n     'https:\/\/esm.run\/three@'+VERSION+'\/examples\/jsm\/controls\/OrbitControls.js']\r\n  );\r\n  return list.filter(pair=>pair[0]&&pair[1]);\r\n}\r\n\/* Una CDN che non risponde non deve tenere in ostaggio il widget: oltre i 12\r\n   secondi il tentativo viene abbandonato e si passa alla successiva. *\/\r\nfunction withTimeout(promise,ms){\r\n  let id;\r\n  return Promise.race([\r\n    promise.finally(()=>clearTimeout(id)),\r\n    new Promise((_,reject)=>{id=setTimeout(()=>reject(new Error('timeout')),ms)})\r\n  ]);\r\n}\r\nasync function loadEngine(){\r\n  \/* Un tentativo fallito che poi rientra da un'altra sorgente non e' un\r\n     problema dell'utente: si annota e si va avanti in silenzio. Il riepilogo\r\n     va in console solo se cade anche l'ultima sorgente. *\/\r\n  const tried=[];let last;\r\n  for(const [core,extra] of engineSources()){\r\n    try{\r\n      return await withTimeout(Promise.all([import(core),import(extra)]),12000);\r\n    }catch(error){\r\n      last=error;tried.push(core+' ('+(error?.message||error)+')');\r\n    }\r\n  }\r\n  console.error('[cobra-3d] nessuna sorgente three.js raggiungibile:',tried.join(' | '));\r\n  throw last||new Error('nessuna sorgente disponibile');\r\n}\r\n\/* L'avvio del 3D aspetta che la pagina sia caricata e il thread libero:\r\n   il widget non ritarda mai il primo rendering ne' lo scroll della homepage. *\/\r\nlet bootQueued=false;\r\nfunction scheduleBoot(){\r\n  if(bootQueued||ready||loading||dead)return;\r\n  if(PRODUCT){boot();return}\r\n  bootQueued=true;let fired=false;\r\n  const go=()=>{\r\n    if(fired)return;fired=true;\r\n    const start=()=>{bootQueued=false;if(visible&&!dead)boot()};\r\n    if(window.requestIdleCallback)requestIdleCallback(start,{timeout:1500});else setTimeout(start,120);\r\n  };\r\n  if(document.readyState==='complete')go();\r\n  else{addEventListener('load',go,{once:true});setTimeout(go,3500)}\r\n}\r\nasync function boot(){\r\n  if(loading||ready||dead)return;loading=true;\r\n  try{\r\n    const [three,addon]=await loadEngine();\r\n    if(dead)return;T=three;\r\n    renderer=new T.WebGLRenderer({antialias:true,alpha:false,powerPreference:'default'});\r\n    renderer.transmissionResolutionScale=1;\r\n    renderer.outputColorSpace=T.SRGBColorSpace;renderer.toneMapping=T.NeutralToneMapping;\r\n    renderer.toneMappingExposure=.96;renderer.setClearColor(0x000000,1);\r\n    scene=new T.Scene();scene.background=new T.Color(0x000000);\r\n    \/\/ Product gallery: graphite studio backdrop so black ties read clearly.\r\n    if(PRODUCT){scene.background=null;backdrop()}camera=new T.PerspectiveCamera(30,1,.035,500);\r\n    vA=new T.Vector3();vB=new T.Vector3();vC=new T.Vector3();vD=new T.Vector3();qA=new T.Quaternion();qB=new T.Quaternion();\r\n    normal=new T.Vector3();projected=new T.Vector3();spherical=new T.Spherical();axis=new T.Vector3(0,1,0);\r\n    configureMold();TIP.k=mold()?.tipK??.325;prepareTail();matrix=new T.Matrix4();lift=new T.Color(1,1,1);\r\n    bundle=new T.Vector3();aim=new T.Vector3();slot=new T.Vector3(WRAP.slotX,0,.19);buildPath(WRAP.open);\r\n    makeModel();studio();\r\n    scene.add(new T.AmbientLight(0xffffff,.035));\r\n    key=light(0xfffcf7,2.1,-5,7,10);rim=light(0xe8f0ff,2.6,5,4,-8);\r\n    edgeA=light(0xffffff,2,-6,3,-7);edgeB=light(0xfff0e0,1.2,6,-3,-6);\r\n    gloss=light(0xffffff,1.4,0,1,1);light(0xffffff,.55,1,-5,5);tune();\r\n    if(PRODUCT)makeShadowRig();\r\n    const canvas=renderer.domElement;canvas.tabIndex=0;canvas.setAttribute('role','img');canvas.setAttribute('aria-label',copy.title);canvas.setAttribute('aria-describedby',root.id+'-description');mount.replaceChildren(canvas);\r\n    controls=new addon.OrbitControls(camera,canvas);controls.enablePan=false;controls.enableDamping=false;\r\n    controls.enableZoom=false;controls.rotateSpeed=.6;controls.zoomSpeed=.65;\r\n    controls.minDistance=1.5;controls.minPolarAngle=.01;controls.maxPolarAngle=Math.PI-.01;\r\n    controls.enabled=!coarse.matches;canvas.style.touchAction='pan-y';controls.addEventListener('change',kick);embedInput();\r\n    controls.addEventListener('start',()=>{if(!manual)mode(true);stopIntro()});\r\n    on(canvas,'pointerdown',()=>{stopIntro();if(!coarse.matches||manual||embedCompact())mode(true)},{capture:true});\r\n    on(canvas,'dblclick',()=>{if(embedCompact()&&manual)mode(false)});\r\n    on(canvas,'keydown',e=>{\r\n      if(e.key==='Escape'){mode(false);return}\r\n      if(e.key==='+'||e.key==='='){e.preventDefault();zoom(.84);return}\r\n      if(e.key==='-'){e.preventDefault();zoom(1.19);return}\r\n      if(!['ArrowLeft','ArrowRight','ArrowUp','ArrowDown'].includes(e.key))return;\r\n      e.preventDefault();mode(true);vA.copy(camera.position).sub(controls.target);spherical.setFromVector3(vA);\r\n      spherical.theta+=e.key==='ArrowLeft'?.10:e.key==='ArrowRight'?-.10:0;\r\n      spherical.phi+=e.key==='ArrowUp'?-.10:e.key==='ArrowDown'?.10:0;\r\n      spherical.makeSafe();camera.position.copy(controls.target).add(vA.setFromSpherical(spherical));controls.update();kick();\r\n    });\r\n    on(canvas,'webglcontextlost',e=>{e.preventDefault();fail()});\r\n    on(canvas,'webglcontextrestored',async()=>{\r\n      if(dead)return;\r\n      try{\r\n        studio();await renderer.compileAsync(scene,camera);if(dead)return;\r\n        lost=false;root.classList.remove('is-failed');mount.hidden=false;status.hidden=true;resize();updateUI();kick();\r\n      }catch{fail()}\r\n    });\r\n    ready=true;resize();await renderer.compileAsync(scene,camera);if(dead)return;\r\n    loading=false;status.hidden=true;updateUI();kick();\r\n    {let n=0;const post=()=>{if(!dead){kick();requestAnimationFrame(()=>requestAnimationFrame(()=>postParent({type:'ready',color:selectedColor})))}};\r\n     const wait=()=>{if(dead)return;if(n++>=16||finishes.every(m=>!m.bumpMap?.userData?.pending))post();else setTimeout(wait,50)};wait()}\r\n  }catch(error){if(!dead){console.error('[cobra-3d] avvio non riuscito:',error);fail()}}\r\n}\r\nfunction destroy(){\r\n  dead=true;cancelAnimationFrame(cardRevealRAF);SURF.worker?.terminate();SURF.worker=null;if(SURF.url)URL.revokeObjectURL(SURF.url);stopZip();if(ZIP.context)ZIP.context.close().catch(()=>{});abort.abort();cancelAnimationFrame(raf);cancelAnimationFrame(pinRAF);cancelAnimationFrame(resizeRAF);observer?.disconnect();resizeObserver?.disconnect();\r\n  languageObserver?.disconnect();removalObserver?.disconnect();glassObserver?.disconnect();controls?.dispose();rack?.mesh.dispose();\r\n  resources.forEach(o=>o.dispose());environment?.dispose();renderer?.dispose();hosts.forEach(o=>o.classList.remove('cfs-host'));\r\n  zoneObserver?.disconnect();openObserver?.disconnect();fx?.stop();clearTimeout(lockTimer);scrollLock=false;hudGhosts.forEach(g=>g.remove());logoURLs.forEach(u=>URL.revokeObjectURL(u));mount.replaceChildren();delete root.cfsDestroy;\r\n}\r\nroot.cfsDestroy=destroy;root.classList.toggle('is-reduced',reduced);\r\n\/* Correzione Elementor limitata agli antenati effettivi del widget. *\/\r\nfor(let node=root.parentElement;node&&node!==document.body;node=node.parentElement){\r\n  const style=getComputedStyle(node);\r\n  if((node.matches('.elementor-section,.elementor-container,.elementor-column,.elementor-widget-wrap,.elementor-widget,.elementor-widget-container,.elementor-widget-image,.e-con,.e-con-inner')||['hidden','auto','scroll','clip'].includes(style.overflowX)||['hidden','auto','scroll','clip'].includes(style.overflowY))&&!node.classList.contains('cfs-host')){\r\n    node.classList.add('cfs-host');hosts.push(node);\r\n  }\r\n}\r\nroot.dataset.hud=PRODUCT?'expanded':innerWidth<=600?'compact':'expanded';\r\nif(PRODUCT)on(window,'message',e=>{\r\n if(e.origin!==location.origin||e.source!==parent||!e.data||e.data.source!=='cfs3d-host')return;\r\n const d=e.data;\r\n if(d.type==='color'&&d.color){selectColor.quiet=true;try{selectColor(String(d.color))}finally{selectColor.quiet=false}}\r\n if(d.type==='visible'){visible=!!d.value;if(visible){scrollRead=true;kick()}}\r\n if(d.type==='prefetch'&&ready)prefetchNative();\r\n if(d.type==='layout'){const next=d.full?'full':'compact';if(next==='full')queueUpgrade();if(root.dataset.embed!==next){root.dataset.embed=next;backdrop();playback=null;returning=null;mode(false);embedInput();p=targetP=0;wrap=0;dismissed=-2;tourUI();if(!next.startsWith('f')){dismissed=active}w=h=0;resize();applyTimeline(0);updateUI();kick()}}\r\n});\r\n['pointerenter','focusin','touchstart'].forEach(ev=>on(root,ev,e=>{const a=e.target.closest?.('.cfs-open-product,.cfs-products');if(a)prefetchProduct(a.href)},{passive:true,capture:true}));\r\non(root,'click',e=>{if(PRODUCT&&e.target.closest?.('.cfs-products')){e.preventDefault();postParent({type:'cta',color:selectedColor});return}const a=e.target.closest?.('.cfs-open-product,.cfs-products');if(a)trackProduct(a.classList.contains('cfs-products')?'final':'persistent',a.href)},{capture:true});\r\nconst openObserver=window.ResizeObserver?new ResizeObserver(()=>placeOpenProduct()):null;['.cfs-header','.cfs-colors'].forEach(q=>{const e=$(q);if(e)openObserver?.observe(e)});\r\nconst zoneObserver=window.ResizeObserver?new ResizeObserver(()=>{if(root.dataset.compact==='true'&&ready){zoneSettling=true;kick()}}):null;zoneObserver?.observe(card);\r\non(window,'resize',()=>{if(innerWidth<=600&&root.dataset.hud!=='compact'&&!root.contains(document.activeElement)){root.dataset.hud='compact';hudUI()}},{passive:true});\r\ncard.id=root.id+'-card';pin.setAttribute('aria-controls',card.id);createPalette();localize();\r\non(root,'pointerdown',e=>{\r\n  stopIntro();if(e.target.matches('[data-install-progress]')){unlockZip();ZIP.inputTime=Date.now()}\r\n},{capture:true,passive:true});\r\non(root,'keydown',e=>{if(e.target.matches('[data-install-progress]'))unlockZip()});\r\non(window,'scroll',()=>{if(scrollLock&&tourScrollY!==null){if(Math.abs(scrollY-tourScrollY)>1){try{window.scrollTo({top:tourScrollY,behavior:'instant'})}catch{window.scrollTo(0,tourScrollY)}}return}if(tourScrollY!==null&&(playback?.tour||Math.abs(scrollY-tourScrollY)<2)){schedulePin();return}playback=null;tourScrollY=null;tourUI();stopIntro();scrollRead=true;schedulePin();kick()},{passive:true});on(window,'resize',resize,{passive:true});\r\non(window,'load',resize,{passive:true});\r\nif(window.visualViewport)on(window.visualViewport,'resize',resize,{passive:true});\r\non(document,'visibilitychange',()=>{\r\n  last=0;if(document.hidden){stopZip();cancelAnimationFrame(raf);raf=0}else{scrollRead=true;kick()}\r\n});\r\non(window,'wheel',wheelAction,{passive:false});\r\non(root,'pointermove',e=>{const sig=$('.cfs-signature');if(!sig||sig.hidden||e.pointerType==='touch')return;const r=stage.getBoundingClientRect();sig.style.setProperty('--tx',(((e.clientY-r.top)\/r.height-.5)*-14).toFixed(2)+'deg');sig.style.setProperty('--ty',(((e.clientX-r.left)\/r.width-.5)*22).toFixed(2)+'deg')},{passive:true});\r\non(window,'touchmove',e=>{if(scrollLock&&e.cancelable)e.preventDefault()},{passive:false});\r\non(window,'wheel',e=>{if(scrollLock&&e.cancelable)e.preventDefault()},{passive:false});\r\non(root,'touchstart',e=>{if(scrollLock){touchOrigin=null;return}if(e.touches.length===1&&stepScope(e.target)){if(!e.target.closest?.('button,select,input,a,[role=\"option\"]'))cancelTour();touchOrigin={x:e.touches[0].clientX,y:e.touches[0].clientY,used:false}}else touchOrigin=null},{passive:true});\r\non(root,'touchmove',e=>{\r\n if(embedCompact())return;\r\n if(!touchOrigin||e.touches.length!==1||!stepScope(e.target))return;\r\n const dx=touchOrigin.x-e.touches[0].clientX,dy=touchOrigin.y-e.touches[0].clientY;\r\n if(Math.abs(dx)>Math.abs(dy))return;\r\n if((playback?.step&&playback.playing)||touchOrigin.used){e.preventDefault();return}\r\n if(Math.abs(dy)>12&&nextAction(Math.sign(dy))!==undefined)e.preventDefault();\r\n if(Math.abs(dy)>=40){touchOrigin.used=startAction(nextAction(Math.sign(dy)))}\r\n},{passive:false});\r\non(root,'touchend',()=>{touchOrigin=null},{passive:true});\r\non(root,'touchcancel',()=>{touchOrigin=null},{passive:true});\r\non(window,'keydown',e=>{\r\n if(e.key==='Escape'){cancelTour();return}\r\n const dir=['PageDown','ArrowDown'].includes(e.key)?1:['PageUp','ArrowUp'].includes(e.key)?-1:0;\r\n if(!dir||!stepScope(e.target))return;\r\n if(playback?.step&&playback.playing){e.preventDefault();return}\r\n const next=nextAction(dir);if(next!==undefined){e.preventDefault();cancelTour();startAction(next)}\r\n});\r\non(window,'popstate',()=>{localize();scrollRead=true;kick()});\r\non(motion,'change',()=>{\r\n  reduced=motion.matches;root.classList.toggle('is-reduced',reduced);stopIntro();returning=null;\r\n  if(playback)playback.playing=false;stopZip();\r\n  if(controls)controls.enableDamping=manual&&!reduced;resize();updateUI();\r\n});\r\non(coarse,'change',()=>{if(controls){controls.enabled=manual||!coarse.matches;resize()}});\r\non(root,'change',e=>{if(e.target.matches('[data-color-option]'))selectColor(e.target.value);else if(e.target.matches('[data-type-select]'))setFamily(e.target.value);else if(e.target.matches('[data-head-select]'))setFamily(selectedType,e.target.value)});\r\non(root,'input',e=>{if(e.target.matches('[data-install-progress]'))seekInstallation(Number(e.target.value)\/1000,false,true)});\r\non(root,'click',e=>{\r\n  const b=e.target.closest('button');if(!b||b.disabled)return;\r\n  if(b.hasAttribute('data-stop')){jump(Number(b.dataset.stop));return}\r\n  switch(b.dataset.action){\r\n    case 'hud':toggleHUD();break;\r\n    case 'tour-play':playTour();break;\r\n    case 'install-play':playInstallation();break;\r\n    case 'sound':toggleSound();break;\r\n    case 'details':jump(3);break;\r\n    case 'mode':mode(!manual);break;\r\n    case 'zoom-in':zoom(.82);break;\r\n    case 'zoom-out':zoom(1.22);break;\r\n    case 'close':dismissed=active;updateUI();kick();break;\r\n    case 'skip':window.scrollTo({top:root.getBoundingClientRect().top+scrollY+root.offsetHeight-top,\r\n      behavior:reduced?'auto':'smooth'});break;\r\n  }\r\n});\r\non(pin,'click',()=>{dismissed=-2;updateUI();kick()});\r\nif(document.fonts){document.fonts.ready.then(()=>{if(!dead)resize()});on(document.fonts,'loadingdone',resize)}\r\nresizeObserver=new ResizeObserver(scheduleResize);resizeObserver.observe(stage);resizeObserver.observe(root);resizeObserver.observe(mount);\r\nlanguageObserver=new MutationObserver(localize);\r\nlanguageObserver.observe(document.documentElement,{attributes:true,attributeFilter:['lang']});\r\nlanguageObserver.observe(document.head,{subtree:true,childList:true,attributes:true,attributeFilter:['href','hreflang','rel']});\r\nremovalObserver=new MutationObserver(()=>{if(!root.isConnected)destroy()});removalObserver.observe(document.body,{subtree:true,childList:true});\r\n\/* Taratura a caldo: cambiando data-glass da devtools il materiale si aggiorna. *\/\r\nglassObserver=new MutationObserver(()=>{if(ready){tune();kick()}});\r\nglassObserver.observe(root,{attributes:true,attributeFilter:['data-glass']});\r\nobserver=new IntersectionObserver(entries=>{\r\n  visible=entries.some(e=>e.isIntersecting);\r\n  if(visible){scrollRead=true;last=0;scheduleBoot();kick()}else{stopZip();cancelAnimationFrame(raf);raf=0}\r\n},{rootMargin:'150px'});\r\nroot.classList.add('is-ready');resize();\r\nobserver.observe(root);\r\n})();\r\n<\/script>\r\n<script>\r\n\/* ===== PATCH LAYOUT v1 =====\r\n   Misura le bande reali (header sticky, barra inferiore, pannello) e le pubblica\r\n   come variabili CSS; sblocca gli antenati Elementor che romperebbero lo sticky;\r\n   adatta il pannello in modo che non scrolli mai. Non tocca il motore 3D. *\/\r\n(()=>{'use strict';const t=document.getElementById('cobra-scroll3d');if(!t)return;t.cfsFit?.destroy?.();const e=e=>t.querySelector(e),o=e('.cfs-stage'),n=e('.cfs-card'),s=e('.cfs-header'),i=e('.cfs-bottom');if(!(o&&n&&s&&i))return;const c=t=>Math.round(t)+'px',r=Object.create(null);let a=0,l=0,d='';function u(e,o){r[e]!==o&&(r[e]=o,t.style.setProperty(e,o))}function f(){for(let e=t.parentElement;e&&e!==document.documentElement;e=e.parentElement){const t=getComputedStyle(e);('visible'!==t.overflowX||'visible'!==t.overflowY||'none'!==t.transform||'none'!==t.perspective||'none'!==t.filter||'none'!==t.contain||t.containerType&&'normal'!==t.containerType||'transform'===t.willChange)&&e.classList.add('cfs-host')}}let m=!1;function h(){a=0,function(){const o=e('.cfs-colors');if(!o||o.querySelector('[data-action=\"colors\"]'))return;const n=o.querySelector('legend'),s=o.querySelector('.cfs-color-list');if(!n||!s)return;s.id=t.id+'-colors';const i=document.createElement('button');i.type='button',i.dataset.action='colors',i.setAttribute('aria-controls',s.id);const c=o=>{t.dataset.colors=o?'on':'off',i.setAttribute('aria-expanded',String(o)),i.textContent=o?'\\u00d7':'+',i.setAttribute('aria-label',(e('.cfs-color-label')?.textContent||'Colore').trim()),g()};i.addEventListener('click',e=>{e.stopPropagation(),m=!0,c('on'!==t.dataset.colors)}),n.append(i),c(innerWidth>600)}(),!m&&t.dataset.colors&&(t.dataset.colors=innerWidth>600?'on':'off');const r=function(){let t=0;const e=document.getElementById('wpadminbar');e&&'fixed'===getComputedStyle(e).position&&(t+=e.offsetHeight);const o=document.querySelector('.elementor-location-header')||document.querySelector('header');if(o){const e=getComputedStyle(o).position;'fixed'!==e&&'sticky'!==e||(t+=Math.round(o.getBoundingClientRect().height))}return t}();innerWidth<=600?u('--cfs-top','30px'):r>0&&u('--cfs-top',c(r));const l=o.getBoundingClientRect();u('--cfs-h',c(o.clientHeight)),u('--cfs-head-h',c(Math.max(0,s.getBoundingClientRect().bottom-l.top))),u('--cfs-foot-h',c(Math.max(0,l.bottom-i.getBoundingClientRect().top))),function(){const s=[n.textContent.length,Math.round(n.clientWidth),Math.round(o.clientHeight),getComputedStyle(n).maxHeight,t.dataset.compact,t.dataset.landscape,t.dataset.focused,e('.cfs-install-controls')?.hidden].join('|');if(s===d)return;d=s;let i=1;n.classList.remove('is-clamped'),n.style.setProperty('--cfs-fit','1');const c='true'===t.dataset.compact?.86:.72;for(;i>c&&n.scrollHeight>n.clientHeight+1;)i=Math.max(c,i-.04),n.style.setProperty('--cfs-fit',i.toFixed(2));const r=e('.cfs-copy'),a=n.scrollHeight-n.clientHeight;if(a>1&&r){const t=parseFloat(getComputedStyle(r).lineHeight)||16;n.style.setProperty('--cfs-lines',String(Math.max(2,Math.floor((r.clientHeight-a)\/t)))),n.classList.add('is-clamped')}}(),u('--cfs-card-h',c(n.getBoundingClientRect().height))}const g=()=>{a||(a=requestAnimationFrame(h))},p=()=>{clearTimeout(l),l=setTimeout(g,200)},y=new ResizeObserver(g);y.observe(o);const b=new ResizeObserver(p);[s,i,n].forEach(t=>b.observe(t));const v=new MutationObserver(p);v.observe(n,{subtree:!0,childList:!0,characterData:!0,attributes:!0,attributeFilter:['hidden','class','aria-hidden']}),addEventListener('resize',g,{passive:!0}),addEventListener('orientationchange',g,{passive:!0}),addEventListener('load',()=>{f(),g()},{passive:!0}),document.fonts?.ready.then(p);const C=setTimeout(()=>{f(),g()},1200);f(),h(),t.cfsFit={destroy(){y.disconnect(),b.disconnect(),v.disconnect(),removeEventListener('resize',g),removeEventListener('orientationchange',g),cancelAnimationFrame(a),clearTimeout(l),clearTimeout(C),delete t.cfsFit}}})();\r\n<\/script>\r\n\r\n\r\n<style id=\"cfp-card-style-patch\">\r\n\/* ===== PATCH STILE CFP: palette, card e top-offset presi dal CSS fornito ===== *\/\r\n.cfs{\r\n  --cfp-bg:#000;\r\n  --cfp-red:#e30916;\r\n  --cfp-red-soft:rgba(227,9,22,.38);\r\n  --cfp-text:#f4f4f2;\r\n  --cfp-muted:rgba(244,244,242,.62);\r\n  --cfp-line:rgba(255,255,255,.13);\r\n  --cfp-top-offset:151px;\r\n  --cfp-bottom-offset:0px;\r\n  --cfp-page-padding:60px 0 50px;\r\n  --cfs-pad-t:60px;\r\n  --cfs-pad-b:50px;\r\n  --cfs-top:var(--cfp-top-offset);\r\n  --cfs-bottom:var(--cfp-bottom-offset);\r\n  color:var(--cfp-text);\r\n  background:var(--cfp-bg);\r\n}\r\n@media(max-width:600px){\r\n  .cfs{\r\n    --cfp-top-offset:30px;\r\n    --cfp-bottom-offset:30px;\r\n    --cfp-page-padding:30px 0 30px;\r\n    --cfs-pad-t:30px;\r\n    --cfs-pad-b:30px;\r\n    --cfs-top:var(--cfp-top-offset);\r\n    --cfs-bottom:var(--cfp-bottom-offset);\r\n  }\r\n}\r\n\r\n\/* Page Content Padding: desktop 60px 0 50px; mobile <=600px 30px 0 30px.\r\n   Viene espresso nelle variabili di layout per non ridurre il viewport del canvas 3D. *\/\r\n\/* Lo stage usa gli stessi offset del layout CFP. *\/\r\n.cfs-stage{\r\n  top:var(--cfp-top-offset)!important;\r\n  height:calc(100vh - var(--cfp-top-offset) - var(--cfp-bottom-offset))!important;\r\n}\r\n.cfs .cfs-header{top:0;}\r\n\r\n\/* Card: valori visibili nel CSS CFP fornito. *\/\r\n.cfs .cfs-stage .cfs-card{\r\n  padding:22px 24px!important;\r\n  border:1px solid rgba(255,255,255,.16)!important;\r\n  border-left:4px solid rgba(227,9,22,.42)!important;\r\n  border-radius:24px!important;\r\n  color:var(--cfp-text)!important;\r\n  background:linear-gradient(135deg,#29292b,#1d1d1f 75%)!important;\r\n  box-shadow:0 18px 50px rgba(0,0,0,.53)!important;\r\n}\r\n.cfs .cfs-stage .cfs-card h3{\r\n  color:var(--cfp-text)!important;\r\n  font-size:clamp(22px,2.3vw,34px)!important;\r\n  line-height:1.15!important;\r\n  font-weight:600!important;\r\n  letter-spacing:0!important;\r\n  margin-bottom:16px!important;\r\n}\r\n.cfs .cfs-stage .cfs-card h3::after{\r\n  width:68px!important;\r\n  height:2px!important;\r\n  margin-top:12px!important;\r\n  background:var(--cfp-red)!important;\r\n}\r\n.cfs .cfs-stage .cfs-count{\r\n  color:var(--cfp-muted)!important;\r\n  font-size:10px!important;\r\n  line-height:1.4!important;\r\n  letter-spacing:.16em!important;\r\n  margin-bottom:16px!important;\r\n}\r\n.cfs .cfs-stage .cfs-copy{\r\n  color:var(--cfp-muted)!important;\r\n  font-size:clamp(13px,1.12vw,16px)!important;\r\n  line-height:1.65!important;\r\n}\r\n.cfs .cfs-stage .cfs-close{\r\n  color:var(--cfp-muted)!important;\r\n}\r\n.cfs .cfs-stage .cfs-card [data-action=\"details\"]{\r\n  color:var(--cfp-muted)!important;\r\n}\r\n\r\n\/* Palette CFP anche per il resto dell'interfaccia testuale. *\/\r\n.cfs .cfs-stage .cfs-description,\r\n.cfs .cfs-stage .cfs-help{\r\n  color:var(--cfp-muted)!important;\r\n}\r\n.cfs .cfs-stage .cfs-title{color:var(--cfp-text)!important;}\r\n.cfs .cfs-stage .cfs-progress{background:var(--cfp-line)!important;}\r\n.cfs .cfs-stage .cfs-progress i{background:var(--cfp-red)!important;}\r\n\r\n@media(max-height:620px){\r\n  .cfs .cfs-stage .cfs-card{padding:20px!important;}\r\n}\r\n<\/style>\r\n\r\n\r\n<style id=\"cfp-mobile-layout-patch\">\r\n\/* ===== PATCH MOBILE v2: canvas 3D prioritario, card compatta ===== *\/\r\n@media (max-width:600px){\r\n  .cfs{\r\n    --cfp-top-offset:30px;\r\n    --cfp-bottom-offset:24px;\r\n  }\r\n\r\n  .cfs-stage{\r\n    top:var(--cfp-top-offset)!important;\r\n    height:calc(100svh - var(--cfp-top-offset) - var(--cfp-bottom-offset))!important;\r\n    min-height:0!important;\r\n  }\r\n\r\n  \/* Il canvas occupa sempre lo spazio libero restante; quando la card e' aperta\r\n     lo spazio viene riservato dinamicamente dal --cfs-card-h gia' misurato dallo script. *\/\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-mount{\r\n    top:8px!important;\r\n    bottom:calc(var(--cfs-foot-h,72px) + var(--cfs-gap) * .45)!important;\r\n    height:auto!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage:has(.cfs-card.is-open) .cfs-mount,\r\n  .cfs[data-compact=\"true\"][data-focused=\"true\"] .cfs-stage .cfs-mount{\r\n    bottom:calc(var(--cfs-foot-h,72px) + var(--cfs-card-h,0px) + 10px)!important;\r\n  }\r\n\r\n  \/* Card mobile: piu' bassa e compatta per lasciare priorita' assoluta al 3D. *\/\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-card{\r\n    left:10px!important;\r\n    right:10px!important;\r\n    bottom:calc(var(--cfs-foot-h,72px) + 6px)!important;\r\n    width:auto!important;\r\n    padding:10px 12px!important;\r\n    border-radius:18px!important;\r\n    max-height:min(calc(var(--cfs-h) * .30),250px)!important;\r\n    overflow:hidden!important;\r\n  }\r\n\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-card h3{\r\n    font-size:20px!important;\r\n    line-height:1.08!important;\r\n    margin:0 28px 5px 0!important;\r\n    padding-right:0!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-card h3::after{\r\n    width:34px!important;\r\n    height:2px!important;\r\n    margin-top:4px!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-count{\r\n    font-size:8px!important;\r\n    line-height:1.2!important;\r\n    letter-spacing:.08em!important;\r\n    margin-bottom:4px!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-copy{\r\n    font-size:11.5px!important;\r\n    line-height:1.28!important;\r\n    margin:0!important;\r\n  }\r\n\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-install-controls{\r\n    margin-top:6px!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-install-meter{\r\n    font-size:8px!important;\r\n    line-height:1.15!important;\r\n    gap:8px!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage input[data-install-progress]{\r\n    height:27px!important;\r\n    margin:2px 0 4px!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-products{\r\n    min-height:40px!important;\r\n    padding:8px 10px!important;\r\n    margin:0 0 5px!important;\r\n    font-size:12px!important;\r\n    line-height:1!important;\r\n    gap:10px!important;\r\n    border-radius:12px!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-products svg{\r\n    width:44px!important;\r\n    height:11px!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-install-actions{\r\n    gap:4px!important;\r\n    flex-wrap:nowrap!important;\r\n    align-items:center!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-install-actions button{\r\n    min-height:36px!important;\r\n    height:36px!important;\r\n    padding:5px 9px!important;\r\n    font-size:10px!important;\r\n    line-height:1!important;\r\n    white-space:nowrap!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-card .cfs-close{\r\n    width:32px!important;\r\n    min-height:32px!important;\r\n    height:32px!important;\r\n    top:2px!important;\r\n    right:2px!important;\r\n    font-size:13px!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-card [data-action=\"sound\"]{\r\n    gap:4px!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-card [data-action=\"sound\"] svg{\r\n    width:14px!important;\r\n    height:14px!important;\r\n  }\r\n\r\n  \/* Footer ridotto: lascia piu' altezza utile al canvas. *\/\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-bottom{\r\n    left:10px!important;\r\n    right:10px!important;\r\n    bottom:7px!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-progress{margin-bottom:5px!important;}\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-row{\r\n    gap:4px!important;\r\n    align-items:center!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-nav{\r\n    gap:1px!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-nav button{\r\n    min-height:32px!important;\r\n    height:32px!important;\r\n    padding:4px 7px!important;\r\n    font-size:9px!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-nav b{margin-right:2px!important;}\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-tools{gap:3px!important;}\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-tools button{\r\n    min-height:32px!important;\r\n    height:32px!important;\r\n    width:32px!important;\r\n    padding:0!important;\r\n    font-size:14px!important;\r\n  }\r\n\r\n  \/* Header mobile piu' leggero: non sottrae superficie al modello. *\/\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-header{\r\n    top:8px!important;\r\n    left:12px!important;\r\n    right:12px!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-intro{\r\n    max-height:92px!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-title{\r\n    font-size:23px!important;\r\n    line-height:1.05!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-description{\r\n    font-size:12px!important;\r\n    line-height:1.25!important;\r\n    margin-top:6px!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-colors{\r\n    margin-top:6px!important;\r\n  }\r\n}\r\n\r\n@media (max-width:600px){\r\n  \/* Su telefoni stretti il 3D riceve ancora piu' spazio. *\/\r\n  .cfs{\r\n    --cfp-bottom-offset:20px;\r\n  }\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-card{\r\n    left:8px!important;\r\n    right:8px!important;\r\n    bottom:calc(var(--cfs-foot-h,68px) + 4px)!important;\r\n    max-height:min(calc(var(--cfs-h) * .27),220px)!important;\r\n    padding:8px 10px!important;\r\n    border-radius:16px!important;\r\n  }\r\n  .cfs[data-narrow=\"true\"] .cfs-stage:has(.cfs-card.is-open) .cfs-mount,\r\n  .cfs[data-narrow=\"true\"][data-focused=\"true\"] .cfs-stage .cfs-mount{\r\n    bottom:calc(var(--cfs-foot-h,68px) + var(--cfs-card-h,0px) + 8px)!important;\r\n  }\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-card h3{\r\n    font-size:18px!important;\r\n    margin-bottom:4px!important;\r\n  }\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-copy{\r\n    font-size:10.5px!important;\r\n    line-height:1.24!important;\r\n  }\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-install-meter{font-size:7.5px!important;}\r\n  .cfs[data-narrow=\"true\"] .cfs-stage input[data-install-progress]{height:24px!important;}\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-products{\r\n    min-height:36px!important;\r\n    padding:7px 9px!important;\r\n    font-size:11px!important;\r\n  }\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-install-actions button{\r\n    min-height:33px!important;\r\n    height:33px!important;\r\n    font-size:9px!important;\r\n    padding:4px 7px!important;\r\n  }\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-bottom{\r\n    left:8px!important;\r\n    right:8px!important;\r\n    bottom:5px!important;\r\n  }\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-nav button{\r\n    min-height:30px!important;\r\n    height:30px!important;\r\n    padding:3px 6px!important;\r\n    font-size:8px!important;\r\n  }\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-tools button{\r\n    min-height:30px!important;\r\n    height:30px!important;\r\n    width:30px!important;\r\n  }\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-header{\r\n    top:5px!important;\r\n    left:9px!important;\r\n    right:9px!important;\r\n  }\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-title{font-size:21px!important;}\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-description{font-size:11px!important;}\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-intro{max-height:82px!important;}\r\n}\r\n\r\n@media (max-width:600px) and (max-height:680px){\r\n  \/* Telefoni bassi: riduciamo ancora la card invece di sacrificare il canvas. *\/\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-card{\r\n    max-height:190px!important;\r\n    padding:7px 9px!important;\r\n  }\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-card h3{font-size:16px!important;}\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-copy{font-size:9.5px!important;line-height:1.2!important;}\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-products{min-height:32px!important;padding:6px 8px!important;}\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-install-actions button{min-height:30px!important;height:30px!important;font-size:8px!important;}\r\n}\r\n<\/style>\r\n\r\n\r\n<style id=\"cfp-mobile-ui-v3\">\r\n\/* ===== PATCH MOBILE v3: leggibilita' card + color glass + footer touch-friendly ===== *\/\r\n@media (max-width:600px){\r\n  \/* Card leggermente piu' leggibile senza rubare troppo spazio al 3D. *\/\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-card{\r\n    padding:12px 13px!important;\r\n    border-radius:18px!important;\r\n    background:linear-gradient(135deg,rgba(45,45,48,.96),rgba(24,24,27,.94))!important;\r\n    border-color:rgba(255,255,255,.18)!important;\r\n    box-shadow:0 16px 42px rgba(0,0,0,.55),0 0 0 1px rgba(255,255,255,.03) inset!important;\r\n    backdrop-filter:blur(10px) saturate(125%);\r\n    -webkit-backdrop-filter:blur(10px) saturate(125%);\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-card h3{\r\n    font-size:20px!important;\r\n    line-height:1.12!important;\r\n    margin-bottom:6px!important;\r\n    color:#f4f4f2!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-card h3::after{\r\n    width:38px!important;\r\n    margin-top:5px!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-count{\r\n    font-size:8.5px!important;\r\n    line-height:1.25!important;\r\n    margin-bottom:5px!important;\r\n    color:rgba(244,244,242,.68)!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-copy{\r\n    font-size:12px!important;\r\n    line-height:1.34!important;\r\n    color:rgba(244,244,242,.78)!important;\r\n  }\r\n\r\n  \/* Controllo colore: vetro trasparente, leggibile anche quando il 3D passa sotto. *\/\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-colors{\r\n    margin-top:8px!important;\r\n    padding:6px 9px 7px!important;\r\n    max-width:calc(100% - 20px)!important;\r\n    border:1px solid rgba(255,255,255,.20)!important;\r\n    border-radius:16px!important;\r\n    background:linear-gradient(135deg,rgba(22,22,25,.38),rgba(12,12,15,.26))!important;\r\n    box-shadow:0 10px 28px rgba(0,0,0,.24),inset 0 1px 0 rgba(255,255,255,.12)!important;\r\n    backdrop-filter:blur(14px) saturate(145%)!important;\r\n    -webkit-backdrop-filter:blur(14px) saturate(145%)!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-colors legend{\r\n    color:rgba(244,244,242,.76)!important;\r\n    font-size:9px!important;\r\n    line-height:1.2!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-color-name{\r\n    color:#f4f4f2!important;\r\n    font-size:10px!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-color-list{\r\n    gap:1px!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-color-list label{\r\n    width:30px!important;\r\n    min-width:30px!important;\r\n    height:30px!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-swatch{\r\n    width:18px!important;\r\n    height:18px!important;\r\n    box-shadow:inset 0 1px 2px rgba(255,255,255,.22),0 1px 5px rgba(0,0,0,.2)!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage [data-action=\"colors\"]{\r\n    width:24px!important;\r\n    min-width:24px!important;\r\n    min-height:24px!important;\r\n    height:24px!important;\r\n    background:rgba(255,255,255,.06)!important;\r\n    border-color:rgba(255,255,255,.22)!important;\r\n    color:#f4f4f2!important;\r\n  }\r\n\r\n  \/* Footer mobile: due righe separate, niente compressione dei pulsanti. *\/\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-bottom{\r\n    left:10px!important;\r\n    right:10px!important;\r\n    bottom:6px!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-progress{\r\n    margin-bottom:8px!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-row{\r\n    display:flex!important;\r\n    flex-direction:column!important;\r\n    align-items:stretch!important;\r\n    justify-content:flex-start!important;\r\n    gap:7px!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-nav{\r\n    display:grid!important;\r\n    grid-template-columns:repeat(5,minmax(0,1fr))!important;\r\n    width:100%!important;\r\n    gap:5px!important;\r\n    align-items:stretch!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-nav button{\r\n    width:100%!important;\r\n    min-width:0!important;\r\n    min-height:44px!important;\r\n    height:44px!important;\r\n    padding:6px 5px!important;\r\n    border-radius:22px!important;\r\n    font-size:10px!important;\r\n    line-height:1.1!important;\r\n    white-space:nowrap!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-nav b{\r\n    font-size:9px!important;\r\n    margin-right:3px!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-tools{\r\n    display:flex!important;\r\n    width:100%!important;\r\n    justify-content:flex-end!important;\r\n    gap:8px!important;\r\n    margin-left:0!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-tools button{\r\n    flex:0 0 44px!important;\r\n    width:44px!important;\r\n    min-width:44px!important;\r\n    min-height:44px!important;\r\n    height:44px!important;\r\n    padding:0!important;\r\n    border-radius:50%!important;\r\n    font-size:16px!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-tools [data-action=\"mode\"]{\r\n    width:auto!important;\r\n    flex:0 0 auto!important;\r\n    min-width:118px!important;\r\n    padding:0 16px!important;\r\n    border-radius:22px!important;\r\n    font-size:11px!important;\r\n  }\r\n\r\n  \/* Quando il canvas e' prioritario, gli strumenti restano nel footer e non si sovrappongono al modello. *\/\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-mount{\r\n    bottom:calc(var(--cfs-foot-h,116px) + 6px)!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage:has(.cfs-card.is-open) .cfs-mount,\r\n  .cfs[data-compact=\"true\"][data-focused=\"true\"] .cfs-stage .cfs-mount{\r\n    bottom:calc(var(--cfs-foot-h,116px) + var(--cfs-card-h,0px) + 10px)!important;\r\n  }\r\n}\r\n\r\n@media (max-width:600px){\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-card{\r\n    padding:10px 11px!important;\r\n    max-height:min(calc(var(--cfs-h) * .28),220px)!important;\r\n    background:linear-gradient(135deg,rgba(45,45,48,.96),rgba(24,24,27,.94))!important;\r\n  }\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-card h3{\r\n    font-size:18px!important;\r\n    line-height:1.12!important;\r\n  }\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-copy{\r\n    font-size:11px!important;\r\n    line-height:1.27!important;\r\n  }\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-nav button{\r\n    min-height:44px!important;\r\n    height:44px!important;\r\n    font-size:9.5px!important;\r\n    padding:6px 4px!important;\r\n  }\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-tools button{\r\n    min-height:44px!important;\r\n    height:44px!important;\r\n  }\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-tools [data-action=\"mode\"]{\r\n    min-width:112px!important;\r\n  }\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-mount{\r\n    bottom:calc(var(--cfs-foot-h,116px) + 4px)!important;\r\n  }\r\n  .cfs[data-narrow=\"true\"] .cfs-stage:has(.cfs-card.is-open) .cfs-mount,\r\n  .cfs[data-narrow=\"true\"][data-focused=\"true\"] .cfs-stage .cfs-mount{\r\n    bottom:calc(var(--cfs-foot-h,116px) + var(--cfs-card-h,0px) + 8px)!important;\r\n  }\r\n}\r\n\r\n@media (max-width:600px) and (max-height:680px){\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-card{\r\n    max-height:185px!important;\r\n    padding:9px 10px!important;\r\n  }\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-card h3{font-size:16.5px!important;}\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-copy{font-size:10px!important;line-height:1.22!important;}\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-nav button{min-height:42px!important;height:42px!important;}\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-tools button{min-height:42px!important;height:42px!important;}\r\n}\r\n<\/style>\r\n\r\n\r\n<style id=\"cfp-mobile-intro-v8\">\r\n\/* ===== PATCH MOBILE v8: + controlla solo cfs-description ===== *\/\r\n.cfs-intro-toggle{display:none!important;}\r\n@media (max-width:600px){\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-intro,\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-intro{\r\n    max-height:none!important;\r\n    overflow:visible!important;\r\n    opacity:1!important;\r\n    transition:none!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-title,\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-title{\r\n    font-size:30px!important;\r\n    line-height:1.12!important;\r\n    max-width:none!important;\r\n    margin:0!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-description,\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-description{\r\n    font-size:18px!important;\r\n    line-height:1.42!important;\r\n    margin:12px 0 0!important;\r\n    max-width:62ch!important;\r\n    display:-webkit-box!important;\r\n    -webkit-box-orient:vertical!important;\r\n    -webkit-line-clamp:2!important;\r\n    line-clamp:2!important;\r\n    overflow:hidden!important;\r\n    max-height:5.68em!important;\r\n    transition:max-height .32s cubic-bezier(.22,1,.36,1)!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-intro-toggle,\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-intro-toggle{\r\n    display:grid!important;\r\n    place-items:center!important;\r\n    width:38px!important;\r\n    min-width:38px!important;\r\n    height:38px!important;\r\n    min-height:38px!important;\r\n    margin:10px 0 0!important;\r\n    padding:0!important;\r\n    border:1px solid rgba(255,255,255,.24)!important;\r\n    border-radius:50%!important;\r\n    background:linear-gradient(135deg,rgba(255,255,255,.10),rgba(255,255,255,.035))!important;\r\n    color:#f4f4f2!important;\r\n    box-shadow:0 8px 20px rgba(0,0,0,.28),inset 0 1px 0 rgba(255,255,255,.12)!important;\r\n    backdrop-filter:blur(12px) saturate(145%)!important;\r\n    -webkit-backdrop-filter:blur(12px) saturate(145%)!important;\r\n    font-size:20px!important;\r\n    line-height:1!important;\r\n    pointer-events:auto!important;\r\n    position:relative!important;\r\n    z-index:5!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-intro-toggle:hover,\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-intro-toggle:hover{\r\n    background:rgba(255,255,255,.12)!important;\r\n  }\r\n  .cfs[data-compact=\"true\"][data-description-open=\"true\"] .cfs-stage .cfs-description,\r\n  .cfs[data-narrow=\"true\"][data-description-open=\"true\"] .cfs-stage .cfs-description{\r\n    -webkit-line-clamp:unset!important;\r\n    line-clamp:unset!important;\r\n    max-height:30em!important;\r\n  }\r\n  .cfs[data-compact=\"true\"][data-focused=\"true\"] .cfs-stage .cfs-intro-toggle,\r\n  .cfs[data-narrow=\"true\"][data-focused=\"true\"] .cfs-stage .cfs-intro-toggle{\r\n    display:none!important;\r\n  }\r\n}\r\n@media (max-width:600px) and (max-height:680px){\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-description,\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-description{\r\n    -webkit-line-clamp:2!important;\r\n    line-clamp:2!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-intro-toggle,\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-intro-toggle{\r\n    width:36px!important;\r\n    min-width:36px!important;\r\n    height:36px!important;\r\n    min-height:36px!important;\r\n    margin-top:8px!important;\r\n    font-size:19px!important;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(()=>{\r\n  'use strict';\r\n  const root=document.getElementById('cobra-scroll3d');\r\n  if(!root)return;\r\n  const toggle=root.querySelector('[data-action=\"intro-toggle\"]');\r\n  const description=root.querySelector('.cfs-description');\r\n  if(!toggle||!description)return;\r\n  if(!description.id)description.id=root.id+'-description';\r\n  toggle.setAttribute('aria-controls',description.id);\r\n\r\n  const isMobileOrTablet=()=>window.innerWidth<=600;\r\n  const hasCollapsedOverflow=()=>{\r\n    if(!isMobileOrTablet())return false;\r\n    const open=root.dataset.descriptionOpen==='true';\r\n    if(open)return true;\r\n    const previous=root.dataset.descriptionMeasuring;\r\n    root.dataset.descriptionMeasuring='true';\r\n    const style=description.style;\r\n    const savedDisplay=style.display,savedClamp=style.webkitLineClamp,savedMaxHeight=style.maxHeight;\r\n    style.display='-webkit-box';\r\n    style.webkitLineClamp='2';\r\n    style.maxHeight='5.68em';\r\n    const overflow=description.scrollHeight>description.clientHeight+1;\r\n    style.display=savedDisplay;\r\n    style.webkitLineClamp=savedClamp;\r\n    style.maxHeight=savedMaxHeight;\r\n    if(previous===undefined)delete root.dataset.descriptionMeasuring;\r\n    else root.dataset.descriptionMeasuring=previous;\r\n    return overflow;\r\n  };\r\n  const sync=()=>{\r\n    const open=root.dataset.descriptionOpen==='true';\r\n    const needsToggle=hasCollapsedOverflow();\r\n    const show=open||needsToggle;\r\n    toggle.textContent=open?'\\u2212':'+';\r\n    toggle.setAttribute('aria-expanded',String(open));\r\n    toggle.setAttribute('aria-label',open?'Chiudi descrizione':'Apri descrizione');\r\n    toggle.title=open?'Chiudi descrizione':'Apri descrizione';\r\n    toggle.style.setProperty('display',show?'grid':'none','important');\r\n    toggle.setAttribute('aria-hidden',show?'false':'true');\r\n  };\r\n  const setOpen=open=>{\r\n    root.dataset.descriptionOpen=open?'true':'false';\r\n    sync();\r\n    requestAnimationFrame(()=>{\r\n      window.dispatchEvent(new Event('resize'));\r\n      requestAnimationFrame(()=>{\r\n        sync();\r\n        window.dispatchEvent(new Event('resize'));\r\n      });\r\n    });\r\n  };\r\n  toggle.addEventListener('click',e=>{\r\n    e.preventDefault();\r\n    e.stopPropagation();\r\n    setOpen(root.dataset.descriptionOpen!=='true');\r\n  },{passive:false});\r\n  if(!root.dataset.descriptionOpen)root.dataset.descriptionOpen='false';\r\n\r\n  const ro='ResizeObserver' in window?new ResizeObserver(sync):null;\r\n  ro?.observe(description);\r\n  window.addEventListener('resize',sync,{passive:true});\r\n  const mo=new MutationObserver(sync);\r\n  mo.observe(description,{childList:true,characterData:true,subtree:true});\r\n  sync();\r\n\r\n  root.cfsIntroToggleCleanup=()=>{\r\n    ro?.disconnect();\r\n    window.removeEventListener('resize',sync);\r\n    mo.disconnect();\r\n  };\r\n})();\r\n<\/script>\r\n\r\n\r\n<style id=\"cfp-colors-glass-fix-v12\">\r\n\/* ===== FIX MOBILE\/TABLET: il blur riguarda solo la pillola colori, non il fieldset ===== *\/\r\n@media (max-width:600px){\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-colors,\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-colors{\r\n    position:relative!important;\r\n    display:block!important;\r\n    margin-top:8px!important;\r\n    padding:0!important;\r\n    max-width:none!important;\r\n    width:max-content!important;\r\n    border:0!important;\r\n    border-radius:0!important;\r\n    background:transparent!important;\r\n    box-shadow:none!important;\r\n    backdrop-filter:none!important;\r\n    -webkit-backdrop-filter:none!important;\r\n    overflow:visible!important;\r\n  }\r\n\r\n  \/* La legend resta nitida e sopra al vetro. *\/\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-colors legend,\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-colors legend{\r\n    position:relative!important;\r\n    z-index:3!important;\r\n    display:inline-flex!important;\r\n    align-items:center!important;\r\n    gap:7px!important;\r\n    width:max-content!important;\r\n    margin:0 0 4px!important;\r\n    padding:0!important;\r\n    color:rgba(244,244,242,.80)!important;\r\n    background:transparent!important;\r\n    border:0!important;\r\n    box-shadow:none!important;\r\n    backdrop-filter:none!important;\r\n    -webkit-backdrop-filter:none!important;\r\n  }\r\n\r\n  \/* Il vero glass layer \u00e8 solo la pillola che contiene gli swatch. *\/\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-color-list,\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-color-list{\r\n    position:relative!important;\r\n    z-index:2!important;\r\n    display:flex!important;\r\n    width:max-content!important;\r\n    max-width:100%!important;\r\n    margin:0!important;\r\n    padding:5px 7px!important;\r\n    gap:1px!important;\r\n    border:1px solid rgba(255,255,255,.20)!important;\r\n    border-radius:15px!important;\r\n    background:linear-gradient(135deg,rgba(20,20,24,.30),rgba(8,8,11,.18))!important;\r\n    box-shadow:0 8px 24px rgba(0,0,0,.18),inset 0 1px 0 rgba(255,255,255,.10)!important;\r\n    backdrop-filter:blur(12px) saturate(145%)!important;\r\n    -webkit-backdrop-filter:blur(12px) saturate(145%)!important;\r\n  }\r\n\r\n  \/* Quando la palette \u00e8 chiusa resta solo una piccola pillola attorno alla legend. *\/\r\n  .cfs[data-colors=\"off\"] .cfs-stage .cfs-colors legend{\r\n    margin:0!important;\r\n    padding:5px 7px!important;\r\n    border:1px solid rgba(255,255,255,.18)!important;\r\n    border-radius:13px!important;\r\n    background:linear-gradient(135deg,rgba(20,20,24,.30),rgba(8,8,11,.18))!important;\r\n    box-shadow:0 8px 20px rgba(0,0,0,.16),inset 0 1px 0 rgba(255,255,255,.08)!important;\r\n    backdrop-filter:blur(12px) saturate(145%)!important;\r\n    -webkit-backdrop-filter:blur(12px) saturate(145%)!important;\r\n  }\r\n\r\n  .cfs[data-colors=\"off\"] .cfs-stage .cfs-color-list{display:none!important;}\r\n}\r\n<\/style>\r\n\r\n<style id=\"cfp-intro-focused-fix-v9\">\r\n\/* ===== FIX v9: quando l'H2 viene nascosto durante lo scroll,\r\n   l'intro non deve sparire. Resta visibile la descrizione (+ toggle su mobile\/tablet). *\/\r\n.cfs[data-focused=\"true\"] .cfs-stage .cfs-intro{\r\n  max-height:1000px!important;\r\n  opacity:1!important;\r\n  overflow:visible!important;\r\n  transition:none!important;\r\n}\r\n@media (max-width:600px){\r\n  .cfs[data-focused=\"true\"] .cfs-stage .cfs-intro-toggle{\r\n    display:grid!important;\r\n    visibility:visible!important;\r\n    opacity:1!important;\r\n  }\r\n  .cfs[data-focused=\"true\"] .cfs-stage .cfs-description{\r\n    opacity:1!important;\r\n    visibility:visible!important;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<style id=\"cfp-intro-scroll-v11\">\r\n\/* ===== FIX v11: l'intero .cfs-intro segue la stessa dinamica di scroll del titolo ===== *\/\r\n.cfs .cfs-stage .cfs-intro{\r\n  transition:max-height .3s cubic-bezier(.22,1,.36,1),opacity .3s cubic-bezier(.22,1,.36,1)!important;\r\n}\r\n.cfs[data-focused=\"true\"] .cfs-stage .cfs-intro{\r\n  max-height:0!important;\r\n  opacity:0!important;\r\n  overflow:hidden!important;\r\n  visibility:hidden!important;\r\n}\r\n.cfs[data-focused=\"false\"] .cfs-stage .cfs-intro{\r\n  opacity:1!important;\r\n  visibility:visible!important;\r\n}\r\n@media (max-width:600px){\r\n  .cfs[data-focused=\"true\"] .cfs-stage .cfs-intro-toggle{\r\n    display:none!important;\r\n    visibility:hidden!important;\r\n    opacity:0!important;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<style id=\"cfp-glass-nav-v13\">\r\n\/* ===== PATCH v13 =====================================================\r\n   1. card in glassmorphism su desktop e su mobile: il canvas 3D resta\r\n      visibile sotto, quindi l'area utile del modello e' tutta la scocca;\r\n   2. su mobile il canvas non viene piu' accorciato dalla card;\r\n   3. nav mobile: la pillola corrente non esce mai dal suo riquadro;\r\n   4. offset superiore su mobile a 30px.\r\n   ==================================================================== *\/\r\n\r\n\/* --- 1. Card in vetro, desktop e mobile ----------------------------- *\/\r\n.cfs .cfs-stage .cfs-card{\r\n  border:1px solid rgba(255,255,255,.17)!important;\r\n  border-left:3px solid rgba(227,9,22,.62)!important;\r\n  background:linear-gradient(140deg,rgba(30,30,34,.66),rgba(10,10,13,.54))!important;\r\n  box-shadow:0 24px 64px rgba(0,0,0,.46),inset 0 1px 0 rgba(255,255,255,.13)!important;\r\n  backdrop-filter:blur(30px) saturate(145%)!important;\r\n  -webkit-backdrop-filter:blur(30px) saturate(145%)!important;\r\n}\r\n.cfs .cfs-stage .cfs-card h3{color:#fff!important;text-shadow:0 1px 3px rgba(0,0,0,.45)!important;}\r\n.cfs .cfs-stage .cfs-copy{color:rgba(248,248,246,.90)!important;text-shadow:0 1px 2px rgba(0,0,0,.42)!important;}\r\n.cfs .cfs-stage .cfs-count{color:rgba(248,248,246,.74)!important;text-shadow:0 1px 2px rgba(0,0,0,.40)!important;}\r\n\/* I pulsanti dentro la card restano leggibili sopra il vetro. *\/\r\n.cfs .cfs-stage .cfs-card button:not(.cfs-close):not([data-action=\"install-play\"]){\r\n  background:rgba(255,255,255,.07)!important;\r\n  border-color:rgba(255,255,255,.20)!important;\r\n  color:rgba(246,246,244,.88)!important;\r\n}\r\n.cfs .cfs-stage .cfs-install-meter{color:rgba(246,246,244,.72)!important;}\r\n\r\n\/* --- 2\/3\/4. Mobile -------------------------------------------------- *\/\r\n@media (max-width:600px){\r\n  .cfs{\r\n    --cfp-top-offset:30px!important;\r\n    --cfs-top:30px!important;\r\n  }\r\n  .cfs-stage{top:30px!important;}\r\n\r\n  \/* Card mobile: stesso vetro, piu' compatta. *\/\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-card,\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-card{\r\n    background:linear-gradient(140deg,rgba(30,30,34,.68),rgba(10,10,13,.56))!important;\r\n    border:1px solid rgba(255,255,255,.17)!important;\r\n    border-left:3px solid rgba(227,9,22,.62)!important;\r\n    box-shadow:0 18px 46px rgba(0,0,0,.44),inset 0 1px 0 rgba(255,255,255,.12)!important;\r\n    backdrop-filter:blur(24px) saturate(145%)!important;\r\n    -webkit-backdrop-filter:blur(24px) saturate(145%)!important;\r\n  }\r\n\r\n  \/* Il canvas non viene piu' accorciato dalla card: le passa sotto. *\/\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-mount,\r\n  .cfs[data-compact=\"true\"] .cfs-stage:has(.cfs-card.is-open) .cfs-mount,\r\n  .cfs[data-compact=\"true\"][data-focused=\"true\"] .cfs-stage .cfs-mount,\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-mount,\r\n  .cfs[data-narrow=\"true\"] .cfs-stage:has(.cfs-card.is-open) .cfs-mount,\r\n  .cfs[data-narrow=\"true\"][data-focused=\"true\"] .cfs-stage .cfs-mount{\r\n    top:4px!important;\r\n    bottom:calc(var(--cfs-foot-h,104px) + 4px)!important;\r\n    height:auto!important;\r\n  }\r\n\r\n  \/* --- Footer: nav a larghezza variabile ---------------------------- *\/\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-bottom,\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-bottom{\r\n    left:10px!important;\r\n    right:10px!important;\r\n    bottom:8px!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-row,\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-row{\r\n    display:flex!important;\r\n    flex-direction:column!important;\r\n    align-items:stretch!important;\r\n    gap:7px!important;\r\n  }\r\n\r\n  \/* La nav torna flex: i passi non correnti occupano solo il numero, la\r\n     pillola corrente prende lo spazio che resta e non esce mai dal box. *\/\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-nav,\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-nav{\r\n    display:flex!important;\r\n    grid-template-columns:none!important;\r\n    width:100%!important;\r\n    max-width:100%!important;\r\n    gap:4px!important;\r\n    align-items:stretch!important;\r\n    justify-content:flex-start!important;\r\n    overflow:hidden!important;\r\n    padding:3px!important;\r\n    border:1px solid rgba(255,255,255,.14)!important;\r\n    border-radius:26px!important;\r\n    background:linear-gradient(140deg,rgba(24,24,28,.42),rgba(9,9,12,.26))!important;\r\n    box-shadow:0 10px 26px rgba(0,0,0,.22),inset 0 1px 0 rgba(255,255,255,.09)!important;\r\n    backdrop-filter:blur(16px) saturate(145%)!important;\r\n    -webkit-backdrop-filter:blur(16px) saturate(145%)!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-nav button,\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-nav button{\r\n    flex:0 0 auto!important;\r\n    display:inline-flex!important;\r\n    align-items:center!important;\r\n    justify-content:center!important;\r\n    width:auto!important;\r\n    min-width:34px!important;\r\n    max-width:100%!important;\r\n    min-height:38px!important;\r\n    height:38px!important;\r\n    padding:0 9px!important;\r\n    border:1px solid transparent!important;\r\n    border-radius:19px!important;\r\n    background:transparent!important;\r\n    font-size:10px!important;\r\n    line-height:1!important;\r\n    white-space:nowrap!important;\r\n    overflow:hidden!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-nav button[aria-current=\"step\"],\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-nav button[aria-current=\"step\"]{\r\n    flex:1 1 auto!important;\r\n    min-width:0!important;\r\n    border-color:rgba(227,9,22,.45)!important;\r\n    background:linear-gradient(140deg,rgba(90,14,20,.62),rgba(40,6,10,.52))!important;\r\n    color:#fff!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-nav button[aria-current=\"step\"] span,\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-nav button[aria-current=\"step\"] span{\r\n    display:inline-block!important;\r\n    min-width:0!important;\r\n    max-width:100%!important;\r\n    overflow:hidden!important;\r\n    text-overflow:ellipsis!important;\r\n    white-space:nowrap!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-nav b,\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-nav b{\r\n    flex:0 0 auto!important;\r\n    font-size:9px!important;\r\n    margin-right:0!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-nav button[aria-current=\"step\"] b,\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-nav button[aria-current=\"step\"] b{\r\n    margin-right:5px!important;\r\n  }\r\n\r\n  \/* Strumenti: stessa altezza della nav, vetro coerente. *\/\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-tools,\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-tools{\r\n    display:flex!important;\r\n    width:100%!important;\r\n    justify-content:flex-end!important;\r\n    gap:7px!important;\r\n    margin-left:0!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-tools button,\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-tools button{\r\n    flex:0 0 42px!important;\r\n    width:42px!important;\r\n    min-width:42px!important;\r\n    min-height:42px!important;\r\n    height:42px!important;\r\n    padding:0!important;\r\n    border:1px solid rgba(255,255,255,.18)!important;\r\n    border-radius:50%!important;\r\n    background:linear-gradient(140deg,rgba(24,24,28,.44),rgba(9,9,12,.28))!important;\r\n    box-shadow:0 8px 20px rgba(0,0,0,.20),inset 0 1px 0 rgba(255,255,255,.10)!important;\r\n    backdrop-filter:blur(14px) saturate(145%)!important;\r\n    -webkit-backdrop-filter:blur(14px) saturate(145%)!important;\r\n    font-size:16px!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-tools [data-action=\"mode\"],\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-tools [data-action=\"mode\"]{\r\n    flex:0 0 auto!important;\r\n    width:auto!important;\r\n    min-width:112px!important;\r\n    padding:0 16px!important;\r\n    border-radius:21px!important;\r\n    border-color:rgba(227,9,22,.38)!important;\r\n    font-size:11px!important;\r\n  }\r\n\r\n  \/* Header mobile: sale con il nuovo offset. *\/\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-header,\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-header{\r\n    top:6px!important;\r\n    left:11px!important;\r\n    right:11px!important;\r\n  }\r\n}\r\n\r\n\/* Telefoni bassi: nav e strumenti leggermente piu' sottili. *\/\r\n@media (max-width:600px) and (max-height:680px){\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-nav button,\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-nav button{\r\n    min-height:34px!important;\r\n    height:34px!important;\r\n    border-radius:17px!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-tools button,\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-tools button{\r\n    flex-basis:38px!important;\r\n    width:38px!important;\r\n    min-width:38px!important;\r\n    min-height:38px!important;\r\n    height:38px!important;\r\n  }\r\n  .cfs[data-compact=\"true\"] .cfs-stage .cfs-tools [data-action=\"mode\"],\r\n  .cfs[data-narrow=\"true\"] .cfs-stage .cfs-tools [data-action=\"mode\"]{\r\n    width:auto!important;\r\n    min-width:104px!important;\r\n  }\r\n}\r\n\r\n\/* Il vetro richiede un contesto non filtrato: lo stage non deve avere filtri. *\/\r\n.cfs .cfs-stage{backdrop-filter:none;}\r\n<\/style>\r\n\r\n<style id=\"cfp-colors-glass-desktop-v14\">\r\n\/* ===== Selettore colore in glassmorphism anche su desktop =====\r\n   Stesso trattamento gia' usato su mobile: il fieldset non ha piu' una scocca\r\n   opaca, il vetro e' la sola pillola che contiene gli swatch. *\/\r\n@media (min-width:601px){\r\n  .cfs .cfs-stage .cfs-colors{\r\n    position:relative!important;\r\n    display:block!important;\r\n    padding:0!important;\r\n    width:max-content!important;\r\n    max-width:100%!important;\r\n    border:0!important;\r\n    border-radius:0!important;\r\n    background:transparent!important;\r\n    box-shadow:none!important;\r\n    backdrop-filter:none!important;\r\n    -webkit-backdrop-filter:none!important;\r\n    overflow:visible!important;\r\n  }\r\n  .cfs .cfs-stage .cfs-colors legend{\r\n    position:relative!important;\r\n    z-index:3!important;\r\n    display:inline-flex!important;\r\n    align-items:center!important;\r\n    gap:9px!important;\r\n    width:max-content!important;\r\n    margin:0 0 6px!important;\r\n    padding:0!important;\r\n    color:rgba(244,244,242,.80)!important;\r\n    background:transparent!important;\r\n    border:0!important;\r\n    box-shadow:none!important;\r\n    backdrop-filter:none!important;\r\n    -webkit-backdrop-filter:none!important;\r\n  }\r\n  .cfs .cfs-stage .cfs-color-name{color:#fff!important;}\r\n  .cfs .cfs-stage .cfs-color-list{\r\n    position:relative!important;\r\n    z-index:2!important;\r\n    display:flex!important;\r\n    width:max-content!important;\r\n    max-width:100%!important;\r\n    margin:0!important;\r\n    padding:6px 9px!important;\r\n    gap:3px!important;\r\n    border:1px solid rgba(255,255,255,.19)!important;\r\n    border-radius:20px!important;\r\n    background:linear-gradient(140deg,rgba(24,24,28,.40),rgba(9,9,12,.26))!important;\r\n    box-shadow:0 12px 30px rgba(0,0,0,.24),inset 0 1px 0 rgba(255,255,255,.11)!important;\r\n    backdrop-filter:blur(18px) saturate(150%)!important;\r\n    -webkit-backdrop-filter:blur(18px) saturate(150%)!important;\r\n  }\r\n  \/* Palette chiusa: resta la sola pillola attorno alla legend. *\/\r\n  .cfs[data-colors=\"off\"] .cfs-stage .cfs-colors legend{\r\n    margin:0!important;\r\n    padding:6px 11px!important;\r\n    border:1px solid rgba(255,255,255,.18)!important;\r\n    border-radius:17px!important;\r\n    background:linear-gradient(140deg,rgba(24,24,28,.40),rgba(9,9,12,.26))!important;\r\n    box-shadow:0 10px 24px rgba(0,0,0,.20),inset 0 1px 0 rgba(255,255,255,.09)!important;\r\n    backdrop-filter:blur(18px) saturate(150%)!important;\r\n    -webkit-backdrop-filter:blur(18px) saturate(150%)!important;\r\n  }\r\n  .cfs[data-colors=\"off\"] .cfs-stage .cfs-color-list{display:none!important;}\r\n  .cfs .cfs-stage [data-action=\"colors\"]{\r\n    background:rgba(255,255,255,.08)!important;\r\n    border-color:rgba(255,255,255,.24)!important;\r\n    color:#f4f4f2!important;\r\n  }\r\n  .cfs .cfs-stage [data-action=\"colors\"]:hover{background:rgba(255,255,255,.16)!important;}\r\n}\r\n<\/style>\r\n<style>\r\n.cfs .cfs-stage .cfs-type-switch{display:flex;flex-wrap:wrap;align-items:end;gap:8px;margin-top:16px;pointer-events:auto;max-width:560px}\r\n.cfs .cfs-stage .cfs-type-switch label{display:grid;gap:5px;min-width:0;max-width:100%}\r\n.cfs .cfs-stage .cfs-type-label{font-size:11px;color:#aaa;letter-spacing:.04em}\r\n.cfs .cfs-stage .cfs-type-switch select{font:inherit;font-size:13px;line-height:1.2;color:#f0f0f0;background:#171719;border:1px solid #46464a;border-radius:9px;padding:10px 32px 10px 12px;min-height:42px;max-width:100%;cursor:pointer;color-scheme:dark}\r\n.cfs .cfs-stage .cfs-type-switch select:focus-visible{outline:2px solid #db3e32;outline-offset:3px}\r\n.cfs .cfs-stage .cfs-type-switch select[hidden]{display:none}\r\n.cfs .cfs-stage .cfs-type-switch+.cfs-colors{margin-top:10px}\r\n.cfs[data-focused=true] .cfs-stage .cfs-type-switch{margin-top:0}\r\n.cfs[data-compact=true] .cfs-stage .cfs-type-switch{margin-top:10px;gap:5px;max-width:100%}\r\n.cfs[data-compact=true] .cfs-stage .cfs-type-switch select{font-size:12px;padding:8px 25px 8px 9px;min-height:44px}\r\n.cfs[data-compact=true][data-focused=true] .cfs-stage .cfs-type-switch{max-width:calc(100% - 70px);margin-top:0}\r\n<\/style>\r\n\r\n<style>\r\n@media(max-width:600px){\r\n.cfs[data-compact=\"true\"] .cfs-stage .cfs-mount,\r\n.cfs[data-narrow=\"true\"] .cfs-stage .cfs-mount,\r\n.cfs[data-compact=\"true\"][data-focused=\"true\"] .cfs-stage .cfs-mount,\r\n.cfs[data-narrow=\"true\"][data-focused=\"true\"] .cfs-stage .cfs-mount,\r\n.cfs[data-compact=\"true\"] .cfs-stage:has(.cfs-card.is-open) .cfs-mount,\r\n.cfs[data-narrow=\"true\"] .cfs-stage:has(.cfs-card.is-open) .cfs-mount{\r\n top:calc(var(--cfs-head-h,150px) + 8px)!important;\r\n bottom:calc(var(--cfs-foot-h,110px) + 8px)!important;height:auto!important;\r\n}\r\n.cfs[data-compact=\"true\"] .cfs-stage:has(.cfs-card.is-open) .cfs-mount,\r\n.cfs[data-narrow=\"true\"] .cfs-stage:has(.cfs-card.is-open) .cfs-mount{\r\n bottom:calc(var(--cfs-foot-h,110px) + var(--cfs-card-h,180px) + 16px)!important;\r\n}\r\n}\r\n<\/style>\r\n\r\n<style>\r\n.cfs .cfs-stage .cfs-type-field{display:grid;gap:5px;min-width:0;max-width:100%}\r\n.cfs .cfs-stage .cfs-picker{position:relative;min-width:0;max-width:100%;width:280px;color:#fff}\r\n.cfs .cfs-stage .cfs-picker:has([data-head-select]){width:180px}\r\n.cfs .cfs-stage .cfs-picker[hidden],.cfs .cfs-stage .cfs-picker-list[hidden],.cfs .cfs-stage select.cfs-picker-native{display:none!important}\r\n.cfs .cfs-stage .cfs-picker-trigger{display:flex!important;align-items:center;justify-content:space-between;gap:16px;width:100%;min-height:48px;margin:0;padding:12px 16px!important;border:1px solid #414141!important;border-radius:12px!important;background:#000!important;color:#fff!important;font:inherit!important;font-size:14px!important;font-weight:400!important;line-height:1.35!important;text-align:left;text-transform:none!important;letter-spacing:normal!important;cursor:pointer;box-shadow:none!important}\r\n.cfs .cfs-stage .cfs-picker-trigger::after{content:'';display:block;flex:0 0 8px;width:8px;height:8px;border-right:2px solid #e30916;border-bottom:2px solid #e30916;transform:rotate(45deg);margin-top:-4px}\r\n.cfs .cfs-stage .is-open>.cfs-picker-trigger::after{transform:rotate(225deg);margin-top:4px}\r\n.cfs .cfs-stage .cfs-picker-trigger:disabled{opacity:.45;cursor:wait}\r\n.cfs .cfs-stage .cfs-picker-trigger:focus-visible{outline:2px solid #e30916!important;outline-offset:3px}\r\n.cfs .cfs-stage .cfs-picker-list{position:absolute;z-index:30;inset:auto 0 auto 0;top:calc(100% + 8px);box-sizing:border-box;width:100%;padding:10px;border:1px solid #393939;border-radius:15px;background:#000!important;color:#fff;box-shadow:0 14px 38px #000b;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain;scrollbar-width:thin!important;scrollbar-color:#e30916 #000!important;scrollbar-gutter:stable;touch-action:pan-y;pointer-events:auto}\r\n.cfs .cfs-stage .opens-up>.cfs-picker-list{top:auto;bottom:calc(100% + 8px)}\r\n.cfs .cfs-stage .cfs-picker-list [role=option]{display:flex;align-items:center;box-sizing:border-box;min-height:48px;padding:13px 14px;margin:0 0 3px;border:0;border-radius:11px;background:#000;color:#eee;font:inherit;font-size:14px;line-height:1.35;cursor:pointer;outline:none}\r\n.cfs .cfs-stage .cfs-picker-list [role=option]:hover,.cfs .cfs-stage .cfs-picker-list [role=option]:focus{background:#242424;color:#fff}\r\n.cfs .cfs-stage .cfs-picker-list [role=option][aria-selected=true]{background:#e30916;color:#fff}\r\n.cfs .cfs-stage .cfs-picker-list [role=option]:focus-visible{box-shadow:inset 0 0 0 2px #fff}\r\n.cfs .cfs-stage .cfs-picker-list::-webkit-scrollbar{display:block!important;width:7px!important;height:7px!important}\r\n.cfs .cfs-stage .cfs-picker-list::-webkit-scrollbar-track{background:#000;border-radius:8px}\r\n.cfs .cfs-stage .cfs-picker-list::-webkit-scrollbar-thumb{background:#e30916;border-radius:8px;border:1px solid #000}\r\n.cfs.cfs-picker-open .cfs-stage .cfs-header{z-index:20!important}\r\n@media(max-width:600px){.cfs .cfs-stage .cfs-picker{width:260px;max-width:100%}.cfs .cfs-stage .cfs-picker-trigger,.cfs .cfs-stage .cfs-picker-list [role=option]{font-size:13px!important;min-height:46px}}\r\n<\/style>\r\n\r\n\r\n\r\n<style id=\"cfs-glass-system-4k\">\r\n.cfs{--cfs-glass:linear-gradient(145deg,rgba(77,80,87,.38),rgba(12,14,19,.80) 65%);--cfs-glass-line:rgba(255,255,255,.22);--cfs-glass-shadow:0 18px 48px rgba(0,0,0,.34),inset 0 1px 0 rgba(255,255,255,.14);--cfs-glass-blur:20px}\r\n#cobra-scroll3d.cfs .cfs-stage :is(.cfs-card,.cfs-picker-trigger,.cfs-picker-list,.cfs-color-list,.cfs-nav,.cfs-tools),\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-header>button,\r\n#cobra-scroll3d.cfs[data-colors=\"off\"] .cfs-stage .cfs-colors legend{\r\n background:var(--cfs-glass)!important;border:1px solid var(--cfs-glass-line)!important;\r\n box-shadow:var(--cfs-glass-shadow)!important;backdrop-filter:blur(var(--cfs-glass-blur)) saturate(135%)!important;\r\n -webkit-backdrop-filter:blur(var(--cfs-glass-blur)) saturate(135%)!important;color:#f5f5f7!important;\r\n}\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-card{border-left:2px solid rgba(227,9,22,.8)!important;border-radius:26px!important}\r\n#cobra-scroll3d.cfs .cfs-stage :is(.cfs-nav,.cfs-tools){padding:5px;border-radius:24px;max-width:100%;box-sizing:border-box}\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-picker-list{background:linear-gradient(145deg,rgba(52,56,65,.88),rgba(8,10,15,.94))!important;scrollbar-color:#e30916 transparent!important}\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-picker-list [role=option]{background:transparent!important;color:#f4f4f6!important;transition:background .16s,border-color .16s}\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-picker-list [role=option]:is(:hover,:focus){background:rgba(255,255,255,.10)!important}\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-picker-list [role=option][aria-selected=true]{background:linear-gradient(130deg,rgba(227,9,22,.88),rgba(130,15,29,.82))!important;box-shadow:inset 0 1px rgba(255,255,255,.18)}\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-picker-list::-webkit-scrollbar-track{background:transparent!important}\r\n#cobra-scroll3d.cfs .cfs-stage button:not(.cfs-pin):not(.cfs-picker-trigger){background:linear-gradient(140deg,rgba(255,255,255,.09),rgba(255,255,255,.025))!important;border-color:rgba(255,255,255,.20)!important;color:#f5f5f7!important;box-shadow:inset 0 1px 0 rgba(255,255,255,.09)!important}\r\n#cobra-scroll3d.cfs .cfs-stage button:not(.cfs-pin):is(:hover,:focus-visible){background:rgba(255,255,255,.15)!important;border-color:rgba(255,255,255,.46)!important}\r\n#cobra-scroll3d.cfs .cfs-stage button:is([aria-current=\"step\"],[aria-pressed=\"true\"],[data-action=\"install-play\"]),#cobra-scroll3d.cfs .cfs-stage .cfs-products{background:linear-gradient(135deg,rgba(227,9,22,.80),rgba(116,18,30,.78))!important;border-color:rgba(255,130,140,.46)!important}\r\n#cobra-scroll3d.cfs .cfs-stage :is(button,[role=option]):focus-visible{outline:2px solid #fff!important;outline-offset:3px!important}\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-copy{color:#e0e1e7!important}\r\n#cobra-scroll3d.cfs .cfs-stage :is(.cfs-count,.cfs-help,.cfs-install-meter){color:#bfc2cb!important}\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-pin::before{background:rgba(20,23,29,.58)!important;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);box-shadow:inset 0 1px rgba(255,255,255,.2)}\r\n#cobra-scroll3d.cfs .cfs-stage input[type=range]{accent-color:#e30916}\r\n@media(max-width:600px){.cfs{--cfs-glass-blur:12px}#cobra-scroll3d.cfs .cfs-stage :is(.cfs-nav,.cfs-tools){padding:3px;border-radius:20px}#cobra-scroll3d.cfs .cfs-stage .cfs-card{border-radius:22px!important}}\r\n@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){.cfs{--cfs-glass:linear-gradient(145deg,#262830,#101218)}}\r\n@media(prefers-reduced-transparency:reduce){.cfs{--cfs-glass:linear-gradient(145deg,#262830,#101218);--cfs-glass-blur:0px}}\r\n@media(prefers-reduced-motion:reduce){#cobra-scroll3d.cfs .cfs-stage *{scroll-behavior:auto!important;transition:none!important}}\r\n@media(forced-colors:active){#cobra-scroll3d.cfs .cfs-stage :is(button,.cfs-card,.cfs-picker-list,[role=option]){background:Canvas!important;color:CanvasText!important;border:1px solid ButtonText!important;backdrop-filter:none!important}#cobra-scroll3d.cfs .cfs-stage [aria-selected=true]{outline:2px solid Highlight!important}}\r\n<\/style>\r\n<!-- FINE WIDGET -->\r\n\r\n<style>\r\n\/* Final scoped adjustments: compact scroll journey and safe font descenders. *\/\r\n#cobra-scroll3d.cfs{--cfs-scroll:3.8}\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-title{padding-bottom:.20em!important;overflow:visible!important;box-sizing:content-box}\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-tools{flex-wrap:wrap;justify-content:flex-end}\r\n#cobra-scroll3d.cfs .cfs-stage [data-action=\"tour-play\"]{border-color:#ad8f43;white-space:nowrap}\r\n@media(max-width:600px){#cobra-scroll3d.cfs{--cfs-scroll:3.5}#cobra-scroll3d.cfs .cfs-stage .cfs-row{flex-wrap:wrap;gap:8px}#cobra-scroll3d.cfs .cfs-stage .cfs-tools{width:100%;justify-content:center}#cobra-scroll3d.cfs .cfs-stage [data-action=\"tour-play\"]{min-height:44px}}\r\n<\/style>\r\n\r\n<style>\r\n\/* Final HUD layout overrides legacy fixed circular widths. *\/\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-tools{display:flex!important;flex-wrap:wrap!important;gap:8px!important;width:auto!important;max-width:100%!important;justify-content:center;box-sizing:border-box}\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-tools button{flex:0 0 auto!important;width:auto!important;min-width:44px!important;height:44px!important;min-height:44px!important;max-width:100%!important;padding:0 14px!important;white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis;font-size:12px!important;line-height:1!important;letter-spacing:0!important;display:inline-flex!important;align-items:center;justify-content:center}\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-tools button::after{content:none!important}\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-tools [data-action=\"tour-play\"]{min-width:108px!important;border-color:#bfa568!important;background:linear-gradient(135deg,#b1954d,#776333)!important;color:#fff!important;font-weight:600!important}\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-tools :is([data-action=\"zoom-in\"],[data-action=\"zoom-out\"]){width:44px!important;padding:0!important;font-size:20px!important}\r\n\/* Closed controls: on desktop only the selectors fold away, the bottom row\r\n   (steps + tools) stays open; on phones the row folds as well. *\/\r\n#cobra-scroll3d.cfs[data-hud=\"compact\"] .cfs-stage :is(.cfs-type-switch,.cfs-colors){display:none!important}\r\n@media(max-width:600px){\r\n#cobra-scroll3d.cfs[data-hud=\"compact\"] .cfs-stage :is(.cfs-nav,.cfs-help){display:none!important}\r\n#cobra-scroll3d.cfs[data-hud=\"compact\"] .cfs-stage .cfs-tools :is([data-action=\"mode\"],[data-action=\"zoom-in\"],[data-action=\"zoom-out\"]){display:none!important}\r\n#cobra-scroll3d.cfs[data-hud=\"compact\"] .cfs-stage .cfs-row{justify-content:center!important}\r\n}\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-products{transition:filter .18s ease,background .18s ease!important}\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-products:hover{background:linear-gradient(135deg,rgba(241,36,46,.88),rgba(141,26,39,.88))!important;filter:brightness(1.07)}\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-products:focus-visible{outline:2px solid #fff;outline-offset:4px}\r\n@media(max-width:600px){\r\n #cobra-scroll3d.cfs .cfs-stage .cfs-row{display:flex!important;flex-direction:column!important;gap:7px!important}\r\n #cobra-scroll3d.cfs .cfs-stage .cfs-tools{padding:5px!important;border-radius:24px!important}\r\n #cobra-scroll3d.cfs .cfs-stage .cfs-tools button{font-size:11px!important;padding:0 10px!important}\r\n #cobra-scroll3d.cfs .cfs-stage .cfs-nav{width:100%;justify-content:center}\r\n #cobra-scroll3d.cfs .cfs-stage .cfs-nav span{display:none!important}\r\n #cobra-scroll3d.cfs .cfs-stage .cfs-nav button{flex:0 0 44px;min-width:44px;padding:0!important}\r\n #cobra-scroll3d.cfs .cfs-stage :is(.cfs-card,.cfs-tools,.cfs-nav,.cfs-picker-trigger,.cfs-color-list){backdrop-filter:none!important;-webkit-backdrop-filter:none!important;background-color:rgba(15,17,20,.94)!important}\r\n}\r\n<\/style>\r\n\r\n<style>#cobra-scroll3d.cfs .cfs-stage .cfs-tools button{border-radius:24px!important}@media(max-width:600px){#cobra-scroll3d.cfs .cfs-stage .cfs-tools button{backdrop-filter:none!important;-webkit-backdrop-filter:none!important}}<\/style>\r\n\r\n<style>\r\n\/* Product information uses compositor-only reveals; no animated blur or shadows. *\/\r\n.cfs .cfs-card{background:linear-gradient(145deg,#202225f5,#0b0c10fa 68%);border-color:#ffffff25;box-shadow:0 24px 64px #0006,inset 0 1px #ffffff14}\r\n.cfs .cfs-card h3{letter-spacing:-.035em;line-height:1.08!important;text-wrap:balance}\r\n.cfs .cfs-card.is-open .cfs-count{animation:cfs-eyebrow .65s ease both}\r\n.cfs .cfs-facts{margin:1em 0 .75em;padding-top:.8em;border-top:1px solid #ffffff20}\r\n.cfs .cfs-facts[hidden]{display:none!important}\r\n.cfs .cfs-facts-label{font-size:.65em!important;letter-spacing:.16em;text-transform:uppercase;color:#c7c9ce;margin:0 0 .65em!important;line-height:1.3}\r\n.cfs .cfs-facts ul{list-style:none;margin:0!important;padding:0!important;display:grid;gap:.45em}\r\n.cfs .cfs-facts li{display:grid;grid-template-columns:1.7em 1fr;gap:.5em;padding:.55em .65em;border-radius:8px;line-height:1.35;font-size:.78em;color:#d7d8dc;background:#ffffff04;border-left:2px solid transparent}\r\n.cfs .cfs-facts li[data-current=true]{background:linear-gradient(100deg,#e309161b,#ffffff05);border-left-color:#e30916;color:#fff}\r\n.cfs .cfs-fact-number{font-variant-numeric:tabular-nums;font-size:.8em;color:#c1c3c9;align-self:start;padding-top:.12em}\r\n.cfs .cfs-facts a{display:inline-flex;align-items:center;min-height:44px;gap:.5em;margin-top:.4em;font-size:.8em;color:#fff!important;text-underline-offset:4px;text-decoration:underline}\r\n.cfs .cfs-facts a[hidden]{display:none}\r\n.cfs .cfs-products{transition:background-color .2s,filter .2s,transform .2s}\r\n.cfs .cfs-products:hover{filter:brightness(1.12);transform:translateY(-1px)}\r\n.cfs .cfs-facts a:focus-visible{outline:2px solid #fff;outline-offset:4px}\r\n@keyframes cfs-eyebrow{from{opacity:0;transform:translateX(-8px)}to{opacity:1;transform:translateX(0)}}\r\n@media(max-width:600px),(max-height:650px){.cfs .cfs-facts li[data-current=false]{display:none}.cfs .cfs-facts{margin:.65em 0 .4em;padding-top:.55em}.cfs .cfs-facts li{font-size:.78em;padding:.38em .55em}.cfs .cfs-facts-label{display:none}}\r\n.cfs[data-installation=true] .cfs-facts li[data-current=false]{display:none}\r\n@media(prefers-reduced-motion:reduce){.cfs .cfs-card *{animation:none!important;transition:none!important}}\r\n<\/style>\r\n\r\n<style>\r\n#cobra-scroll3d .cfs-card-body{position:relative;min-width:0}\r\n#cobra-scroll3d .cfs-card-body>.cfs-count{padding-right:2em}\r\n#cobra-scroll3d .cfs-card-body h3{overflow:visible}\r\n<\/style>\r\n\r\n<style>\r\n#cobra-scroll3d .cfs-typed-word{display:inline-block;vertical-align:baseline;white-space:nowrap}\r\n#cobra-scroll3d .cfs-origin{display:flex;align-items:center;gap:.6em;margin:.8em 0;font-size:.75em;font-weight:600;letter-spacing:.04em;color:#f4f4f4}\r\n#cobra-scroll3d .cfs-origin[hidden]{display:none!important}\r\n#cobra-scroll3d .cfs-origin>span{width:25px;height:3px;background:linear-gradient(90deg,#169b62 0 33.33%,#fff 33.33% 66.66%,#e30916 66.66%)}\r\n@media(prefers-reduced-motion:reduce){#cobra-scroll3d .cfs-typed-word{transform:none!important;opacity:1!important}}\r\n<\/style>\r\n<!-- Made in Italy: https:\/\/www.cieffeplast.com\/it\/ -->\r\n\r\n<style>\r\n#cobra-scroll3d .cfs-card{border-radius:18px!important}\r\n#cobra-scroll3d .cfs-card-body h3{font-weight:750;letter-spacing:-.035em}\r\n#cobra-scroll3d .cfs-technical-frame{position:absolute;inset:9px;pointer-events:none;background:linear-gradient(#ffffff80,#ffffff80) left top\/16px 1px no-repeat,linear-gradient(#ffffff80,#ffffff80) left top\/1px 16px no-repeat,linear-gradient(#e30916,#e30916) right bottom\/20px 1px no-repeat,linear-gradient(#e30916,#e30916) right bottom\/1px 20px no-repeat}\r\n#cobra-scroll3d .cfs-climate{position:absolute;inset:0;z-index:1;pointer-events:none}\r\n#cobra-scroll3d .cfs-climate:before,#cobra-scroll3d .cfs-climate:after{content:'';position:absolute;inset:0;pointer-events:none}\r\n#cobra-scroll3d .cfs-climate:before{background:radial-gradient(circle at var(--bx,30%) var(--by,60%),#ff6a1a3d,#db4e161c 26%,transparent 58%);opacity:var(--warm,0)}\r\n#cobra-scroll3d .cfs-climate:after{background:radial-gradient(circle at var(--bx,30%) var(--by,60%),#cfe8ff30,#8fc4ff17 28%,transparent 60%);opacity:var(--cold,0)}\r\n#cobra-scroll3d .cfs-signature{position:absolute;z-index:2;pointer-events:none;left:7%;top:calc(var(--cfs-head-h,130px) + 18px);width:clamp(140px,13vw,200px);display:grid;gap:16px;opacity:var(--draw,0);transform:translateY(calc((1 - var(--draw,0))*8px))}\r\n#cobra-scroll3d .cfs-signature[hidden]{display:none}\r\n#cobra-scroll3d .cfs-signature img{display:block;width:100%;height:auto;object-fit:contain}\r\n#cobra-scroll3d .cfs-signature{perspective:620px;perspective-origin:50% 40%}\r\n#cobra-scroll3d .cfs-logo-tilt{position:relative;width:100%;transform-style:preserve-3d;transform:rotateX(calc(16deg + var(--tx,0deg))) rotateY(calc(var(--spin,0deg) - 28deg + var(--ty,0deg)));transition:transform .5s cubic-bezier(.2,.7,.2,1)}\r\n#cobra-scroll3d .cfs-logo3d{position:absolute;inset:0;transform-style:preserve-3d;animation:cfsLogoSway 7s ease-in-out var(--delay,0s) infinite alternate}\r\n#cobra-scroll3d .cfs-logo3d>img,#cobra-scroll3d .cfs-logo3d>.cfs-logo-layer{position:absolute!important;inset:0;display:block!important;width:100%!important;height:100%!important;max-width:none!important;margin:0!important;opacity:1!important;visibility:visible!important;backface-visibility:hidden}\r\n#cobra-scroll3d .cfs-logo-layer{background:var(--cfs-logo) center\/100% 100% no-repeat}\r\n#cobra-scroll3d .cfs-logo3d>.cfs-logo-face{transform:translateZ(.2px)!important;filter:brightness(1.06) drop-shadow(0 0 .6px #000a)}\r\n#cobra-scroll3d .cfs-logo-shine{position:absolute;inset:0;-webkit-mask-image:var(--cfs-logo);mask-image:var(--cfs-logo);transform:translateZ(.45px);-webkit-mask-size:100% 100%;mask-size:100% 100%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;background:linear-gradient(105deg,transparent 38%,#ffffff8c 49%,#ffffff1a 54%,transparent 64%) 0 0\/260% 100% no-repeat;mix-blend-mode:screen;animation:cfsLogoShine 5.5s ease-in-out var(--delay,0s) infinite}\r\n@keyframes cfsLogoSway{from{transform:rotateY(-12deg) rotateX(3deg) translateZ(0)}to{transform:rotateY(14deg) rotateX(-4deg) translateZ(8px)}}\r\n@keyframes cfsLogoShine{0%,55%{background-position:120% 0}85%,100%{background-position:-20% 0}}\r\n@media(prefers-reduced-motion:reduce){#cobra-scroll3d .cfs-logo3d,#cobra-scroll3d .cfs-logo-shine{animation:none}#cobra-scroll3d .cfs-logo-tilt{transition:none}}\r\n#cobra-scroll3d .cfs-thermal-spec{overflow:hidden;will-change:opacity,transform;padding:.6em .8em;border-left:2px solid #e30916;background:#ffffff08;font-size:.8em;line-height:1.4;font-variant-numeric:tabular-nums}\r\n#cobra-scroll3d .cfs-thermal-spec[hidden],#cobra-scroll3d .cfs-thermal-peak[hidden]{display:none}\r\n#cobra-scroll3d .cfs-thermal-spec>*{opacity:var(--cfs-swap,1);transform:translateY(calc((1 - var(--cfs-swap,1))*4px))}\r\n#cobra-scroll3d .cfs-thermal-spec[data-phase=\"hot\"]{border-left-color:#ff5a1f;background:linear-gradient(90deg,#ff5a1f1f,#ffffff05)}\r\n#cobra-scroll3d .cfs-thermal-spec[data-phase=\"cold\"]{border-left-color:#9ccfff;background:linear-gradient(90deg,#9ccfff1f,#ffffff05)}\r\n#cobra-scroll3d .cfs-thermal-label{display:block;color:#c4c7cd;font-size:.9em}\r\n#cobra-scroll3d .cfs-thermal-range{display:block;color:#fff;font-size:clamp(20px,2vw,28px);line-height:1.4;letter-spacing:.015em;white-space:nowrap}\r\n#cobra-scroll3d .cfs-thermal-peak{display:block;color:#fff;font-size:.95em;line-height:1.5;margin-top:3px}\r\n@media(max-width:600px){#cobra-scroll3d .cfs-signature{width:130px;gap:10px;left:auto;right:5%;top:calc(var(--cfs-head-h,80px) + 10px)}}\r\n<\/style>\r\n\r\n<style id=\"cfs-mobile-canvas-first\">\r\n@media(max-width:600px){\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-mount,#cobra-scroll3d.cfs[data-focused=\"true\"] .cfs-stage .cfs-mount,#cobra-scroll3d.cfs .cfs-stage:has(.cfs-card.is-open) .cfs-mount{top:0!important;bottom:0!important;left:0!important;right:0!important;height:auto!important}\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-card{padding:12px 14px 10px!important;max-height:min(42svh,340px)!important}\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-card h3{font-size:19px!important;margin:2px 0 6px!important;line-height:1.15!important}\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-copy{font-size:13px!important;line-height:1.4!important;margin:0 0 6px!important;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;overflow:hidden}\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-origin{font-size:12px!important;margin:4px 0 6px!important}\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-install-controls{gap:6px!important}\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-products{min-height:40px!important;padding:8px 14px!important;margin:4px 0 8px!important;font-size:14px!important}\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-install-actions button{min-height:36px!important;padding:6px 12px!important}\r\n#cobra-scroll3d .cfs-signature{left:5%!important;right:auto!important;width:118px!important;gap:8px!important;top:calc(min(var(--cfs-head-h,64px),20svh) + 10px)!important}\r\n}\r\n<\/style>\r\n\r\n<style id=\"cfs-product-cta\">\r\n#cobra-scroll3d .cfs-header .cfs-open-product{position:absolute;left:0;top:0;z-index:3;pointer-events:auto;display:inline-flex;align-items:center;gap:.55em;min-height:40px;padding:0 16px 0 18px;border-radius:999px;border:1px solid rgba(255,255,255,.34);background:linear-gradient(135deg,rgba(255,255,255,.20),rgba(255,255,255,.08));-webkit-backdrop-filter:blur(18px) saturate(160%);backdrop-filter:blur(18px) saturate(160%);box-shadow:0 10px 30px rgba(0,0,0,.40),inset 0 1px 0 rgba(255,255,255,.30);color:#fff;font:inherit;font-size:14px;font-weight:600;letter-spacing:.01em;text-decoration:none;white-space:nowrap;transition:transform .45s cubic-bezier(.2,.7,.2,1),opacity .35s ease,background-color .2s,border-color .2s;will-change:transform}\r\n#cobra-scroll3d .cfs-header .cfs-open-product:hover{border-color:rgba(255,255,255,.62);background:linear-gradient(135deg,rgba(255,255,255,.28),rgba(255,255,255,.12))}\r\n#cobra-scroll3d .cfs-header .cfs-open-product:focus-visible{outline:2px solid #fff;outline-offset:3px}\r\n#cobra-scroll3d .cfs-open-color{font-weight:500;color:#e7e7ea;padding-left:.55em;border-left:1px solid rgba(255,255,255,.28)}\r\n#cobra-scroll3d .cfs-open-product svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0}\r\n#cobra-scroll3d.cfs[data-cta=\"true\"] .cfs-open-product,#cobra-scroll3d.cfs.is-failed .cfs-open-product{opacity:0;pointer-events:none;visibility:hidden;transition:transform .45s cubic-bezier(.2,.7,.2,1),opacity .3s ease,visibility 0s .3s}\r\n@media(max-width:600px){#cobra-scroll3d .cfs-header .cfs-open-product{min-height:36px;padding:0 12px 0 14px;font-size:12.5px;max-width:calc(100% - 150px)}#cobra-scroll3d .cfs-open-color{overflow:hidden;text-overflow:ellipsis}}\r\n@media(prefers-reduced-motion:reduce){#cobra-scroll3d .cfs-header .cfs-open-product{transition:none}}\r\n@media(max-width:600px){#cobra-scroll3d.cfs[data-early=\"true\"] .cfs-open-product{opacity:0;pointer-events:none;visibility:hidden;transform:translateY(-6px)!important;transition:opacity .3s ease,transform .3s ease,visibility 0s .3s}}\r\n\/* Riproduci: the most visible control of the row, without competing with the red CTA. *\/\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-tools button[data-action=\"tour-play\"]{background:linear-gradient(135deg,#ffffff,#e6e7ea)!important;color:#0d0d0f!important;border:1px solid #ffffff!important;font-weight:700!important;box-shadow:0 0 0 0 rgba(255,255,255,.45),0 10px 26px rgba(0,0,0,.45)!important;animation:cfsPlayPulse 2.6s ease-out infinite}\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-tools button[data-action=\"tour-play\"]:hover{filter:brightness(1.04);transform:translateY(-1px)}\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-tools button[data-action=\"tour-play\"][aria-pressed=\"true\"]{animation:none;background:linear-gradient(135deg,#f3f3f5,#d9dadd)!important}\r\n@keyframes cfsPlayPulse{0%{box-shadow:0 0 0 0 rgba(255,255,255,.42),0 10px 26px rgba(0,0,0,.45)}70%{box-shadow:0 0 0 12px rgba(255,255,255,0),0 10px 26px rgba(0,0,0,.45)}100%{box-shadow:0 0 0 0 rgba(255,255,255,0),0 10px 26px rgba(0,0,0,.45)}}\r\n@media(prefers-reduced-motion:reduce){#cobra-scroll3d.cfs .cfs-stage .cfs-tools button[data-action=\"tour-play\"]{animation:none}}\r\n<\/style>\r\n\r\n<style id=\"cfs-cobra-strike\">\r\n#cobra-scroll3d .cfs-logo-fx{position:absolute;inset:0;width:100%;height:100%;z-index:3;pointer-events:none}\r\n#cobra-scroll3d .cfs-signature:is([data-form=\"run\"],[data-form=\"land\"],[data-form=\"done\"]){opacity:1!important;transform:none!important}\r\n#cobra-scroll3d .cfs-signature[data-form=\"run\"] .cfs-logo-tilt{opacity:0;transform:none!important;transition:none!important}\r\n#cobra-scroll3d .cfs-signature[data-form=\"land\"] .cfs-logo-tilt{transform:none!important}\r\n#cobra-scroll3d .cfs-signature[data-form=\"land\"] .cfs-logo-tilt:first-child{opacity:1;transition:opacity .22s ease}\r\n#cobra-scroll3d .cfs-signature[data-form=\"land\"] .cfs-logo-tilt:not(:first-child){opacity:0;transform:translateY(10px)!important}\r\n#cobra-scroll3d .cfs-signature[data-form=\"done\"] .cfs-logo-tilt{opacity:1;transition:transform 1s cubic-bezier(.2,.8,.2,1),opacity .6s ease .1s}\r\n\/* Phones: the active step shows its name instead of its number. *\/\r\n@media(max-width:600px){\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-nav button[aria-current=\"step\"]{flex:1 1 auto!important;min-width:0!important;padding:0 14px!important}\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-nav button[aria-current=\"step\"] span{display:inline-block!important;color:#fff;font-size:12px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\r\n#cobra-scroll3d.cfs .cfs-stage .cfs-nav button[aria-current=\"step\"] b{display:none!important}\r\n}\r\n<\/style>\r\n\r\n<style id=\"cfs-icons\">\r\n#cobra-scroll3d .cfs-ico{width:1.05em;height:1.05em;flex-shrink:0;vertical-align:-.16em;margin-right:.45em;display:inline-block}\r\n#cobra-scroll3d .cfs-ico-play path,#cobra-scroll3d .cfs-ico-pause path{fill:currentColor;stroke:none}\r\n#cobra-scroll3d .cfs-ico-menu path,#cobra-scroll3d .cfs-ico-minus path{fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round}\r\n#cobra-scroll3d :is([data-action=\"tour-play\"],[data-action=\"hud\"]){display:inline-flex!important;align-items:center;justify-content:center}\r\n<\/style>\r\n\r\n<style id=\"cfs-polish\">\r\n#cobra-scroll3d{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}\r\n#cobra-scroll3d :is(button,a,select,input,[role=\"option\"]){-webkit-tap-highlight-color:transparent}\r\n#cobra-scroll3d :is(button,a,select,input,[tabindex]):focus-visible{outline:2px solid #fff!important;outline-offset:3px!important;box-shadow:0 0 0 5px rgba(227,9,22,.45)!important}\r\n#cobra-scroll3d :is(.cfs-title,.cfs-card h3){text-wrap:balance}\r\n#cobra-scroll3d :is(.cfs-description,.cfs-copy,.cfs-facts li){text-wrap:pretty;hyphens:manual}\r\n#cobra-scroll3d :is(.cfs-install-value,.cfs-count,.cfs-thermal-range){font-variant-numeric:tabular-nums}\r\n#cobra-scroll3d .cfs-stage :is(button,a){transition-property:background-color,border-color,color,filter,transform,opacity,box-shadow}\r\n@media(pointer:coarse){#cobra-scroll3d .cfs-stage :is(.cfs-tools button,.cfs-nav button,[data-action=\"skip\"],.cfs-close,.cfs-open-product){min-height:44px}#cobra-scroll3d .cfs-close{min-width:44px}}\r\n@media(hover:hover){#cobra-scroll3d .cfs-stage .cfs-nav button:hover{border-color:rgba(255,255,255,.34)}}\r\n<\/style>\r\n\r\n<style id=\"cfs-product-mode\">\r\nhtml.cfs3d-embed,html.cfs3d-embed body{margin:0!important;padding:0!important;background:#000!important;overflow:hidden!important;height:100%}\r\nhtml.cfs3d-embed body :not(#cobra-scroll3d):not(#cobra-scroll3d *){visibility:hidden!important}\r\nhtml.cfs3d-embed #cobra-scroll3d{visibility:visible!important}\r\nhtml.cfs3d-embed #cobra-scroll3d{z-index:2147483000!important}\r\nhtml.cfs3d-embed :is(#iubenda-cs-banner,.iubenda-tp-btn,.iubenda-uspr-btn,#wpadminbar,#cfp-live-request-root){display:none!important}\r\n#cobra-scroll3d.cfs[data-mode=\"product\"]{--cfs-top:0px!important;--cfs-bottom:0px!important;position:fixed!important;inset:0!important;width:100%!important;height:100%!important;margin:0!important}\r\n#cobra-scroll3d.cfs[data-mode=\"product\"] .cfs-stage{position:absolute!important;inset:0!important;height:100%!important;top:0!important}\r\n#cobra-scroll3d.cfs[data-mode=\"product\"] :is(.cfs-intro,.cfs-type-switch,[data-action=\"skip\"],.cfs-open-product,.cfs-products,.cfs-help,.cfs-progress){display:none!important}\r\n<\/style>\r\n\r\n<style id=\"cfs-embed-compact\">\r\n#cobra-scroll3d.cfs[data-mode=\"product\"][data-embed=\"compact\"] .cfs-stage :is(.cfs-header,.cfs-card,.cfs-pin,.cfs-lines,.cfs-nav,.cfs-help,.cfs-progress,.cfs-signature,.cfs-status){display:none!important}\r\n#cobra-scroll3d.cfs[data-mode=\"product\"][data-embed=\"compact\"] .cfs-stage .cfs-tools>button:not([data-action=\"tour-play\"]){display:none!important}\r\n#cobra-scroll3d.cfs[data-mode=\"product\"][data-embed=\"compact\"] .cfs-stage .cfs-bottom{left:auto!important;right:14px!important;bottom:14px!important;width:auto!important;transform:none!important}\r\n#cobra-scroll3d.cfs[data-mode=\"product\"][data-embed=\"compact\"] .cfs-stage :is(.cfs-row,.cfs-tools){background:none!important;border:0!important;box-shadow:none!important;padding:0!important;-webkit-backdrop-filter:none!important;backdrop-filter:none!important;width:auto!important;justify-content:flex-end!important}\r\n#cobra-scroll3d.cfs[data-mode=\"product\"][data-embed=\"compact\"] .cfs-mount{top:0!important;bottom:0!important}\r\n<\/style>\r\n\r\n<style id=\"cfs-embed-compact-2\">\r\n#cobra-scroll3d.cfs[data-mode=\"product\"][data-embed=\"compact\"] .cfs-stage .cfs-bottom{visibility:hidden!important;pointer-events:none!important}\r\n<\/style>\r\n\r\n<style id=\"cfs-product-light\">\r\nhtml.cfs3d-embed,html.cfs3d-embed body{background:#f8f8f8!important}\r\nhtml.cfs3d-embed.cfs3d-full,html.cfs3d-embed.cfs3d-full body{background:#000!important}\r\n#cobra-scroll3d.cfs[data-mode=\"product\"][data-embed=\"compact\"],#cobra-scroll3d.cfs[data-mode=\"product\"][data-embed=\"compact\"] :is(.cfs-stage,.cfs-mount){background:#f8f8f8!important}\r\n#cobra-scroll3d.cfs[data-mode=\"product\"][data-embed=\"full\"],#cobra-scroll3d.cfs[data-mode=\"product\"][data-embed=\"full\"] :is(.cfs-stage,.cfs-mount){background:#000!important}\r\n#cobra-scroll3d.cfs[data-mode=\"product\"][data-embed=\"full\"] .cfs-stage .cfs-products:not([hidden]){display:flex!important}\r\n#cobra-scroll3d.cfs[data-mode=\"product\"] .cfs-stage .cfs-products{background:#e30916!important;color:#fff!important;border-radius:8px!important;box-shadow:0 10px 28px rgba(227,9,22,.28)}\r\n#cobra-scroll3d.cfs[data-mode=\"product\"] .cfs-stage .cfs-products:hover{background:#c7251b!important}\r\n<\/style>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-3b0699d qodef-elementor-content-grid elementor-section-height-min-height elementor-section-boxed elementor-section-height-default elementor-section-items-middle\" data-id=\"3b0699d\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<section class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-d149081\" data-id=\"d149081\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-600f996 elementor-widget__width-inherit elementor-widget elementor-widget-stal_core_section_title\" data-id=\"600f996\" data-element_type=\"widget\" data-widget_type=\"stal_core_section_title.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"qodef-shortcode qodef-m  qodef-section-title qodef-alignment--left  qodef-title-with-tagline\">\n\t\t<div class=\"qodef-m-title-wrap\">\n\t        <h6 class=\"qodef-m-title-tagline\" >Enterprise<\/h6>\n    \t<h2 class=\"qodef-m-title\" style=\"color: #FFFFFF\">\n\t\t\t\t\t<a itemprop=\"url\" href=\"https:\/\/www.cieffeplast.com\/fr\/\" target=\"_self\">\n\t\t\t\t\tCieffeplast : 40 ans de Passion et d'Excellence Italienne\t\t\t\t\t<\/a>\n\t\t\t<\/h2>\n\t\n\t<\/div>\n\t<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5b90306 elementor-widget__width-auto elementor-widget elementor-widget-text-editor\" data-id=\"5b90306\" data-element_type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;none&quot;}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-path-to-node=\"4\">Fond\u00e9e en tant que sp\u00e9cialiste de la <b data-path-to-node=\"4\" data-index-in-node=\"37\">transformation des mati\u00e8res plastiques<\/b>, l&rsquo;entreprise a \u00e9volu\u00e9 pour devenir une structure industrielle <b data-path-to-node=\"4\" data-index-in-node=\"139\">4.0<\/b> moderne, situ\u00e9e au c\u0153ur de la <b data-path-to-node=\"4\" data-index-in-node=\"173\">V\u00e9n\u00e9tie<\/b>, \u00e0 Maser\u00e0 di Padova.<\/p><p data-path-to-node=\"5\">Aujourd&rsquo;hui, la marque <b data-path-to-node=\"5\" data-index-in-node=\"23\">COBRA\u00ae<\/b> est synonyme d&rsquo;excellence dans le secteur de la <b data-path-to-node=\"5\" data-index-in-node=\"77\">fixation professionnelle<\/b>. Notre mission demeure inchang\u00e9e : transformer un geste simple \u2013 fixer \u2013 en une garantie de <b data-path-to-node=\"5\" data-index-in-node=\"194\">qualit\u00e9 absolue<\/b>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5014daa elementor-widget__width-auto btn-header-home elementor-widget-mobile__width-initial elementor-invisible elementor-widget elementor-widget-stal_core_button\" data-id=\"5014daa\" data-element_type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeInLeft&quot;}\" data-widget_type=\"stal_core_button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<a class=\"qodef-shortcode qodef-m  qodef-button qodef-layout--splitted qodef-size--large qodef-html--link\" href=\"https:\/\/www.cieffeplast.com\/fr\/entreprise\/\" target=\"_self\"  style=\"font-size: 16px;font-weight: 700\">\n    <span class=\"qodef-m-text\">\n        Notre id\u00e9e FIXE!        <svg class=\"qodef-m-arrowline\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlns:xlink=\"http:\/\/www.w3.org\/1999\/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 63 20\" xml:space=\"preserve\">\n                            <line x1=\"61.6\" y1=\"10\" x2=\"61.6\" y2=\"10\"\/>\n                            <line x1=\"62\" y1=\"10\" x2=\"61.6\" y2=\"10\"\/>\n                            <line x1=\"61.6\" y1=\"10\" x2=\"1\" y2=\"10\"\/>\n                            <path d=\"M61.6,10\"\/>\n                            <line x1=\"61.6\" y1=\"10\" x2=\"61.6\" y2=\"10\"\/>\n                            <line class=\"arrow-up\" x1=\"56.7\" y1=\"5.1\" x2=\"61.6\" y2=\"10\"\/>\n                            <path d=\"M61.6,10\"\/>\n                            <line x1=\"61.6\" y1=\"10\" x2=\"61.6\" y2=\"10\"\/>\n                            <line class=\"arrow-down\" x1=\"61.6\" y1=\"10\" x2=\"56.7\" y2=\"14.9\"\/>\n                        <\/svg>    <\/span>\n    <span class=\"qodef-m-split qodef-split--up\"><\/span>\n    <span class=\"qodef-m-split qodef-split--down\"><\/span>\n<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-820d22e timeline-wrapper\" data-id=\"820d22e\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ce972ac elementor-widget__width-inherit elementor-tabs-alignment-stretch premium-card elementor-tabs-view-horizontal elementor-widget elementor-widget-tabs\" data-id=\"ce972ac\" data-element_type=\"widget\" data-widget_type=\"tabs.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-tabs\">\n\t\t\t<div class=\"elementor-tabs-wrapper\" role=\"tablist\" >\n\t\t\t\t\t\t\t\t\t<div id=\"elementor-tab-title-2161\" class=\"elementor-tab-title elementor-tab-desktop-title\" aria-selected=\"true\" data-tab=\"1\" role=\"tab\" tabindex=\"0\" aria-controls=\"elementor-tab-content-2161\" aria-expanded=\"false\">2020<\/div>\n\t\t\t\t\t\t\t\t\t<div id=\"elementor-tab-title-2162\" class=\"elementor-tab-title elementor-tab-desktop-title\" aria-selected=\"false\" data-tab=\"2\" role=\"tab\" tabindex=\"-1\" aria-controls=\"elementor-tab-content-2162\" aria-expanded=\"false\">2000<\/div>\n\t\t\t\t\t\t\t\t\t<div id=\"elementor-tab-title-2163\" class=\"elementor-tab-title elementor-tab-desktop-title\" aria-selected=\"false\" data-tab=\"3\" role=\"tab\" tabindex=\"-1\" aria-controls=\"elementor-tab-content-2163\" aria-expanded=\"false\">1986<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t\t<div class=\"elementor-tabs-content-wrapper\" role=\"tablist\" aria-orientation=\"vertical\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-tab-title elementor-tab-mobile-title\" aria-selected=\"true\" data-tab=\"1\" role=\"tab\" tabindex=\"0\" aria-controls=\"elementor-tab-content-2161\" aria-expanded=\"false\">2020<\/div>\n\t\t\t\t\t<div id=\"elementor-tab-content-2161\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"1\" role=\"tabpanel\" aria-labelledby=\"elementor-tab-title-2161\" tabindex=\"0\" hidden=\"false\"><p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-9466 alignnone\" src=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/Timeline-2020-300x300.jpg\" alt=\"Servizi Cieffeplast consegna rapida in tutto il mondo\" width=\"300\" height=\"300\" srcset=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/Timeline-2020-300x300.jpg 300w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/Timeline-2020-150x150.jpg 150w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/Timeline-2020-768x768.jpg 768w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/Timeline-2020-650x650.jpg 650w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/Timeline-2020-82x82.jpg 82w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/Timeline-2020-600x600.jpg 600w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/Timeline-2020-100x100.jpg 100w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/11\/Timeline-2020.jpg 800w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/p><p>L&rsquo;extension de notre si\u00e8ge vise \u00e0 renforcer notre capacit\u00e9 logistique, garantissant une r\u00e9activit\u00e9 maximale et la livraison de millions de pi\u00e8ces dans des d\u00e9lais tr\u00e8s courts.<\/p><\/div>\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-tab-title elementor-tab-mobile-title\" aria-selected=\"false\" data-tab=\"2\" role=\"tab\" tabindex=\"-1\" aria-controls=\"elementor-tab-content-2162\" aria-expanded=\"false\">2000<\/div>\n\t\t\t\t\t<div id=\"elementor-tab-content-2162\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"2\" role=\"tabpanel\" aria-labelledby=\"elementor-tab-title-2162\" tabindex=\"0\" hidden=\"hidden\"><p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-9817 alignnone\" src=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2022\/01\/Cieffeplast-fascette-di-cablaggio-Cobra-1.jpg\" alt=\"La nascita della linea Cobra nel 2000 \u2013 Cieffeplast\" width=\"300\" height=\"300\" srcset=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2022\/01\/Cieffeplast-fascette-di-cablaggio-Cobra-1.jpg 255w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2022\/01\/Cieffeplast-fascette-di-cablaggio-Cobra-1-150x150.jpg 150w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2022\/01\/Cieffeplast-fascette-di-cablaggio-Cobra-1-82x82.jpg 82w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2022\/01\/Cieffeplast-fascette-di-cablaggio-Cobra-1-100x100.jpg 100w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/p><p>Cieffeplast a pris la d\u00e9cision strat\u00e9gique de se consacrer exclusivement au d\u00e9veloppement de sa propre gamme, lan\u00e7ant la fabrication des colliers de serrage COBRA.<\/p><\/div>\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-tab-title elementor-tab-mobile-title\" aria-selected=\"false\" data-tab=\"3\" role=\"tab\" tabindex=\"-1\" aria-controls=\"elementor-tab-content-2163\" aria-expanded=\"false\">1986<\/div>\n\t\t\t\t\t<div id=\"elementor-tab-content-2163\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"3\" role=\"tabpanel\" aria-labelledby=\"elementor-tab-title-2163\" tabindex=\"0\" hidden=\"hidden\"><p><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-12027 alignnone\" src=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2026\/02\/1986-Cieffeplast-Logo-BN2-600x600-1-300x300.webp\" alt=\"Cieffeplast 1986 produzione fascette di cablaggio made in italy\" width=\"300\" height=\"300\" srcset=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2026\/02\/1986-Cieffeplast-Logo-BN2-600x600-1-300x300.webp 300w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2026\/02\/1986-Cieffeplast-Logo-BN2-600x600-1-150x150.webp 150w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2026\/02\/1986-Cieffeplast-Logo-BN2-600x600-1-82x82.webp 82w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2026\/02\/1986-Cieffeplast-Logo-BN2-600x600-1-100x100.webp 100w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2026\/02\/1986-Cieffeplast-Logo-BN2-600x600-1-50x50.webp 50w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2026\/02\/1986-Cieffeplast-Logo-BN2-600x600-1.webp 600w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/p><p>L&rsquo;entreprise s&rsquo;est initialement d\u00e9di\u00e9e \u00e0 la transformation des mati\u00e8res plastiques, acqu\u00e9rant une solide expertise dans l&rsquo;assemblage et les finitions techniques de pr\u00e9cision.<\/p><\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-90977fa qodef-elementor-content-grid elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"90977fa\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-9bf0617\" data-id=\"9bf0617\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-14fbc26 elementor-widget__width-inherit elementor-widget elementor-widget-stal_core_section_title\" data-id=\"14fbc26\" data-element_type=\"widget\" data-widget_type=\"stal_core_section_title.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"qodef-shortcode qodef-m  qodef-section-title qodef-alignment--left  qodef-title-with-tagline\">\n\t\t<div class=\"qodef-m-title-wrap\">\n\t        <h6 class=\"qodef-m-title-tagline\" >FAQ<\/h6>\n    \t<h2 class=\"qodef-m-title\" style=\"color: #FFFFFF\">\n\t\t\t\t\t<a itemprop=\"url\" href=\"https:\/\/www.cieffeplast.com\/fr\/\" target=\"_self\">\n\t\t\t\t\tQuestions Fr\u00e9quentes\t\t\t\t\t<\/a>\n\t\t\t<\/h2>\n\t\n\t<\/div>\n\t<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2bf34ea elementor-widget elementor-widget-toggle\" data-id=\"2bf34ea\" data-element_type=\"widget\" data-widget_type=\"toggle.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-toggle\">\n\t\t\t\t\t\t\t<div class=\"elementor-toggle-item\">\n\t\t\t\t\t<h3 id=\"elementor-tab-title-4601\" class=\"elementor-tab-title\" data-tab=\"1\" role=\"button\" aria-controls=\"elementor-tab-content-4601\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon elementor-toggle-icon-right\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-closed\"><i class=\"fas fa-caret-down\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-opened\"><i class=\"elementor-toggle-icon-opened fas fa-caret-up\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-toggle-title\" tabindex=\"0\">Pourquoi choisir les colliers de serrage COBRA\u00ae ?<\/a>\n\t\t\t\t\t<\/h3>\n\n\t\t\t\t\t<div id=\"elementor-tab-content-4601\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"1\" role=\"region\" aria-labelledby=\"elementor-tab-title-4601\"><p>Nos produits font l&rsquo;objet de tests rigoureux et d&rsquo;am\u00e9liorations constantes. Gr\u00e2ce aux retours de nos clients et \u00e0 des ann\u00e9es de recherche continue, les colliers de serrage COBRA\u00ae r\u00e9pondent aux exigences concr\u00e8tes des professionnels qui les utilisent au quotidien :<br \/>R\u00e9sistance m\u00e9canique et stabilit\u00e9 thermique accrues.<br \/>Pr\u00e9cision de serrage et flexibilit\u00e9 d\u2019utilisation.<br \/>Large disponibilit\u00e9 de coloris et dimensions.<br \/>Conditionnements personnalisables pour le secteur industriel ou professionnel.<br \/>D\u00e9couvrez la gamme compl\u00e8te dans la section Produits ou contactez-nous pour une \u00e9tude personnalis\u00e9e.<\/p><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-toggle-item\">\n\t\t\t\t\t<h3 id=\"elementor-tab-title-4602\" class=\"elementor-tab-title\" data-tab=\"2\" role=\"button\" aria-controls=\"elementor-tab-content-4602\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon elementor-toggle-icon-right\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-closed\"><i class=\"fas fa-caret-down\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-opened\"><i class=\"elementor-toggle-icon-opened fas fa-caret-up\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-toggle-title\" tabindex=\"0\">Quel mat\u00e9riau est utilis\u00e9 pour la fabrication des colliers COBRA\u00ae ?<\/a>\n\t\t\t\t\t<\/h3>\n\n\t\t\t\t\t<div id=\"elementor-tab-content-4602\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"2\" role=\"region\" aria-labelledby=\"elementor-tab-title-4602\"><p>Suite \u00e0 de nombreux tests et analyses, nous avons s\u00e9lectionn\u00e9 le Polyamide 6.6 (Nylon) vierge de haute qualit\u00e9 et de premier choix pour la fabrication de nos articles. Il s&rsquo;agit d&rsquo;un mat\u00e9riau d&rsquo;ing\u00e9nierie hygroscopique, offrant une stabilit\u00e9 thermique et m\u00e9canique \u00e9lev\u00e9e.<\/p><p>Les propri\u00e9t\u00e9s exceptionnelles de ce mat\u00e9riau nous permettent de d\u00e9velopper des gammes techniques sp\u00e9cifiques, telles que les colliers V0 (auto-extinguibles), les colliers thermor\u00e9sistants ou encore les versions r\u00e9sistantes aux rayons UV.<\/p><p>Parall\u00e8lement, nous r\u00e9alisons des productions sp\u00e9cifiques en Polypropyl\u00e8ne lorsque le projet exige une haute r\u00e9sistance chimique. Le Polypropyl\u00e8ne (PP) est un polym\u00e8re thermoplastique semi-cristallin caract\u00e9ris\u00e9 par une r\u00e9sistance exceptionnelle aux acides et aux bases. Dans le secteur de la fixation, c&rsquo;est le choix privil\u00e9gi\u00e9 pour les applications en milieux chimiquement agressifs, l\u00e0 o\u00f9 le Nylon (Polyamide) standard risquerait de se d\u00e9grader.<\/p><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-toggle-item\">\n\t\t\t\t\t<h3 id=\"elementor-tab-title-4603\" class=\"elementor-tab-title\" data-tab=\"3\" role=\"button\" aria-controls=\"elementor-tab-content-4603\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon elementor-toggle-icon-right\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-closed\"><i class=\"fas fa-caret-down\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-opened\"><i class=\"elementor-toggle-icon-opened fas fa-caret-up\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-toggle-title\" tabindex=\"0\">Depuis quand existons-nous et quel est notre domaine d'activit\u00e9 ?<\/a>\n\t\t\t\t\t<\/h3>\n\n\t\t\t\t\t<div id=\"elementor-tab-content-4603\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"3\" role=\"region\" aria-labelledby=\"elementor-tab-title-4603\"><p>Fond\u00e9e en 1986 et aujourd&rsquo;hui certifi\u00e9e ISO 9001:2015 par l&rsquo;Association Suisse pour Syst\u00e8mes de Qualit\u00e9 et de Management (SQS \/ IQNet), Cieffeplast Srl est une entreprise italienne bas\u00e9e en V\u00e9n\u00e9tie (province de Padoue), sp\u00e9cialis\u00e9e dans la production de syst\u00e8mes de fixation et de colliers de c\u00e2blage en plastique.<\/p><p>Depuis quarante ans, l&rsquo;entreprise est une r\u00e9f\u00e9rence dans le secteur et, gr\u00e2ce \u00e0 la marque COBRA\u00ae Cable Ties, elle s&rsquo;oriente vers le march\u00e9 international en offrant une gamme compl\u00e8te de colliers pour \u00e9lectriciens con\u00e7us pour un usage professionnel.<\/p><p>Les produits COBRA\u00ae sont le r\u00e9sultat d&rsquo;une \u00e9volution constante qui transmet l&rsquo;excellence du Made in Italy dans plus de 60 pays \u00e0 travers le monde :<\/p><p>Production Certifi\u00e9e : Chaque jour, nous produisons des millions d&rsquo;articles, en soignant chaque collier avec des technologies de pr\u00e9cision pour garantir des c\u00e2blages s\u00fbrs, durables et efficaces, attest\u00e9s par la certification volontaire de produit UL, la d\u00e9claration de conformit\u00e9 CE et les directives REACH et RoHS.<\/p><p>Mat\u00e9riaux \u00e0 Haute R\u00e9sistance : Nous utilisons uniquement des mati\u00e8res premi\u00e8res de qualit\u00e9 certifi\u00e9es UL 94 V-2, anti-UV et sans halog\u00e8ne (halogen free) pour assurer une fiabilit\u00e9 m\u00e9canique et chimique dans toutes les conditions environnementali.<\/p><p>Service et Logistique : Nous savons que dans le monde professionnel, le temps est fondamental. C&rsquo;est pourquoi notre structure industrielle nous permet de garantir une exp\u00e9dition rapide et ponctuelle.<\/p><p>Engagement Constant : De Padoue au reste du monde, nous continuons \u00e0 innover avec pr\u00e9cision. Chacune de nos solutions repr\u00e9sente un engagement concret envers la qualit\u00e9 et la durabilit\u00e9.<\/p><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-toggle-item\">\n\t\t\t\t\t<h3 id=\"elementor-tab-title-4604\" class=\"elementor-tab-title\" data-tab=\"4\" role=\"button\" aria-controls=\"elementor-tab-content-4604\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon elementor-toggle-icon-right\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-closed\"><i class=\"fas fa-caret-down\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-opened\"><i class=\"elementor-toggle-icon-opened fas fa-caret-up\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-toggle-title\" tabindex=\"0\">Qu'est-ce que le classement d'inflammabilit\u00e9 UL 94 V-2 ?<\/a>\n\t\t\t\t\t<\/h3>\n\n\t\t\t\t\t<div id=\"elementor-tab-content-4604\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"4\" role=\"region\" aria-labelledby=\"elementor-tab-title-4604\"><p>Le degr\u00e9 d&rsquo;inflammabilit\u00e9 indique la facilit\u00e9 avec laquelle un mat\u00e9riau de construction (mati\u00e8re premi\u00e8re, plastique) peut s&rsquo;enflammer et son comportement durant la combustion.<\/p><p>Les classifications les plus courantes pour les mati\u00e8res plastiques se r\u00e9f\u00e8rent \u00e0 la norme internationale UL 94, d\u00e9velopp\u00e9e par Underwriters Laboratories, qui d\u00e9finit les m\u00e9thodes d&rsquo;essai, les conditions et les crit\u00e8res de classification.<\/p><p>Selon cette norme, le classement V-2 se d\u00e9finit comme suit :<\/p><table><thead><tr><td><p><strong>CLASSE\u00a0<\/strong><\/p><\/td><td><p><strong>M\u00c9THODE D&rsquo;ESSAI\u00a0<\/strong><\/p><\/td><td><p><strong>DESCRIPTION\u00a0<\/strong><\/p><\/td><\/tr><\/thead><tbody><tr><td><p><strong>HB<\/strong><\/p><\/td><td><p><strong>Combustion Horizontale<\/strong><\/p><\/td><td><p>Le mat\u00e9riau plastique br\u00fble lentement en position horizontale, avec une vitesse de combustion maximale de 76 mm\/min (\u00e9paisseur \u2265 3 mm) ou s&rsquo;auto-\u00e9teint avant 100 mm.<\/p><\/td><\/tr><tr><td><p><strong>V-2<\/strong><\/p><\/td><td><p><strong>Combustion Verticale<\/strong><\/p><\/td><td><p>Le mat\u00e9riau plastique br\u00fble en position verticale et s&rsquo;auto-\u00e9teint en moins de 30 secondes apr\u00e8s le retrait de la flamme. Les gouttes enflamm\u00e9es sont autoris\u00e9es.<\/p><\/td><\/tr><tr><td><p><strong>V-0<\/strong><\/p><\/td><td><p><strong>Combustion Verticale<\/strong><\/p><\/td><td><p>Le mat\u00e9riau plastique br\u00fble en position verticale et s&rsquo;auto-\u00e9teint en moins de 10 secondes apr\u00e8s le retrait de la flamme. Aucune goutte enflamm\u00e9e n&rsquo;est autoris\u00e9e.<\/p><\/td><\/tr><\/tbody><\/table><p><span style=\"font-family: DinPro; font-size: 20px; font-weight: 400;\">Afin de garantir les standards de qualit\u00e9 les plus \u00e9lev\u00e9s, Cieffeplast utilise exclusivement des mati\u00e8res premi\u00e8res conformes aux normes strictes des Underwriters Laboratories, disposant des certificats UL 94 classe V-2 et V-0.<\/span><\/p><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-toggle-item\">\n\t\t\t\t\t<h3 id=\"elementor-tab-title-4605\" class=\"elementor-tab-title\" data-tab=\"5\" role=\"button\" aria-controls=\"elementor-tab-content-4605\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon elementor-toggle-icon-right\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-closed\"><i class=\"fas fa-caret-down\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-opened\"><i class=\"elementor-toggle-icon-opened fas fa-caret-up\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-toggle-title\" tabindex=\"0\">Quelle est la r\u00e9sistance thermique des colliers de c\u00e2blage COBRA\u00ae?<\/a>\n\t\t\t\t\t<\/h3>\n\n\t\t\t\t\t<div id=\"elementor-tab-content-4605\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"5\" role=\"region\" aria-labelledby=\"elementor-tab-title-4605\"><p>Nos articles sont fabriqu\u00e9s \u00e0 partir de Polyamide 6.6 (Nylon) vierge de haute qualit\u00e9 et de premier choix, ce qui garantit \u00e0 nos produits les caract\u00e9ristiques suivantes :<\/p><table><thead><tr><td><p><strong>CARACT\u00c9RISTIQUE<\/strong><\/p><\/td><td><p><strong>VALEUR \/ DESCRIPTION<\/strong><\/p><\/td><\/tr><\/thead><tbody><tr><td><p><strong>Temp\u00e9rature d&rsquo;utilisation (Service continu)<\/strong><\/p><\/td><td><p><strong>-40 \u00b0C \u00e0 +85 \u00b0C<\/strong><\/p><\/td><\/tr><tr><td><p><strong>Temp\u00e9rature de montage (Installation)<\/strong><\/p><\/td><td><p><strong>-10 \u00b0C \u00e0 +60 \u00b0C<\/strong><\/p><\/td><\/tr><tr><td><p><strong>Pic de temp\u00e9rature admissible (Courte dur\u00e9e)<\/strong><\/p><\/td><td><p><strong>+110 \u00b0C<\/strong><\/p><\/td><\/tr><tr><td><p><strong>Point de fusion<\/strong><\/p><\/td><td><p><strong>+256 \u00b0C<\/strong><\/p><\/td><\/tr><tr><td><p><strong>Durabilit\u00e9 \/ Long\u00e9vit\u00e9<\/strong><\/p><\/td><td><p><strong>\u00c9lev\u00e9e<\/strong><\/p><\/td><\/tr><tr><td><p><strong>Tenue au feu (Inflammabilit\u00e9) *<\/strong><\/p><\/td><td><p><strong>Conforme UL 94 classe V-2<\/strong><\/p><\/td><\/tr><tr><td><p><strong>Reprise d&rsquo;humidit\u00e9<\/strong><\/p><\/td><td><p><strong>2,7 % (\u00e0 50 % d&rsquo;humidit\u00e9 relative H.R.)<\/strong><\/p><\/td><\/tr><\/tbody><\/table><p><strong>*Note : Pour tous les colliers en polyamide 6.6, nous utilisons des mat\u00e9riaux class\u00e9s UL 94 V-2.<\/strong><\/p><p>Nous r\u00e9alisons \u00e9galement des productions sp\u00e9cifiques utilisant un polyamide r\u00e9sistant aux hautes temp\u00e9ratures, pour des colliers supportant jusqu&rsquo;\u00e0 150 \u00b0C sur de courtes p\u00e9riodes (125 \u00b0C en utilisation continue).<\/p><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-toggle-item\">\n\t\t\t\t\t<h3 id=\"elementor-tab-title-4606\" class=\"elementor-tab-title\" data-tab=\"6\" role=\"button\" aria-controls=\"elementor-tab-content-4606\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon elementor-toggle-icon-right\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-closed\"><i class=\"fas fa-caret-down\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-opened\"><i class=\"elementor-toggle-icon-opened fas fa-caret-up\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-toggle-title\" tabindex=\"0\">Quel est le degr\u00e9 d'auto-extinguibilit\u00e9 des colliers COBRA\u00ae?<\/a>\n\t\t\t\t\t<\/h3>\n\n\t\t\t\t\t<div id=\"elementor-tab-content-4606\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"6\" role=\"region\" aria-labelledby=\"elementor-tab-title-4606\"><p>Nos articles sont fabriqu\u00e9s \u00e0 partir de Polyamide 6.6 (Nylon) vierge de haute qualit\u00e9 et de premier choix, ce qui garantit aux colliers de c\u00e2blage COBRA\u00ae un classement d\u2019inflammabilit\u00e9 UL 94 V-2 et une auto-extinguibilit\u00e9 dans les 30 secondes. De cette mani\u00e8re, la combustion s&rsquo;interrompt d&rsquo;elle-m\u00eame.<\/p><p>Nous r\u00e9alisons \u00e9galement des productions sp\u00e9cifiques en utilisant un polyamide auto-extinguible avec un classement UL 94 V-0, qui ne propage pas la flamme.<\/p><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-toggle-item\">\n\t\t\t\t\t<h3 id=\"elementor-tab-title-4607\" class=\"elementor-tab-title\" data-tab=\"7\" role=\"button\" aria-controls=\"elementor-tab-content-4607\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon elementor-toggle-icon-right\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-closed\"><i class=\"fas fa-caret-down\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-opened\"><i class=\"elementor-toggle-icon-opened fas fa-caret-up\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-toggle-title\" tabindex=\"0\">Les colliers de serrage COBRA\u00ae sont-ils r\u00e9sistants aux rayons UV?<\/a>\n\t\t\t\t\t<\/h3>\n\n\t\t\t\t\t<div id=\"elementor-tab-content-4607\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"7\" role=\"region\" aria-labelledby=\"elementor-tab-title-4607\"><p>Tout \u00e0 fait ! Les colliers de serrage COBRA\u00ae de couleur noire sont parfaitement adapt\u00e9s aux applications ext\u00e9rieures (outdoor) et r\u00e9sistent aux rayons UV.<\/p><p>La coloration noire de notre mati\u00e8re premi\u00e8re vierge contient un additif technique appel\u00e9 noir de carbone (Carbon Black). Cet \u00e9l\u00e9ment prolonge consid\u00e9rablement la dur\u00e9e de vie du collier lorsqu&rsquo;il est utilis\u00e9 en ext\u00e9rieur.<\/p><p>Pour prolonger davantage la long\u00e9vit\u00e9 du produit et maximiser sa tenue face aux rayonnements, nous recommandons notre gamme sp\u00e9cifiquement con\u00e7ue pour la r\u00e9sistance \u00e0 la chaleur, \u00e0 la lumi\u00e8re et aux rayons ultraviolets.<\/p><p>Contactez nos experts pour obtenir des pr\u00e9cisions techniques suppl\u00e9mentaires.<\/p><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-toggle-item\">\n\t\t\t\t\t<h3 id=\"elementor-tab-title-4608\" class=\"elementor-tab-title\" data-tab=\"8\" role=\"button\" aria-controls=\"elementor-tab-content-4608\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon elementor-toggle-icon-right\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-closed\"><i class=\"fas fa-caret-down\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-opened\"><i class=\"elementor-toggle-icon-opened fas fa-caret-up\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-toggle-title\" tabindex=\"0\">Quel est le nom technique des colliers en plastique ?<\/a>\n\t\t\t\t\t<\/h3>\n\n\t\t\t\t\t<div id=\"elementor-tab-content-4608\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"8\" role=\"region\" aria-labelledby=\"elementor-tab-title-4608\"><p>Ils sont connus sous de nombreuses d\u00e9nominations, souvent comme colliers de serrage ou colliers d&rsquo;\u00e9lectricien, mais aussi comme serre-c\u00e2bles ou attaches en plastique. Le secteur \u00e9lectrique a \u00e9t\u00e9 le premier \u00e0 adopter cet outil polyvalent et, depuis lors, le terme technique appropri\u00e9 est colliers de c\u00e2blage.<\/p><p>Le collier de c\u00e2blage moderne a \u00e9t\u00e9 invent\u00e9 en 1958 et \u00e9tait destin\u00e9 \u00e0 l&rsquo;industrie a\u00e9ronautique (sp\u00e9cifiquement pour Boeing) afin de remplacer l&rsquo;ancien syst\u00e8me de ligatures avec du fil de la\u00e7age cir\u00e9, qui causait de fr\u00e9quentes blessures aux mains des ouvriers.<\/p><p>Initialement dot\u00e9s d&rsquo;une languette m\u00e9tallique, les colliers ont \u00e9volu\u00e9 \u00e0 la fin des ann\u00e9es 60 pour devenir monoblocs en Nylon (tout plastique), la technologie standard que nous utilisons aujourd&rsquo;hui.<\/p><p>Aujourd&rsquo;hui, la gamme COBRA perp\u00e9tue cet h\u00e9ritage et repr\u00e9sente l&rsquo;\u00e9volution professionnelle de cet outil essentiel. Gr\u00e2ce \u00e0 des presses \u00e0 injection de derni\u00e8re g\u00e9n\u00e9ration, nous garantissons des charges de rupture (r\u00e9sistance \u00e0 la traction) bien sup\u00e9rieures \u00e0 celles des premiers prototypes de 1958.<\/p><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t<script type=\"application\/ld+json\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@type\":\"FAQPage\",\"mainEntity\":[{\"@type\":\"Question\",\"name\":\"Pourquoi choisir les colliers de serrage COBRA\\u00ae ?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"<p>Nos produits font l&rsquo;objet de tests rigoureux et d&rsquo;am\\u00e9liorations constantes. Gr\\u00e2ce aux retours de nos clients et \\u00e0 des ann\\u00e9es de recherche continue, les colliers de serrage COBRA\\u00ae r\\u00e9pondent aux exigences concr\\u00e8tes des professionnels qui les utilisent au quotidien :<br \\\/>R\\u00e9sistance m\\u00e9canique et stabilit\\u00e9 thermique accrues.<br \\\/>Pr\\u00e9cision de serrage et flexibilit\\u00e9 d\\u2019utilisation.<br \\\/>Large disponibilit\\u00e9 de coloris et dimensions.<br \\\/>Conditionnements personnalisables pour le secteur industriel ou professionnel.<br \\\/>D\\u00e9couvrez la gamme compl\\u00e8te dans la section Produits ou contactez-nous pour une \\u00e9tude personnalis\\u00e9e.<\\\/p>\"}},{\"@type\":\"Question\",\"name\":\"Quel mat\\u00e9riau est utilis\\u00e9 pour la fabrication des colliers COBRA\\u00ae ?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"<p>Suite \\u00e0 de nombreux tests et analyses, nous avons s\\u00e9lectionn\\u00e9 le Polyamide 6.6 (Nylon) vierge de haute qualit\\u00e9 et de premier choix pour la fabrication de nos articles. Il s&rsquo;agit d&rsquo;un mat\\u00e9riau d&rsquo;ing\\u00e9nierie hygroscopique, offrant une stabilit\\u00e9 thermique et m\\u00e9canique \\u00e9lev\\u00e9e.<\\\/p><p>Les propri\\u00e9t\\u00e9s exceptionnelles de ce mat\\u00e9riau nous permettent de d\\u00e9velopper des gammes techniques sp\\u00e9cifiques, telles que les colliers V0 (auto-extinguibles), les colliers thermor\\u00e9sistants ou encore les versions r\\u00e9sistantes aux rayons UV.<\\\/p><p>Parall\\u00e8lement, nous r\\u00e9alisons des productions sp\\u00e9cifiques en Polypropyl\\u00e8ne lorsque le projet exige une haute r\\u00e9sistance chimique. Le Polypropyl\\u00e8ne (PP) est un polym\\u00e8re thermoplastique semi-cristallin caract\\u00e9ris\\u00e9 par une r\\u00e9sistance exceptionnelle aux acides et aux bases. Dans le secteur de la fixation, c&rsquo;est le choix privil\\u00e9gi\\u00e9 pour les applications en milieux chimiquement agressifs, l\\u00e0 o\\u00f9 le Nylon (Polyamide) standard risquerait de se d\\u00e9grader.<\\\/p>\"}},{\"@type\":\"Question\",\"name\":\"Depuis quand existons-nous et quel est notre domaine d'activit\\u00e9 ?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"<p>Fond\\u00e9e en 1986 et aujourd&rsquo;hui certifi\\u00e9e ISO 9001:2015 par l&rsquo;Association Suisse pour Syst\\u00e8mes de Qualit\\u00e9 et de Management (SQS \\\/ IQNet), Cieffeplast Srl est une entreprise italienne bas\\u00e9e en V\\u00e9n\\u00e9tie (province de Padoue), sp\\u00e9cialis\\u00e9e dans la production de syst\\u00e8mes de fixation et de colliers de c\\u00e2blage en plastique.<\\\/p><p>Depuis quarante ans, l&rsquo;entreprise est une r\\u00e9f\\u00e9rence dans le secteur et, gr\\u00e2ce \\u00e0 la marque COBRA\\u00ae Cable Ties, elle s&rsquo;oriente vers le march\\u00e9 international en offrant une gamme compl\\u00e8te de colliers pour \\u00e9lectriciens con\\u00e7us pour un usage professionnel.<\\\/p><p>Les produits COBRA\\u00ae sont le r\\u00e9sultat d&rsquo;une \\u00e9volution constante qui transmet l&rsquo;excellence du Made in Italy dans plus de 60 pays \\u00e0 travers le monde :<\\\/p><p>Production Certifi\\u00e9e : Chaque jour, nous produisons des millions d&rsquo;articles, en soignant chaque collier avec des technologies de pr\\u00e9cision pour garantir des c\\u00e2blages s\\u00fbrs, durables et efficaces, attest\\u00e9s par la certification volontaire de produit UL, la d\\u00e9claration de conformit\\u00e9 CE et les directives REACH et RoHS.<\\\/p><p>Mat\\u00e9riaux \\u00e0 Haute R\\u00e9sistance : Nous utilisons uniquement des mati\\u00e8res premi\\u00e8res de qualit\\u00e9 certifi\\u00e9es UL 94 V-2, anti-UV et sans halog\\u00e8ne (halogen free) pour assurer une fiabilit\\u00e9 m\\u00e9canique et chimique dans toutes les conditions environnementali.<\\\/p><p>Service et Logistique : Nous savons que dans le monde professionnel, le temps est fondamental. C&rsquo;est pourquoi notre structure industrielle nous permet de garantir une exp\\u00e9dition rapide et ponctuelle.<\\\/p><p>Engagement Constant : De Padoue au reste du monde, nous continuons \\u00e0 innover avec pr\\u00e9cision. Chacune de nos solutions repr\\u00e9sente un engagement concret envers la qualit\\u00e9 et la durabilit\\u00e9.<\\\/p>\"}},{\"@type\":\"Question\",\"name\":\"Qu'est-ce que le classement d'inflammabilit\\u00e9 UL 94 V-2 ?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"<p>Le degr\\u00e9 d&rsquo;inflammabilit\\u00e9 indique la facilit\\u00e9 avec laquelle un mat\\u00e9riau de construction (mati\\u00e8re premi\\u00e8re, plastique) peut s&rsquo;enflammer et son comportement durant la combustion.<\\\/p><p>Les classifications les plus courantes pour les mati\\u00e8res plastiques se r\\u00e9f\\u00e8rent \\u00e0 la norme internationale UL 94, d\\u00e9velopp\\u00e9e par Underwriters Laboratories, qui d\\u00e9finit les m\\u00e9thodes d&rsquo;essai, les conditions et les crit\\u00e8res de classification.<\\\/p><p>Selon cette norme, le classement V-2 se d\\u00e9finit comme suit :<\\\/p><table><thead><tr><td><p><strong>CLASSE\\u00a0<\\\/strong><\\\/p><\\\/td><td><p><strong>M\\u00c9THODE D&rsquo;ESSAI\\u00a0<\\\/strong><\\\/p><\\\/td><td><p><strong>DESCRIPTION\\u00a0<\\\/strong><\\\/p><\\\/td><\\\/tr><\\\/thead><tbody><tr><td><p><strong>HB<\\\/strong><\\\/p><\\\/td><td><p><strong>Combustion Horizontale<\\\/strong><\\\/p><\\\/td><td><p>Le mat\\u00e9riau plastique br\\u00fble lentement en position horizontale, avec une vitesse de combustion maximale de 76 mm\\\/min (\\u00e9paisseur \\u2265 3 mm) ou s&rsquo;auto-\\u00e9teint avant 100 mm.<\\\/p><\\\/td><\\\/tr><tr><td><p><strong>V-2<\\\/strong><\\\/p><\\\/td><td><p><strong>Combustion Verticale<\\\/strong><\\\/p><\\\/td><td><p>Le mat\\u00e9riau plastique br\\u00fble en position verticale et s&rsquo;auto-\\u00e9teint en moins de 30 secondes apr\\u00e8s le retrait de la flamme. Les gouttes enflamm\\u00e9es sont autoris\\u00e9es.<\\\/p><\\\/td><\\\/tr><tr><td><p><strong>V-0<\\\/strong><\\\/p><\\\/td><td><p><strong>Combustion Verticale<\\\/strong><\\\/p><\\\/td><td><p>Le mat\\u00e9riau plastique br\\u00fble en position verticale et s&rsquo;auto-\\u00e9teint en moins de 10 secondes apr\\u00e8s le retrait de la flamme. Aucune goutte enflamm\\u00e9e n&rsquo;est autoris\\u00e9e.<\\\/p><\\\/td><\\\/tr><\\\/tbody><\\\/table><p><span style=\\\"font-family: DinPro; font-size: 20px; font-weight: 400;\\\">Afin de garantir les standards de qualit\\u00e9 les plus \\u00e9lev\\u00e9s, Cieffeplast utilise exclusivement des mati\\u00e8res premi\\u00e8res conformes aux normes strictes des Underwriters Laboratories, disposant des certificats UL 94 classe V-2 et V-0.<\\\/span><\\\/p>\"}},{\"@type\":\"Question\",\"name\":\"Quelle est la r\\u00e9sistance thermique des colliers de c\\u00e2blage COBRA\\u00ae?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"<p>Nos articles sont fabriqu\\u00e9s \\u00e0 partir de Polyamide 6.6 (Nylon) vierge de haute qualit\\u00e9 et de premier choix, ce qui garantit \\u00e0 nos produits les caract\\u00e9ristiques suivantes :<\\\/p><table><thead><tr><td><p><strong>CARACT\\u00c9RISTIQUE<\\\/strong><\\\/p><\\\/td><td><p><strong>VALEUR \\\/ DESCRIPTION<\\\/strong><\\\/p><\\\/td><\\\/tr><\\\/thead><tbody><tr><td><p><strong>Temp\\u00e9rature d&rsquo;utilisation (Service continu)<\\\/strong><\\\/p><\\\/td><td><p><strong>-40 \\u00b0C \\u00e0 +85 \\u00b0C<\\\/strong><\\\/p><\\\/td><\\\/tr><tr><td><p><strong>Temp\\u00e9rature de montage (Installation)<\\\/strong><\\\/p><\\\/td><td><p><strong>-10 \\u00b0C \\u00e0 +60 \\u00b0C<\\\/strong><\\\/p><\\\/td><\\\/tr><tr><td><p><strong>Pic de temp\\u00e9rature admissible (Courte dur\\u00e9e)<\\\/strong><\\\/p><\\\/td><td><p><strong>+110 \\u00b0C<\\\/strong><\\\/p><\\\/td><\\\/tr><tr><td><p><strong>Point de fusion<\\\/strong><\\\/p><\\\/td><td><p><strong>+256 \\u00b0C<\\\/strong><\\\/p><\\\/td><\\\/tr><tr><td><p><strong>Durabilit\\u00e9 \\\/ Long\\u00e9vit\\u00e9<\\\/strong><\\\/p><\\\/td><td><p><strong>\\u00c9lev\\u00e9e<\\\/strong><\\\/p><\\\/td><\\\/tr><tr><td><p><strong>Tenue au feu (Inflammabilit\\u00e9) *<\\\/strong><\\\/p><\\\/td><td><p><strong>Conforme UL 94 classe V-2<\\\/strong><\\\/p><\\\/td><\\\/tr><tr><td><p><strong>Reprise d&rsquo;humidit\\u00e9<\\\/strong><\\\/p><\\\/td><td><p><strong>2,7 % (\\u00e0 50 % d&rsquo;humidit\\u00e9 relative H.R.)<\\\/strong><\\\/p><\\\/td><\\\/tr><\\\/tbody><\\\/table><p><strong>*Note : Pour tous les colliers en polyamide 6.6, nous utilisons des mat\\u00e9riaux class\\u00e9s UL 94 V-2.<\\\/strong><\\\/p><p>Nous r\\u00e9alisons \\u00e9galement des productions sp\\u00e9cifiques utilisant un polyamide r\\u00e9sistant aux hautes temp\\u00e9ratures, pour des colliers supportant jusqu&rsquo;\\u00e0 150 \\u00b0C sur de courtes p\\u00e9riodes (125 \\u00b0C en utilisation continue).<\\\/p>\"}},{\"@type\":\"Question\",\"name\":\"Quel est le degr\\u00e9 d'auto-extinguibilit\\u00e9 des colliers COBRA\\u00ae?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"<p>Nos articles sont fabriqu\\u00e9s \\u00e0 partir de Polyamide 6.6 (Nylon) vierge de haute qualit\\u00e9 et de premier choix, ce qui garantit aux colliers de c\\u00e2blage COBRA\\u00ae un classement d\\u2019inflammabilit\\u00e9 UL 94 V-2 et une auto-extinguibilit\\u00e9 dans les 30 secondes. De cette mani\\u00e8re, la combustion s&rsquo;interrompt d&rsquo;elle-m\\u00eame.<\\\/p><p>Nous r\\u00e9alisons \\u00e9galement des productions sp\\u00e9cifiques en utilisant un polyamide auto-extinguible avec un classement UL 94 V-0, qui ne propage pas la flamme.<\\\/p>\"}},{\"@type\":\"Question\",\"name\":\"Les colliers de serrage COBRA\\u00ae sont-ils r\\u00e9sistants aux rayons UV?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"<p>Tout \\u00e0 fait ! Les colliers de serrage COBRA\\u00ae de couleur noire sont parfaitement adapt\\u00e9s aux applications ext\\u00e9rieures (outdoor) et r\\u00e9sistent aux rayons UV.<\\\/p><p>La coloration noire de notre mati\\u00e8re premi\\u00e8re vierge contient un additif technique appel\\u00e9 noir de carbone (Carbon Black). Cet \\u00e9l\\u00e9ment prolonge consid\\u00e9rablement la dur\\u00e9e de vie du collier lorsqu&rsquo;il est utilis\\u00e9 en ext\\u00e9rieur.<\\\/p><p>Pour prolonger davantage la long\\u00e9vit\\u00e9 du produit et maximiser sa tenue face aux rayonnements, nous recommandons notre gamme sp\\u00e9cifiquement con\\u00e7ue pour la r\\u00e9sistance \\u00e0 la chaleur, \\u00e0 la lumi\\u00e8re et aux rayons ultraviolets.<\\\/p><p>Contactez nos experts pour obtenir des pr\\u00e9cisions techniques suppl\\u00e9mentaires.<\\\/p>\"}},{\"@type\":\"Question\",\"name\":\"Quel est le nom technique des colliers en plastique ?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"<p>Ils sont connus sous de nombreuses d\\u00e9nominations, souvent comme colliers de serrage ou colliers d&rsquo;\\u00e9lectricien, mais aussi comme serre-c\\u00e2bles ou attaches en plastique. Le secteur \\u00e9lectrique a \\u00e9t\\u00e9 le premier \\u00e0 adopter cet outil polyvalent et, depuis lors, le terme technique appropri\\u00e9 est colliers de c\\u00e2blage.<\\\/p><p>Le collier de c\\u00e2blage moderne a \\u00e9t\\u00e9 invent\\u00e9 en 1958 et \\u00e9tait destin\\u00e9 \\u00e0 l&rsquo;industrie a\\u00e9ronautique (sp\\u00e9cifiquement pour Boeing) afin de remplacer l&rsquo;ancien syst\\u00e8me de ligatures avec du fil de la\\u00e7age cir\\u00e9, qui causait de fr\\u00e9quentes blessures aux mains des ouvriers.<\\\/p><p>Initialement dot\\u00e9s d&rsquo;une languette m\\u00e9tallique, les colliers ont \\u00e9volu\\u00e9 \\u00e0 la fin des ann\\u00e9es 60 pour devenir monoblocs en Nylon (tout plastique), la technologie standard que nous utilisons aujourd&rsquo;hui.<\\\/p><p>Aujourd&rsquo;hui, la gamme COBRA perp\\u00e9tue cet h\\u00e9ritage et repr\\u00e9sente l&rsquo;\\u00e9volution professionnelle de cet outil essentiel. Gr\\u00e2ce \\u00e0 des presses \\u00e0 injection de derni\\u00e8re g\\u00e9n\\u00e9ration, nous garantissons des charges de rupture (r\\u00e9sistance \\u00e0 la traction) bien sup\\u00e9rieures \\u00e0 celles des premiers prototypes de 1958.<\\\/p>\"}}]}<\/script>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c46ab4d elementor-widget__width-auto btn-header-home elementor-widget-mobile__width-initial elementor-invisible elementor-widget elementor-widget-stal_core_button\" data-id=\"c46ab4d\" data-element_type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeInLeft&quot;}\" data-widget_type=\"stal_core_button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<a class=\"qodef-shortcode qodef-m  qodef-button qodef-layout--splitted qodef-size--large qodef-html--link\" href=\"https:\/\/www.cieffeplast.com\/fr\/contacts\/\" target=\"_self\"  style=\"font-size: 16px;font-weight: 700\">\n    <span class=\"qodef-m-text\">\n        Contact direct        <svg class=\"qodef-m-arrowline\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlns:xlink=\"http:\/\/www.w3.org\/1999\/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 63 20\" xml:space=\"preserve\">\n                            <line x1=\"61.6\" y1=\"10\" x2=\"61.6\" y2=\"10\"\/>\n                            <line x1=\"62\" y1=\"10\" x2=\"61.6\" y2=\"10\"\/>\n                            <line x1=\"61.6\" y1=\"10\" x2=\"1\" y2=\"10\"\/>\n                            <path d=\"M61.6,10\"\/>\n                            <line x1=\"61.6\" y1=\"10\" x2=\"61.6\" y2=\"10\"\/>\n                            <line class=\"arrow-up\" x1=\"56.7\" y1=\"5.1\" x2=\"61.6\" y2=\"10\"\/>\n                            <path d=\"M61.6,10\"\/>\n                            <line x1=\"61.6\" y1=\"10\" x2=\"61.6\" y2=\"10\"\/>\n                            <line class=\"arrow-down\" x1=\"61.6\" y1=\"10\" x2=\"56.7\" y2=\"14.9\"\/>\n                        <\/svg>    <\/span>\n    <span class=\"qodef-m-split qodef-split--up\"><\/span>\n    <span class=\"qodef-m-split qodef-split--down\"><\/span>\n<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-42f9c78 elementor-widget elementor-widget-shortcode\" data-id=\"42f9c78\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><style>\n\/* --- STILE BASE (Comune a tutti i dispositivi) --- *\/\n\/* Il testo parte sempre nascosto *\/\n.testo-a-comparsa {\n    opacity: 0;\n    height: 0;\n    transform: translateY(10px); \/* Spostato leggermente in basso *\/\n    transition: all 0.4s ease; \/* Animazione fluida *\/\n    overflow: hidden;\n}\n\n\/* --- LOGICA DESKTOP (Mouse Hover) --- *\/\n@media (min-width: 1025px) {\n    \/* Quando il mouse passa sopra, mostra il testo *\/\n    .box-interattivo:hover .testo-a-comparsa {\n        opacity: 1;\n        height: auto;\n        transform: translateY(0);\n    }\n    \n    .box-interattivo {\n        cursor: pointer; \/* Manina del mouse *\/\n    }\n}\n\n\/* --- LOGICA MOBILE E TABLET (Tap\/Click) --- *\/\n@media (max-width: 1024px) {\n    \/* Qui non usiamo :hover, ma una classe \".aperto\" che aggiungiamo con JS *\/\n    .box-interattivo.aperto .testo-a-comparsa {\n        opacity: 1 !important;\n        height: auto !important;\n        transform: translateY(0) !important;\n        margin-top: 10px;\n        padding-bottom: 10px; \/* Un po' di aria sotto *\/\n    }\n}\n<\/style>\n\n<script>\ndocument.addEventListener(\"DOMContentLoaded\", function() {\n    \n    \/\/ Seleziona tutti gli elementi con la classe box-interattivo\n    var boxes = document.querySelectorAll('.box-interattivo');\n\n    \/\/ Per ogni box...\n    boxes.forEach(function(box) {\n        \n        \/\/ Aggiunge un ascoltatore per il click (o tap su mobile)\n        box.addEventListener('click', function() {\n            \n            \/\/ CONTROLLO DISPOSITIVO: Eseguiamo solo se siamo su Tablet o Mobile\n            \/\/ (Su desktop lasciamo fare all'hover CSS)\n            if (window.innerWidth <= 1024) {\n                \n                \/\/ Se \u00e8 gi\u00e0 aperto, lo chiudiamo\n                if (this.classList.contains('aperto')) {\n                    this.classList.remove('aperto');\n                } \n                \/\/ Altrimenti lo apriamo\n                else {\n                    \/\/ Opzionale: Se vuoi che se ne apra solo uno alla volta, \n                    \/\/ scommenta le 3 righe qui sotto:\n                    \/*\n                    boxes.forEach(function(el) {\n                        el.classList.remove('aperto');\n                    });\n                    *\/\n                    \n                    this.classList.add('aperto');\n                }\n            }\n        });\n    });\n});\n<\/script><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3207f04 elementor-widget elementor-widget-shortcode\" data-id=\"3207f04\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><style>\n\/* --- CAROSELLO LOGHI INFINITO E FLUIDO --- *\/\n\/* Forza lo swiper di Elementor ad avere una velocit\u00e0 costante senza frenare *\/\n\n.carosello-continuo .swiper-wrapper {\n    -webkit-transition-timing-function: linear !important; \n    -o-transition-timing-function: linear !important;\n    transition-timing-function: linear !important; \n}\n<\/style><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3bc5dee elementor-widget elementor-widget-shortcode\" data-id=\"3bc5dee\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><style>\n\n\/* Immagini con transizione e hover *\/\n.premium-card img {\n    border-radius: 8px !important;\n    transition: transform 0.3s ease-in-out; \/* Rende il movimento fluido *\/\n    display: block; \/* Evita spazi bianchi indesiderati *\/\n}\n\n\n\n.premium-card img:hover {\n    transform: scale(1.05); \/* Ingrandimento del 5% *\/\n    cursor: pointer;\n}\n<\/style><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-52757bf elementor-section-full_width d-none elementor-section-height-default elementor-section-height-default qodef-elementor-content-no\" data-id=\"52757bf\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7e74571\" data-id=\"7e74571\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-9880b76 img-video-home elementor-widget elementor-widget-stal_core_video_button\" data-id=\"9880b76\" data-element_type=\"widget\" data-widget_type=\"stal_core_video_button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"qodef-shortcode qodef-m  qodef-video-button  qodef-vb-has-img\">\n\t<div class=\"qodef-m-image\">\n\t<img loading=\"lazy\" decoding=\"async\" width=\"1440\" height=\"467\" src=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/12\/background-video.jpg\" class=\"attachment-full size-full\" alt=\"Fascette Cobra Made in Italy con logo\" srcset=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/12\/background-video.jpg 1440w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/12\/background-video-300x97.jpg 300w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/12\/background-video-1024x332.jpg 1024w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/12\/background-video-768x249.jpg 768w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/12\/background-video-600x195.jpg 600w\" sizes=\"(max-width: 1440px) 100vw, 1440px\" \/><\/div>\t\n\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-2107318 elementor-section-full_width elementor-section-height-default elementor-section-height-default qodef-elementor-content-no\" data-id=\"2107318\" data-element_type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t\t<div class=\"elementor-background-overlay\"><\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-fe7d3ea\" data-id=\"fe7d3ea\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-14a0fc5 elementor-widget elementor-widget-image\" data-id=\"14a0fc5\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/www.cieffeplast.com\/fr\/\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"267\" src=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/12\/logo-cobra-new-w-600x267.png\" class=\"attachment-woocommerce_single size-woocommerce_single wp-image-9572\" alt=\"Logo Cobra Made in Italy \u2013 Cieffeplast\" srcset=\"https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/12\/logo-cobra-new-w-600x267.png 600w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/12\/logo-cobra-new-w-300x134.png 300w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/12\/logo-cobra-new-w-1024x456.png 1024w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/12\/logo-cobra-new-w-768x342.png 768w, https:\/\/www.cieffeplast.com\/wp-content\/uploads\/2021\/12\/logo-cobra-new-w.png 1417w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Notre id\u00e9e fixe! Fabricant de colliers de c\u00e2blage Cobra\u00ae Fabricant de colliers de serrage en plastique et d&#039;accessoires de fixation pour professionnels. Made in Italy &amp; Livraison rapide dans toute l&#039;Europe. Contact direct COLLIERS DE C\u00c2BLAGE Colliers de c\u00e2blage standard nylon Colliers de c\u00e2blage Colliers de c\u00e2blage color\u00e9s nylon ACCESSOIRES POUR FIXATION Cheville pour colliers [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":9120,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-full-width.php","meta":{"_acf_changed":false,"_sitemap_exclude":false,"_sitemap_priority":"","_sitemap_frequency":"","footnotes":""},"class_list":["post-12288","page","type-page","status-publish","has-post-thumbnail","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.cieffeplast.com\/fr\/wp-json\/wp\/v2\/pages\/12288","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.cieffeplast.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.cieffeplast.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.cieffeplast.com\/fr\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/www.cieffeplast.com\/fr\/wp-json\/wp\/v2\/comments?post=12288"}],"version-history":[{"count":85,"href":"https:\/\/www.cieffeplast.com\/fr\/wp-json\/wp\/v2\/pages\/12288\/revisions"}],"predecessor-version":[{"id":16427,"href":"https:\/\/www.cieffeplast.com\/fr\/wp-json\/wp\/v2\/pages\/12288\/revisions\/16427"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.cieffeplast.com\/fr\/wp-json\/wp\/v2\/media\/9120"}],"wp:attachment":[{"href":"https:\/\/www.cieffeplast.com\/fr\/wp-json\/wp\/v2\/media?parent=12288"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}