{"id":1208,"date":"2026-11-04T01:07:09","date_gmt":"2026-11-04T01:07:09","guid":{"rendered":"https:\/\/www.lp-equipment.com.my\/2016\/?page_id=1208"},"modified":"2026-11-04T02:11:06","modified_gmt":"2026-11-04T02:11:06","slug":"home-new","status":"publish","type":"page","link":"https:\/\/www.lp-equipment.com.my\/2016\/","title":{"rendered":"Processing Equipment Supplier in Shah Alam | LP Equipment"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1208\" class=\"elementor elementor-1208\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-2ff2e5b elementor-section-full_width elementor-section-stretched elementor-section-height-default elementor-section-height-default\" data-id=\"2ff2e5b\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;stretch_section&quot;:&quot;section-stretched&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-100 elementor-top-column elementor-element elementor-element-1cfb425\" data-id=\"1cfb425\" data-element_type=\"column\" data-e-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-f90f2b1 elementor-widget elementor-widget-html\" data-id=\"f90f2b1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\"><link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@500&family=Space+Grotesk:wght@500;600;700&display=swap\" rel=\"stylesheet\">\n<style>\n.lpx{overflow-x:clip}\n.lpx svg,.lpx img{max-width:none}\n.lpx h1,.lpx h2,.lpx h3,.lpx h4,.lpx h5{font-weight:700;font-style:normal;text-transform:none;color:inherit}\n.lpx a:hover,.lpx a:focus,.lpx a:active{color:inherit;text-decoration:none}\n.lpx button{text-transform:none;letter-spacing:normal}\n.lpx section{padding:0}\n.lpx{--g:#0B1220;--p:#141E30;--c:#22D3EE;--t:#14B8A6;--b:#2563EB;--a:#F59E0B;--l:#F4F7FB;--ink:#0F172A;--mut:#64748B;--vh:min(100vh,900px)}\n.lpx *{box-sizing:border-box;margin:0}\nhtml{scroll-behavior:smooth}\n.lpx{background:var(--g);color:#eaf2fb;font:400 16px\/1.6 Inter,system-ui,sans-serif;overflow-x:clip}\n.lpx a{color:inherit;text-decoration:none}\n.lpx h1,.lpx h2,.lpx h3{font-family:'Space Grotesk',sans-serif;letter-spacing:-.025em;line-height:1.02}\n.lpx .mono{font:500 11px 'JetBrains Mono',monospace;letter-spacing:.14em;text-transform:uppercase;color:var(--c)}\n.lpx .lp-main{position:relative;isolation:isolate}\n.lpx #lp-ribbon{position:absolute;left:0;top:0;width:100%;z-index:-1;pointer-events:none;overflow:visible}\n.lpx section{position:relative}\n.lpx .band{position:absolute;inset:0;z-index:-2}\n.lpx .dark .band{background:linear-gradient(180deg,#0B1220,#0e1a30 60%,#0B1220)}\n.lpx .light .band{background:linear-gradient(180deg,#F4F7FB,#e7eff9)}\n.lpx .light{color:var(--ink)}\n.lpx .light .mono{color:var(--b)}\n.lpx .light .sub{color:var(--mut)}\n.lpx .wave{position:absolute;left:0;width:100%;height:90px;overflow:hidden;pointer-events:none;z-index:-2}\n.lpx .wave.top{top:-89px}\n.lpx .wave.bot{bottom:-1px;transform:scaleY(-1)}\n.lpx .wave svg{width:200%;height:100%;animation:wv 14s linear infinite}\n.lpx .wave.r svg{animation-direction:reverse;animation-duration:20s}\n@keyframes wv{to{transform:translateX(-50%)}}\n.lpx nav{position:fixed;top:14px;left:50%;transform:translateX(-50%);z-index:40;width:min(1280px,calc(100% - 24px));display:flex;align-items:center;gap:24px;padding:10px 12px 10px 26px;border-radius:99px;background:rgba(11,18,32,.55);backdrop-filter:blur(18px) saturate(1.5);border:1px solid rgba(255,255,255,.14)}\n.lpx .brand{display:flex;align-items:center;gap:12px;font:600 20px 'Space Grotesk';white-space:nowrap}\n.lpx .logo-ic{width:32px;height:32px;flex:none}\n.lpx nav .links{margin-left:auto;display:flex;gap:30px;font-size:16.5px;font-weight:500;color:#a9bbd2;white-space:nowrap}\n.lpx nav .links a:hover{color:#fff}\n.lpx .btn{display:inline-flex;align-items:center;gap:8px;padding:12px 22px;border-radius:99px;font-weight:600;font-size:14px;border:0;cursor:pointer;transition:.3s;position:relative;overflow:hidden}\n.lpx .btn.pri{background:linear-gradient(120deg,var(--c),var(--b));color:#04101f}\n.lpx .btn.pri:hover{transform:translateY(-2px);box-shadow:0 14px 34px -8px rgba(34,211,238,.7)}\n.lpx .btn.gh{border:1px solid rgba(255,255,255,.25);color:#fff}\n.lpx nav .btn{padding:13px 26px;font-size:16px;white-space:nowrap}\n.lpx .rv{opacity:0;transform:translateY(34px);transition:opacity .9s,transform .9s cubic-bezier(.2,.8,.2,1)}\n.lpx .rv.in{opacity:1;transform:none}\n.lpx .hero{min-height:var(--vh);display:grid;grid-template-columns:1.05fr 1fr;align-items:center;gap:2vw;max-width:1400px;margin:auto;padding:120px 6vw 120px}\n.lpx .hero h1{font-size:clamp(48px,7.2vw,112px);margin:16px 0 22px}\n.lpx .flowtxt{background:linear-gradient(100deg,#22D3EE,#2563EB,#14B8A6,#22D3EE);background-size:250% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:flowtxt 8s linear infinite}\n@keyframes flowtxt{to{background-position:250% 0}}\n.lpx .hero .lead{color:#a9bbd2;max-width:500px;font-size:clamp(16px,1.4vw,19px)}\n.lpx .hero .cta{display:flex;gap:12px;margin-top:30px;flex-wrap:wrap}\n.lpx .pool{position:relative;height:min(580px,80vw)}\n.lpx .blob{position:absolute;animation:morph 11s ease-in-out infinite alternate;mix-blend-mode:screen}\n.lpx .blob.b1{inset:6% 8% 8% 6%;background:radial-gradient(circle at 30% 30%,#22D3EE,#2563EB 70%);opacity:.9;filter:drop-shadow(0 30px 60px rgba(37,99,235,.5))}\n.lpx .blob.b2{inset:22% 0 0 26%;background:radial-gradient(circle at 60% 40%,#14B8A6,#2563EB 80%);opacity:.7;animation-delay:-4s;animation-duration:13s}\n.lpx .blob.b3{inset:0 30% 40% 0;background:radial-gradient(circle at 40% 40%,#8be9ff,#22D3EE 60%,transparent 75%);opacity:.55;animation-delay:-7s;filter:blur(8px)}\n@keyframes morph{0%{border-radius:60% 40% 55% 45%\/55% 45% 55% 45%;transform:rotate(0)}50%{border-radius:40% 60% 45% 55%\/45% 60% 40% 55%}100%{border-radius:55% 45% 62% 38%\/60% 40% 60% 40%;transform:rotate(25deg) scale(1.05)}}\n.lpx .pool .core{position:absolute;inset:0;display:grid;place-items:center}\n.lpx .pool .core svg{width:min(250px,48%);filter:drop-shadow(0 0 40px rgba(255,255,255,.4));animation:float 7s ease-in-out infinite alternate}\n@keyframes float{to{transform:translateY(-16px) rotate(6deg)}}\n.lpx .chip{position:absolute;padding:11px 18px 11px 14px;border-radius:99px;background:rgba(255,255,255,.14);border:1px solid rgba(255,255,255,.35);backdrop-filter:blur(14px);font:500 14px 'Space Grotesk';display:flex;gap:10px;align-items:center;box-shadow:0 20px 40px -14px rgba(0,0,0,.5);animation:float 6s ease-in-out infinite alternate}\n.lpx .chip:before{content:'';width:14px;height:18px;border-radius:50% 50% 50% 50%\/60% 60% 40% 40%;background:linear-gradient(#fff,#22D3EE)}\n.lpx .chip.c1{left:-4%;top:20%}\n.lpx .chip.c2{right:-2%;top:12%;animation-delay:-2s}\n.lpx .chip.c3{right:6%;bottom:12%;animation-delay:-4s}\n.lpx .chip.c4{left:6%;bottom:16%;animation-delay:-5s}\n.lpx .drop{position:absolute;bottom:-20px;width:10px;height:14px;border-radius:50% 50% 50% 50%\/60% 60% 40% 40%;background:rgba(34,211,238,.6);animation:rise var(--d,9s) linear infinite;left:var(--x)}\n@keyframes rise{to{transform:translateY(-110vh) translateX(30px);opacity:0}}\n.lpx .sec{max-width:1300px;margin:auto;padding:130px 5vw 120px;position:relative}\n.lpx .sec h2{font-size:clamp(34px,5vw,72px);margin:12px 0 14px;max-width:820px}\n.lpx .sec .sub{max-width:560px}\n.lpx .peb{display:grid;grid-template-columns:repeat(4,1fr);gap:22px;margin-top:56px}\n.lpx .pb{position:relative;min-height:290px;padding:30px;overflow:hidden;background:#fff;color:var(--ink);box-shadow:0 30px 60px -30px rgba(15,23,42,.35),0 0 0 1px rgba(15,23,42,.05);transition:transform .5s cubic-bezier(.2,.8,.2,1),box-shadow .5s,border-radius 1.2s;display:flex;flex-direction:column;justify-content:flex-end}\n.lpx .pb:nth-child(8n+1){border-radius:60px 40px 70px 30px}\n.lpx .pb:nth-child(8n+2){border-radius:36px 70px 36px 64px}\n.lpx .pb:nth-child(8n+3){border-radius:70px 34px 52px 48px}\n.lpx .pb:nth-child(8n+4){border-radius:34px 62px 40px 70px}\n.lpx .pb:nth-child(8n+5){border-radius:48px 66px 34px 56px}\n.lpx .pb:nth-child(8n+6){border-radius:64px 32px 70px 40px}\n.lpx .pb:nth-child(8n+7){border-radius:38px 56px 62px 34px}\n.lpx .pb:nth-child(8n+8){border-radius:70px 44px 36px 60px}\n.lpx .pb:hover{transform:translateY(-12px) scale(1.02);border-radius:56px;box-shadow:0 40px 70px -26px rgba(37,99,235,.55)}\n.lpx .pb .fill{position:absolute;left:-60%;width:220%;height:220%;top:190%;background:linear-gradient(180deg,#22D3EE,#2563EB);border-radius:42%;animation:slosh 7s linear infinite;transition:top .9s cubic-bezier(.2,.8,.2,1);z-index:0}\n.lpx .pb .fill.f2{background:rgba(255,255,255,.22);animation-duration:11s;animation-direction:reverse}\n.lpx .pb:hover .fill{top:6%}\n.lpx .pb:hover .fill.f2{top:10%}\n@keyframes slosh{to{transform:rotate(360deg)}}\n.lpx .pb>*:not(.fill){position:relative;z-index:1;transition:color .5s}\n.lpx .pb:hover>*:not(.fill){color:#fff}\n.lpx .pb .ic{position:absolute;right:26px;top:26px;width:58px;height:58px;border-radius:50%;display:grid;place-items:center;background:#e7f6fc;border:1px solid rgba(37,99,235,.2);transition:.5s}\n.lpx .pb .ic svg{width:28px;height:28px;stroke:var(--b);fill:none;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round;transition:.5s}\n.lpx .pb:hover .ic{background:rgba(255,255,255,.2);border-color:rgba(255,255,255,.5)}\n.lpx .pb:hover .ic svg{stroke:#fff}\n.lpx .pb h3{font-size:25px;margin-bottom:8px}\n.lpx .pb p{font-size:14px;color:var(--mut);max-width:260px}\n.lpx .pb .n{font:500 11px 'JetBrains Mono';letter-spacing:.14em;color:var(--b);margin-bottom:auto;position:absolute;left:30px;top:30px}\n.lpx .tank{position:relative;margin:0 auto;max-width:1380px;padding:0 3vw}\n.lpx .tankbox{border-radius:90px 90px 90px 90px;background:linear-gradient(160deg,#0d1b33,#0B1220);color:#eaf2fb;padding:60px 4vw 30px;position:relative;overflow:hidden;box-shadow:0 60px 120px -40px rgba(11,18,32,.7)}\n.lpx .tankbox:before{content:'';position:absolute;width:70%;aspect-ratio:1;right:-25%;top:-50%;border-radius:50%;background:radial-gradient(circle,rgba(34,211,238,.35),transparent 65%);filter:blur(30px)}\n.lpx .tankbox h2{font-size:clamp(30px,4vw,58px);max-width:700px;margin-top:10px;position:relative}\n.lpx .tankbox .plant{margin-top:10px}\n.lpx .lvl{position:absolute;right:4vw;top:60px;width:64px;height:200px;border-radius:32px;border:2px solid rgba(255,255,255,.3);overflow:hidden;z-index:3;background:rgba(255,255,255,.05)}\n.lpx .lvl i{position:absolute;left:0;right:0;bottom:0;height:calc(var(--p,0)*100%);background:linear-gradient(180deg,#22D3EE,#2563EB);transition:height .15s}\n.lpx .lvl b{position:absolute;inset:0;display:grid;place-items:center;font:700 14px 'JetBrains Mono';color:#fff;mix-blend-mode:difference}\n.lpx .plant-pop{background:rgba(255,255,255,.96);color:var(--ink);border:1px solid rgba(37,99,235,.25);box-shadow:0 30px 60px -20px rgba(0,0,0,.6)}\n.lpx .plant-pop .pp-chips span{border-color:rgba(37,99,235,.25);background:#eef6fd}\n.lpx .plant-pop .pp-cat i{background:#dff3fb;color:#0e6d86}\n.lpx .plant-pop .pp-cta{color:var(--b)}\n.lpx .river{position:relative;margin-top:50px}\n.lpx .river svg{width:100%;height:170px;overflow:visible}\n.lpx .river .nodes{display:grid;grid-template-columns:repeat(5,1fr);margin-top:-110px;position:relative}\n.lpx .nd{display:grid;justify-items:center;gap:10px;cursor:pointer;text-align:center;padding:0 6px}\n.lpx .nd i{width:64px;height:64px;border-radius:50%;display:grid;place-items:center;font:700 18px 'Space Grotesk';font-style:normal;background:#fff;color:var(--b);border:2px solid rgba(37,99,235,.25);box-shadow:0 14px 30px -10px rgba(37,99,235,.4);transition:.45s cubic-bezier(.2,.8,.2,1)}\n.lpx .nd:nth-child(even) i{transform:translateY(40px)}\n.lpx .nd.on i,.lpx .nd:hover i{background:linear-gradient(135deg,var(--c),var(--b));color:#fff;transform:scale(1.25) translateY(var(--ty,0));box-shadow:0 20px 40px -8px rgba(37,99,235,.7)}\n.lpx .nd:nth-child(even){--ty:30px}\n.lpx .nd span{font:600 14px 'Space Grotesk';line-height:1.2;max-width:140px;margin-top:2px}\n.lpx .nd:nth-child(even) span{margin-top:42px}\n.lpx .sdet{margin-top:56px;background:#fff;border-radius:60px 36px 60px 36px;padding:36px 42px;box-shadow:0 30px 60px -30px rgba(15,23,42,.35);display:grid;grid-template-columns:1fr auto;gap:30px;align-items:center;position:relative;overflow:hidden}\n.lpx .sdet:before{content:'';position:absolute;left:-10%;bottom:-70%;width:60%;aspect-ratio:1;border-radius:46%;background:linear-gradient(135deg,rgba(34,211,238,.25),rgba(37,99,235,.12));animation:slosh 12s linear infinite}\n.lpx .sdet>*{position:relative}\n.lpx .sdet h3{font-size:30px;margin-bottom:6px}\n.lpx .sdet p{color:var(--mut);max-width:560px}\n.lpx .mq{overflow:hidden;margin:46px 0 0;mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);-webkit-mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent)}\n.lpx .mq div{display:flex;gap:16px;width:max-content;animation:mq 40s linear infinite;margin-bottom:16px}\n.lpx .mq div.rev{animation-direction:reverse;animation-duration:50s}\n.lpx .mq span{padding:18px 34px;border-radius:99px;font:600 clamp(18px,2vw,26px) 'Space Grotesk';background:linear-gradient(120deg,rgba(34,211,238,.16),rgba(37,99,235,.2));border:1px solid rgba(255,255,255,.18);white-space:nowrap}\n@keyframes mq{to{transform:translateX(-50%)}}\n.lpx .ctab{max-width:1150px;margin:0 auto;border-radius:90px 50px 90px 50px;padding:clamp(30px,5vw,70px);background:linear-gradient(135deg,#22D3EE,#2563EB 70%);color:#04101f;display:grid;grid-template-columns:1fr 1fr;gap:40px;position:relative;overflow:hidden}\n.lpx .ctab:before{content:'';position:absolute;width:90%;aspect-ratio:1;left:-20%;bottom:-70%;border-radius:44%;background:rgba(255,255,255,.18);animation:slosh 15s linear infinite}\n.lpx .ctab>*{position:relative}\n.lpx .ctab h2{font-size:clamp(34px,4.6vw,66px);color:#04101f}\n.lpx .ctab ul{list-style:none;padding:0;margin-top:20px;font-weight:600;display:grid;gap:4px}\n.lpx .ctab form{display:grid;gap:12px}\n.lpx .ctab input,.lpx .ctab textarea{padding:16px 22px;border-radius:30px;border:0;background:rgba(255,255,255,.92);font:inherit;color:var(--ink);outline:0}\n.lpx .ctab input:focus,.lpx .ctab textarea:focus{box-shadow:0 0 0 4px rgba(255,255,255,.5)}\n.lpx .ctab .btn{background:var(--g);color:#fff;justify-content:center}\n.lpx footer{max-width:1200px;margin:70px auto 0;padding:26px 5vw 50px;color:#8fa3bd;font-size:13px;display:flex;justify-content:space-between;gap:16px;flex-wrap:wrap}\n.lpx .glow{position:fixed;left:0;top:0;width:260px;height:260px;margin:-130px 0 0 -130px;border-radius:50%;background:radial-gradient(circle,rgba(34,211,238,.35),transparent 65%);pointer-events:none;z-index:30;mix-blend-mode:screen;filter:blur(10px)}\n.lpx .rip{position:fixed;width:20px;height:20px;margin:-10px;border-radius:50%;border:2px solid var(--c);pointer-events:none;z-index:31;animation:rip .9s ease-out forwards}\n@keyframes rip{to{transform:scale(10);opacity:0}}\n.lpx .badge{position:fixed;left:14px;bottom:14px;z-index:60;font:500 10px 'JetBrains Mono';letter-spacing:.1em;padding:6px 10px;border-radius:99px;background:rgba(0,0,0,.55);color:#a9bbd2}\n@media(max-width:980px){.lpx .peb{grid-template-columns:repeat(2,1fr)}}\n@media(max-width:820px){.lpx nav .links{display:none}\n.lpx nav .btn{margin-left:auto}\n.lpx .hero{grid-template-columns:minmax(0,1fr);padding-top:100px;padding-bottom:90px}\n.lpx .hero>*{min-width:0}\n.lpx .pool{height:360px}\n.lpx .chip{font-size:12px;padding:8px 12px 8px 10px}\n.lpx .peb{grid-template-columns:1fr}\n.lpx .pb{min-height:220px}\n.lpx .tankbox{border-radius:50px;padding:36px 14px 16px}\n.lpx .lvl{display:none}\n.lpx .river svg{display:none}\n.lpx .river .nodes{grid-template-columns:repeat(2,1fr);margin-top:0;row-gap:24px}\n.lpx .nd:nth-child(even) i,.lpx .nd:nth-child(even) span{transform:none;margin-top:0}\n.lpx .sdet{grid-template-columns:1fr;padding:26px}\n.lpx .ctab{grid-template-columns:1fr;border-radius:50px 30px 50px 30px}\n.lpx .glow{display:none}}\n.shot .lpx .badge,.shot .lpx .glow{display:none}\n.shot .lpx nav{position:absolute}\n.lpx .plant{position:relative;width:100%;max-width:100%;min-width:0}\n.lpx .plant-svg{width:100%;height:auto;display:block;overflow:visible;touch-action:manipulation}\n.lpx .plant .cam{transition:transform .25s linear;transform-box:view-box}\n.lpx .plant .hs{cursor:pointer;outline:none}\n.lpx .plant .hs>g:not(.marker),.lpx .plant .hs>polygon,.lpx .plant .hs>circle,.lpx .plant .hs>line,.lpx .plant .hs>rect{transition:filter .25s}\n.lpx .plant .hs:hover>g:not(.marker),.lpx .plant .hs.on>g:not(.marker){filter:drop-shadow(0 0 10px var(--plant-glow,#22D3EE)) brightness(1.12)}\n.lpx .plant .hs .marker{transition:transform .2s}\n.lpx .plant .pulse{transform-box:fill-box;transform-origin:center;animation:pl-pulse 2.4s ease-out infinite}\n@keyframes pl-pulse{0%{transform:scale(.7);opacity:.9}100%{transform:scale(1.9);opacity:0}}\n.lpx .plant .pflow{animation:pl-flow 1.1s linear infinite}\n@keyframes pl-flow{to{stroke-dashoffset:-24}}\n.lpx .plant .pfill{transition:stroke-dasharray .12s linear;filter:drop-shadow(0 0 3px #22D3EE)}\n.lpx .plant .piston{animation:pl-pis .9s ease-in-out infinite alternate;transform-box:fill-box}\n@keyframes pl-pis{from{transform:translateY(0)}to{transform:translateY(-6px)}}\n.lpx .plant .scan{animation:pl-scan 1.6s ease-in-out infinite alternate}\n@keyframes pl-scan{from{opacity:.08}to{opacity:.35}}\n.lpx .plant .scanline{animation:pl-sl 1.6s ease-in-out infinite alternate}\n@keyframes pl-sl{from{transform:translateY(-34px)}to{transform:translateY(34px)}}\n.lpx .plant .blinkx{animation:pl-bl 1.2s steps(2) infinite}\n@keyframes pl-bl{50%{opacity:.25}}\n.lpx .plant .drip{animation:pl-drip .9s ease-in infinite}\n@keyframes pl-drip{0%{transform:translateY(0);opacity:0}20%{opacity:1}100%{transform:translateY(34px);opacity:0}}\n.lpx .plant-pop{position:absolute;left:var(--px);top:var(--py);transform:translate(26px,-50%);width:min(290px,70%);z-index:5;padding:16px 18px 16px;border-radius:22px;font:400 13px\/1.5 Inter,system-ui,sans-serif;opacity:0;visibility:hidden;pointer-events:none;transition:opacity .7s ease,visibility 0s linear .7s}\n.lpx .plant-pop.left{transform:translate(calc(-100% - 26px),-50%)}\n.lpx .plant-pop.show{opacity:1;visibility:visible;pointer-events:auto;transition:opacity .3s ease,visibility 0s}\n.lpx .plant-hint{display:flex;align-items:center;gap:9px;margin:6px 0 2px;font:500 11.5px 'JetBrains Mono',monospace;letter-spacing:.12em;text-transform:uppercase;color:#7fe6f5}\n.lpx .plant-hint:before{content:'';width:9px;height:9px;border-radius:50%;background:#22D3EE;box-shadow:0 0 0 0 rgba(34,211,238,.6);animation:pl-hint 2s ease-out infinite;flex:none}\n@keyframes pl-hint{to{box-shadow:0 0 0 10px rgba(34,211,238,0)}}\n.lpx .plant-hint .ht{display:none}\n.lpx .plant-hint .hh{display:inline}\n@media(hover:none) and (pointer:coarse){.lpx .plant-hint .hh{display:none}.lpx .plant-hint .ht{display:inline}}\n.lpx .plant-pop .pp-x{position:absolute;right:10px;top:8px;background:none;border:0;color:inherit;font-size:20px;cursor:pointer;opacity:.6}\n.lpx .plant-pop .pp-cat{display:flex;gap:8px;align-items:center;font:600 10.5px 'JetBrains Mono',monospace;letter-spacing:.12em;text-transform:uppercase}\n.lpx .plant-pop .pp-cat i{font-style:normal;padding:2px 6px;border-radius:99px;background:rgba(34,211,238,.18)}\n.lpx .plant-pop h4{margin:8px 0 4px;font:600 16px\/1.25 'Space Grotesk',sans-serif}\n.lpx .plant-pop p{margin:0 0 10px;opacity:.78}\n.lpx .plant-pop .pp-chips{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:12px}\n.lpx .plant-pop .pp-chips span{font-size:11px;padding:4px 9px;border-radius:99px;border:1px solid rgba(255,255,255,.18);background:rgba(255,255,255,.06)}\n.lpx .plant-pop .pp-cta{font-weight:600;font-size:12.5px;color:#22D3EE;text-decoration:none}\n@media(max-width:768px){.lpx .plant-pop{position:relative;left:auto;top:auto;transform:none!important;width:calc(100% - 8px);max-width:360px;margin:0 4px;padding-top:0;padding-bottom:0;max-height:0;overflow:hidden;border-width:0;transition:opacity .7s ease,max-height .7s ease,margin .7s ease,padding .7s ease,visibility 0s linear .7s}\n.lpx .plant-pop.show{max-height:640px;margin:10px 4px 0;padding-top:16px;padding-bottom:16px;border-width:1px;transition:opacity .3s ease,max-height .4s ease,margin .3s ease,padding .3s ease,visibility 0s}}\n@media(prefers-reduced-motion:reduce){.lpx .plant *{animation:none!important}.lpx .plant-hint:before{animation:none}}\n\/* zoom viewport + controls: desktop is untouched (controls hidden, no clipping); narrow screens fit the whole plant to the width and allow zoom *\/\n.lpx .plant-zoom{display:none}\n.lpx .plant-hint .hz{display:none}\n@media(max-width:768px){\n.lpx .plant-vp{position:relative;overflow:hidden;box-sizing:border-box;padding:0 8px 26px;border-radius:14px;touch-action:pan-y;-webkit-user-select:none;user-select:none}\n.lpx .plant-vp.zoomed{touch-action:none;cursor:grab}\n.lpx .plant-vp .plant-svg{min-width:0;transform-origin:0 0;will-change:transform;transition:transform .22s ease}\n.lpx .plant-vp.gest .plant-svg{transition:none}\n.lpx .plant-zoom{display:flex;align-items:center;justify-content:flex-end;gap:8px;margin:8px 0 0}\n.lpx .plant-zoom .pz-r{font:500 12px 'JetBrains Mono',monospace;letter-spacing:.08em;color:#7fe6f5;min-width:34px;text-align:right;margin-right:2px}\n.lpx .plant-zoom button{width:44px;height:44px;min-width:40px;min-height:40px;border-radius:50%;border:1px solid rgba(127,230,245,.45);background:rgba(255,255,255,.08);color:#eaf2fb;font:600 22px\/1 'Space Grotesk',sans-serif;display:inline-flex;align-items:center;justify-content:center;padding:0;cursor:pointer;touch-action:manipulation}\n.lpx .plant-zoom button.pz-rs{font-size:18px}\n.lpx .plant-zoom button:focus-visible{outline:2px solid #22D3EE;outline-offset:2px}\n.lpx .plant-zoom button:disabled{opacity:.35;cursor:default}\n.lpx .plant-hint{max-width:100%;line-height:1.5}}\n@media(max-width:768px) and (hover:hover) and (pointer:fine){.lpx .plant-hint .hz{display:inline}}\n.lpx :focus-visible{outline:3px solid var(--c);outline-offset:3px;border-radius:12px}\n.lpx ::selection{background:rgba(34,211,238,.35)}\n.lpx nav .links a{position:relative;padding:10px 4px;transition:color .3s}\n.lpx nav .links a.on{color:#fff}\n.lpx nav .links a.on:after{content:'';position:absolute;left:0;right:0;bottom:-3px;height:3px;border-radius:3px;background:linear-gradient(90deg,var(--c),var(--b))}\n.lpx .menu{display:none;width:48px;height:48px;border-radius:50%;border:1px solid rgba(255,255,255,.28);background:rgba(255,255,255,.07);cursor:pointer;place-items:center;flex:none;position:relative}\n.lpx .menu i{position:absolute;left:14px;right:14px;height:2px;border-radius:2px;background:#fff;transition:.4s cubic-bezier(.2,.8,.2,1)}\n.lpx .menu i:nth-child(1){top:17px}\n.lpx .menu i:nth-child(2){top:23px;right:20px}\n.lpx .menu i:nth-child(3){top:29px}\n.lpx .menu.open i:nth-child(1){top:23px;transform:rotate(45deg)}\n.lpx .menu.open i:nth-child(2){opacity:0}\n.lpx .menu.open i:nth-child(3){top:23px;transform:rotate(-45deg)}\n.lpx .mnav{position:fixed;inset:0;z-index:39;background:radial-gradient(circle at 85% 0,#17396b,#0B1220 65%);clip-path:circle(0 at calc(100% - 38px) 36px);transition:clip-path .8s cubic-bezier(.7,0,.2,1);display:flex;flex-direction:column;justify-content:center;padding:100px 9vw 60px;visibility:hidden}\n.lpx .mnav.open{clip-path:circle(160% at calc(100% - 38px) 36px);visibility:visible}\n.lpx .mnav a{font:600 clamp(34px,10vw,54px) 'Space Grotesk';letter-spacing:-.03em;color:#eaf2fb;padding:6px 0;transform:translateY(24px);opacity:0;transition:transform .6s,opacity .6s,color .3s}\n.lpx .mnav.open a{opacity:1;transform:none;transition-delay:calc(var(--i)*.06s + .3s)}\n.lpx .mnav a.on{background:linear-gradient(100deg,#22D3EE,#2563EB);-webkit-background-clip:text;background-clip:text;color:transparent}\n.lpx .mnav small{margin-top:26px;color:#8fa3bd;font:500 12px 'JetBrains Mono';letter-spacing:.12em;opacity:0;transition:opacity .6s .7s}\n.lpx .mnav.open small{opacity:1}\n.lpx .steps3{display:flex;gap:22px;margin-top:34px;flex-wrap:wrap;font:600 14px 'Space Grotesk';color:#cfe0f3}\n.lpx .steps3 span{display:flex;align-items:center;gap:9px}\n.lpx .steps3 i{width:10px;height:13px;border-radius:50% 50% 50% 50%\/60% 60% 40% 40%;background:linear-gradient(#fff,#22D3EE);box-shadow:0 0 14px rgba(34,211,238,.9);animation:float 3s ease-in-out infinite alternate}\n.lpx .steps3 span:nth-child(2) i{animation-delay:-1s}\n.lpx .steps3 span:nth-child(3) i{animation-delay:-2s}\n.lpx .cue{position:absolute;left:50%;bottom:78px;transform:translateX(-50%);display:flex;flex-direction:column;align-items:center;gap:8px;font:500 10px 'JetBrains Mono';letter-spacing:.2em;color:#7f93ad;text-transform:uppercase}\n.lpx .cue i{width:22px;height:36px;border-radius:12px;border:1.5px solid rgba(255,255,255,.3);position:relative}\n.lpx .cue i:after{content:'';position:absolute;left:50%;top:7px;width:5px;height:9px;margin-left:-2.5px;border-radius:50%;background:var(--c);animation:cue 1.8s ease-in-out infinite}\n@keyframes cue{0%{transform:translateY(0);opacity:1}80%{transform:translateY(12px);opacity:0}100%{opacity:0}}\n.lpx .pb .go{position:absolute;right:26px;bottom:26px;width:42px;height:42px;border-radius:50%;display:grid;place-items:center;border:1px solid rgba(37,99,235,.25);background:#fff;transition:.5s;z-index:1}\n.lpx .pb .go svg{width:16px;height:16px;stroke:var(--b);fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;transition:.4s}\n.lpx .pb:hover .go{background:rgba(255,255,255,.22);border-color:rgba(255,255,255,.6);transform:rotate(-45deg)}\n.lpx .pb:hover .go svg{stroke:#fff}\n.lpx .pb p{padding-right:48px}\n.lpx .stl{display:flex;flex-wrap:wrap;gap:10px;margin-top:22px;position:relative}\n.lpx .stl button{font:600 13px 'Space Grotesk';display:flex;gap:8px;align-items:center;padding:9px 16px 9px 10px;border-radius:99px;background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.16);color:#cfe0f3;cursor:pointer;transition:.35s;backdrop-filter:blur(8px)}\n.lpx .stl button b{font:500 10px 'JetBrains Mono';padding:3px 7px;border-radius:99px;background:rgba(34,211,238,.2);color:#8be9ff;transition:.35s}\n.lpx .stl button:hover,.lpx .stl button.on{background:linear-gradient(120deg,rgba(34,211,238,.9),rgba(37,99,235,.95));color:#04101f;border-color:transparent;transform:translateY(-2px)}\n.lpx .stl button:hover b,.lpx .stl button.on b{background:rgba(255,255,255,.55);color:#04101f}\n.lpx .sdet .acts{display:flex;gap:10px;flex-wrap:wrap}\n.lpx .btn.ln{border:1.5px solid rgba(37,99,235,.35);color:var(--b);background:transparent}\n.lpx .btn.ln:hover{background:rgba(37,99,235,.08)}\n.lpx .cband{max-width:1180px;margin:0 auto;border-radius:90px 50px 90px 50px;padding:clamp(34px,5vw,72px);background:linear-gradient(135deg,#22D3EE,#2563EB 72%);color:#04101f;position:relative;overflow:hidden;display:grid;grid-template-columns:1.3fr 1fr;gap:34px;align-items:center}\n.lpx .cband:before{content:'';position:absolute;width:90%;aspect-ratio:1;left:-20%;bottom:-85%;border-radius:44%;background:rgba(255,255,255,.18);animation:slosh 15s linear infinite}\n.lpx .cband:after{content:'';position:absolute;width:50%;aspect-ratio:1;right:-10%;top:-60%;border-radius:46%;background:rgba(255,255,255,.14);animation:slosh 19s linear infinite reverse}\n.lpx .cband>*{position:relative;z-index:1}\n.lpx .cband h2{font-size:clamp(32px,4.4vw,62px);color:#04101f;margin-top:12px}\n.lpx .cband .mono{color:#04101f;opacity:.7}\n.lpx .cband .acts{display:grid;gap:12px}\n.lpx .cband .btn{justify-content:center;padding:16px 26px;font-size:15px}\n.lpx .cband .btn.dk{background:var(--g);color:#fff}\n.lpx .cband .btn.dk:hover{transform:translateY(-2px);box-shadow:0 14px 34px -10px rgba(0,0,0,.6)}\n.lpx .cband .btn.wh{background:rgba(255,255,255,.88);color:var(--ink)}\n.lpx .cband .btn.wh:hover{transform:translateY(-2px);background:#fff}\n.lpx .cband small{font-weight:600;opacity:.75;text-align:center}\n.lpx .foot{position:relative;background:#080e1a;color:#8fa3bd;font-size:14px;margin-top:100px}\n.lpx .foot:before{content:'';position:absolute;left:0;right:0;top:-1px;height:1px;background:linear-gradient(90deg,transparent,rgba(34,211,238,.6),transparent)}\n.lpx .foot .in{max-width:1300px;margin:auto;padding:70px 5vw 30px;display:grid;grid-template-columns:1.4fr 1fr 1fr 1.2fr;gap:40px}\n.lpx .foot h4{font:500 11px 'JetBrains Mono';letter-spacing:.16em;text-transform:uppercase;color:var(--c);margin-bottom:16px}\n.lpx .foot a{display:block;padding:4px 0;transition:.3s}\n.lpx .foot a:hover{color:#fff;transform:translateX(4px)}\n.lpx .foot .brand{color:#fff;margin-bottom:14px;font-size:17px}\n.lpx .foot .brand .logo-ic{width:30px;height:30px}\n.lpx .foot p{max-width:300px}\n.lpx .foot .low{max-width:1300px;margin:auto;padding:22px 5vw 38px;border-top:1px solid rgba(255,255,255,.07);display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap;font-size:12.5px}\n.lpx .phero{max-width:1300px;margin:auto;padding:150px 5vw 130px;display:grid;grid-template-columns:1.15fr .85fr;gap:3vw;align-items:center;min-height:min(var(--vh),660px);position:relative}\n.lpx .phero>*{min-width:0}\n.lpx .crumb{font:500 12px 'JetBrains Mono';letter-spacing:.1em;color:#7f93ad;margin-bottom:16px;text-transform:uppercase}\n.lpx .crumb a:hover{color:var(--c)}\n.lpx .crumb b{color:var(--c);font-weight:500}\n.lpx .phero h1{font-size:clamp(42px,6.2vw,96px);margin:8px 0 20px}\n.lpx .phero .lead{color:#a9bbd2;max-width:520px;font-size:clamp(16px,1.3vw,19px)}\n.lpx .phero .cta{display:flex;gap:12px;margin-top:28px;flex-wrap:wrap}\n.lpx .pool.sm{height:min(430px,78vw)}\n.lpx .pool .core svg.line{width:min(190px,40%);fill:none;stroke:#fff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;filter:drop-shadow(0 0 30px rgba(255,255,255,.5))}\n.lpx .csel{position:sticky;top:80px;z-index:20;max-width:1300px;margin:0 auto;padding:0 5vw}\n.lpx .csel .rail{display:flex;gap:2px;padding:7px;border-radius:99px;background:rgba(255,255,255,.78);backdrop-filter:blur(18px) saturate(1.5);border:1px solid rgba(37,99,235,.14);box-shadow:0 24px 50px -26px rgba(15,23,42,.4);overflow-x:auto;scrollbar-width:none}\n.lpx .csel .rail::-webkit-scrollbar{display:none}\n.lpx .cpill{flex:1 0 auto;display:flex;align-items:center;justify-content:center;gap:7px;padding:11px 13px;border-radius:99px;font:600 14px 'Space Grotesk';color:var(--ink);cursor:pointer;border:0;background:transparent;position:relative;overflow:hidden;white-space:nowrap;transition:color .4s;isolation:isolate}\n.lpx .cpill svg{width:18px;height:18px;stroke:var(--b);fill:none;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;transition:stroke .4s}\n.lpx .cpill:before{content:'';position:absolute;inset:0;border-radius:inherit;background:linear-gradient(120deg,var(--c),var(--b));transform:translateY(105%);transition:transform .6s cubic-bezier(.2,.8,.2,1);z-index:-1}\n.lpx .cpill.on,.lpx .cpill:hover{color:#fff}\n.lpx .cpill.on:before,.lpx .cpill:hover:before{transform:none}\n.lpx .cpill.on svg,.lpx .cpill:hover svg{stroke:#fff}\n.lpx .cpanel{max-width:1300px;margin:0 auto;padding:70px 5vw 40px}\n.lpx .chead{display:grid;grid-template-columns:1.25fr 1fr;gap:44px;align-items:end}\n.lpx .chead>*{min-width:0}\n.lpx .chead .num{font:700 clamp(90px,13vw,190px)\/.8 'Space Grotesk';letter-spacing:-.06em;background:linear-gradient(180deg,rgba(34,211,238,.7),rgba(37,99,235,.04));-webkit-background-clip:text;background-clip:text;color:transparent;margin-bottom:6px;display:block}\n.lpx .chead h2{font-size:clamp(34px,4.8vw,66px);margin:0 0 14px}\n.lpx .chead p.d{color:var(--mut);max-width:520px;font-size:17px}\n.lpx .tagrow{display:flex;gap:10px;flex-wrap:wrap;margin-top:20px}\n.lpx .tag{padding:10px 18px;border-radius:99px;font:600 13px 'Space Grotesk';background:#fff;color:var(--ink);border:1px solid rgba(37,99,235,.18);box-shadow:0 14px 30px -16px rgba(37,99,235,.35);display:inline-flex;gap:8px;align-items:center}\n.lpx .tag i{width:8px;height:11px;border-radius:50% 50% 50% 50%\/60% 60% 40% 40%;background:linear-gradient(#fff,var(--c));box-shadow:0 0 0 1px rgba(34,211,238,.6)}\n.lpx .tag.sales{background:linear-gradient(120deg,var(--c),var(--b));color:#fff;border:0}\n.lpx .tag.sales i{background:#fff;box-shadow:none}\n.lpx .loc{position:relative;margin-top:44px;padding:30px 36px 22px;border-radius:60px 34px 60px 34px;background:#fff;box-shadow:0 30px 60px -30px rgba(15,23,42,.3);overflow:hidden}\n.lpx .loc .mono{display:block;margin-bottom:22px}\n.lpx .loc .line{position:relative;display:grid;grid-template-columns:repeat(8,1fr);text-align:center}\n.lpx .loc .line:before{content:'';position:absolute;left:6.25%;right:6.25%;top:11px;height:6px;border-radius:3px;background:rgba(37,99,235,.14)}\n.lpx .loc .line:after{content:'';position:absolute;left:6.25%;right:6.25%;top:13px;height:2px;background:repeating-linear-gradient(90deg,#fff 0 2px,transparent 2px 12px);animation:ldash 1s linear infinite;background-size:12px 2px}\n@keyframes ldash{to{background-position:12px 0}}\n.lpx .loc .st{position:relative;z-index:1;display:grid;justify-items:center;gap:10px;font:600 12px\/1.25 'Space Grotesk';color:var(--mut);padding:0 2px;transition:color .4s}\n.lpx .loc .st i{width:28px;height:28px;border-radius:50%;background:#fff;border:2px solid rgba(37,99,235,.28);transition:.5s cubic-bezier(.2,.8,.2,1);display:block}\n.lpx .loc .st.on{color:var(--ink)}\n.lpx .loc .st.on i{background:linear-gradient(135deg,var(--c),var(--b));border-color:transparent;transform:scale(1.35);box-shadow:0 0 0 7px rgba(34,211,238,.25),0 10px 24px -6px rgba(37,99,235,.6)}\n.lpx .peb.sub{grid-template-columns:repeat(auto-fill,minmax(250px,1fr));margin-top:46px}\n.lpx .peb.sub .pb{min-height:250px;animation:cardin .8s cubic-bezier(.2,.8,.2,1) backwards;animation-delay:calc(var(--i)*70ms)}\n.lpx .peb.sub .pb h3{font-size:22px}\n.lpx .pb .cs{display:inline-flex;align-items:center;gap:6px;margin-top:14px;font:600 13px 'Space Grotesk';color:var(--b);white-space:nowrap}\n@keyframes cardin{from{opacity:0;transform:translateY(40px) scale(.94)}}\n.lpx .peb.mini{grid-template-columns:repeat(4,1fr);margin-top:34px;gap:16px}\n.lpx .peb.mini .pb{min-height:150px;padding:22px 24px;cursor:pointer;justify-content:flex-end}\n.lpx .peb.mini .pb h3{font-size:19px;margin:0;padding-right:44px}\n.lpx .peb.mini .pb .ic{width:46px;height:46px;right:20px;top:20px}\n.lpx .peb.mini .pb .ic svg{width:22px;height:22px}\n.lpx .peb.mini .pb .n{left:24px;top:22px}\n.lpx .peb.mini .pb .go{display:none}\n.lpx .sechead{display:flex;justify-content:space-between;align-items:end;gap:20px;flex-wrap:wrap}\n.lpx .sechead h2{font-size:clamp(28px,3.6vw,48px);margin:8px 0 0}\n.lpx .svx{display:grid;grid-template-columns:110px minmax(0,1fr);gap:3vw;max-width:1300px;margin:auto;padding:90px 5vw 40px;position:relative}\n.lpx .pipe{position:sticky;top:130px;align-self:start;height:min(560px,calc(var(--vh) - 190px));min-height:380px;display:flex;justify-content:center}\n.lpx .pipe .tube{position:relative;width:24px;height:100%;border-radius:12px;background:rgba(37,99,235,.12);box-shadow:inset 0 0 0 1.5px rgba(37,99,235,.2)}\n.lpx .pipe .tube .fillt{position:absolute;left:0;right:0;top:0;height:calc(var(--p,0)*100%);border-radius:12px;background:linear-gradient(180deg,var(--c),var(--b));box-shadow:0 0 22px rgba(34,211,238,.65);transition:height .12s linear}\n.lpx .pipe .tube .fillt:after{content:'';position:absolute;inset:0;border-radius:inherit;background:repeating-linear-gradient(180deg,rgba(255,255,255,.7) 0 2px,transparent 2px 14px);animation:vdash 1s linear infinite;opacity:.6}\n@keyframes vdash{to{background-position:0 14px}}\n.lpx .pipe .pn{position:absolute;left:50%;top:calc(var(--k)*25%);transform:translate(-50%,-50%);width:54px;height:54px;border-radius:50%;display:grid;place-items:center;background:#fff;color:var(--b);font:700 16px 'Space Grotesk';border:2px solid rgba(37,99,235,.25);box-shadow:0 12px 26px -10px rgba(37,99,235,.45);transition:.5s cubic-bezier(.2,.8,.2,1);cursor:pointer;z-index:2}\n.lpx .pipe .pn.on{background:linear-gradient(135deg,var(--c),var(--b));color:#fff;border-color:transparent;transform:translate(-50%,-50%) scale(1.22);box-shadow:0 0 0 8px rgba(34,211,238,.22),0 16px 34px -8px rgba(37,99,235,.7)}\n.lpx .sblks{display:grid;gap:36px;min-width:0}\n.lpx .sblk{position:relative;display:grid;grid-template-columns:1.05fr 1fr;gap:34px;padding:clamp(28px,3.4vw,52px);background:#fff;overflow:hidden;box-shadow:0 30px 60px -30px rgba(15,23,42,.35),0 0 0 1px rgba(15,23,42,.05);opacity:.55;transform:scale(.97);transition:opacity .6s,transform .7s cubic-bezier(.2,.8,.2,1),box-shadow .6s;scroll-margin-top:120px}\n.lpx .sblk>*{min-width:0}\n.lpx .sblk:nth-child(1){border-radius:80px 40px 80px 40px}\n.lpx .sblk:nth-child(2){border-radius:40px 80px 40px 80px}\n.lpx .sblk:nth-child(3){border-radius:80px 36px 60px 50px}\n.lpx .sblk:nth-child(4){border-radius:46px 80px 46px 70px}\n.lpx .sblk:nth-child(5){border-radius:80px 46px 80px 46px}\n.lpx .sblk.act,.shot .lpx .sblk{opacity:1;transform:none;box-shadow:0 40px 80px -30px rgba(37,99,235,.45),0 0 0 1px rgba(34,211,238,.35)}\n.lpx .sblk:before{content:'';position:absolute;left:-12%;bottom:-85%;width:58%;aspect-ratio:1;border-radius:46%;background:linear-gradient(135deg,rgba(34,211,238,.22),rgba(37,99,235,.1));animation:slosh 14s linear infinite;transition:bottom .9s cubic-bezier(.2,.8,.2,1)}\n.lpx .sblk.act:before,.shot .lpx .sblk:before{bottom:-60%}\n.lpx .sblk>*{position:relative}\n.lpx .sblk .big{position:absolute;right:30px;top:6px;font:700 clamp(80px,10vw,150px)\/1 'Space Grotesk';letter-spacing:-.06em;color:rgba(37,99,235,.07);pointer-events:none}\n.lpx .sblk h3{font-size:clamp(28px,3.2vw,44px);margin:10px 0 12px}\n.lpx .sblk p.d{color:var(--mut);font-size:17px;max-width:460px}\n.lpx .sblk .acts{margin-top:24px;display:flex;gap:10px;flex-wrap:wrap}\n.lpx .cov{background:linear-gradient(160deg,#f4f9ff,#eaf2fc);border-radius:36px 56px 36px 56px;padding:26px 28px;border:1px solid rgba(37,99,235,.1);align-self:center}\n.lpx .cov .mono{display:block;margin-bottom:14px}\n.lpx .cov ul{list-style:none;padding:0;display:grid;gap:11px}\n.lpx .cov li{display:flex;gap:12px;align-items:flex-start;font-weight:500;font-size:15px;line-height:1.4}\n.lpx .cov li:before{content:'';flex:none;width:10px;height:14px;margin-top:3px;border-radius:50% 50% 50% 50%\/60% 60% 40% 40%;background:linear-gradient(#fff,var(--c));box-shadow:0 0 0 1.5px var(--c)}\n.lpx .cov .for{margin-top:18px;display:flex;flex-wrap:wrap;gap:8px}\n.lpx .cov .for span{font:600 12px 'Space Grotesk';padding:6px 12px;border-radius:99px;background:#fff;border:1px solid rgba(37,99,235,.18)}\n.lpx .flow4{display:grid;grid-template-columns:repeat(4,1fr);gap:20px;position:relative;margin-top:56px}\n.lpx .flow4:before{content:'';position:absolute;left:8%;right:8%;top:36px;height:4px;background:repeating-linear-gradient(90deg,var(--c) 0 10px,transparent 10px 20px);background-size:20px 4px;animation:ldash2 1s linear infinite;opacity:.7}\n@keyframes ldash2{to{background-position:20px 0}}\n.lpx .flow4 .fs{position:relative;text-align:center;display:grid;justify-items:center;gap:10px;padding:0 8px}\n.lpx .flow4 .fs i{width:74px;height:74px;border-radius:50%;display:grid;place-items:center;font:700 22px 'Space Grotesk';font-style:normal;background:linear-gradient(135deg,var(--c),var(--b));color:#fff;box-shadow:0 0 0 8px rgba(34,211,238,.18),0 20px 40px -12px rgba(37,99,235,.6);transition:.5s}\n.lpx .flow4 .fs:hover i{transform:translateY(-6px) scale(1.08)}\n.lpx .flow4 .fs h4{font:600 20px 'Space Grotesk'}\n.lpx .flow4 .fs p{color:var(--mut);font-size:14px;max-width:230px}\n.lpx .chips2{display:flex;flex-wrap:wrap;gap:12px;margin-top:34px}\n.lpx .chips2 a{padding:13px 22px;border-radius:99px;background:#fff;font:600 15px 'Space Grotesk';box-shadow:0 14px 30px -16px rgba(37,99,235,.4);border:1px solid rgba(37,99,235,.14);transition:.4s;position:relative;overflow:hidden;isolation:isolate}\n.lpx .chips2 a:before{content:'';position:absolute;inset:0;background:linear-gradient(120deg,var(--c),var(--b));transform:translateY(105%);transition:transform .6s cubic-bezier(.2,.8,.2,1);z-index:-1}\n.lpx .chips2 a:hover{color:#fff;transform:translateY(-3px)}\n.lpx .chips2 a:hover:before{transform:none}\n.lpx .cgrid{display:grid;grid-template-columns:minmax(0,.8fr) minmax(0,1.2fr);gap:4vw;max-width:1300px;margin:auto;padding:90px 5vw 30px;align-items:start}\n.lpx .cinfo{display:grid;gap:18px}\n.lpx .icard{display:flex;gap:18px;align-items:center;padding:22px 26px;background:#fff;border-radius:50px 28px 50px 28px;box-shadow:0 26px 54px -30px rgba(15,23,42,.38),0 0 0 1px rgba(15,23,42,.05);transition:.5s cubic-bezier(.2,.8,.2,1)}\n.lpx .icard:nth-child(even){border-radius:28px 50px 28px 50px}\n.lpx .icard:hover{transform:translateY(-6px);box-shadow:0 36px 64px -26px rgba(37,99,235,.5)}\n.lpx .icard .ic{flex:none;width:56px;height:56px;border-radius:50%;display:grid;place-items:center;background:#e7f6fc;border:1px solid rgba(37,99,235,.2)}\n.lpx .icard .ic svg{width:26px;height:26px;stroke:var(--b);fill:none;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round}\n.lpx .icard .mono{display:block;margin-bottom:2px}\n.lpx .icard b{font:600 clamp(16px,1.6vw,20px) 'Space Grotesk';line-height:1.25;display:block;overflow-wrap:anywhere}\n.lpx .icard .tbc{font-weight:500;color:var(--mut);font-size:15px}\n.lpx .mapph{position:relative;height:250px;border-radius:70px 40px 70px 40px;overflow:hidden;background:linear-gradient(135deg,#dff3fb,#c9dcfa);box-shadow:0 26px 54px -30px rgba(15,23,42,.38)}\n.lpx .mapph svg{position:absolute;inset:0;width:100%;height:100%}\n.lpx .mapph .lab{position:absolute;left:24px;bottom:18px;font:500 10px 'JetBrains Mono';letter-spacing:.14em;text-transform:uppercase;color:#1e3a8a;background:rgba(255,255,255,.7);padding:6px 12px;border-radius:99px}\n.lpx .mapph .pinp{animation:pinp 2.4s ease-out infinite;transform-box:fill-box;transform-origin:center}\n@keyframes pinp{0%{transform:scale(.6);opacity:.8}100%{transform:scale(2.6);opacity:0}}\n.lpx .fcard{position:relative;background:#fff;border-radius:80px 44px 80px 44px;padding:clamp(28px,4vw,58px);box-shadow:0 50px 90px -40px rgba(37,99,235,.5),0 0 0 1px rgba(15,23,42,.05);overflow:hidden}\n.lpx .fcard:before{content:'';position:absolute;left:-30%;width:160%;aspect-ratio:1;top:calc(100% - var(--p,0)*55%);border-radius:48%;background:linear-gradient(180deg,rgba(34,211,238,.2),rgba(37,99,235,.14));animation:slosh 16s linear infinite;transition:top .9s cubic-bezier(.2,.8,.2,1);pointer-events:none}\n.lpx .fcard>*{position:relative}\n.lpx .fcard h2{font-size:clamp(30px,3.6vw,50px);margin:8px 0 6px;color:var(--ink)}\n.lpx .fcard .sub{color:var(--mut);margin-bottom:26px}\n.lpx .fcard .req{color:#e11d48;font-style:normal;font-weight:600}\n.lpx .frow{display:grid;grid-template-columns:1fr 1fr;gap:0 20px}\n.lpx .fld{display:grid;gap:8px;margin-bottom:22px;align-content:start;min-width:0}\n.lpx .fld label,.lpx .fld .lb{font:600 14px 'Space Grotesk';color:var(--ink)}\n.lpx .fld label em,.lpx .fld .lb em{color:#e11d48;font-style:normal;margin-left:3px}\n.lpx .fld input,.lpx .fld textarea{width:100%;padding:16px 22px;border-radius:26px;border:1.5px solid rgba(37,99,235,.18);background:rgba(246,249,253,.9);font:inherit;color:var(--ink);outline:0;transition:.3s}\n.lpx .fld textarea{border-radius:30px;resize:vertical;min-height:140px}\n.lpx .fld input::placeholder,.lpx .fld textarea::placeholder{color:#94a3b8}\n.lpx .fld input:focus,.lpx .fld textarea:focus{border-color:var(--c);background:#fff;box-shadow:0 0 0 5px rgba(34,211,238,.2)}\n.lpx .fld .hint{font-size:13px;color:var(--mut);line-height:1.4}\n.lpx .fld .msg{display:none;color:#e11d48;font-size:13px;font-weight:500}\n.lpx .fld.err input,.lpx .fld.err textarea{border-color:#e11d48;background:#fff5f6}\n.lpx .fld.err .msg{display:block}\n.lpx .fld.ok input,.lpx .fld.ok textarea{border-color:var(--t)}\n.lpx .chp{padding:11px 18px;border-radius:99px;border:1.5px solid rgba(37,99,235,.2);background:#fff;font:600 13px 'Space Grotesk';color:var(--ink);cursor:pointer;transition:.35s cubic-bezier(.2,.8,.2,1);position:relative;overflow:hidden;isolation:isolate}\n.lpx .chp:before{content:'';position:absolute;inset:0;background:linear-gradient(120deg,var(--c),var(--b));transform:translateY(105%);transition:transform .55s cubic-bezier(.2,.8,.2,1);z-index:-1}\n.lpx .chp:hover{transform:translateY(-2px);border-color:var(--c)}\n.lpx .chp.on{color:#fff;border-color:transparent}\n.lpx .chp.on:before{transform:none}\n.lpx .chips{display:flex;flex-wrap:wrap;gap:10px}\n.lpx .fsub{display:flex;gap:16px;align-items:center;flex-wrap:wrap;margin-top:8px}\n.lpx .fsub .btn{padding:16px 40px;font-size:15px}\n.lpx .fsub small{color:var(--mut);max-width:260px;line-height:1.4}\n.lpx .fcard .done{display:none;text-align:center;padding:40px 10px}\n.lpx .fcard.sent form{display:none}\n.lpx .fcard.sent .done{display:block}\n.lpx .fcard .done .big{width:96px;height:96px;margin:0 auto 20px;border-radius:50%;display:grid;place-items:center;background:linear-gradient(135deg,var(--c),var(--b));box-shadow:0 0 0 12px rgba(34,211,238,.2)}\n.lpx .fcard .done svg{width:44px;fill:none;stroke:#fff;stroke-width:3;stroke-linecap:round;stroke-linejoin:round}\n.lpx .nextl{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;max-width:1300px;margin:30px auto 0;padding:0 5vw}\n.lpx .nextl .nx{background:#fff;border-radius:44px 28px 44px 28px;padding:26px 28px;box-shadow:0 26px 54px -30px rgba(15,23,42,.35)}\n.lpx .nextl .nx i{font:700 15px 'Space Grotesk';font-style:normal;width:40px;height:40px;border-radius:50%;display:grid;place-items:center;color:#fff;background:linear-gradient(135deg,var(--c),var(--b));margin-bottom:12px}\n.lpx .nextl .nx h4{font:600 19px 'Space Grotesk';margin-bottom:4px}\n.lpx .nextl .nx p{color:var(--mut);font-size:14px}\n@media(prefers-reduced-motion:reduce){.lpx *{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}\n.lpx .rv{opacity:1;transform:none}}\n@media(max-width:1100px){.lpx .csel .rail{justify-content:flex-start}\n.lpx .foot .in{grid-template-columns:1fr 1fr}\n.lpx .loc .st{font-size:11px}}\n@media(max-width:980px){.lpx .peb.mini{grid-template-columns:repeat(2,1fr)}\n.lpx .sblk{grid-template-columns:1fr}\n.lpx .cgrid{grid-template-columns:1fr}\n.lpx .flow4{grid-template-columns:repeat(2,1fr);row-gap:40px}\n.lpx .flow4:before{display:none}\n.lpx .chead{grid-template-columns:1fr;gap:20px}}\n@media(max-width:820px){.lpx .menu{display:grid}\n.lpx nav{padding-left:16px;gap:10px}\n.lpx nav .btn{margin-left:auto}\n.lpx .phero{grid-template-columns:minmax(0,1fr);padding-top:112px;padding-bottom:100px;min-height:0}\n.lpx .pool.sm{height:300px}\n.lpx .cue{display:none}\n.lpx .steps3{gap:14px;font-size:13px}\n.lpx .csel{top:70px;padding:0 3vw}\n.lpx .cpanel{padding-top:44px}\n.lpx .loc{padding:24px 18px 18px;border-radius:44px 26px 44px 26px}\n.lpx .loc .line{grid-template-columns:repeat(4,1fr);row-gap:20px}\n.lpx .loc .line:before,.lpx .loc .line:after{display:none}\n.lpx .svx{grid-template-columns:44px minmax(0,1fr);gap:14px;padding-top:60px}\n.lpx .pipe{top:96px;min-height:320px;height:calc(var(--vh) - 160px)}\n.lpx .pipe .tube{width:12px}\n.lpx .pipe .pn{width:38px;height:38px;font-size:13px}\n.lpx .sblk{opacity:1;transform:none}\n.lpx .sblk .big{font-size:80px}\n.lpx .frow{grid-template-columns:1fr}\n.lpx .nextl{grid-template-columns:1fr}\n.lpx .cband{grid-template-columns:1fr;border-radius:56px 34px 56px 34px}\n.lpx .foot .in{grid-template-columns:1fr}\n.lpx .mapph{height:210px}\n.lpx .fcard{border-radius:50px 30px 50px 30px}}\n@media(max-width:480px){.lpx nav .btn{display:none}\n.lpx nav{padding-right:8px}\n.lpx .menu{margin-left:auto}\n.lpx .peb.mini{grid-template-columns:1fr}\n.lpx .flow4{grid-template-columns:1fr}\n.lpx .fsub .btn{width:100%;justify-content:center}}\n.shot .lpx .csel{position:relative;top:0}\n.shot .lpx .pipe{position:relative;top:0}\n.shot .lpx .cue{display:none}\n.shot .lpx .sblk{opacity:1;transform:none}\n.shot .lpx .pipe{align-self:stretch;height:auto;min-height:0}\n.shot .lpx .mnav{display:none}\n.lpx footer.foot{max-width:none;margin:100px 0 0;padding:0;display:block;color:#8fa3bd;font-size:14px;gap:0}\n.lpx .lvl b{mix-blend-mode:normal;color:#fff;text-shadow:0 1px 6px rgba(0,0,0,.45)}\n.lpx .peb.mini .pb .fill{top:320%}\n.lpx .peb.mini .pb:hover .fill{top:6%}\n.lpx .peb.mini .pb:hover .fill.f2{top:10%}\n.lpx .cpill{font-size:13.5px}\n.lpx[data-page=contact] footer.foot{margin-top:0}\n.lpx .hrs{display:grid;grid-template-columns:max-content 1fr;gap:4px 18px;margin-top:4px}\n.lpx .hrs span{display:contents;font:600 15px 'Space Grotesk';color:var(--ink)}\n.lpx .hrs em{font-style:normal;font-weight:500;color:var(--mut)}\n.lpx .foot .hrs-f{margin-top:12px;font-size:13px;line-height:1.6;color:#8fa3bd}\n@media(max-width:480px){.lpx .hrs{grid-template-columns:1fr;gap:0}\n.lpx .hrs em{margin-top:6px}\n.lpx .hrs em:first-child{margin-top:0}}\n@media(max-width:400px){.lpx .hero,.lpx .phero{padding-left:max(18px,6vw);padding-right:max(18px,6vw)}\n.lpx .hero>div:first-child,.lpx .phero>div:first-child{padding-right:11vw}\n.lpx .hero h1{font-size:40px;line-height:1.05}\n.lpx .phero h1{font-size:38px;line-height:1.05}\n.lpx .hero .lead,.lpx .phero .lead{font-size:15px}\n.lpx .pool,.lpx .pool.sm{overflow:visible}\n.lpx .chip{max-width:calc(100% - 8px);font-size:11.5px;padding:7px 11px 7px 9px;gap:7px}\n.lpx .chip.c1{left:2px;top:20%}\n.lpx .chip.c2{right:2px;left:auto}\n.lpx .chip.c3{right:2px;left:auto}\n.lpx .chip.c4{left:2px}\n.lpx .chip:before{width:11px;height:14px;flex:none}}\n.lpx .cgrid.info{align-items:stretch}\n.lpx .cgrid.info .mapph{height:auto;min-height:340px}\n.lpx .fhead{max-width:860px;margin:auto;padding:90px 5vw 34px;text-align:center;position:relative}\n.lpx .fhead h2{font-size:clamp(30px,3.6vw,50px);margin:8px 0 6px;color:var(--ink)}\n.lpx .fhead .sub{color:var(--mut)}\n.lpx .fhead .req{color:#e11d48;font-style:normal;font-weight:600}\n@media(max-width:980px){.lpx .cgrid.info .mapph{min-height:240px}}\n.lpx .pstrip{list-style:none;display:grid;grid-template-columns:repeat(8,1fr);gap:4px;margin:18px 0 0;padding:0;position:relative}\n.lpx .pstrip:before{content:'';position:absolute;left:6%;right:6%;top:13px;height:2px;background:repeating-linear-gradient(90deg,rgba(127,230,245,.55) 0 5px,transparent 5px 11px)}\n.lpx .pstrip li{position:relative;z-index:1;text-align:center}\n.lpx .pstrip button{background:none;border:0;color:#a9bbd2;cursor:pointer;display:grid;justify-items:center;gap:7px;width:100%;padding:0 2px;font:500 11px\/1.2 'JetBrains Mono',monospace;letter-spacing:.08em;text-transform:uppercase;transition:color .35s}\n.lpx .pstrip button b{width:27px;height:27px;border-radius:50%;display:grid;place-items:center;background:#0f1d35;border:1.5px solid rgba(127,230,245,.55);color:#8be9ff;font:600 11px 'JetBrains Mono',monospace;letter-spacing:0;transition:.35s}\n.lpx .pstrip li.loop button b{border-style:dashed;border-color:#14B8A6;color:#5eead4}\n.lpx .pstrip button:hover,.lpx .pstrip li.on button{color:#fff}\n.lpx .pstrip button:hover b,.lpx .pstrip li.on button b{background:linear-gradient(120deg,#22D3EE,#2563EB);border-color:transparent;color:#04101f;transform:scale(1.15)}\n.lpx .pstrip button:focus-visible{outline:2px solid #22D3EE;outline-offset:3px;border-radius:8px}\n@media(max-width:768px){.lpx .pstrip{grid-template-columns:repeat(4,1fr);row-gap:14px}.lpx .pstrip:before{display:none}}\n\/* header size: tablet + phone *\/\n@media(max-width:1100px){.lpx nav{gap:16px;padding-left:20px}.lpx nav .links{gap:18px;font-size:15px}.lpx nav .btn{padding:12px 20px;font-size:15px}.lpx .brand{font-size:18px}.lpx .logo-ic{width:30px;height:30px}}\n@media(max-width:1000px){.lpx nav{gap:12px;padding-left:16px}.lpx nav .links{gap:12px;font-size:14.5px}.lpx nav .links a{padding:10px 2px}.lpx nav .btn{padding:11px 16px;font-size:14px}.lpx .brand{font-size:17px;gap:8px}.lpx .logo-ic{width:28px;height:28px}}\n@media(max-width:820px){.lpx nav{top:10px;padding:8px 10px 8px 18px}.lpx .brand{font-size:19px}.lpx .logo-ic{width:32px;height:32px}.lpx nav .btn{padding:11px 20px;font-size:15px}}\n@media(max-width:480px){.lpx nav{padding:7px 8px 7px 16px;gap:8px}.lpx .brand{font-size:19px;gap:10px}.lpx .logo-ic{width:30px;height:30px}}\n<\/style>\n<style id=\"lp-tap44\">\n\/* Mobile tap targets (2026-11-03): every link, button, menu item, snake-strip dot and form control is at least 44x44px on phones. Desktop (769px and wider) is untouched. *\/\n@media(max-width:768px){\n.lpx .btn,.lpx a.btn,.lpx button.btn{min-height:44px;box-sizing:border-box}\n.lpx .chip{min-height:44px;box-sizing:border-box}\n.lpx .brand{min-height:44px;box-sizing:border-box}\n.lpx .menu{min-width:44px;min-height:44px}\n.lpx .mnav a{min-height:44px;box-sizing:border-box}\n.lpx .foot a{min-height:44px;padding:12px 0;box-sizing:border-box}\n.lpx .crumb a{display:inline-block;min-width:44px;min-height:44px;box-sizing:border-box;padding:14px 10px;margin:-14px -10px;text-align:center}\n.lpx .chips2 a{display:inline-flex;align-items:center;min-height:44px;box-sizing:border-box}\n.lpx .cpill{min-height:44px;box-sizing:border-box}\n.lpx .loc .st{min-width:44px;min-height:44px;box-sizing:border-box}\n.lpx .pstrip button{min-width:44px;min-height:44px;box-sizing:border-box}\n.lpx .stl button{min-height:44px;box-sizing:border-box}\n.lpx .plant-zoom button{min-width:44px;min-height:44px}\n.lpx .plant-pop .pp-x{width:44px;height:44px;right:0;top:0;padding:0;display:grid;place-items:center}\n.lpx .plant-pop .pp-cta{display:inline-flex;align-items:center;min-height:44px}\n.lpx .pb .go{width:44px;height:44px}\n.lpx .nd{min-height:44px}\n.lpx .icard b a{display:flex!important;align-items:center;min-height:44px}\n.lpx input:not([type=checkbox]):not([type=radio]):not([type=hidden]),.lpx select,.lpx textarea,#wpforms-571 input:not([type=checkbox]):not([type=radio]):not([type=hidden]),#wpforms-571 select,#wpforms-571 textarea{min-height:44px;box-sizing:border-box}\n#wpforms-571 .wpforms-field-checkbox ul li label{display:inline-flex;align-items:center;min-height:44px;box-sizing:border-box}\n#wpforms-571 button.wpforms-submit,.lpx button[type=submit]{min-height:44px;min-width:44px}\n}\n<\/style>\n<div class=\"lpx\" data-page=\"home\">\n<div class=\"glow\" id=\"lp-glow\"><\/div>\n<nav id=\"lp-nav\"><a class=\"brand\" href=\"https:\/\/www.lp-equipment.com.my\/2016\/\" aria-label=\"LP Equipment home\"><svg class=\"logo-ic\" viewBox=\"0 0 200 200\" aria-hidden=\"true\"><circle cx=\"100\" cy=\"100\" r=\"86\" fill=\"none\" stroke=\"#22B8E6\" stroke-width=\"18\"\/><circle cx=\"100\" cy=\"100\" r=\"66\" fill=\"#fff\" opacity=\".08\"\/><path transform=\"translate(100,100) scale(.82) translate(-92,-98)\" d=\"M60,46 V150 H110 V54 H124 A26,26 0 0 1 124,106 H110\" fill=\"none\" stroke=\"#fff\" stroke-width=\"20\" stroke-linejoin=\"round\"\/><\/svg>\nLP Equipment<\/a>\n<div class=\"links\"><a href=\"https:\/\/www.lp-equipment.com.my\/2016\/\" data-p=\"home\">Home<\/a><a href=\"https:\/\/www.lp-equipment.com.my\/2016\/?page_id=1220\" data-p=\"equipment\">Processing Equipment<\/a><a href=\"https:\/\/www.lp-equipment.com.my\/2016\/?page_id=1225\" data-p=\"services\">Services<\/a><a href=\"https:\/\/www.lp-equipment.com.my\/2016\/#lp-industries\" data-p=\"industries\">Industries<\/a><a href=\"https:\/\/www.lp-equipment.com.my\/2016\/?page_id=1230\" data-p=\"contact\">Contact<\/a><\/div>\n<a class=\"btn pri\" href=\"https:\/\/www.lp-equipment.com.my\/2016\/?page_id=1230\">Request a quote<\/a>\n<button class=\"menu\" id=\"lp-menu\" aria-label=\"Open menu\" aria-expanded=\"false\"><i><\/i><i><\/i><i><\/i><\/button><\/nav>\n<div class=\"mnav\" id=\"lp-mnav\"><a href=\"https:\/\/www.lp-equipment.com.my\/2016\/\" style=\"--i:0\" data-p=\"home\">Home<\/a><a href=\"https:\/\/www.lp-equipment.com.my\/2016\/?page_id=1220\" style=\"--i:1\" data-p=\"equipment\">Processing Equipment<\/a><a href=\"https:\/\/www.lp-equipment.com.my\/2016\/?page_id=1225\" style=\"--i:2\" data-p=\"services\">Services<\/a><a href=\"https:\/\/www.lp-equipment.com.my\/2016\/#lp-industries\" style=\"--i:3\">Industries<\/a><a href=\"https:\/\/www.lp-equipment.com.my\/2016\/?page_id=1230\" style=\"--i:4\" data-p=\"contact\">Contact<\/a><small>LPEQUIPMENT@GMAIL.COM \u00b7 03-5525 3071<\/small><\/div>\n\n<div class=\"lp-main\" id=\"lp-main\">\n<svg id=\"lp-ribbon\" aria-hidden=\"true\"><defs><linearGradient id=\"lp-rg\" x1=\"0\" x2=\"1\"><stop offset=\"0\" stop-color=\"#22D3EE\"\/><stop offset=\".5\" stop-color=\"#2563EB\"\/><stop offset=\"1\" stop-color=\"#14B8A6\"\/><\/linearGradient><filter id=\"lp-rb\"><feGaussianBlur stdDeviation=\"6\"\/><\/filter><\/defs>\n<path id=\"rtrack\" fill=\"none\" stroke=\"rgba(34,211,238,.22)\" stroke-width=\"38\" stroke-linecap=\"round\"\/>\n<path id=\"rglow\" fill=\"none\" stroke=\"#22D3EE\" stroke-width=\"30\" stroke-linecap=\"round\" pathLength=\"1000\" stroke-dasharray=\"0 2000\" filter=\"url(#lp-rb)\" opacity=\".5\"\/>\n<path id=\"rfill\" fill=\"none\" stroke=\"url(#lp-rg)\" stroke-width=\"22\" stroke-linecap=\"round\" pathLength=\"1000\" stroke-dasharray=\"0 2000\" opacity=\".85\"\/>\n<path id=\"rflow\" fill=\"none\" stroke=\"#fff\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-dasharray=\"2 22\" opacity=\".7\"><animate attributeName=\"stroke-dashoffset\" from=\"0\" to=\"-48\" dur=\"1.4s\" repeatCount=\"indefinite\"\/><\/path>\n<\/svg>\n\n\n<section class=\"dark\" id=\"lp-top\"><div class=\"band\"><\/div>\n <div class=\"hero\">\n  <div>\n   <span class=\"mono\">Processing equipment \u00b7 Shah Alam, Malaysia<\/span>\n   <h1>Let your <span class=\"flowtxt\">process flow.<\/span><\/h1>\n   <p class=\"lead\">Mixing, homogenising, heat treatment, filling, cleaning and inspection equipment that keeps product moving, hygienic and under control. Selected, installed and serviced by our local team.<\/p>\n   <div class=\"cta\"><a class=\"btn pri\" href=\"https:\/\/www.lp-equipment.com.my\/2016\/?page_id=1220\">See the processing equipment<\/a><a class=\"btn gh\" href=\"#lp-plant\">Watch it flow \u2193<\/a><\/div>\n   <div class=\"steps3\"><span><i><\/i>Selected<\/span><span><i><\/i>Installed<\/span><span><i><\/i>Serviced<\/span><\/div>\n  <\/div>\n  <div class=\"pool\">\n   <div class=\"blob b1\"><\/div><div class=\"blob b2\"><\/div><div class=\"blob b3\"><\/div>\n   <div class=\"core\"><svg viewBox=\"0 0 200 200\" role=\"img\" aria-label=\"LP Equipment\"><circle cx=\"100\" cy=\"100\" r=\"86\" fill=\"none\" stroke=\"#fff\" stroke-opacity=\".9\" stroke-width=\"14\"\/><circle cx=\"100\" cy=\"100\" r=\"66\" fill=\"#fff\" opacity=\".12\"\/><path transform=\"translate(100,100) scale(.82) translate(-92,-98)\" d=\"M60,46 V150 H110 V54 H124 A26,26 0 0 1 124,106 H110\" fill=\"none\" stroke=\"#fff\" stroke-width=\"18\" stroke-linejoin=\"round\"\/><\/svg><\/div>\n   <a class=\"chip c1\" href=\"\/2016\/processing-equipment\/#cat-flow\">Sanitary pumps<\/a><a class=\"chip c2\" href=\"\/2016\/processing-equipment\/#cat-insp\">Inspection systems<\/a><a class=\"chip c3\" href=\"\/2016\/processing-equipment\/#cat-clean\">Cleaning &amp; CIP<\/a><a class=\"chip c4\" href=\"\/2016\/processing-equipment\/#cat-homog\">Homogenisers<\/a>\n  <\/div>\n  <div id=\"drops\"><\/div>\n  <div class=\"cue\"><i><\/i>Scroll<\/div>\n <\/div>\n<\/section>\n\n<section class=\"light\" id=\"lp-equipment\"><div class=\"band\"><\/div>\n <div class=\"wave top\"><svg viewBox=\"0 0 2880 90\" preserveAspectRatio=\"none\"><path d=\"M0 45 C240 5 480 85 720 45 S1200 5 1440 45 S1920 85 2160 45 S2640 5 2880 45 V90 H0Z\" fill=\"#F4F7FB\"\/><\/svg><\/div>\n <div class=\"sec\">\n  <span class=\"mono rv\">Processing Equipment<\/span>\n  <h2 class=\"rv\">Everything your product touches, <span style=\"color:var(--b)\">covered.<\/span><\/h2>\n  <p class=\"sub rv\">Seven functions and complete process lines from one local partner. Hover to fill a card, click to explore it.<\/p>\n  <div class=\"peb\" id=\"peb\"><\/div>\n  <p class=\"rv\" style=\"margin-top:40px\"><a class=\"btn pri\" href=\"https:\/\/www.lp-equipment.com.my\/2016\/?page_id=1220\">Browse all processing equipment \u2192<\/a><\/p>\n <\/div>\n<\/section>\n\n<section class=\"light\" id=\"lp-plant\" style=\"padding-bottom:140px\"><div class=\"band\" style=\"background:linear-gradient(180deg,#e7eff9,#F4F7FB 40%,#e7eff9)\"><\/div>\n <div class=\"tank rv\"><div class=\"tankbox\"><div class=\"lvl\" id=\"lvl\"><i><\/i><b id=\"lvlt\">0%<\/b><\/div>\n  <span class=\"mono\">Live miniature plant<\/span><h2>From raw material to finished container.<\/h2>\n  <p style=\"color:#a9bbd2;max-width:480px;margin-top:10px\">Scroll and the liquid fills each line, step by step through mixing, treatment, filling and inspection.<\/p>\n  <div id=\"plantHost\"><\/div>\n  <ol class=\"pstrip\" id=\"pstrip\" aria-label=\"Process steps\"><\/ol>\n  <div class=\"stl\" id=\"stl\" role=\"group\" aria-label=\"Plant stations\"><\/div><\/div><\/div>\n<\/section>\n\n<section class=\"light\" id=\"lp-services\"><div class=\"band\" style=\"background:linear-gradient(180deg,#e7eff9,#F4F7FB)\"><\/div>\n <div class=\"sec\" style=\"padding-top:60px\">\n  <span class=\"mono rv\">Services<\/span><h2 class=\"rv\">Support that keeps running with you.<\/h2>\n  <div class=\"river rv\"><svg viewBox=\"0 0 1000 170\" preserveAspectRatio=\"none\"><path d=\"M0 85 C100 10 200 160 300 85 S500 10 600 85 S800 160 1000 85\" fill=\"none\" stroke=\"rgba(37,99,235,.15)\" stroke-width=\"26\" stroke-linecap=\"round\"\/><path d=\"M0 85 C100 10 200 160 300 85 S500 10 600 85 S800 160 1000 85\" fill=\"none\" stroke=\"url(#lp-rg)\" stroke-width=\"12\" stroke-linecap=\"round\"\/><path d=\"M0 85 C100 10 200 160 300 85 S500 10 600 85 S800 160 1000 85\" fill=\"none\" stroke=\"#fff\" stroke-width=\"2.4\" stroke-dasharray=\"2 18\"><animate attributeName=\"stroke-dashoffset\" from=\"0\" to=\"-40\" dur=\"1.2s\" repeatCount=\"indefinite\"\/><\/path><\/svg>\n  <div class=\"nodes\" id=\"nodes\"><\/div><\/div>\n  <div class=\"sdet rv\" id=\"sdet\"><\/div>\n <\/div>\n<\/section>\n\n<section class=\"dark\" id=\"lp-industries\"><div class=\"band\"><\/div>\n <div class=\"wave top r\"><svg viewBox=\"0 0 2880 90\" preserveAspectRatio=\"none\"><path d=\"M0 45 C240 85 480 5 720 45 S1200 85 1440 45 S1920 5 2160 45 S2640 85 2880 45 V90 H0Z\" fill=\"#0B1220\"\/><\/svg><\/div>\n <div class=\"sec\" style=\"padding-bottom:60px\">\n  <span class=\"mono rv\">Industries<\/span><h2 class=\"rv\">Wherever liquid moves, we can help.<\/h2>\n  <div class=\"mq\"><div id=\"mq1\"><\/div><div class=\"rev\" id=\"mq2\"><\/div><\/div>\n <\/div>\n<\/section>\n<section class=\"dark\" id=\"lp-cta\" style=\"padding-bottom:10px\"><div class=\"band\"><\/div>\n <div class=\"wave top r\"><svg viewBox=\"0 0 2880 90\" preserveAspectRatio=\"none\"><path d=\"M0 45 C240 85 480 5 720 45 S1200 85 1440 45 S1920 5 2160 45 S2640 85 2880 45 V90 H0Z\" fill=\"#0B1220\"\/><\/svg><\/div>\n <div class=\"sec\" style=\"padding-top:70px;padding-bottom:20px\"><div class=\"cband rv\">\n  <div><span class=\"mono\">Request a quote<\/span><h2>Tell us what you pour, pump or pack.<\/h2><\/div>\n  <div class=\"acts\"><a class=\"btn dk\" href=\"https:\/\/www.lp-equipment.com.my\/2016\/?page_id=1230\">Open the request form \u2192<\/a><a class=\"btn wh\" href=\"tel:+60355253071\">Call 03-5525 3071<\/a><small>or LPEQUIPMENT@GMAIL.COM<\/small><\/div>\n <\/div><\/div>\n<\/section>\n\n<\/div>\n<footer class=\"foot\"><div class=\"in\">\n <div><a class=\"brand\" href=\"https:\/\/www.lp-equipment.com.my\/2016\/\"><svg class=\"logo-ic\" viewBox=\"0 0 200 200\" aria-hidden=\"true\"><circle cx=\"100\" cy=\"100\" r=\"86\" fill=\"none\" stroke=\"#22B8E6\" stroke-width=\"18\"\/><circle cx=\"100\" cy=\"100\" r=\"66\" fill=\"#fff\" opacity=\".08\"\/><path transform=\"translate(100,100) scale(.82) translate(-92,-98)\" d=\"M60,46 V150 H110 V54 H124 A26,26 0 0 1 124,106 H110\" fill=\"none\" stroke=\"#fff\" stroke-width=\"20\" stroke-linejoin=\"round\"\/><\/svg>\nLP Equipment<\/a><p>Sanitary pumps, homogenisers, inspection, filtration, cleaning and process equipment, with the service to keep it running. Shah Alam, Selangor.<\/p><\/div>\n <div><h4>Processing equipment<\/h4><a href=\"\/2016\/processing-equipment\/#cat-store\">Storage, mixing &amp; fermentation<\/a><a href=\"\/2016\/processing-equipment\/#cat-homog\">Homogenising &amp; emulsifying<\/a><a href=\"\/2016\/processing-equipment\/#cat-heat\">Heat treatment<\/a><a href=\"\/2016\/processing-equipment\/#cat-fill\">Filling, dosing &amp; packing<\/a><a href=\"\/2016\/processing-equipment\/#cat-clean\">Cleaning &amp; CIP<\/a><a href=\"\/2016\/processing-equipment\/#cat-flow\">Transfer &amp; flow control<\/a><a href=\"\/2016\/processing-equipment\/#cat-insp\">Inspection &amp; rejection<\/a><a href=\"\/2016\/processing-equipment\/#cat-lines\">Complete process lines<\/a><\/div>\n <div><h4>Services<\/h4><a href=\"\/2016\/our-services\/#s1\">Application &amp; selection<\/a><a href=\"\/2016\/our-services\/#s2\">Installation &amp; commissioning<\/a><a href=\"\/2016\/our-services\/#s3\">Spares<\/a><a href=\"\/2016\/our-services\/#s4\">Maintenance &amp; overhauls<\/a><a href=\"\/2016\/our-services\/#s5\">Refurbished equipment<\/a><\/div>\n <div><h4>Contact<\/h4><a href=\"mailto:LPEQUIPMENT@GMAIL.COM\">LPEQUIPMENT@GMAIL.COM<\/a><a href=\"tel:+60355253071\">(+60)3 5525 3071<\/a><a href=\"tel:+60123661515\">(+60)12-366 1515<\/a><a href=\"tel:+60122027221\">(+60)12-202 7221<\/a><p style=\"margin-top:8px\">33, Jalan Gitar 33\/3, Seksyen 33,<br>40400 Shah Alam, Selangor<\/p><p class=\"hrs-f\">Monday \u2013 Friday 9:30 AM \u2013 06:30 PM<br>Saturday 9:30 AM \u2013 12:30 PM<\/p><\/div>\n<\/div><div class=\"low\"><span>\u00a9 2026 LP Equipment Sdn Bhd<\/span><\/div><\/footer>\n<script>\n(function(){\nconst $=(s,r=document)=>r.querySelector(s),$$=(s,r=document)=>[...r.querySelectorAll(s)];\nconst SHOT=location.hash.startsWith('#shot');\nif(SHOT)document.documentElement.classList.add('shot');\nconst io=new IntersectionObserver(es=>es.forEach(e=>{if(e.isIntersecting){e.target.classList.add('in');io.unobserve(e.target)}}),{threshold:.12});\nconst reveal=()=>$$('.rv:not(.in)').forEach(el=>SHOT?el.classList.add('in'):io.observe(el));\nconst IC={store:'<rect x=\"6\" y=\"3\" width=\"12\" height=\"18\" rx=\"5\"\/><path d=\"M6 9h12M6 15h12\"\/>',homog:'<path d=\"M5 20V9M12 20V5M19 20V9M3 20h18\"\/>',heat:'<path d=\"M10 14.5V5a2 2 0 0 1 4 0v9.5a4 4 0 1 1-4 0zM12 9v7\"\/>',fill:'<path d=\"M10 2h4v4l2 3v11a1 1 0 0 1-1 1H9a1 1 0 0 1-1-1V9l2-3zM8 13h8\"\/>',clean:'<path d=\"M12 3c3 4 5 6.5 5 9a5 5 0 0 1-10 0c0-2.500 2-5 5-9z\"\/>',flow:'<circle cx=\"11\" cy=\"13\" r=\"7\"\/><circle cx=\"11\" cy=\"13\" r=\"2.4\"\/><path d=\"M16 8l3-3h3M4 13H2M11 20v2\"\/>',insp:'<path d=\"M4 8V5a1 1 0 0 1 1-1h3M16 4h3a1 1 0 0 1 1 1v3M20 16v3a1 1 0 0 1-1 1h-3M8 20H5a1 1 0 0 1-1-1v-3M7 12h10\"\/>',lines:'<circle cx=\"5\" cy=\"12\" r=\"2\"\/><circle cx=\"12\" cy=\"12\" r=\"2\"\/><circle cx=\"19\" cy=\"12\" r=\"2\"\/><path d=\"M7 12h3M14 12h3\"\/>'};\nconst ARROW='<svg viewBox=\"0 0 24 24\"><path d=\"M5 12h14M13 6l6 6-6 6\"\/><\/svg>';\n\/* nav + mobile menu *\/\n(()=>{const pg=(document.querySelector('[data-page]')||document.body).dataset.page;$$('[data-p]').forEach(a=>{if(a.dataset.p===pg)a.classList.add('on')});\n const m=$('#lp-menu'),n=$('#lp-mnav');if(!m)return;m.onclick=()=>{const o=m.classList.toggle('open');n.classList.toggle('open',o);m.setAttribute('aria-expanded',o);document.body.style.overflow=o?'hidden':''};\n $$('a',n).forEach(a=>a.addEventListener('click',()=>{m.classList.remove('open');n.classList.remove('open');document.body.style.overflow=''}))})();\n\/* ribbon (v2, 2026-11-02): the flow line now runs the full height of the page, the scroll-fill follows the line's own position, and it re-measures when the page height changes *\/\nconst Ribbon=(()=>{const main=$('#lp-main'),rb=$('#lp-ribbon'),rt=$('#rtrack'),rg=$('#rglow'),rf=$('#rfill'),rfl=$('#rflow');\n let ys=[0,1],key='';\n const dTop=el=>el.getBoundingClientRect().top+scrollY;\n function build(){const c=window.RIB,W=main.clientWidth,mob=W<820,xs=mob?c.xm:c.xd,sc=mob?.55:1,hw=19*sc+6,top0=dTop(main);\n  let H=main.offsetHeight;\n  if(c.to){const t=document.getElementById(c.to);if(t)H=Math.max(H,Math.round(dTop(t)-top0))}\n  const k=W+'x'+H+'\/'+c.ids.map(spec=>{const s=document.getElementById(spec.split(':')[0]);return s?Math.round(s.offsetTop):0}).join(',');\n  if(k===key){prog();return}key=k;\n  const X=f=>Math.max(hw,Math.min(W-hw,W*f));\n  rb.setAttribute('viewBox',`0 0 ${W} ${H}`);rb.style.height=H+'px';\n  [[rt,38],[rg,30],[rf,22]].forEach(([e,w])=>e.setAttribute('stroke-width',w*sc));\n  let px=X(xs[0]),py=0,d=`M${px},0`;\n  const go=(x,y)=>{y=Math.min(y,H);if(y<=py)return;const my=(py+y)\/2;d+=` C${px},${my} ${x},${my} ${x},${y}`;px=x;py=y};\n  c.ids.forEach((spec,i)=>{if(i===0)return;const [id,m]=spec.split(':'),s=document.getElementById(id);if(!s)return;\n   go(X(xs[i]),s.offsetTop+(m?(m[0]==='b'?s.offsetHeight-(+m.slice(1)):+m):Math.min(s.offsetHeight*.35,420)))});\n  go(px,H); \/* always finish at the very bottom of the block *\/\n  [rt,rg,rf,rfl].forEach(p=>p.setAttribute('d',d));\n  const L=rt.getTotalLength(),n=Math.max(60,Math.min(2000,Math.round(L\/6)));ys=[];for(let i=0;i<=n;i++)ys.push(rt.getPointAtLength(L*i\/n).y);\n  prog()}\n function prog(){let p;\n  if(SHOT)p=1;else{const dh=document.documentElement.scrollHeight,t=Math.max(0,Math.min(1,scrollY\/Math.max(1,dh-innerHeight))),\n   fy=scrollY+innerHeight*(.6+.4*t)-dTop(main),n=ys.length-1;\n   if(fy<=ys[0])p=0;else if(fy>=ys[n])p=1;else{let a=0,b=n;while(b-a>1){const m=(a+b)>>1;ys[m]<=fy?a=m:b=m}p=(a+(fy-ys[a])\/Math.max(.001,ys[b]-ys[a]))\/n}}\n  [rf,rg].forEach(e=>e.setAttribute('stroke-dasharray',`${p*1000} 2000`))}\n let q=0;const later=()=>{cancelAnimationFrame(q);q=requestAnimationFrame(build)};\n document.readyState==='complete'?setTimeout(build,60):addEventListener('load',()=>setTimeout(build,60));\n addEventListener('resize',later);addEventListener('scroll',prog,{passive:true});\n if(document.fonts&&document.fonts.ready)document.fonts.ready.then(later);\n if(window.ResizeObserver){const ro=new ResizeObserver(later);ro.observe(main);ro.observe(document.body)}\n return{build:()=>{key='';build()},prog}})();\n\/* cursor liquid glow + click ripples *\/\n(()=>{const gl=$('#lp-glow');if(!gl)return;let gx=innerWidth\/2,gy=innerHeight\/2,tx=gx,ty=gy;addEventListener('pointermove',e=>{tx=e.clientX;ty=e.clientY});\n (function loop(){gx+=(tx-gx)*.1;gy+=(ty-gy)*.1;gl.style.transform=`translate(${gx}px,${gy}px)`;requestAnimationFrame(loop)})();\n addEventListener('click',e=>{const r=document.createElement('i');r.className='rip';r.style.left=e.clientX+'px';r.style.top=e.clientY+'px';(document.querySelector('[data-page]')||document.body).appendChild(r);setTimeout(()=>r.remove(),900)})})();\n\n\/* ===== Isometric miniature production plant (pure SVG + CSS\/SMIL animation, no libs) ===== *\/\nconst Plant=(()=>{\nconst S=34,OX=300,OY=170,NS='http:\/\/www.w3.org\/2000\/svg';\nconst iso=(x,y,z)=>[(x-y)*.866*S+OX,(x+y)*.5*S-z*S+OY];\nconst P=(pts)=>pts.map(p=>iso(...p).map(n=>n.toFixed(1)).join(',')).join(' ');\nconst INFO={\n tank:{n:'01',cat:'Storage & mixing',h:'Storage, mixing & fermentation',p:'Vessels where ingredients are received, blended and, where the product needs it, left to ferment or age.',sv:['Application & selection','Installation & commissioning','Maintenance & overhaul']},\n pump:{n:'02',cat:'Transfer & flow control',h:'Pumps, valves & fittings',p:'Hygienic pumps move the product from step to step, while sanitary valves and fittings keep the flow under control.',sv:['Application & selection','Spares','Maintenance & overhaul']},\n filter:{n:'03',cat:'Filtration',h:'Filters & strainers',p:'Filtration that protects the product and the equipment downstream.',sv:['Application & selection','Spares']},\n homog:{n:'04',cat:'Homogenising & emulsifying',h:'High-pressure homogenisers',p:'A smoother, more stable product and a consistent texture, for dairy, beverages, sauces and spreads.',sv:['Installation & commissioning','Spares','Maintenance & overhaul']},\n heat:{n:'05',cat:'Heat treatment',h:'Pasteurisers & UHT systems',p:'Heat, hold and cool the product to make it safe and give it the shelf life you are after.',sv:['Installation & commissioning','Spares','Maintenance & overhaul']},\n fill:{n:'06',cat:'Filling, dosing & packing',h:'Filling & dosing station',p:'Puts the finished product into its container, with dosing options such as liquid nitrogen where the pack calls for it.',sv:['Application & selection','Installation & commissioning','Spares']},\n inspect:{n:'07',cat:'Inspection & rejection',h:'Container inspection & rejection',p:'Leak, vacuum \/ pressure and fill-level checks with automatic reject on the line.',sv:['Installation & commissioning','Spares','Maintenance & overhaul']},\n cip:{n:'\\u21ba',cat:'Cleaning & CIP',h:'Clean-in-place return loop',p:'A cleaning circuit that runs back to the vessels, so tanks and lines are washed in place between runs.',sv:['Application & selection','Contact our sales team']}\n};\nconst ORDER=['tank','pump','filter','homog','heat','fill','inspect','cip'];\nfunction mount(el,o){\n const T=Object.assign({\n  steel:['#e8f1f8','#9fb3c6','#6f879f'],dark:['#2a3b55','#1b2940','#142036'],acc:'#22D3EE',acc2:'#14B8A6',amber:'#F59E0B',\n  floor:['#16233a','#0f1a2d','#0a1424'],grid:'rgba(34,211,238,.18)',pipe:['#c7d6e4','#7d92a8'],liquid:'#22D3EE',glow:true},o.theme||{});\n const mk=(t,a={},p)=>{const e=document.createElementNS(NS,t);for(const k in a)e.setAttribute(k,a[k]);p&&p.appendChild(e);return e};\n el.classList.add('plant');\n const svg=mk('svg',{viewBox:'20 40 760 470',class:'plant-svg',role:'img','aria-label':'Animated miniature processing plant: storage and mixing tank, pump, filter, homogeniser, heat treatment unit, filling station, inspection conveyor and cleaning return loop'});\n const vp=document.createElement('div');vp.className='plant-vp';vp.appendChild(svg);el.appendChild(vp);\n const defs=mk('defs',{},svg);\n const grad=(id,c)=>{const g=mk('linearGradient',{id,x1:0,x2:1,y1:0,y2:0},defs);[[0,c[1]],[.42,c[0]],[1,c[2]]].forEach(([o,cl])=>mk('stop',{offset:o,'stop-color':cl},g))};\n const uid='p'+Math.random().toString(36).slice(2,6);\n grad(uid+'s',T.steel);grad(uid+'d',T.dark);\n const gl=mk('filter',{id:uid+'glow',x:'-50%',y:'-50%',width:'200%',height:'200%'},defs);mk('feGaussianBlur',{stdDeviation:3.2},gl);\n const cam=mk('g',{class:'cam'},svg);\n const world=mk('g',{},cam);\n const poly=(pts,fill,p,ex={})=>mk('polygon',Object.assign({points:P(pts),fill},ex),p);\n function box(p,x,y,z,w,d,h,m,ex){const g=mk('g',{},p),M=m||T.steel;\n  poly([[x,y+d,z],[x+w,y+d,z],[x+w,y+d,z+h],[x,y+d,z+h]],M[1],g,{stroke:'rgba(0,0,0,.18)','stroke-width':.6});\n  poly([[x+w,y,z],[x+w,y+d,z],[x+w,y+d,z+h],[x+w,y,z+h]],M[2],g,{stroke:'rgba(0,0,0,.18)','stroke-width':.6});\n  poly([[x,y,z+h],[x+w,y,z+h],[x+w,y+d,z+h],[x,y+d,z+h]],M[0],g,Object.assign({stroke:'rgba(255,255,255,.35)','stroke-width':.6},ex||{}));return g}\n function cyl(p,cx,cy,z,r,h,gid,top,ex){const g=mk('g',{},p),[sx,sy]=iso(cx,cy,z),[tx,ty]=iso(cx,cy,z+h),rx=r*1.2247*S,ry=r*.7071*S;\n  mk('path',{d:`M${sx-rx},${ty} L${sx-rx},${sy} A${rx},${ry} 0 0 0 ${sx+rx},${sy} L${sx+rx},${ty} Z`,fill:`url(#${uid}${gid||'s'})`,stroke:'rgba(0,0,0,.2)','stroke-width':.6},g);\n  mk('ellipse',Object.assign({cx:tx,cy:ty,rx,ry,fill:top||T.steel[0],stroke:'rgba(255,255,255,.4)','stroke-width':.8},ex||{}),g);return g}\n function ring(p,cx,cy,z,r,col){const [x,y]=iso(cx,cy,z);return mk('ellipse',{cx:x,cy:y,rx:r*1.2247*S,ry:r*.7071*S,fill:'none',stroke:col||T.acc,'stroke-width':1.6,opacity:.9},p)}\n \/\/ floor\n const fl=mk('g',{},world);\n box(fl,-.8,-.8,-.5,16.2,9.6,.5,T.floor,{stroke:T.grid});\n for(let i=0;i<=15;i++){mk('polyline',{points:P([[i,-.8,0],[i,8.8,0]]),stroke:T.grid,'stroke-width':.6,fill:'none'},fl)}\n for(let j=0;j<=8;j++){mk('polyline',{points:P([[-.8,j,0],[15.4,j,0]]),stroke:T.grid,'stroke-width':.6,fill:'none'},fl)}\n \/\/ pipes\n const pz=.85,pipes=[\n  [[1.8,1.6,pz],[3.4,1.6,pz]],\n  [[4.6,1.6,pz],[6.6,1.6,pz]],\n  [[7.2,1.6,pz],[8.7,1.6,pz]],\n  [[10.4,1.6,pz],[12.0,1.6,pz]],\n  [[13.0,2.1,pz],[13.0,5.0,pz],[13.0,5.0,2.1]]];\n const pg=mk('g',{},world),pipeEls=[];\n pipes.forEach((pts,i)=>{const d='M'+pts.map(q=>iso(...q).map(n=>n.toFixed(1)).join(' ')).join(' L');\n  mk('path',{d,fill:'none',stroke:T.pipe[1],'stroke-width':13,'stroke-linejoin':'round','stroke-linecap':'butt'},pg);\n  mk('path',{d,fill:'none',stroke:T.pipe[0],'stroke-width':9,'stroke-linejoin':'round'},pg);\n  const f=mk('path',{d,pathLength:100,fill:'none',stroke:T.liquid,'stroke-width':5.5,'stroke-linejoin':'round',class:'pfill','stroke-dasharray':'0 200'},pg);\n  const fl2=mk('path',{d,fill:'none',stroke:'#fff','stroke-width':1.8,'stroke-linejoin':'round',class:'pflow','stroke-dasharray':'2 10',opacity:0},pg);\n  pipeEls.push({f,fl:fl2})});\n \/\/ CIP return line\n mk('polyline',{points:P([[1.2,4.8,.2],[1.2,2.4,.2]]),stroke:T.acc2,'stroke-width':2.2,fill:'none','stroke-dasharray':'3 6',class:'pflow',opacity:.85},pg);\n\/\/ CIP return loop: from the filling end of the line, back along the floor to the CIP station\nmk('polyline',{points:P([[12.4,4.65,.2],[11.6,4.65,.2],[11.6,3.7,.2],[1.75,3.7,.2],[1.75,4.3,.2]]),stroke:T.acc2,'stroke-width':2.2,fill:'none','stroke-dasharray':'3 6',class:'pflow',opacity:.85,'stroke-linejoin':'round'},pg);\n const hs={};let camK=1;\n function station(id,build,mx,my,mz){const g=mk('g',{class:'hs','data-id':id,tabindex:0,role:'button','aria-label':INFO[id].cat+': '+INFO[id].h},world);\n  build(g);const [x,y]=iso(mx,my,mz);\n  const m=mk('g',{class:'marker',transform:`translate(${x} ${y})`},g);\n  const hit=mk('circle',{r:22,class:'mhit',fill:'rgba(0,0,0,0)',stroke:'none','pointer-events':'all'},m);\n  mk('circle',{r:16,class:'pulse',fill:'none',stroke:T.acc,'stroke-width':1.5},m);\n  mk('circle',{r:11,fill:'rgba(8,16,30,.88)',stroke:T.acc,'stroke-width':1.5},m);\n  mk('text',{y:INFO[id].n.length>2?3.6:4,'text-anchor':'middle',fill:'#fff','font-size':INFO[id].n.length>2?10:13,'font-family':'JetBrains Mono,monospace','font-weight':600},m).textContent=INFO[id].n;\n  hs[id]={g,m,x,y,hit};return g}\n \/\/ 01 tank\n station('tank',g=>{cyl(g,1.1,1.5,0,.8,2.6,'s');ring(g,1.1,1.5,.9,.8,T.pipe[1]);ring(g,1.1,1.5,1.8,.8,T.pipe[1]);\n  cyl(g,1.1,1.5,2.6,.4,.3,'s',T.steel[0]);ring(g,1.1,1.5,2.65,.5,T.acc)},1.1,1.5,3.7);\n \/\/ 02 pump (with a sanitary valve on the pipe, part of the same hotspot)\nstation('pump',g=>{box(g,3.1,1.15,0,1.9,.9,.22,T.dark);box(g,3.2,1.3,.22,1.1,.6,.7,T.steel);box(g,3.25,1.3,.92,.9,.6,.12,T.dark);cyl(g,4.3,1.6,.22,.42,.8,'s');ring(g,4.3,1.6,.7,.42,T.pipe[1]);ring(g,4.3,1.6,1.02,.42,T.acc);\n  const [x,y]=iso(5.5,1.6,pz);mk('circle',{cx:x,cy:y,r:9,fill:T.steel[0],stroke:T.pipe[1],'stroke-width':2},g);mk('line',{x1:x,y1:y,x2:x,y2:y-22,stroke:T.amber,'stroke-width':3,'stroke-linecap':'round'},g);mk('circle',{cx:x,cy:y-24,r:5,fill:T.amber},g);\n  [-1,1].forEach(k=>{mk('rect',{x:x+k*13-3,y:y-7,width:6,height:14,rx:1.5,fill:T.pipe[0],stroke:T.pipe[1]},g)})},4.2,1.6,2.2);\n\/\/ 04 filter\n station('filter',g=>{cyl(g,6.9,1.6,0,.5,2.0,'s');[.4,1.0,1.6].forEach(z=>ring(g,6.9,1.6,z,.55,T.pipe[1]));cyl(g,6.9,1.6,2.0,.3,.35,'s');\n  const [a,b]=iso(6.9,1.6,2.6);mk('circle',{cx:a,cy:b,r:5,fill:T.acc,filter:`url(#${uid}glow)`,opacity:.8},g)},6.9,1.6,3.3);\n \/\/ 05 homogeniser\n station('homog',g=>{box(g,8.4,.9,0,2.1,1.5,1.1,T.steel);box(g,8.5,.8,1.1,1.9,1.2,.18,T.dark);\n  [0,1,2].forEach(i=>{const c=cyl(g,8.75+i*.55,1.4,1.28,.17,.75,'s');c.classList.add('piston');c.style.animationDelay=(i*.3)+'s'});\n  box(g,8.5,2.45,0,.9,.8,.9,T.dark);cyl(g,9.9,2.85,0,.4,.7,'d',T.dark[0])},9.4,1.5,2.6);\n \/\/ 05 heat treatment: plate-pack heat exchanger with a holding tube (amber glow = heat)\nstation('heat',g=>{box(g,12.0,1.1,0,.16,1.0,1.8,T.dark);box(g,12.16,1.1,0,1.7,1.0,1.7,T.steel);box(g,13.86,1.1,0,.16,1.0,1.8,T.dark);box(g,12.0,1.15,1.7,1.9,.9,.12,T.dark);\n  for(let i=0;i<9;i++){const x=12.35+i*.17;mk('polyline',{points:P([[x,2.1,.12],[x,2.1,1.6]]),stroke:'rgba(11,18,32,.35)','stroke-width':1.1,fill:'none'},g)}\n  cyl(g,14.75,1.6,0,.3,2.5,'s');ring(g,14.75,1.6,.7,.3,T.pipe[1]);ring(g,14.75,1.6,1.5,.3,T.pipe[1]);\n  const [a,b]=iso(14.75,1.6,2.55);mk('ellipse',{cx:a,cy:b,rx:.3*1.2247*S,ry:.3*.7071*S,fill:T.amber,opacity:.6,class:'blinkx'},g);\n  mk('polyline',{points:P([[14.0,1.6,1.3],[14.45,1.6,1.3]]),stroke:T.pipe[1],'stroke-width':5,fill:'none'},g)},13.3,1.6,3.3);\n\/\/ ---- rejector + reject bottles (v-fun): one reject colour (T.amber) shared by the bottles, the rejector head and the firework ----\n const BN=9,BDUR=14,BX0=13.6,BX1=3.9,RX=5.9,FK=(BX0-RX)\/(BX0-BX1),REJ=[2,6],REJC=T.amber,btls=[],rej={};\n function dbox(p,M){const a=mk('polygon',{fill:M[1],stroke:'rgba(0,0,0,.18)','stroke-width':.6},p),b=mk('polygon',{fill:M[2],stroke:'rgba(0,0,0,.18)','stroke-width':.6},p),c=mk('polygon',{fill:M[0],stroke:'rgba(255,255,255,.35)','stroke-width':.6},p);\n  return (x,y,z,w,d,h)=>{a.setAttribute('points',P([[x,y+d,z],[x+w,y+d,z],[x+w,y+d,z+h],[x,y+d,z+h]]));b.setAttribute('points',P([[x+w,y,z],[x+w,y+d,z],[x+w,y+d,z+h],[x+w,y,z+h]]));c.setAttribute('points',P([[x,y,z+h],[x+w,y,z+h],[x+w,y+d,z+h],[x,y+d,z+h]]))}}\n \/\/ air-kicker on the front (camera) side of the belt, just after the inspection arch: it pushes a rejected bottle sideways off the line\n function buildRejector(g){const rg=mk('g',{class:'rejector'},g);rej.g=rg;\n  box(rg,RX-.3,6.85,0,.6,.45,.35,T.dark);box(rg,RX-.14,6.95,.35,.28,.3,.7,T.dark);\n  box(rg,RX-.22,6.78,1.0,.44,.5,.5,T.steel);box(rg,RX-.2,7.26,1.05,.4,.07,.4,T.dark);\n  const rod=dbox(rg,['#f2f7fb','#c7d6e4','#9fb3c6']),head=dbox(rg,['#fcd34d',REJC,'#b45309']);\n  const [lx,ly]=iso(RX,7.0,1.52);rej.led=mk('circle',{cx:lx,cy:ly,r:2.6,fill:'#34d399'},rg);\n  rej.puff=[0,1,2].map(()=>mk('circle',{r:2,fill:'#fff',opacity:0},rg));\n  rej.set=(ext,pa)=>{const hy=6.62-.64*ext;rod(RX-.05,hy,1.2,.1,6.8-hy,.1);head(RX-.21,hy-.02,1.02,.42,.13,.36);rej.led.setAttribute('fill',ext>.05?REJC:'#34d399');\n   const [px,py]=iso(RX,hy-.2,1.2);rej.puff.forEach((c,k)=>{c.setAttribute('cx',(px+(k-1)*6).toFixed(1));c.setAttribute('cy',(py+(k-1)*2.5+3).toFixed(1));c.setAttribute('r',(1.6+(1-pa)*3.2).toFixed(1));c.setAttribute('opacity',(pa*.75).toFixed(2))})};\n  rej.set(0,0)}\n\/\/ conveyor line (part of inspect hotspot visually but conveyor itself decorative)\n const cv=mk('g',{},world);\n box(cv,3.4,5.5,0,10.6,1,.9,T.dark);\n for(let i=0;i<30;i++){const x=3.6+i*.33;mk('polyline',{points:P([[x,5.5,.9],[x,6.5,.9]]),stroke:'rgba(255,255,255,.12)','stroke-width':1},cv)}\n [3.7,7,10.3,13.5].forEach(x=>{box(cv,x-.08,5.6,-.4,.16,.16,.4,T.dark);box(cv,x-.08,6.2,-.4,.16,.16,.4,T.dark)});\n \/\/ bottles\n const bg=mk('g',{class:'bottles'},world);\n const [bx0,by0]=iso(13.6,6,.9),[bx1,by1]=iso(3.9,6,.9),path=`M${bx0},${by0} L${bx1},${by1}`;\n const bottle=(g,c)=>{mk('path',{d:'M-5,-1 V-13 Q-5,-17 -2,-18 V-23 H2 V-18 Q5,-17 5,-13 V-1 Z',fill:c,stroke:'rgba(255,255,255,.6)','stroke-width':.8,opacity:.95},g);mk('ellipse',{cx:0,cy:-1,rx:5,ry:2.8,fill:c,opacity:.9},g)};\n for(let i=0;i<BN;i++){const g=mk('g',{class:'btl'},bg);btls[i]=g;bottle(g,REJ.includes(i)?REJC:'#cfeefa');const a=mk('animateMotion',{dur:BDUR+'s',repeatCount:'indefinite',begin:(-i*BDUR\/BN)+'s',path},g)}\n \/\/ inspect arch (front)\n station('inspect',g=>{box(g,7.1,5.0,.9,.28,.28,1.7,T.steel);box(g,7.1,6.6,.9,.28,.28,1.7,T.steel);box(g,7.05,5.0,2.55,.38,1.9,.34,T.steel);\n  const sc=poly([[7.25,5.3,.9],[7.25,6.6,.9],[7.25,6.6,2.55],[7.25,5.3,2.55]],T.acc,g,{class:'scan',opacity:.22});\n  const [a,b]=iso(7.25,5.95,1.2);mk('line',{x1:a-40,y1:b,x2:a+40,y2:b,stroke:T.acc,'stroke-width':1.6,class:'scanline',filter:`url(#${uid}glow)`},g);\n  box(g,5.2,4.4,.9,.9,.7,1.0,T.dark);const [c,d]=iso(5.5,5.2,1.9);mk('circle',{cx:c,cy:d,r:3.5,fill:T.amber,class:'blinkx'},g);buildRejector(g)},7.25,5.95,3.5);\n \/\/ 06 filling & dosing station (NEW): filler body over the conveyor, a dosing nozzle with drips, and a small LN2 vessel\nstation('fill',g=>{box(g,12.4,4.2,0,1.2,.9,2.1,T.steel);box(g,12.4,4.9,1.5,1.2,1.5,.35,T.dark);cyl(g,13,5.9,1.0,.14,.5,'s');cyl(g,12.7,5.9,1.0,.1,.4,'d',T.dark[0]);\n  cyl(g,14.4,4.5,0,.3,1.5,'s');ring(g,14.4,4.5,.8,.3,T.pipe[1]);ring(g,14.4,4.5,1.5,.3,T.acc);\n  mk('polyline',{points:P([[13.6,4.65,1.2],[14.4,4.65,1.2],[14.4,4.5,1.5]]),stroke:T.pipe[1],'stroke-width':4,fill:'none'},g);\n  const [a,b]=iso(13,5.9,.95);for(let i=0;i<3;i++){const c=mk('circle',{cx:a,cy:b+6+i*3,r:1.6,fill:T.acc,class:'drip'},g);c.style.animationDelay=(i*.3)+'s'}},13.0,4.7,3.5);\n\/\/ CIP\n station('cip',g=>{cyl(g,1,5.6,0,.55,1.5,'s');cyl(g,2.5,5.8,0,.5,1.3,'s');box(g,.5,4.3,0,2.2,.6,.7,T.dark);\n  const [a,b]=iso(1.75,5.7,2.2);mk('line',{x1:a,y1:b+30,x2:a,y2:b-2,stroke:T.pipe[0],'stroke-width':3},g);\n  for(let i=0;i<5;i++){const c=mk('circle',{cx:a-12+i*6,cy:b+10,r:1.8,fill:T.acc2,class:'drip'},g);c.style.animationDelay=(i*.18)+'s'}},1.75,5.6,2.9);\n \/\/ popover: hidden by default; shown only on hover \/ focus \/ tap, fades out slowly (0.7s) when the pointer leaves\n const hint=document.createElement('p');hint.className='plant-hint';hint.innerHTML='<span class=\"hh\">Hover over the equipment to view details<span class=\"hz\"> \u00b7 use + to zoom<\/span><\/span><span class=\"ht\">Pinch or tap + to zoom \u00b7 Tap equipment for details<\/span>';el.insertBefore(hint,vp);\n \/\/ zoom controls (shown only on narrow screens via CSS)\n const zc=document.createElement('div');zc.className='plant-zoom';zc.setAttribute('role','group');zc.setAttribute('aria-label','Zoom the plant');\n zc.innerHTML='<span class=\"pz-r\" aria-live=\"polite\">1\u00d7<\/span><button type=\"button\" class=\"pz-out\" aria-label=\"Zoom out\">\u2212<\/button><button type=\"button\" class=\"pz-in\" aria-label=\"Zoom in\">+<\/button><button type=\"button\" class=\"pz-rs\" aria-label=\"Reset zoom\">\u27f2<\/button>';el.appendChild(zc);\n const pop=document.createElement('div');pop.className='plant-pop';pop.setAttribute('aria-live','polite');el.appendChild(pop);\n \/\/ pinch \/ pan \/ buttons: whole plant fits the width at 1x; zoom is clamped to 1x-3x and panning stays inside the plant box\n const mq=window.matchMedia('(max-width:768px)'),ZMIN=1,ZMAX=3;\n let z=1,tx=0,ty=0,moved=false;const ptrs=new Map();let g0=null;\n const clampZ=v=>Math.max(ZMIN,Math.min(ZMAX,v));\n \/\/ invisible tap area on each marker: always >= 44x44 CSS px on screen (r = 22px \/ current on-screen scale of the 760x470 viewBox)\n function fitHits(){const b=svg.getBoundingClientRect(),sc=Math.min(b.width\/760,b.height\/470)*camK;if(!(sc>0))return;const r=Math.max(16,Math.min(90,22\/sc)).toFixed(1);Object.keys(hs).forEach(id=>hs[id].hit.setAttribute('r',r))}\n function apply(){const W=svg.clientWidth||svg.getBoundingClientRect().width\/z,H=svg.clientHeight||svg.getBoundingClientRect().height\/z;\n  if(!mq.matches){svg.style.transform='';vp.classList.remove('zoomed');fitHits();return}\n  z=clampZ(z);tx=Math.max(W-W*z,Math.min(0,tx));ty=Math.max(H-H*z,Math.min(0,ty));\n  if(z<=1.001){z=1;tx=0;ty=0}\n  svg.style.transform=z===1?'':`translate(${tx.toFixed(1)}px,${ty.toFixed(1)}px) scale(${z.toFixed(3)})`;\n  vp.classList.toggle('zoomed',z>1);\n  const r=$('.pz-r',zc);r.textContent=(Math.round(z*10)\/10)+'\u00d7';\n  $('.pz-in',zc).disabled=z>=ZMAX-.001;$('.pz-out',zc).disabled=z<=ZMIN+.001;$('.pz-rs',zc).disabled=z<=ZMIN+.001;fitHits()}\n function zoomAt(nz,cx,cy){nz=clampZ(nz);tx=cx-(cx-tx)*(nz\/z);ty=cy-(cy-ty)*(nz\/z);z=nz;apply()}\n const step=d=>zoomAt(Math.round((z+d)*2)\/2,svg.clientWidth\/2,svg.clientHeight\/2);\n $('.pz-in',zc).onclick=()=>step(.5);$('.pz-out',zc).onclick=()=>step(-.5);$('.pz-rs',zc).onclick=()=>{z=1;tx=0;ty=0;apply()};\n const loc=e=>{const r=vp.getBoundingClientRect();return [e.clientX-r.left-vp.clientLeft-(parseFloat(getComputedStyle(vp).paddingLeft)||0),e.clientY-r.top-vp.clientTop-(parseFloat(getComputedStyle(vp).paddingTop)||0)]};\n function gstart(){const a=[...ptrs.values()];\n  if(a.length>=2){const [p,q]=a,m=[(p[0]+q[0])\/2,(p[1]+q[1])\/2];g0={n:2,d:Math.hypot(p[0]-q[0],p[1]-q[1])||1,z,tx,ty,m}}\n  else if(a.length===1)g0={n:1,x:a[0][0],y:a[0][1],tx,ty}; else g0=null}\n vp.addEventListener('pointerdown',e=>{if(!mq.matches)return;if(e.pointerType==='mouse'&&e.button!==0)return;ptrs.set(e.pointerId,loc(e));if(ptrs.size===1)moved=false;vp.classList.add('gest');gstart()});\n const pmove=e=>{if(!ptrs.has(e.pointerId)||!g0)return;ptrs.set(e.pointerId,loc(e));const a=[...ptrs.values()];\n  if(g0.n===2&&a.length>=2){const [p,q]=a,m=[(p[0]+q[0])\/2,(p[1]+q[1])\/2],d=Math.hypot(p[0]-q[0],p[1]-q[1]),nz=clampZ(g0.z*d\/g0.d);moved=true;\n   tx=m[0]-(g0.m[0]-g0.tx)*(nz\/g0.z);ty=m[1]-(g0.m[1]-g0.ty)*(nz\/g0.z);z=nz;apply()}\n  else if(g0.n===1&&a.length===1){const dx=a[0][0]-g0.x,dy=a[0][1]-g0.y;if(!moved&&Math.hypot(dx,dy)<7)return;moved=true;if(z>1){tx=g0.tx+dx;ty=g0.ty+dy;apply()}}};\n const pend=e=>{if(!ptrs.delete(e.pointerId))return;if(!ptrs.size){vp.classList.remove('gest');g0=null}else gstart()};\n addEventListener('pointermove',pmove);addEventListener('pointerup',pend);addEventListener('pointercancel',pend);\n vp.addEventListener('click',e=>{if(moved){e.stopPropagation();e.preventDefault();moved=false}},true);\n vp.addEventListener('wheel',e=>{if(!mq.matches||!e.ctrlKey)return;e.preventDefault();const [x,y]=loc(e);zoomAt(z*Math.exp(-e.deltaY*.01),x,y)},{passive:false});\n if(window.ResizeObserver)new ResizeObserver(fitHits).observe(svg);addEventListener('resize',apply);(mq.addEventListener?mq.addEventListener('change',apply):mq.addListener(apply));apply();\n let cur=null,camPts=null,tm=0;\n const stay=()=>{clearTimeout(tm)},later=()=>{clearTimeout(tm);tm=setTimeout(()=>hide(),220)};\n function show(id,fromHover){stay();const i=INFO[id],h=hs[id];cur=id;\n  $$('.hs',svg).forEach(e=>e.classList.toggle('on',e.dataset.id===id));\n  pop.innerHTML=`<button class=\"pp-x\" aria-label=\"Close\">\u00d7<\/button><div class=\"pp-cat\"><i>${i.n}<\/i>${i.cat}<\/div><h4>${i.h}<\/h4><p>${i.p}<\/p><div class=\"pp-chips\">${i.sv.map(s=>`<span>${s}<\/span>`).join('')}<\/div><a class=\"pp-cta\" href=\"${o.cta||'#contact'}\">Talk to our team \u2192<\/a>`;\n  const r=el.getBoundingClientRect(),m=h.m.getBoundingClientRect(),lx=m.left-r.left+m.width\/2,ly=m.top-r.top+m.height\/2;\n  pop.style.setProperty('--px',lx+'px');pop.style.setProperty('--py',ly+'px');pop.classList.toggle('left',lx>r.width*.55);\n  pop.classList.add('show');\n  if(mq.matches)setTimeout(()=>{const b=pop.getBoundingClientRect();if(cur===id&&(b.bottom>innerHeight||b.top<0))pop.scrollIntoView({block:'nearest',behavior:'smooth'})},450);\n  $('.pp-x',pop).onclick=()=>hide();o.onSelect&&o.onSelect(id,i)}\n function hide(){stay();cur=null;pop.classList.remove('show');$$('.hs',svg).forEach(e=>e.classList.remove('on'));o.onHide&&o.onHide()}\n pop.addEventListener('pointerenter',stay);pop.addEventListener('pointerleave',e=>{if(e.pointerType==='mouse'||e.pointerType==='pen')later()});\n pop.addEventListener('focusin',stay);pop.addEventListener('focusout',e=>{if(!pop.contains(e.relatedTarget)&&!(e.relatedTarget&&e.relatedTarget.closest&&e.relatedTarget.closest('.hs')))later()});\n Object.keys(hs).forEach(id=>{const g=hs[id].g;\n  g.addEventListener('click',e=>{e.stopPropagation();show(id);go(id)});\n  g.addEventListener('pointerenter',e=>{if(e.pointerType==='mouse'||e.pointerType==='pen')show(id,true)});\n  g.addEventListener('pointerleave',e=>{if(e.pointerType==='mouse'||e.pointerType==='pen')later()});\n  g.addEventListener('focus',()=>show(id));g.addEventListener('blur',e=>{if(!(e.relatedTarget&&pop.contains(e.relatedTarget)))later()});\n  g.addEventListener('keydown',e=>{if(e.key==='Enter'||e.key===' '){e.preventDefault();show(id);go(id)}else if(e.key==='Escape')hide()})});\n \/\/ ===== fun layer: a 3D-looking miniature operator (rigged in 3D, drawn as shaded inline SVG) who rushes to the clicked equipment, and the reject kicker's firework (vanilla JS, no libraries) =====\n const rmq=window.matchMedia?window.matchMedia('(prefers-reduced-motion: reduce)'):{matches:false};\n const cl=(v,a,b)=>Math.max(a,Math.min(b,v)),easeO=u=>1-(1-u)*(1-u),easeIO=u=>u<.5?2*u*u:1-2*(1-u)*(1-u),TAU2=Math.PI*2;\n const opL=mk('g',{class:'op-layer','pointer-events':'none'},world),fxL=mk('g',{class:'fx-layer','pointer-events':'none'},cam);\n const OPR=(()=>{\n \/\/ ---- walkway graph on the floor (rows in front of the machines and in front of the belt, joined by lanes at both ends)\n const GN=[],GA=[],AY=3.2,FY=7.5;\n const gN=(x,y)=>{GN.push({x,y});GA.push([]);return GN.length-1},gL=(a,b)=>{const w=Math.hypot(GN[a].x-GN[b].x,GN[a].y-GN[b].y);GA[a].push([b,w]);GA[b].push([a,w])};\n const SPOT={};\n \/\/ [id, stand x, machine x, machine y]: he stands on the walkway and faces the machine\n const rowA=[[-.2],['tank',1.2,1.1,1.5],['pump',4.1,3.7,1.5],['filter',6.9,6.9,1.6],['homog',10.9,9.4,1.5],['heat',14.3,12.9,1.5],[15]],rowF=[[-.2],['cip',1.8,1.75,5.7],['inspect',8.6,7.1,5.9],['fill',13,12.8,5.0],[15]];\n const mkRow=(row,y)=>{let prev=-1,first=-1,last=-1;row.forEach(r=>{const isS=typeof r[0]==='string',n=gN(isS?r[1]:r[0],y);if(isS)SPOT[r[0]]={n,tg:[r[2],r[3]]};if(prev>=0)gL(prev,n);else first=n;prev=n;last=n});return [first,last]};\n const [aL,aR]=mkRow(rowA,AY),[fL,fR]=mkRow(rowF,FY);gL(aL,fL);gL(aR,fR);\n const IDLE='inspect';\n let SZ=mq.matches?1.4:1;\n \/\/ ---- tiny 3D kit: true isometric (same camera as the plant), painter-sorted shaded primitives\n const K=S*1.2247449,VW=[.57735,.57735,.57735],LT=[.2143,.6,.7712],LX=-.59,LY=-.81;\n const d3=(a,b)=>a[0]*b[0]+a[1]*b[1]+a[2]*b[2],nz=a=>{const l=Math.hypot(a[0],a[1],a[2])||1;return [a[0]\/l,a[1]\/l,a[2]\/l]},ad=(a,b)=>[a[0]+b[0],a[1]+b[1],a[2]+b[2]],sb=(a,b)=>[a[0]-b[0],a[1]-b[1],a[2]-b[2]],ml=(a,k)=>[a[0]*k,a[1]*k,a[2]*k];\n const CC={},col=(h,k)=>{let c=CC[h];if(!c)c=CC[h]=[1,3,5].map(i=>parseInt(h.substr(i,2),16));return 'rgb('+Math.min(255,c[0]*k|0)+','+Math.min(255,c[1]*k|0)+','+Math.min(255,c[2]*k|0)+')'};\n const f1=n=>n.toFixed(1),pr=p=>iso(p[0],p[1],p[2]);\n const sgrad=(id,a,b,c)=>{const g=mk('radialGradient',{id:uid+id,cx:.4,cy:.34,r:.72,fx:.33,fy:.26},defs);[[0,a],[.5,b],[1,c]].forEach(([o,cc])=>mk('stop',{offset:o,'stop-color':cc},g))};\n sgrad('osk','#ffe9d2','#f6cfa6','#c58b5e');sgrad('oht','#fff3b0','#fbbf24','#b45309');sgrad('obt','#51668a','#2b3b57','#101a2c');\n {const g=mk('radialGradient',{id:uid+'osh'},defs);[[0,'rgba(0,0,0,.6)'],[.5,'rgba(0,0,0,.32)'],[1,'rgba(0,0,0,0)']].forEach(([o,cc])=>mk('stop',{offset:o,'stop-color':cc},g))}\n \/\/ origin of drawing: everything below lives in the operator group\n const op=mk('g',{class:'op-fig','aria-hidden':'true'},opL);\n const shG=mk('g',{},op);\n const shadow=mk('ellipse',{fill:`url(#${uid}osh)`},shG),ao=[0,1].map(()=>mk('ellipse',{fill:'#000'},shG));\n const items=[];let nid=0;\n const mkItem=(fn)=>{const g=mk('g',{},op);const it={id:nid++,g,d:0};fn(it,g);items.push(it);return it};\n \/\/ capsule limb: three stacked round-capped strokes = cylindrical shading, lit from the upper left\n function limbEls(p,hex){const e=[0,1,2].map(()=>mk('line',{'stroke-linecap':'round'},p));\n  return (A,B,r)=>{const a=pr(A),b=pr(B),w=2*r*K*SZ;\n   const set=(l,off,wd,c)=>{l.setAttribute('x1',f1(a[0]+LX*off));l.setAttribute('y1',f1(a[1]+LY*off));l.setAttribute('x2',f1(b[0]+LX*off));l.setAttribute('y2',f1(b[1]+LY*off));l.setAttribute('stroke-width',f1(wd));l.setAttribute('stroke',c)};\n   set(e[0],0,w,col(hex,.52));set(e[1],.12*w,.76*w,col(hex,1));set(e[2],.23*w,.27*w,col(hex,1.32))}}\n \/\/ shaded box with three lit faces\n function boxEls(p){const f=[];for(let i=0;i<6;i++)f.push(mk('path',{'stroke-linejoin':'round'},p));\n  return (c,ax,h,hex,k0)=>{let n=0;for(let i=0;i<3;i++)for(let s=-1;s<=1;s+=2){const el=f[n++],nr=ml(ax[i],s);if(d3(nr,VW)<=.02){el.setAttribute('visibility','hidden');continue}\n    const j=(i+1)%3,k=(i+2)%3,m=ad(c,ml(nr,h[i])),u=ml(ax[j],h[j]),v=ml(ax[k],h[k]);\n    const q=[ad(ad(m,u),v),ad(sb(m,u),v),sb(sb(m,u),v),sb(ad(m,u),v)].map(pr);\n    const fill=col(hex,(k0||1)*(.74+.42*Math.max(0,d3(nr,LT))));\n    el.setAttribute('d','M'+f1(q[0][0])+','+f1(q[0][1])+'L'+f1(q[1][0])+','+f1(q[1][1])+'L'+f1(q[2][0])+','+f1(q[2][1])+'L'+f1(q[3][0])+','+f1(q[3][1])+'Z');\n    el.setAttribute('fill',fill);el.setAttribute('stroke',fill);el.setAttribute('stroke-width',2.6);el.setAttribute('visibility','visible')}}}\n \/\/ flat decal (ellipse) lying on a surface with unit normal nn\n function decal(el,pos,nn,r,sq){const v=d3(nn,VW);if(v<.04){el.setAttribute('visibility','hidden');return false}\n  const p=pr(pos),q=iso(pos[0]+nn[0],pos[1]+nn[1],pos[2]+nn[2]),ang=Math.atan2(q[1]-p[1],q[0]-p[0])*180\/Math.PI;\n  el.setAttribute('transform','translate('+f1(p[0])+' '+f1(p[1])+') rotate('+f1(ang)+')');el.setAttribute('rx',(r*K*SZ*v).toFixed(2));el.setAttribute('ry',(r*K*SZ*(sq||1)).toFixed(2));el.setAttribute('visibility','visible');return true}\n const ell=(p,a)=>mk('ellipse',Object.assign({rx:1,ry:1},a),p);\n \/\/ ---- body parts (all coordinates are in the body frame: a = forward, b = left, c = up; hip pivot at PIV)\n const HZ=.90,PIV=.95,L1=.42,L2=.40,AU=.34,AF=.32;\n const legs=[1,-1].map(sg=>mkItem((it,g)=>{it.sg=sg;it.th=limbEls(g,'#2f5fd0');it.sh=limbEls(g,'#2a54bd');it.bt=limbEls(g,'#2b3b57');it.k=null}));\n const hips=mkItem((it,g)=>{it.dr=boxEls(g)}),stripe=mkItem((it,g)=>{it.dr=boxEls(g)}),shirt=mkItem((it,g)=>{it.dr=boxEls(g)}),\n  strapR=mkItem((it,g)=>{it.dr=boxEls(g)}),strapL=mkItem((it,g)=>{it.dr=boxEls(g)}),bib=mkItem((it,g)=>{it.dr=boxEls(g)}),pocket=mkItem((it,g)=>{it.dr=boxEls(g)});\n const arms=[1,-1].map(sg=>mkItem((it,g)=>{it.sg=sg;it.u=limbEls(g,'#f4f7fb');it.f=limbEls(g,'#f6cfa6');it.h=mk('circle',{fill:`url(#${uid}osk)`},g)}));\n \/\/ head\n const HR=.27;let pkFront=null;\n const head=mkItem((it,g)=>{\n  it.eB=mk('circle',{fill:`url(#${uid}osk)`},g);it.hc=mk('circle',{fill:`url(#${uid}osk)`},g);\n  it.hair=ell(g,{fill:'#5a3a26'});it.bl=[0,1].map(()=>ell(g,{fill:'#fb8f90',opacity:.42}));it.nose=ell(g,{fill:'#e5a074'});\n  it.ew=[0,1].map(()=>ell(g,{fill:'#fff'}));it.pp=[0,1].map(()=>ell(g,{fill:'#0f172a'}));it.gl=[0,1].map(()=>ell(g,{fill:'#fff'}));\n  it.mouth=mk('path',{fill:'none',stroke:'#7c3e1d','stroke-width':1.3,'stroke-linecap':'round','stroke-linejoin':'round'},g);\n  it.vis=mk('path',{fill:'rgba(125,232,255,.26)',stroke:'rgba(235,252,255,.75)','stroke-width':.9,'stroke-linejoin':'round'},g);it.vsh=mk('path',{fill:'none',stroke:'rgba(255,255,255,.7)','stroke-width':1,'stroke-linecap':'round'},g);\n  it.eF=mk('circle',{fill:`url(#${uid}osk)`},g);\n  it.brT=ell(g,{fill:'#8a4a06'});it.br=ell(g,{fill:'#e08a0b'});\n  it.pkG=mk('g',{},g);it.pkT=ell(it.pkG,{fill:'#8a4a06'});it.pk=ell(it.pkG,{fill:'#f0a31a'});\n  it.dm=mk('path',{fill:`url(#${uid}oht)`},g);it.rg=mk('path',{fill:'none',stroke:'rgba(255,248,200,.55)','stroke-width':2.6,'stroke-linecap':'round'},g);it.dh=ell(g,{fill:'#fff',opacity:.55});\n  it.lamp=mk('circle',{fill:'#fff7c2'},g)});\n \/\/ holographic control panel he \"presses\" (pops up in front of him while operating)\n const panel=mkItem((it,g)=>{it.fr=mk('polygon',{fill:'rgba(34,211,238,.17)',stroke:T.acc,'stroke-width':1,'stroke-linejoin':'round'},g);it.ln=[0,1,2].map(()=>mk('line',{stroke:'rgba(190,245,255,.65)','stroke-width':1.2,'stroke-linecap':'round'},g));\n  it.gw=ell(g,{fill:'#34d399'});it.bt=ell(g,{fill:'#34d399'});it.ring=ell(g,{fill:'none',stroke:T.acc,'stroke-width':1.2});it.hl=ell(g,{fill:'#fff',opacity:.8})});\n \/\/ ---- state\n const ST={n:SPOT[IDLE].n,x:GN[SPOT[IDLE].n].x,y:GN[SPOT[IDLE].n].y,seg:[SPOT[IDLE].n,SPOT[IDLE].n],mode:'idle',wp:[],wi:0,t:0,ph:0,opT:0,target:IDLE,front:null,btnA:0,w:0,hd:Math.PI\/4,hdT:Math.PI\/4,turnK:5,lean:0,hy:0,hp:0,lw:0,pan:0,blink:0,opSg:-1,nextBlink:2.5,clock:0,hpos:null};\n const SPEED=6.2,OPDUR=2.2;\n \/\/ ---- head tracking: last pointer \/ touch point anywhere on the page\n const PT={x:0,y:0,t:-1e9,touch:false,has:false};\n const pset=(x,y,touch)=>{PT.x=x;PT.y=y;PT.t=performance.now();PT.touch=touch;PT.has=true};\n addEventListener('pointermove',e=>pset(e.clientX,e.clientY,e.pointerType==='touch'),{passive:true});\n addEventListener('pointerdown',e=>pset(e.clientX,e.clientY,e.pointerType==='touch'),{passive:true});\n addEventListener('touchstart',e=>{const t=e.touches[0];if(t)pset(t.clientX,t.clientY,true)},{passive:true});\n addEventListener('touchmove',e=>{const t=e.touches[0];if(t)pset(t.clientX,t.clientY,true)},{passive:true});\n const ER=[.70711,-.70711,0],EU=[-.40825,-.40825,.8165],BL=nz([.66,.66,.14]);\n function plan(tn){ \/\/ Dijkstra from where he is now (on the edge seg[0]-seg[1]) to the target node\n  const N=GN.length,dist=Array(N).fill(1e9),prev=Array(N).fill(-1),done=Array(N).fill(false);\n  ST.seg.forEach(n=>{dist[n]=Math.min(dist[n],Math.hypot(GN[n].x-ST.x,GN[n].y-ST.y))});\n  for(;;){let u=-1;for(let i=0;i<N;i++)if(!done[i]&&(u<0||dist[i]<dist[u]))u=i;if(u<0||dist[u]>=1e9)break;done[u]=true;if(u===tn)break;GA[u].forEach(([v,w])=>{if(dist[u]+w<dist[v]){dist[v]=dist[u]+w;prev[v]=u}})}\n  const path=[];for(let u=tn;u>=0;u=prev[u])path.unshift(u);return path}\n const faceTg=id=>{const tg=SPOT[id].tg,p0=Math.atan2(tg[1]-ST.y,tg[0]-ST.x),a=p0+.8,b=p0-.8,sa=Math.cos(a)+Math.sin(a),sb2=Math.cos(b)+Math.sin(b),r=sa>sb2?a:b,F=[Math.cos(r),Math.sin(r)];\n  ST.opSg=(-F[1]+F[0])>0?1:-1; \/\/ arm on the camera side does the pressing (Sd = (-sin, cos))\n  return r};\n function go(id){if(rmq.matches||!SPOT[id])return;const sp=SPOT[id];ST.target=id;\n  if(ST.mode!=='walk'&&Math.hypot(GN[sp.n].x-ST.x,GN[sp.n].y-ST.y)<.01){ST.mode='op';ST.opT=0;ST.hdT=faceTg(id);ST.turnK=12;return}\n  ST.wp=plan(sp.n);ST.wi=0;ST.mode='walk';ST.t=0}\n function place(){const front=ST.y>4.0;if(front===ST.front)return;ST.front=front;if(front)world.appendChild(opL);else world.insertBefore(opL,cv)}\n const wrapA=a=>{a=(a+Math.PI)%TAU2;if(a<0)a+=TAU2;return a-Math.PI};\n const lerpA=(a,b,k)=>a+wrapA(b-a)*k;\n \/\/ ---- one frame: simulate (dt>0), pose, head tracking, draw\n function frame(dt,rm){\n  ST.clock+=dt;const now=ST.clock;\n  \/\/ movement + mode\n  if(!rm){\n   if(ST.mode==='walk'){let rem=SPEED*dt;\n    while(rem>0&&ST.wi<ST.wp.length){const n=GN[ST.wp[ST.wi]],dx=n.x-ST.x,dy=n.y-ST.y,d=Math.hypot(dx,dy);\n     if(d>1e-6){ST.hdT=Math.atan2(dy,dx);ST.turnK=15}\n     if(d<=rem){ST.x=n.x;ST.y=n.y;rem-=d;ST.seg=[ST.wp[ST.wi],ST.wp[Math.min(ST.wi+1,ST.wp.length-1)]];ST.wi++}else{ST.x+=dx\/d*rem;ST.y+=dy\/d*rem;rem=0}}\n    if(ST.wi>=ST.wp.length){const sp=SPOT[ST.target];ST.n=sp.n;ST.seg=[sp.n,sp.n];ST.mode='op';ST.opT=0;ST.hdT=faceTg(ST.target);ST.turnK=12}}\n   else if(ST.mode==='op'){ST.opT+=dt;if(ST.opT>OPDUR){ST.mode='idle';ST.t=0}}\n   else ST.t+=dt;\n   ST.hd=lerpA(ST.hd,ST.hdT,Math.min(1,dt*ST.turnK))}\n  const walking=ST.mode==='walk';\n  ST.w+=((walking?1:0)-ST.w)*Math.min(1,dt*9);const w=ST.w;\n  if(walking)ST.ph+=dt*Math.PI*SPEED\/(1.15*SZ);\n  ST.lean+=((walking?.2:ST.mode==='op'?.05:0)-ST.lean)*Math.min(1,dt*8);\n  ST.pan+=((ST.mode==='op'?1:0)-ST.pan)*Math.min(1,dt*9);\n  \/\/ frames\n  const c=Math.cos(ST.hd),s=Math.sin(ST.hd),F=[c,s,0],Sd=[-s,c,0],Up=[0,0,1];\n  const lc=Math.cos(ST.lean),ls=Math.sin(ST.lean),F2=[F[0]*lc,F[1]*lc,-ls],U2=[F[0]*ls,F[1]*ls,lc];\n  const idleB=Math.sin(now*2.2)*.008*(1-w);\n  \/\/ legs (forward kinematics, running cycle)\n  const ank=[];let minZ=9;\n  const lg=legs.map(it=>{const sg=it.sg,phi=ST.ph+(sg>0?0:Math.PI),A=.86*w,tt=A*Math.sin(phi),fl=1.2*w*Math.max(0,Math.cos(phi)),ts=tt-fl,\n   hip=[0,sg*.15,HZ],kn=[hip[0]+Math.sin(tt)*L1,hip[1],hip[2]-Math.cos(tt)*L1],an=[kn[0]+Math.sin(ts)*L2,hip[1],kn[2]-Math.cos(ts)*L2];minZ=Math.min(minZ,an[2]);return {it,hip,kn,an,fl,tt}});\n  const drop=Math.max(0,minZ-.08)+Math.abs(Math.sin(ST.ph))*.025*w+idleB;\n  const org=[ST.x,ST.y,-drop*SZ];\n  const lw=(a,b,cc)=>[org[0]+(F[0]*a+Sd[0]*b)*SZ,org[1]+(F[1]*a+Sd[1]*b)*SZ,org[2]+cc*SZ];\n  const uw=(a,b,cc)=>{const dz=cc-PIV,A=a*lc+dz*ls,C=PIV+dz*lc-a*ls;return lw(A,b,C)};\n  \/\/ ground shadow + contact AO\n  {const p=iso(ST.x+.12*SZ,ST.y+.07*SZ,0),r=.78*K*SZ;shadow.setAttribute('cx',f1(p[0]));shadow.setAttribute('cy',f1(p[1]));shadow.setAttribute('rx',f1(r));shadow.setAttribute('ry',f1(r*.58));\n   lg.forEach((l,i)=>{const gp=pr(lw(l.an[0]+.04,l.hip[1],0)),h=Math.max(0,l.an[2]-drop-.08),e=ao[i];e.setAttribute('cx',f1(gp[0]));e.setAttribute('cy',f1(gp[1]));e.setAttribute('rx',f1(.17*K*SZ*(1-Math.min(.5,h*1.5))));e.setAttribute('ry',f1(.17*K*SZ*.58*(1-Math.min(.5,h*1.5))));e.setAttribute('opacity',(.45*Math.max(0,1-h*2.6)).toFixed(2))})}\n  lg.forEach(l=>{const it=l.it,H=lw(...l.hip),Kn=lw(...l.kn),An=lw(...l.an),heel=lw(l.an[0]-.05,l.hip[1],l.an[2]-.01),toe=lw(l.an[0]+.17,l.hip[1],l.an[2]-.03-l.fl*.05);\n   it.th(H,Kn,.10);it.sh(Kn,An,.088);it.bt(heel,toe,.09);it.d=d3(Kn,VW)});\n  \/\/ torso (hips are legs-side, shirt and straps follow the lean)\n  const TC=lw(0,0,1.0),TD=d3(TC,VW),frontUp=d3(F2,VW)>0;\n  hips.dr(lw(0,0,.86),[F,Sd,Up],[.155*SZ,.265*SZ,.155*SZ],'#2563EB',1);hips.d=TD;\n  const sc=uw(0,0,1.17);shirt.dr(sc,[F2,Sd,U2],[.158*SZ,.285*SZ,.165*SZ],'#f4f7fb',1);shirt.d=TD+.001;\n  stripe.dr(lw(0,0,.985),[F,Sd,Up],[.162*SZ,.272*SZ,.03*SZ],'#22D3EE',1.15);stripe.d=TD+.002;\n  [[strapR,-1],[strapL,1]].forEach(([it,sg])=>{const p=uw(0,sg*.135,1.13);it.dr(p,[F2,Sd,U2],[.168*SZ,.04*SZ,.2*SZ],'#2563EB',1);it.d=TD+.003});\n  {const p=uw(.165,0,1.04);bib.dr(p,[F2,Sd,U2],[.016*SZ,.13*SZ,.13*SZ],'#2f6df0',1.02);bib.d=frontUp?TD+.004:TD-.2;\n   const q=uw(.19,.07,1.09);pocket.dr(q,[F2,Sd,U2],[.012*SZ,.05*SZ,.045*SZ],'#1d4ed8',1);pocket.d=frontUp?TD+.005:TD-.2}\n  \/\/ look target (needs head position)\n  const Hc=uw(.02,0,1.56);\n  \/\/ button position of the holo panel (in front of him)\n  const pc=lw(.55,ST.opSg*.12,1.1),pn=Math.max(0,ST.pan);\n  \/\/ arms\n  const sw=Math.sin(ST.ph);\n  arms.forEach(it=>{const sg=it.sg,phi=ST.ph+(sg>0?Math.PI:0),sh=uw(0,sg*.315,1.23);\n   const al=.78*w*Math.sin(phi)+.05*Math.sin(now*1.6+sg)*(1-w)+(sg!==ST.opSg?.3*pn:0),be=.3+.45*w+(sg!==ST.opSg?.45*pn:0),ga=al+be;\n   const e0=[Math.sin(al)*AU,sg*.345,1.23-Math.cos(al)*AU];let el=uw(e0[0],e0[1],e0[2]),wr=uw(e0[0]+Math.sin(ga)*AF,sg*.345,e0[2]-Math.cos(ga)*AF);\n   if(sg===ST.opSg&&pn>.01){ \/\/ two-bone IK to the button, with a press stroke\n    const press=Math.max(0,Math.sin(ST.opT*TAU2*1.6)),tgt=ad(pc,ml(F,-.02*SZ-press*.05*SZ)),v=sb(tgt,sh),dd=Math.min(Math.hypot(v[0],v[1],v[2]),(AU+AF)*SZ*.995),dir=nz(v),aa=(dd*dd+(AU*SZ)**2-(AF*SZ)**2)\/(2*dd),h=Math.sqrt(Math.max(0,(AU*SZ)**2-aa*aa)),dn=[0,0,-1],pole=nz(ad(sb(dn,ml(dir,d3(dn,dir))),ml(Sd,.5*sg)));\n    const ie=ad(ad(sh,ml(dir,aa)),ml(pole,h)),iw=ad(sh,ml(dir,dd)),k=easeIO(Math.min(1,pn));\n    el=ad(ml(el,1-k),ml(ie,k));wr=ad(ml(wr,1-k),ml(iw,k))}\n   it.u(sh,el,.082);it.f(el,wr,.072);const hp=pr(wr),hr=.085*K*SZ;it.h.setAttribute('cx',f1(hp[0]));it.h.setAttribute('cy',f1(hp[1]));it.h.setAttribute('r',f1(hr));it.d=d3(ml(ad(el,wr),.5),VW)});\n  \/\/ ---- head: look direction, eased and clamped to a plausible neck range\n  let LD=nz(ad(BL,ad(ml(ER,Math.sin(now*.5)*.22),ml(EU,Math.sin(now*.37)*.08))));\n  const idleLook=LD;\n  if(!rm){\n   const noIn=!PT.has||(PT.touch&&performance.now()-PT.t>5000);\n   if(!noIn&&ST.hpos){const dx=PT.x-ST.hpos[0],dy=PT.y-ST.hpos[1],dist=Math.hypot(dx,dy),phi=cl(dist\/260,0,1)*1.45,ux=dist>1?dx\/dist:0,uy=dist>1?dy\/dist:0;\n    LD=nz(ad(ml(BL,Math.cos(phi)),ml(ad(ml(ER,ux),[0,0,-uy*1.1]),Math.sin(phi))))}\n   \/\/ while pressing the button he looks at it\n   ST.lw+=((ST.mode==='op'?1:0)-ST.lw)*Math.min(1,dt*7);\n   if(ST.lw>.01){const mt=nz(sb(pc,Hc));LD=nz(ad(ml(LD,1-ST.lw),ml(mt,ST.lw)))}}\n  const lf=d3(LD,F),ls2=d3(LD,Sd),lu=d3(LD,Up);let yT=Math.atan2(ls2,lf),pT=Math.asin(cl(lu,-1,1));\n  const YL=1.4;\n  if(ST.mode==='idle'&&!rm&&Math.abs(yT)>.95){ST.hdT=ST.hd+(yT-Math.sign(yT)*.95);ST.turnK=2.2} \/\/ body follows when the neck is maxed out\n  const hk=1-Math.exp(-dt*12);\n  ST.hy+=(cl(yT,-YL,YL)-ST.hy)*(rm?1:hk);ST.hp+=(cl(pT,-.42,.7)-ST.hp)*(rm?1:hk);\n  const cy=Math.cos(ST.hy),sy=Math.sin(ST.hy),cp=Math.cos(ST.hp),sp=Math.sin(ST.hp);\n  let Hf=ad(ml(F2,cy),ml(Sd,sy)),Hs=ad(ml(Sd,cy),ml(F2,-sy));const Hu0=U2;\n  const Hf2=ad(ml(Hf,cp),ml(Hu0,sp)),Hu=ad(ml(Hu0,cp),ml(Hf,-sp));\n  const roll=ST.hy*.08,Hs2=nz(ad(ml(Hs,Math.cos(roll)),ml(Hu,Math.sin(roll)))),Hu2=nz(ad(ml(Hu,Math.cos(roll)),ml(Hs,-Math.sin(roll))));\n  drawHead(head,Hc,Hf2,Hs2,Hu2,LD,dt,rm);head.d=d3(Hc,VW)+.002;\n  \/\/ keep head pos on screen (client px) for the cursor\n  {const m=world.getScreenCTM();if(m){const p=pr(Hc);ST.hpos=[m.a*p[0]+m.c*p[1]+m.e,m.b*p[0]+m.d*p[1]+m.f]}}\n  \/\/ ---- holo panel\n  {const it=panel,ctr=lw(.55,ST.opSg*.12,1.1),nn=nz([-F[0]+.8,-F[1]+.8,0]),PW=[-nn[1],nn[0],0],W2=.30*SZ*pn,H2=.21*SZ*pn;\n   if(pn<.02){it.g.setAttribute('visibility','hidden')}else{it.g.setAttribute('visibility','visible');it.g.setAttribute('opacity',pn.toFixed(2));\n    const c4=[ad(ad(ctr,ml(PW,W2)),ml(Up,H2)),ad(sb(ctr,ml(PW,W2)),ml(Up,-H2)),sb(sb(ctr,ml(PW,W2)),ml(Up,H2)),sb(ad(ctr,ml(PW,W2)),ml(Up,H2))].map(pr);\n    it.fr.setAttribute('points',c4.map(q=>f1(q[0])+','+f1(q[1])).join(' '));\n    [-.5,0,.5].forEach((o,i)=>{const a=pr(ad(ad(ctr,ml(PW,-W2*.8)),ml(Up,H2*(o+.15)))),b=pr(ad(ad(ctr,ml(PW,W2*(i===1?.3:.55))),ml(Up,H2*(o+.15))));const l=it.ln[i];l.setAttribute('x1',f1(a[0]));l.setAttribute('y1',f1(a[1]));l.setAttribute('x2',f1(b[0]));l.setAttribute('y2',f1(b[1]))});\n    const on=Math.floor(ST.opT*5)%2===0,cc=on?'#34d399':T.acc,pp=(ST.opT*2)%1,nb=d3(nn,VW)<0?ml(nn,-1):nn;\n    it.bt.setAttribute('fill',cc);it.gw.setAttribute('fill',cc);it.gw.setAttribute('opacity',on?.5:.15);\n    const bp=ad(ctr,ml(F,-.0));decal(it.bt,bp,nb,.055*pn);decal(it.hl,ad(bp,ml(Up,.02)),nb,.018*pn);decal(it.gw,bp,nb,.12*pn);decal(it.ring,bp,nb,(.06+pp*.16)*pn);it.ring.setAttribute('opacity',(1-pp).toFixed(2))}\n   it.d=d3(ctr,VW)+.01}\n  \/\/ draw order\n  const ord=items.slice().sort((a,b)=>a.d-b.d),sig=ord.map(i=>i.id).join();\n  if(sig!==ST.sig){ST.sig=sig;ord.forEach(i=>op.appendChild(i.g))}\n  place()}\n \/\/ ---- head drawing: skull sphere, face decals that follow the look direction, visor, hard hat\n function drawHead(it,Hc,Hf,Hs,Hu,LD,dt,rm){\n  const R=HR*SZ,pc=pr(Hc),rp=R*K;\n  const setC=(el,p,r)=>{el.setAttribute('cx',f1(p[0]));el.setAttribute('cy',f1(p[1]));el.setAttribute('r',f1(r))};\n  setC(it.hc,pc,rp);\n  const dirOf=(lat,el)=>ad(ad(ml(Hf,Math.cos(el)*Math.cos(lat)),ml(Hs,Math.cos(el)*Math.sin(lat))),ml(Hu,Math.sin(el)));\n  const onS=(d,k)=>ad(Hc,ml(d,R*(k||1.0)));\n  \/\/ ears: only the one on the camera side shows\n  {const sd=d3(Hs,VW)>0?Hs:ml(Hs,-1),vv=Math.abs(d3(Hs,VW));it.eB.setAttribute('visibility','hidden');if(vv>.12){const e=ad(Hc,ad(ml(sd,R*1.0),ml(Hu,-.02*SZ)));it.eF.setAttribute('visibility','visible');setC(it.eF,pr(e),.06*K*SZ)}else it.eF.setAttribute('visibility','hidden')}\n  \/\/ hair at the back of the head\n  {const bd=nz(ad(ml(Hf,-1),ml(Hu,-.1)));decal(it.hair,onS(bd,.99),bd,.22*1,1);}\n  \/\/ face (only when the front of the head is toward the camera)\n  const lf=ml(Hf,1);const fv=d3(lf,VW);\n  const vis=fv>-.05;\n  [it.nose,it.mouth,it.vis,it.vsh].forEach(e=>e.setAttribute('visibility',fv>.02?'visible':'hidden'));\n  \/\/ look residual for the pupils\n  const res=sb(LD,ml(Hf,d3(LD,Hf))),rl=Math.min(.16,Math.hypot(res[0],res[1],res[2])*.5),resN=nz(res);\n  it.blink=(it.blink||0);ST.nextBlink-=dt;if(ST.nextBlink<0){it.blink=.14;ST.nextBlink=2.4+Math.random()*3.2}if(it.blink>0)it.blink-=dt;const bf=it.blink>0?Math.max(.12,Math.abs(it.blink-.07)\/.07):1;\n  [1,-1].forEach((sg,i)=>{const de=dirOf(sg*.37,-.1),pe=onS(de,1.0),ok=d3(de,VW)>.03;\n   if(!ok){it.ew[i].setAttribute('visibility','hidden');it.pp[i].setAttribute('visibility','hidden');it.gl[i].setAttribute('visibility','hidden');return}\n   decal(it.ew[i],pe,de,.075,bf);\n   const dp=nz(ad(de,ml(resN,rl))),pp=onS(dp,1.012);decal(it.pp[i],pp,dp,.043,bf);const gp=onS(nz(ad(dp,ml(Hu,.03))),1.02);decal(it.gl[i],ad(gp,ml(Hs,-sg*.012*SZ)),dp,.014,bf)});\n  [1,-1].forEach((sg,i)=>{const dd=dirOf(sg*.62,-.42);decal(it.bl[i],onS(dd,1),dd,.07,1)});\n  {const dd=dirOf(0,-.2);decal(it.nose,onS(dd,1.02),dd,.05,1)}\n  \/\/ mouth + visor sampled on the sphere surface\n  const samp=(pts,k)=>pts.map(([lat,el])=>{const d=dirOf(lat,el);return d3(d,VW)>.02?pr(onS(d,k)):null});\n  {const m=[];for(let i=0;i<=6;i++){const lat=-.26+i*.52\/6,u=lat\/.26;m.push([lat,-.58-.1*(1-u*u)])}\n   const pts=samp(m,1.01);const seg=pts.filter(Boolean);it.mouth.setAttribute('d',seg.length>2?'M'+seg.map(q=>f1(q[0])+','+f1(q[1])).join('L'):'')}\n  {const top=[],bot=[];for(let i=0;i<=8;i++){const lat=-.78+i*1.56\/8;top.push([lat,.30-.05*Math.abs(lat\/.78)]);bot.push([-lat,-.34+.05*Math.abs(lat\/.78)])}\n   const pts=samp(top.concat(bot),1.045).filter(Boolean);it.vis.setAttribute('d',pts.length>4?'M'+pts.map(q=>f1(q[0])+','+f1(q[1])).join('L')+'Z':'');\n   const hl=samp([[-.55,.22],[-.3,.26],[-.1,.27]],1.05).filter(Boolean);it.vsh.setAttribute('d',hl.length>1?'M'+hl.map(q=>f1(q[0])+','+f1(q[1])).join('L'):'')}\n  \/\/ ---- hard hat\n  const Cb=ad(Hc,ml(Hu,.15*SZ)),cb=pr(Cb),up=sb(pr(ad(Cb,Hu)),cb),ul=Math.hypot(up[0],up[1])||1,uh=[up[0]\/ul,up[1]\/ul];\n  const vU=Math.abs(d3(Hu,VW));\n  const mA=[uh[1],-uh[0]],mAng=Math.atan2(mA[1],mA[0])*180\/Math.PI;\n  const ellipseAt=(el,center,rr,sq)=>{const p=pr(center);el.setAttribute('transform','translate('+f1(p[0])+' '+f1(p[1])+') rotate('+f1(mAng)+')');el.setAttribute('rx',f1(rr*K));el.setAttribute('ry',f1(rr*K*vU*(sq||1)))};\n  const brR=.335*SZ;\n  ellipseAt(it.brT,sb(Cb,ml(Hu,.035*SZ)),brR,1);ellipseAt(it.br,Cb,brR,1);\n  \/\/ peak (front visor of the hat)\n  ellipseAt(it.pkT,ad(sb(Cb,ml(Hu,.035*SZ)),ml(Hf,.28*SZ)),.12*SZ,1);ellipseAt(it.pk,ad(Cb,ml(Hf,.28*SZ)),.12*SZ,1);\n  const front=d3(Hf,VW)>0;if(front!==pkFront){pkFront=front;if(front)it.g.insertBefore(it.pkG,it.dm.nextSibling);else it.g.insertBefore(it.pkG,it.br.nextSibling)}\n  \/\/ dome = upper half of a sphere above the brim plane\n  {const Rh=.295*SZ,Rp=Rh*K,A1=[cb[0]+mA[0]*Rp,cb[1]+mA[1]*Rp],A2=[cb[0]-mA[0]*Rp,cb[1]-mA[1]*Rp],sw=(mA[0]*uh[1]-mA[1]*uh[0])>0?1:0;\n   it.dm.setAttribute('d','M'+f1(A1[0])+','+f1(A1[1])+'A'+f1(Rp)+','+f1(Rp)+' 0 0 '+sw+' '+f1(A2[0])+','+f1(A2[1])+'A'+f1(Rp)+','+f1(Rp*vU)+' '+f1(mAng)+' 0 '+sw+' '+f1(A1[0])+','+f1(A1[1])+'Z');\n   \/\/ highlight on the upper-left of the dome\n   const hp=[cb[0]+uh[0]*Rp*.52+LX*Rp*.28,cb[1]+uh[1]*Rp*.52+LY*Rp*.28];it.dh.setAttribute('transform','translate('+f1(hp[0])+' '+f1(hp[1])+') rotate(-38)');it.dh.setAttribute('rx',f1(Rp*.2));it.dh.setAttribute('ry',f1(Rp*.1));\n   \/\/ ridge along the top, front to back\n   const rp=[];for(let i=0;i<=10;i++){const a=i\/10*Math.PI,d=ad(ml(Hf,Math.cos(a)),ml(Hu,Math.sin(a)));if(d3(d,VW)>.12){const q=pr(ad(Cb,ml(d,Rh*1.0)));rp.push(q)}}\n   it.rg.setAttribute('d',rp.length>2?'M'+rp.map(q=>f1(q[0])+','+f1(q[1])).join('L'):'');\n   \/\/ lamp on the front of the hat\n   const ld=nz(ad(ml(Hf,.9),ml(Hu,.38)));if(d3(ld,VW)>.1){const q=pr(ad(Cb,ml(ld,Rh*1.02)));setC(it.lamp,q,.045*K*SZ);it.lamp.setAttribute('visibility','visible')}else it.lamp.setAttribute('visibility','hidden')}\n }\n \/\/ ---- initial pose\n frame(0,true);\n return {go,frame,setSZ:v=>{SZ=v},get SZ(){return SZ}};\n })();\n const go=OPR.go;\n \/\/ ---- reject kicker + firework\n const FL=.8,FWD=1.5,PCOL=['#F59E0B','#22D3EE','#ff6fb1','#7CFC8A','#ffffff','#a78bfa','#fcd34d'],NP=48;\n const rjs=REJ.map((bi,k)=>{\n  const sh=mk('ellipse',{rx:6,ry:2.4,fill:'rgba(0,0,0,.4)',opacity:0},fxL);\n  const bt=mk('g',{class:'rj-clone',opacity:0},fxL),bi2=mk('g',{transform:'translate(0 12)'},bt);bottle(bi2,REJC);\n  const fw=mk('g',{class:'rj-fw',opacity:0,style:'filter:drop-shadow(0 0 5px rgba(255,255,255,.85))'},fxL),flash=mk('circle',{r:4,fill:'#fff'},fw),ring=mk('circle',{r:4,fill:'none',stroke:'#fff','stroke-width':2},fw);\n  const ps=Array.from({length:NP},()=>mk('circle',{r:2,fill:'#fff'},fw));\n  return {bi,sh,bt,fw,flash,ring,ps,cyc:-1,pv:[],hid:null,c:[0,0]}});\n const seedR=n=>{let s=n*9301+49297;return()=>((s=(s*9301+49297)%233280)\/233280)};\n function frameRej(t,dt){const bgop=parseFloat(bg.style.opacity);const live=!(bgop<.6);let ext=0,pa=0;\n  rjs.forEach(r=>{const f=((t+r.bi*BDUR\/BN)%BDUR)\/BDUR,s=((f-FK+1)%1)*BDUR,hideLen=(1-FK)*BDUR;\n   const cyc=Math.floor((t+r.bi*BDUR\/BN-FK*BDUR)\/BDUR);\n   \/\/ original bottle: gone from the kick until it wraps round to the start of the belt\n   const gone=s<hideLen&&live;let fade=1;\n   if(rmq.matches&&live&&s>BDUR-.6)fade=Math.max(0,(BDUR-s)\/.6);\n   const g=btls[r.bi];if(r.hid!==gone){r.hid=gone;g.setAttribute('visibility',gone?'hidden':'visible')}\n   g.setAttribute('opacity',fade.toFixed(2));\n   if(rmq.matches||!live){r.sh.setAttribute('opacity',0);r.bt.setAttribute('opacity',0);r.fw.setAttribute('opacity',0);return}\n   \/\/ kicker: windup before the bottle arrives, hit, retract\n   const sx=s>BDUR-.22?s-BDUR:s;let e=0;\n   if(sx<0)e=easeO((sx+.22)\/.22);else if(sx<.14)e=1+.35*easeO(sx\/.14);else if(sx<.3)e=1.35;else if(sx<.75)e=1.35*(1-easeIO((sx-.3)\/.45));\n   if(e>ext){ext=e;pa=sx>=0&&sx<.45?1-sx\/.45:0}\n   if(s<FL){const u=s\/FL,x=RX-.35*u,y=6-2.3*easeO(u),z=.9+.5*u+1.4*4*u*(1-u);const [px,py]=iso(x,y,z),[gx,gy]=iso(x,y,0);\n    r.bt.setAttribute('transform',`translate(${px.toFixed(1)} ${(py-12).toFixed(1)}) rotate(${(u*560).toFixed(0)})`);r.bt.setAttribute('opacity',1);\n    r.sh.setAttribute('cx',gx.toFixed(1));r.sh.setAttribute('cy',gy.toFixed(1));r.sh.setAttribute('opacity',(.45*(1-u*.7)).toFixed(2));r.sh.setAttribute('rx',(6*(1-u*.4)).toFixed(1));\n    r.fw.setAttribute('opacity',0);r.c=[px,py-12]}\n   else if(s<FL+FWD){const tt=s-FL;r.bt.setAttribute('opacity',0);r.sh.setAttribute('opacity',0);\n    if(r.cyc!==cyc){r.cyc=cyc;const R=seedR(cyc*13+r.bi*7+1);r.pv=r.ps.map((p,i)=>{const a=(i\/NP)*TAU2+R()*.5,sp=(i%2?90:150)+R()*95;return{vx:Math.cos(a)*sp,vy:Math.sin(a)*sp,c:PCOL[Math.floor(R()*PCOL.length)],r:i%3===0?4.8:3.4,tw:R()*6}})}\n    const L=FWD,k=2.0,gr=110,[cx,cy]=r.c;r.fw.setAttribute('opacity',1);\n    r.flash.setAttribute('cx',cx.toFixed(1));r.flash.setAttribute('cy',cy.toFixed(1));r.flash.setAttribute('r',(6+tt*80).toFixed(1));r.flash.setAttribute('opacity',Math.max(0,.95-tt*5).toFixed(2));\n    r.ring.setAttribute('cx',cx.toFixed(1));r.ring.setAttribute('cy',cy.toFixed(1));r.ring.setAttribute('r',(6+easeO(Math.min(1,tt\/.55))*70).toFixed(1));r.ring.setAttribute('opacity',Math.max(0,.8-tt*1.6).toFixed(2));r.ring.setAttribute('stroke',tt<.2?'#fff':PCOL[(r.bi)%PCOL.length]);\n    r.ps.forEach((p,i)=>{const v=r.pv[i],d=(1-Math.exp(-k*tt))\/k,lf=tt\/L;\n     p.setAttribute('cx',(cx+v.vx*d).toFixed(1));p.setAttribute('cy',(cy+v.vy*d+gr*tt*tt\/2).toFixed(1));p.setAttribute('r',Math.max(.2,v.r*(1-lf*.8)).toFixed(2));p.setAttribute('fill',v.c);\n     p.setAttribute('opacity',Math.max(0,(1-lf*lf)*(.65+.35*Math.sin(tt*38+v.tw))).toFixed(2))})}\n   else{r.bt.setAttribute('opacity',0);r.sh.setAttribute('opacity',0);r.fw.setAttribute('opacity',0)}});\n  rej.set(live?ext:0,pa)}\n \/\/ ---- loop: runs only while the plant is on screen\n let raf=0,last=0;\n function tick(ts){raf=requestAnimationFrame(tick);const dt=Math.min(.05,last?(ts-last)\/1000:.016);last=ts;OPR.frame(rmq.matches?0:dt,rmq.matches);frameRej(svg.getCurrentTime?svg.getCurrentTime():ts\/1000,dt)}\n function start(){if(!raf){last=0;raf=requestAnimationFrame(tick)}}function stop(){cancelAnimationFrame(raf);raf=0}\n mq.addEventListener?mq.addEventListener('change',()=>{OPR.setSZ(mq.matches?1.4:1)}):0;\n frameRej(svg.getCurrentTime?svg.getCurrentTime():0,0);\n if(window.IntersectionObserver)new IntersectionObserver(es=>es.forEach(e=>e.isIntersecting?start():stop()),{threshold:0}).observe(el);else start();\n\/\/ progress \/ camera\n const centres=ORDER.map(id=>[hs[id].x,hs[id].y+60]);\n function setProgress(p,camera){\n  const idx=p*6;\n  pipeEls.forEach((pe,k)=>{const f=Math.max(0,Math.min(1,idx-k));pe.f.setAttribute('stroke-dasharray',`${f*100} 200`);pe.fl.setAttribute('opacity',f>0?.9:0)});\n  bg.style.opacity=idx>=5?1:Math.max(0,idx-4.2);\n  if(camera){const a=Math.min(5.999,idx),i0=Math.floor(a),t=a-i0,A=centres[i0],B=centres[i0+1],c=[A[0]+(B[0]-A[0])*t,A[1]+(B[1]-A[1])*t],k=o.zoom||1.7;\n   camK=k;fitHits();cam.style.transform=`translate(${400-c[0]*k}px,${275-c[1]*k}px) scale(${k})`;\n   $$('.hs',svg).forEach(e=>e.classList.toggle('near',e.dataset.id===ORDER[Math.round(idx)]))}\n  else{camK=1;fitHits();cam.style.transform='none'}\n  return ORDER[Math.min(6,Math.round(idx))]}\n svg.addEventListener('click',()=>hide());el.addEventListener('keydown',e=>{if(e.key==='Escape')hide()});document.addEventListener('click',e=>{if(cur&&!pop.contains(e.target)&&!(e.target.closest&&(e.target.closest('.hs')||e.target.closest('#stl')||e.target.closest('.pstrip')||e.target.closest('.plant-zoom'))))hide()});\n setProgress(o.progress==null?1:o.progress,o.camera);\n return {show,hide,go,setProgress,INFO,ORDER,hs,svg,pop};\n}\nreturn {mount,INFO,ORDER};\n})();\n\nwindow.RIB={ids:['lp-top','lp-equipment','lp-plant','lp-services','lp-industries','lp-cta'],xd:[.8,.04,.96,.04,.96,.04],xm:[.9,.03,.97,.03,.97,.03]};\n$('#drops').innerHTML=[...Array(10)].map((_,i)=>`<i class=\"drop\" style=\"--x:${5+i*10}%;--d:${8+i%4*3}s;animation-delay:-${i*1.3}s\"><\/i>`).join('');\n$('#drops').style.cssText='position:absolute;left:0;right:0;top:0;bottom:0;overflow:hidden;pointer-events:none';\n\/* equipment pebbles *\/\nconst G=[['store','Storage, mixing & fermentation','Tanks, vats and mixing stations for blending, ageing and fermenting.'],['homog','Homogenising & emulsifying','High-pressure homogenising for smooth, stable product.'],['heat','Heat treatment','Pasteurisers and UHT systems. Contact our sales team.'],['fill','Filling, dosing & packing','Cups, bottles and aseptic packs, with LN2 dosing.'],['clean','Cleaning & CIP','Washdown and CIP. Contact our sales team.'],['flow','Transfer & flow control','Pumps, valves, fittings and filtration.'],['insp','Inspection & rejection','Leak, vacuum and fill-level checks with auto-reject.'],['lines','Complete process lines','Whole lines by product, from raw material to filled pack.']];\n$('#peb').innerHTML=G.map((g,i)=>`<a href=\"\/2016\/processing-equipment\/#cat-${g[0]}\" class=\"pb rv\"><i class=\"fill\"><\/i><i class=\"fill f2\"><\/i><span class=\"n\">${g[0]==='lines'?'+':'0'+(i+1)}<\/span><div class=\"ic\"><svg viewBox=\"0 0 24 24\">${IC[g[0]]}<\/svg><\/div><h3>${g[1]}<\/h3><p>${g[2]}<\/p><span class=\"go\">${ARROW}<\/span><\/a>`).join('');\n\/* services *\/\nconst SV=[['Application & selection','We match equipment to your product, capacity and hygiene needs before you commit.'],['Installation & commissioning','Positioning, piping, start-up and operator hand-over, so the line runs from day one.'],['Spares','Seals, impellers, gaskets, plates and wear parts, supplied locally.'],['Maintenance & overhauls','Scheduled servicing and rebuilds to keep your equipment in working order.'],['Refurbished equipment','Restored, tested equipment when budget matters.']];\n$('#nodes').innerHTML=SV.map((s,i)=>`<div class=\"nd\" data-i=\"${i}\" tabindex=\"0\" role=\"button\"><i>0${i+1}<\/i><span>${s[0]}<\/span><\/div>`).join('');\nfunction sv(i){$$('.nd').forEach((n,k)=>n.classList.toggle('on',k==i));$('#sdet').innerHTML=`<div><span class=\"mono\">Service 0${i+1}<\/span><h3>${SV[i][0]}<\/h3><p>${SV[i][1]}<\/p><\/div><div class=\"acts\"><a class=\"btn pri\" href=\"https:\/\/www.lp-equipment.com.my\/2016\/?page_id=1230\">Ask about this \u2192<\/a><a class=\"btn ln\" href=\"\/2016\/our-services\/#s${i+1}\">Read more<\/a><\/div>`}\n$$('.nd').forEach(n=>{n.onclick=()=>sv(+n.dataset.i);n.onmouseenter=()=>sv(+n.dataset.i);n.onkeydown=e=>{if(e.key==='Enter'||e.key===' '){e.preventDefault();sv(+n.dataset.i)}}});sv(2);\n\/* marquee *\/\nconst IN=['Dairy','Juice & beverage','Brewery','Sauces & food','Pharma & personal care','Packaging lines'];\nconst row=a=>[...a,...a,...a,...a].map(x=>`<span>${x}<\/span>`).join('');\n$('#mq1').innerHTML=row(IN);$('#mq2').innerHTML=row([...IN].reverse());\n\/* plant *\/\nconst pl=Plant.mount($('#plantHost'),{progress:0,theme:{},cta:'https:\/\/www.lp-equipment.com.my\/2016\/?page_id=1230',onSelect:id=>{$$('#stl button').forEach(b=>b.classList.toggle('on',b.dataset.id===id));$$('#pstrip li').forEach(l=>l.classList.toggle('on',l.dataset.id===id))},onHide:()=>{$$('#stl button').forEach(b=>b.classList.remove('on'));$$('#pstrip li').forEach(l=>l.classList.remove('on'))}});\n$('#stl').innerHTML=Object.entries(pl.INFO).map(([id,i])=>`<button data-id=\"${id}\"><b>${i.n}<\/b>${i.cat}<\/button>`).join('');\nconst STEPS=[['tank','Mix'],['pump','Pump'],['filter','Filter'],['homog','Homogenise'],['heat','Heat'],['fill','Fill'],['inspect','Inspect'],['cip','Clean']];\n$('#pstrip').innerHTML=STEPS.map(([id,t],i)=>`<li data-id=\"${id}\"${id==='cip'?' class=\"loop\"':''}><button type=\"button\" data-id=\"${id}\"${id==='cip'?' aria-label=\"Clean in place, a return loop\"':''}><b>${id==='cip'?'\\u21ba':i+1}<\/b>${t}<\/button><\/li>`).join('');\n$$('#pstrip button').forEach(b=>b.onclick=()=>{pl.show(b.dataset.id);pl.go(b.dataset.id)});\n$$('#stl button').forEach(b=>b.onclick=()=>{pl.show(b.dataset.id);pl.go(b.dataset.id)});\nconst tb=$('.tankbox'),lvl=$('#lvl');\nfunction pscroll(){if(SHOT)return;const r=tb.getBoundingClientRect(),p=Math.max(0,Math.min(1,(innerHeight*.85-r.top)\/(innerHeight*.75)));pl.setProgress(p);lvl.style.setProperty('--p',p);$('#lvlt').textContent=Math.round(p*100)+'%'}\naddEventListener('scroll',pscroll,{passive:true});\nif(SHOT){pl.setProgress(1);lvl.style.setProperty('--p',1);$('#lvlt').textContent='100%'}else pscroll();\n\/* in-page anchors (\"Watch it flow\" etc.): our own smooth scroll to the target, keeps the hash, lands correctly even if the page height shifts while scrolling (fix 2026-11-04) *\/\nlet sa=0;const stopSA=()=>cancelAnimationFrame(sa);['wheel','touchstart','keydown'].forEach(ev=>addEventListener(ev,stopSA,{passive:true}));\nfunction smoothTo(t,off){stopSA();const y0=scrollY,d=Math.min(1100,Math.max(450,Math.abs(t.getBoundingClientRect().top+scrollY-off-y0)*.3)),t0=performance.now(),still=matchMedia('(prefers-reduced-motion:reduce)').matches;\n const step=n=>{const k=still?1:Math.min(1,(n-t0)\/d),e=k<.5?4*k*k*k:1-Math.pow(-2*k+2,3)\/2,y=t.getBoundingClientRect().top+scrollY-off;scrollTo({top:y0+(y-y0)*e,behavior:'instant'});if(k<1)sa=requestAnimationFrame(step)};sa=requestAnimationFrame(step)}\n$$('a[href^=\"#\"]').forEach(a=>a.addEventListener('click',e=>{const id=decodeURIComponent(a.getAttribute('href').slice(1)),t=id&&document.getElementById(id);if(!t)return;e.preventDefault();smoothTo(t,24);if(history.replaceState)history.replaceState(null,'','#'+id)}));\nreveal();\n})();\n<\/script>\n<\/div>\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\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>LP Equipment HomeProcessing EquipmentServicesIndustriesContact Request a quote HomeProcessing EquipmentServicesIndustriesContactLPEQUIPMENT@GMAIL.COM \u00b7 03-5525 3071 Processing equipment \u00b7 Shah Alam, Malaysia Let your process flow. Mixing, homogenising, heat treatment, filling, cleaning and inspection equipment that keeps product moving, hygienic and under control. Selected, installed and serviced by our local team. See the processing equipmentWatch it flow \u2193 SelectedInstalledServiced [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"page-builder","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-1208","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Processing Equipment Supplier in Shah Alam | LP Equipment - LP Equipment<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lp-equipment.com.my\/2016\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Processing Equipment Supplier in Shah Alam | LP Equipment - LP Equipment\" \/>\n<meta property=\"og:description\" content=\"LP Equipment HomeProcessing EquipmentServicesIndustriesContact Request a quote HomeProcessing EquipmentServicesIndustriesContactLPEQUIPMENT@GMAIL.COM \u00b7 03-5525 3071 Processing equipment \u00b7 Shah Alam, Malaysia Let your process flow. Mixing, homogenising, heat treatment, filling, cleaning and inspection equipment that keeps product moving, hygienic and under control. Selected, installed and serviced by our local team. See the processing equipmentWatch it flow \u2193 SelectedInstalledServiced [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lp-equipment.com.my\/2016\/\" \/>\n<meta property=\"og:site_name\" content=\"LP Equipment\" \/>\n<meta property=\"article:modified_time\" content=\"2026-11-04T02:11:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lp-equipment.com.my\/2016\/wp-content\/uploads\/2026\/11\/og-lp-equipment.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lp-equipment.com.my\\\/2016\\\/\",\"url\":\"https:\\\/\\\/www.lp-equipment.com.my\\\/2016\\\/\",\"name\":\"Processing Equipment Supplier in Shah Alam | LP Equipment - LP Equipment\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lp-equipment.com.my\\\/2016\\\/#website\"},\"datePublished\":\"2026-11-04T01:07:09+00:00\",\"dateModified\":\"2026-11-04T02:11:06+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lp-equipment.com.my\\\/2016\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lp-equipment.com.my\\\/2016\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lp-equipment.com.my\\\/2016\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lp-equipment.com.my\\\/2016\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Processing Equipment Supplier in Shah Alam | LP Equipment\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lp-equipment.com.my\\\/2016\\\/#website\",\"url\":\"https:\\\/\\\/www.lp-equipment.com.my\\\/2016\\\/\",\"name\":\"LP Equipment\",\"description\":\"Processing Equipment for Liquid Products\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lp-equipment.com.my\\\/2016\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Processing Equipment Supplier in Shah Alam | LP Equipment - LP Equipment","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lp-equipment.com.my\/2016\/","og_locale":"en_US","og_type":"article","og_title":"Processing Equipment Supplier in Shah Alam | LP Equipment - LP Equipment","og_description":"LP Equipment HomeProcessing EquipmentServicesIndustriesContact Request a quote HomeProcessing EquipmentServicesIndustriesContactLPEQUIPMENT@GMAIL.COM \u00b7 03-5525 3071 Processing equipment \u00b7 Shah Alam, Malaysia Let your process flow. Mixing, homogenising, heat treatment, filling, cleaning and inspection equipment that keeps product moving, hygienic and under control. Selected, installed and serviced by our local team. See the processing equipmentWatch it flow \u2193 SelectedInstalledServiced [&hellip;]","og_url":"https:\/\/www.lp-equipment.com.my\/2016\/","og_site_name":"LP Equipment","article_modified_time":"2026-11-04T02:11:06+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lp-equipment.com.my\/2016\/wp-content\/uploads\/2026\/11\/og-lp-equipment.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lp-equipment.com.my\/2016\/","url":"https:\/\/www.lp-equipment.com.my\/2016\/","name":"Processing Equipment Supplier in Shah Alam | LP Equipment - LP Equipment","isPartOf":{"@id":"https:\/\/www.lp-equipment.com.my\/2016\/#website"},"datePublished":"2026-11-04T01:07:09+00:00","dateModified":"2026-11-04T02:11:06+00:00","breadcrumb":{"@id":"https:\/\/www.lp-equipment.com.my\/2016\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lp-equipment.com.my\/2016\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lp-equipment.com.my\/2016\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lp-equipment.com.my\/2016\/"},{"@type":"ListItem","position":2,"name":"Processing Equipment Supplier in Shah Alam | LP Equipment"}]},{"@type":"WebSite","@id":"https:\/\/www.lp-equipment.com.my\/2016\/#website","url":"https:\/\/www.lp-equipment.com.my\/2016\/","name":"LP Equipment","description":"Processing Equipment for Liquid Products","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lp-equipment.com.my\/2016\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/www.lp-equipment.com.my\/2016\/wp-json\/wp\/v2\/pages\/1208","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lp-equipment.com.my\/2016\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lp-equipment.com.my\/2016\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lp-equipment.com.my\/2016\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lp-equipment.com.my\/2016\/wp-json\/wp\/v2\/comments?post=1208"}],"version-history":[{"count":39,"href":"https:\/\/www.lp-equipment.com.my\/2016\/wp-json\/wp\/v2\/pages\/1208\/revisions"}],"predecessor-version":[{"id":1321,"href":"https:\/\/www.lp-equipment.com.my\/2016\/wp-json\/wp\/v2\/pages\/1208\/revisions\/1321"}],"wp:attachment":[{"href":"https:\/\/www.lp-equipment.com.my\/2016\/wp-json\/wp\/v2\/media?parent=1208"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}