let k=(t,e)=>n.hypot(e[0]-t[0],e[1]-t[1]),p=(t,e)=>n.atan2(e[1]-t[1],e[0]-t[0]),c=a.getContext("2d"),o=t=>c.moveTo(t[0],t[1]),l=(t,e)=>{o(t),c.lineTo(e[0],e[1])},t=t=>t.slice(2,4),h=26,w=300,g=a.width,j=a.height,u=[],m=[0,0],tk=0,n=Math,r=()=>n.random()*j,dn=(t,e,a)=>{let i=p(t,e);t[4]-=n.cos(i)*a,t[5]-=n.sin(i)*a},q=150,i=3;a.addEventListener("mousemove",t=>m=[t.clientX,t.clientY]),a="JS1024",c.font=h+"px Arial",c.fillText(a,0,20);for(let t=g/2-7*c.measureText(a).width/2,e=c.getImageData(0,0,w,h).data;-1<e[i+=4];)0<e[i]&&u.push([r(),r(),t+i/4%w*7,j/2+i/4/w*7,0,0,[]]);u.forEach(e=>e[6]=u.filter(a=>e!=a&&15>k(t(e),t(a)))),c.fillStyle="#0000001a",c.strokeStyle="#ffffff1a";const dr=()=>{tk++,c.fillRect(0,0,g,j),c.beginPath(),u.forEach(e=>{let a=k(e,m),i=k(e,t(e));a<q&&dn(e,m,tk%q*n.log10(a)),i&&dn(e,t(e),-i/100*(tk%q/q)),e[0]+=e[4]*=.85,e[1]+=e[5]*=.85,1<i&&e[6].filter(t=>k(t,e)<q).forEach(t=>l(e,t)),o(e),(r=(()=>c.rect(e[0],e[1],3,3)))(),1<i&&(r(),r())}),c.stroke(),window.requestAnimationFrame(dr)};dr();