UNPKG

phy-engine

Version:

JavaScript 3D Physics for three.js

1 lines 2.88 MB
!function(A,g){"object"==typeof exports&&"undefined"!=typeof module?g(exports):"function"==typeof define&&define.amd?define(["exports"],g):g((A="undefined"!=typeof globalThis?globalThis:A||self).HAVOK={})}(this,(function(A){"use strict";const g=new Map,I=new Map,B=new Map,Q={Ar:null,ArPos:{},needTrigger:!1,needContact:!1,world:null,bodyRef:null,queryCollector:null,timestep:1/60,delta:0,ms:0,deltaTime:0,tmpStep:0,substep:1,key:[],gravity:[0,9.81,0],reflow:{ray:[],point:{},contact:{},velocity:{},stat:{fps:0,delta:0,ms:0}}},C={clear:()=>{g.clear(),I.clear(),B.clear()},byName:A=>g.has(A)?g.get(A):null,byId:A=>I.has(A)?I.get(A):null,add:A=>{"ray"!==A.type&&"contact"!==A.type&&"terrain"!==A.type&&"joint"!==A.type&&A.type,"body"!==A.type&&"solid"!==A.type||I.set(A[0],A),g.set(A.name,A)},remove:A=>{if("ray"!==A.type&&"contact"!==A.type)switch(A.type){case"terrain":A.release();break;case"joint":havok.HP_Constraint_SetEnabled(A,!1),havok.HP_Constraint_Release(A);break;default:havok.HP_World_RemoveBody(Q.world,A),havok.HP_Body_Release(A)}g.delete(A.name)},stats:()=>{},extends:()=>{},byContact:A=>!!B.has(A),clearContact:()=>{B.clear()},addContact:(A,g={})=>{B.set(A,g)},removeContact:A=>{B.delete(A)}},E=4e3,D=1e3,w=4e3,i=100,o=100,F={bodyFull:14,body:8,joint:16,contact:1,ray:11,character:16,vehicle:72,solver:128},G=Math.PI,M=G/180,H=180/G,U=Number.EPSILON,S=.5*G,R={luminousPowers:{"110000 lm (1000W)":11e4,"3500 lm (300W)":3500,"1700 lm (100W)":1700,"800 lm (60W)":800,"400 lm (40W)":400,"180 lm (25W)":180,"20 lm (4W)":20,Off:0},luminousIrradiances:{"0.0001 lx (Moonless Night)":1e-4,"0.002 lx (Night Airglow)":.002,"0.5 lx (Full Moon)":.5,"3.4 lx (City Twilight)":3.4,"50 lx (Living Room)":50,"100 lx (Very Overcast)":100,"350 lx (Office Room)":350,"400 lx (Sunrise/Sunset)":400,"1000 lx (Overcast)":1e3,"18000 lx (Daylight)":18e3,"50000 lx (Direct Sun)":5e4},exposure:A=>Math.pow(A,5),candelaToLumens:A=>4*A*Math.PI,lumensToCandela:A=>A/(4*Math.PI),todeg:H,torad:M,toFixed:(A,g=3)=>1*A.toFixed(g),toRound:(A,g=3)=>Math.trunc(A),clamp:(A,g=0,I=1)=>A=(A=A<g?g:A)>I?I:A,clampA:(A,g,I)=>Math.max(g,Math.min(I,A)),smoothstep:(A,g,I)=>A*(I=-2*(I=R.clamp(I))*I*I+3*I*I)+g*(1-I),remap:(A,g,I,B,Q)=>B+(A-g)*(Q-B)/(I-g),lerp:(A,g,I)=>(1-I)*A+I*g,damp:(A,g,I,B)=>R.lerp(A,g,1-Math.exp(-I*B)),nearAngle:(A,g,I=!1)=>g+Math.atan2(Math.sin(A-g),Math.cos(A-g))*(I?H:1),unwrapDeg:A=>A-360*Math.floor((A+180)/360),unwrapRad:A=>Math.atan2(Math.sin(A),Math.cos(A)),nearEquals:(A,g,I=1e-4)=>Math.abs(A-g)<=I,autoSize:(A=[1,1,1],g="box")=>{1===A.length&&(A[1]=A[0]);let I=A[0],B=A[1];return"sphere"===g&&(A=[I,I,I]),"cylinder"!==g&&"wheel"!==g&&"capsule"!==g||(A=[I,B,I]),"cone"!==g&&"pyramid"!==g||(A=[I,B,I]),2===A.length&&(A[2]=A[0]),A},shuffle:A=>A.map((A=>({value:A,sort:Math.random()}))).sort(((A,g)=>A.sort-g.sort)).map((({value:A})=>A)),randomSign:()=>Math.random()<.5?-1:1,randSpread:A=>A*(.5-Math.random()),rand:(A=0,g=1)=>A+Math.random()*(g-A),randInt:(A,g)=>A+Math.floor(Math.random()*(g-A+1)),randIntUnic:(A,g,I)=>{for(var B=[];B.length<I;){var Q=R.randInt(A,g);-1===B.indexOf(Q)&&B.push(Q)}return B},fromTransform:(A,g,I,B=[0,0,0,1],Q=!1)=>{let C=R.composeMatrixArray(A,g),E=R.composeMatrixArray(I,B);return Q&&(C=R.invertMatrixArray(C)),C=R.multiplyMatrixArray(C,E),[C[12],C[13],C[14]]},fromTransformToQ:(A,g,I=!1)=>{let B=R.composeMatrixArray(A,g),Q=R.decomposeFullMatrixArray(B).q;return I&&(Q=R.quatInvert(Q)),Q},lerpTransform:(A,g,I)=>{let B=A[0],Q=A[1],C=g[0],E=g[1];return C=R.lerpArray(B,C,I),E=R.slerpQuatArray(Q,E,I),[C,E]},composeMatrixArray:(A,g,I=[1,1,1])=>{const B=g[0],Q=g[1],C=g[2],E=g[3],D=B+B,w=Q+Q,i=C+C,o=B*D,F=B*w,G=B*i,M=Q*w,H=Q*i,U=C*i,S=E*D,R=E*w,N=E*i,k=I[0],y=I[1],K=I[2];return[(1-(M+U))*k,(F+N)*k,(G-R)*k,0,(F-N)*y,(1-(o+U))*y,(H+S)*y,0,(G+R)*K,(H-S)*K,(1-(o+M))*K,0,A[0],A[1],A[2],1]},multiplyMatrixArray:(A,g)=>{const I=A,B=g,Q=[],C=I[0],E=I[4],D=I[8],w=I[12],i=I[1],o=I[5],F=I[9],G=I[13],M=I[2],H=I[6],U=I[10],S=I[14],R=I[3],N=I[7],k=I[11],y=I[15],K=B[0],Y=B[4],s=B[8],L=B[12],J=B[1],h=B[5],c=B[9],a=B[13],P=B[2],f=B[6],e=B[10],q=B[14],T=B[3],x=B[7],d=B[11],v=B[15];return Q[0]=C*K+E*J+D*P+w*T,Q[4]=C*Y+E*h+D*f+w*x,Q[8]=C*s+E*c+D*e+w*d,Q[12]=C*L+E*a+D*q+w*v,Q[1]=i*K+o*J+F*P+G*T,Q[5]=i*Y+o*h+F*f+G*x,Q[9]=i*s+o*c+F*e+G*d,Q[13]=i*L+o*a+F*q+G*v,Q[2]=M*K+H*J+U*P+S*T,Q[6]=M*Y+H*h+U*f+S*x,Q[10]=M*s+H*c+U*e+S*d,Q[14]=M*L+H*a+U*q+S*v,Q[3]=R*K+N*J+k*P+y*T,Q[7]=R*Y+N*h+k*f+y*x,Q[11]=R*s+N*c+k*e+y*d,Q[15]=R*L+N*a+k*q+y*v,Q},invertMatrixArray:A=>{const g=A,I=g[0],B=g[1],Q=g[2],C=g[3],E=g[4],D=g[5],w=g[6],i=g[7],o=g[8],F=g[9],G=g[10],M=g[11],H=g[12],U=g[13],S=g[14],R=g[15],N=F*S*i-U*G*i+U*w*M-D*S*M-F*w*R+D*G*R,k=H*G*i-o*S*i-H*w*M+E*S*M+o*w*R-E*G*R,y=o*U*i-H*F*i+H*D*M-E*U*M-o*D*R+E*F*R,K=H*F*w-o*U*w-H*D*G+E*U*G+o*D*S-E*F*S,Y=I*N+B*k+Q*y+C*K;if(0===Y)return[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];const s=1/Y;return g[0]=N*s,g[1]=(U*G*C-F*S*C-U*Q*M+B*S*M+F*Q*R-B*G*R)*s,g[2]=(D*S*C-U*w*C+U*Q*i-B*S*i-D*Q*R+B*w*R)*s,g[3]=(F*w*C-D*G*C-F*Q*i+B*G*i+D*Q*M-B*w*M)*s,g[4]=k*s,g[5]=(o*S*C-H*G*C+H*Q*M-I*S*M-o*Q*R+I*G*R)*s,g[6]=(H*w*C-E*S*C-H*Q*i+I*S*i+E*Q*R-I*w*R)*s,g[7]=(E*G*C-o*w*C+o*Q*i-I*G*i-E*Q*M+I*w*M)*s,g[8]=y*s,g[9]=(H*F*C-o*U*C-H*B*M+I*U*M+o*B*R-I*F*R)*s,g[10]=(E*U*C-H*D*C+H*B*i-I*U*i-E*B*R+I*D*R)*s,g[11]=(o*D*C-E*F*C-o*B*i+I*F*i+E*B*M-I*D*M)*s,g[12]=K*s,g[13]=(o*U*Q-H*F*Q+H*B*G-I*U*G-o*B*S+I*F*S)*s,g[14]=(H*D*Q-E*U*Q-H*B*w+I*U*w+E*B*S-I*D*S)*s,g[15]=(E*F*Q-o*D*Q+o*B*w-I*F*w-E*B*G+I*D*G)*s,g},matrixArrayDeterminant:A=>{const g=A,I=g[0],B=g[4],Q=g[8],C=g[12],E=g[1],D=g[5],w=g[9],i=g[13],o=g[2],F=g[6],G=g[10],M=g[14];return g[3]*(+C*w*F-Q*i*F-C*D*G+B*i*G+Q*D*M-B*w*M)+g[7]*(+I*w*M-I*i*G+C*E*G-Q*E*M+Q*i*o-C*w*o)+g[11]*(+I*i*F-I*D*M-C*E*F+B*E*M+C*D*o-B*i*o)+g[15]*(-Q*D*o-I*w*F+I*D*G+Q*E*F-B*E*G+B*w*o)},decomposeMatrixArray:A=>[A[12],A[13],A[14]],decomposeFullMatrixArray:A=>{const g=A;let I=R.lengthArray([g[0],g[1],g[2]]);const B=R.lengthArray([g[4],g[5],g[6]]),Q=R.lengthArray([g[8],g[9],g[10]]);R.matrixArrayDeterminant(A)<0&&(I=-I);let C=[...A];const E=1/I,D=1/B,w=1/Q;C[0]*=E,C[1]*=E,C[2]*=E,C[4]*=D,C[5]*=D,C[6]*=D,C[8]*=w,C[9]*=w,C[10]*=w;let i=R.quatFromRotationMatrix(C);return{p:[A[12],A[13],A[14]],q:i,s:[I,B,Q]}},applyTransformArray:(A,g,I,B=[1,1,1])=>{const Q=R.composeMatrixArray(g,I,B),C=A[0],E=A[1],D=A[2],w=1/(Q[3]*C+Q[7]*E+Q[11]*D+Q[15]);return[(Q[0]*C+Q[4]*E+Q[8]*D+Q[12])*w,(Q[1]*C+Q[5]*E+Q[9]*D+Q[13])*w,(Q[2]*C+Q[6]*E+Q[10]*D+Q[14])*w]},slerpQuatArray:(A,g,I)=>{if(0===I)return A;if(1===I)return g;let B=[...A];const Q=A[0],C=A[1],E=A[2],D=A[3],w=g[0],i=g[1],o=g[2],F=g[3];let G=D*F+Q*w+C*i+E*o;if(G<0?(B=[-w,-i,-o,-F],G=-G):B=[...g],G>=1)return A;const M=1-G*G;if(M<=U){const A=1-I;return B[3]=A*D+I*B[3],B[0]=A*Q+I*B[0],B[1]=A*C+I*B[1],B[2]=A*E+I*B[2],R.quatNomalize(B)}const H=Math.sqrt(M),S=Math.atan2(H,G),N=Math.sin((1-I)*S)/H,k=Math.sin(I*S)/H;return B[3]=D*N+B[3]*k,B[0]=Q*N+B[0]*k,B[1]=C*N+B[1]*k,B[2]=E*N+B[2]*k,B},toLocalQuatArray:(A=[0,0,0],g)=>{let I=R.quatFromEuler(A),B=R.quatInvert(g.quaternion.toArray());return R.quatMultiply(B,I)},quatFromRotationMatrix:A=>{let g=[0,0,0,1];const I=A,B=I[0],Q=I[4],C=I[8],E=I[1],D=I[5],w=I[9],i=I[2],o=I[6],F=I[10],G=B+D+F;if(G>0){const A=.5/Math.sqrt(G+1);g[3]=.25/A,g[0]=(o-w)*A,g[1]=(C-i)*A,g[2]=(E-Q)*A}else if(B>D&&B>F){const A=2*Math.sqrt(1+B-D-F);g[3]=(o-w)/A,g[0]=.25*A,g[1]=(Q+E)/A,g[2]=(C+i)/A}else if(D>F){const A=2*Math.sqrt(1+D-B-F);g[3]=(C-i)/A,g[0]=(Q+E)/A,g[1]=.25*A,g[2]=(w+o)/A}else{const A=2*Math.sqrt(1+F-B-D);g[3]=(E-Q)/A,g[0]=(C+i)/A,g[1]=(w+o)/A,g[2]=.25*A}return g},quatFromEuler:(A=[0,0,0],g=!0)=>{const I=Math.cos,B=Math.sin,Q=g?M:1,C=A[0]*Q*.5,E=A[1]*Q*.5,D=A[2]*Q*.5,w=I(C),i=I(E),o=I(D),F=B(C),G=B(E),H=B(D);return[F*i*o+w*G*H,w*G*o-F*i*H,w*i*H+F*G*o,w*i*o-F*G*H]},quatFromAxis:(A=[0,0,0],g,I=!0)=>{const B=.5*g*(I?M:1),Q=Math.sin(B);return[A[0]*Q,A[1]*Q,A[2]*Q,Math.cos(B)]},quatNomalize:A=>{let g=R.lengthArray(A);return 0===g?[0,0,0,1]:(g=1/g,R.scaleArray(A,g,4))},quatInvert:A=>[-A[0],-A[1],-A[2],A[3]],quatMultiply:(A,g)=>{const I=A[0],B=A[1],Q=A[2],C=A[3],E=g[0],D=g[1],w=g[2],i=g[3];return[I*i+C*E+B*w-Q*D,B*i+C*D+Q*E-I*w,Q*i+C*w+I*D-B*E,C*i-I*E-B*D-Q*w]},quatToAxis:A=>{let g=2*Math.acos(A[3]);const I=Math.sqrt(1-A[3]*A[3]);return I<1e-4?[1,0,0]:[A[0]/I,A[1]/I,A[2]/I,g]},eulerFromMatrix:A=>{const g=A[0],I=A[4],B=A[8];A[1];const Q=A[5],C=A[9];A[2];const E=A[6],D=A[10];let w=[0,0,0];return w[1]=Math.asin(R.clamp(B,-1,1)),Math.abs(B)<.9999999?(w[0]=Math.atan2(-C,D),w[2]=Math.atan2(-I,g)):(w[0]=Math.atan2(E,Q),w[2]=0),w},angleTo:(A,g)=>2*Math.acos(Math.abs(R.clamp(R.dotArray(A,g),-1,1))),fixedArray:(A,g)=>{let I=A.length,B=[];for(;I--;)B[I]=R.toFixed(A[I],g);return B},getSize:A=>.001*A.byteLength+"kb",perpendicularArray:A=>{const g=Math.sqrt(A[0]*A[0]+A[1]*A[1]+A[2]*A[2]);let I=Math.acos(A[1]/g);const B=Math.atan2(A[2],A[0]);I>S?I-=S:I+=S;return[g*Math.sin(I)*Math.cos(B),g*Math.cos(I),g*Math.sin(I)*Math.sin(B)]},crossArray:(A,g)=>{const I=A[0],B=A[1],Q=A[2],C=g[0],E=g[1],D=g[2];return[B*D-Q*E,Q*C-I*D,I*E-B*C]},applyQuaternion:(A,g)=>{const I=A[0],B=A[1],Q=A[2],C=g[0],E=g[1],D=g[2],w=g[3],i=2*(E*Q-D*B),o=2*(D*I-C*Q),F=2*(C*B-E*I);return[I+w*i+E*F-D*o,B+w*o+D*i-C*F,Q+w*F+C*o-E*i]},nullArray:(A,g,I)=>{let B=0;for(;I--;)B+=A[g+I];return B},equalArray:(A,g)=>{let I=A.length;for(;I--;)if(A[I]!==g[I])return!1;return!0},lerpArray:(A,g,I)=>{if(0===I)return A;if(1===I)return g;let B=A.length,Q=[];for(;B--;)Q[B]=A[B],Q[B]+=(g[B]-Q[B])*I;return Q},zeroArray:(A,g=0,I)=>{for(I=I??A.length;I--;)A[g+I]=0;return A},lengthArray:A=>{let g=A.length,I=0;for(;g--;)I+=A[g]*A[g];return Math.sqrt(I)},dotArray:(A,g)=>{let I=A.length,B=0;for(;I--;)B+=A[I]*g[I];return B},addArray:(A,g,I)=>{I=I??A.length;let B=[];for(;I--;)B[I]=A[I]+g[I];return B},subArray:(A,g,I)=>{I=I??A.length;let B=[];for(;I--;)B[I]=A[I]-g[I];return B},mulArray:(A,g,I)=>{if(g instanceof Array){let B=[];for(I=I??A.length;I--;)B[I]=A[I]*g[I];return B}return A.map((A=>A*g))},worldscale:(A,g)=>A.map((A=>A*g)),divArray:(A,g,I)=>R.mulArray(A,1/g,I),scaleArray:(A,g,I)=>R.mulArray(A,g,I),fillArray:(A,g,I=0,B)=>{for(B=B??A.length;B--;)g[I+B]=A[B]},copyArray:(A,g)=>{},cloneArray:A=>[...A],distanceArray:(A,g=[0,0,0])=>R.lengthArray(R.subArray(A,g)),normalizeArray:A=>R.divArray(A,R.lengthArray(A)||1),normalArray:(A,g=[0,0,0])=>R.normalizeArray(R.subArray(g,A)),getCenter:(A,g)=>(A.computeBoundingBox(),A.boundingBox.getCenter(g)),getVolume:(A,g,I=null)=>{let B=1,Q=g;switch(A){case"sphere":B=4*Math.PI*Q[0]*Q[0]*Q[0]/3;break;case"cone":B=Math.PI*Q[0]*(.5*Q[1])*2;break;case"box":B=.5*Q[0]*8*(.5*Q[1])*(.5*Q[2]);break;case"cylinder":B=Math.PI*Q[0]*Q[0]*(.5*Q[1])*2;break;case"capsule":B=4*Math.PI*Q[0]*Q[0]*Q[0]/3+Math.PI*Q[0]*Q[0]*(.5*Q[1])*2;break;case"convex":case"mesh":B=R.getConvexVolume(I)}return B},getConvexVolume:A=>{let g,I=A.length/3,B=[0,0,0],Q=[0,0,0];for(;I--;)g=3*I,A[g]<B[0]?B[0]=A[g]:A[g]>Q[0]&&(Q[0]=A[g]),A[g+1]<B[1]?B[1]=A[g+1]:A[g+1]>Q[1]&&(Q[1]=A[g+1]),A[g+2]<B[2]?B[2]=A[g+2]:A[g+2]>Q[2]&&(Q[2]=A[g+2]);let C=[Q[0]-B[0],Q[1]-B[1],Q[2]-B[2]];return.5*C[0]*8*(.5*C[1])*(.5*C[2])},massFromDensity:(A,g)=>A*g,densityFromMass:(A,g)=>A/g,toNonIndexed:A=>A.index?A.clone().toNonIndexed():A,getIndex:(A,g)=>!A.index||g?null:A.index.array||null,getSameVertex:A=>{const g=A.getAttribute("position"),I=g.array,B=[],Q=[],C={};new THREE.Vector3;let E,D=0;R.getHash(A);let w,i,o=!1,F=0;for(let A=0;A<g.count;A++){D=3*A,w={x:I[D],y:I[D+1],z:I[D+2],id:A},o=!1,E=B.length;for(let g=0;g<E;g++)i=B[g],w.x===i.x&&w.y===i.y&&w.z===i.z&&(o=!0,C[A]=i.id);o||(w.id=F++,B.push(w),Q.push([w.x,w.y,w.z]))}return[Q,C]},getVertex:(A,g)=>{let I=A.attributes.position.array;return g&&A.index&&(I=(A=A.clone().toNonIndexed()).attributes.position.array),I},getNormal:A=>A.attributes.normal.array,getFaces:A=>{let g=[];if(A.index){let I=A.getIndex();for(let A=0;A<I.count;A+=3)g.push([I.getX(A),I.getX(A+1),I.getX(A+2)])}else{let I=A.getAttribute("position").count;for(let A=0;A<I;A+=3)g.push([A,A+1,A+2])}return g},getConnectedFaces:A=>{const g=[];let I,B,Q,C,E,D,w,i=A.length,o=i;for(;o--;)for(B=A[o],I=i;I--;)I!==o&&(Q=A[I],C=B.filter((A=>Q.includes(A))),C.length>1&&(w=[],E=[...B],D=E.indexOf(C[0]),E.splice(D,1),D=E.indexOf(C[1]),E.splice(D,1),w.push(E[0]),E=[...Q],D=E.indexOf(C[0]),E.splice(D,1),D=E.indexOf(C[1]),E.splice(D,1),w.push(E[0]),g.push(w)));return g},reduce:A=>{},barycentric:(A,g)=>{},solve:(A,g)=>{},getHash:(A,g=1e-4)=>{g=Math.max(g,Number.EPSILON);const I={},B={},Q=A.getAttribute("position"),C=Q.count,E=Q.array,D=.5*g,w=Math.log10(1/g),i=Math.pow(10,w),o=D*i;let F;for(let A=0;A<C;A++){F=3*A;let g=`${~~(E[F]*i+o)},${~~(E[F+1]*i+o)},${~~(E[F+2]*i+o)}`;I[g]?I[g].push(A):I[g]=[A]}let G=0;for(let A in I)B[G++]=I[A];return B}},N=R;class k{constructor(){this.id=0,this.list=[],this.type="item",this.Utils=null}reset(){let A=this.list.length;for(;A--;)this.dispose(this.list[A]);this.list=[],this.id=0}byName(A){return this.Utils.byName(A)}setName(A={}){let g=void 0!==A.name?A.name:this.type+this.id++;return A.id=this.remove(g,!0),A.name=g,g}addToWorld(A,g=-1){this.Utils.add(A),-1!==g?this.list[g]=A:this.list.push(A)}remove(A,g){let I=this.byName(A);return I?this.clear(I,g):-1}clear(A,g){let I=this.list.indexOf(A);return-1===I||g?this.list[I]=null:this.list.splice(I,1),this.dispose(A),I}dispose(A){null!==A&&this.Utils.remove(A)}add(A={}){}set(A={}){}step(A,g){}}class y extends k{constructor(){super(),this.Utils=C,this.type="ray"}step(){const A=Q.Ar,g=Q.ArPos[this.type];Q.reflow.ray=[];let I,B,E,D,w,i,o,G,M,H,U,S,R,k=this.list.length;for(;k--;)B=g+k*F.ray,I=this.list[k],w=I.getPoint(),o=-1,G=-1,M=!1,H=[BigInt(0)],D=[w[0],w[1],[-1,-1],false,H],A[B]=0,havok.HP_World_CastRayWithCollector(Q.world,Q.queryCollector,D),U=havok.HP_QueryCollector_GetNumHits(Q.queryCollector)[1],U>0&&(R=this.nearest(U,w[0]),i=R[1][3],S=R[1][4],R[1][5],A[B]=1,A[B+1]=N.distanceArray(w[0],i),A[B+2]=w[0][0],A[B+3]=w[0][1],A[B+4]=w[0][2],A[B+5]=i[0],A[B+6]=i[1],A[B+7]=i[2],A[B+8]=S[0],A[B+9]=S[1],A[B+10]=S[2],E=C.byId(R[1][0][0]),E&&(Q.reflow.ray[k]=E.name))}nearest(A,g){if(1===A)return havok.HP_QueryCollector_GetCastRayResult(Q.queryCollector,0)[1];let I,B,C,E=0,D=1/0,w=A;for(;w--;)I=havok.HP_QueryCollector_GetCastRayResult(Q.queryCollector,w)[1],B=I[1][3],C=N.distanceArray(g,B),C<D&&(D=C,E=I);return E}add(A={}){this.setName(A);let g=new K(A);this.addToWorld(g,A.id)}set(A={},g=null){null===g&&(g=this.byName(A.name)),null!==g&&(A.begin&&(g.begin=A.begin),A.end&&(g.end=A.end))}}class K{constructor(A={}){this.type="ray",this.name=A.name,this.parent=A.parent||"",this.selfHit=A.selfHit||!1,this.noRotation=A.noRotation||!1,this.begin=A.begin||[0,0,0],this.end=A.end||[0,0,1]}getPoint(){if(this.parent){const A=C.byName(this.parent);if(A){const g=havok.HP_Body_GetQTransform(A)[1],I=g[0],B=this.noRotation?[0,0,0,1]:g[1];return[N.applyTransformArray(this.begin,I,B),N.applyTransformArray(this.end,I,B)]}}return[this.begin,this.end]}}class Y extends k{constructor(){super(),this.Utils=C,this.type="body",this.itype="body",this.num=F[this.type],this.full=!1,this.kinematic={}}setFull(A){this.num=F[A?"bodyFull":"body"],this.full=A}reset(){this.kinematic={},super.reset()}clear(A,g){return A.isKinematic&&delete this.kinematic[A.name],super.clear(A,g)}postStep(){let A,g;for(let I in this.kinematic)A=this.kinematic[I],A.first?(g=A.transform,A.first=!1):(g=havok.HP_Body_GetQTransform(A)[1],havok.HP_Body_SetTargetQTransform(A,N.lerpTransform(g,A.transform,1/Q.substep)))}step(){const A=Q.Ar,g=Q.ArPos[this.itype];let I,B,C,E,D,w,i=this.list.length;for(;i--;)I=this.list[i],B=g+i*this.num,w=1===havok.HP_Body_GetActivationState(I)[1].value,A[B]=w?0:1,I.sleep||(C=havok.HP_Body_GetQTransform(I)[1],N.fillArray(C[0],A,B+1,3),N.fillArray(C[1],A,B+4,4),I.deepSleep&&(havok.HP_Body_SetActivationControl(I,havok.ActivationControl.SIMULATION_CONTROLLED),I.deepSleep=!1),this.full?(E=havok.HP_Body_GetLinearVelocity(I)[1],D=havok.HP_Body_GetAngularVelocity(I)[1],N.fillArray(E,A,B+8,3),N.fillArray(D,A,B+11,3),1===A[B]&&(A[B]=9.8*N.lengthArray(E))):I.getVelocity&&(E=havok.HP_Body_GetLinearVelocity(I)[1],D=havok.HP_Body_GetAngularVelocity(I)[1],Q.reflow.velocity[I.name]=[...E,...D]))}shape(A={}){let g,I,B,Q,C=A.type||"box",E=A.size||[1,1,1],D=A.localPos||[0,0,0],w=[D[0],D[1]-.5*E[1],D[2]],i=[D[0],D[1]+.5*E[1],D[2]],o=A.localQuat||[0,0,0,1];switch(C){case"plane":1===E[0]&&(E=[300,0,300]),E[1]=0,I=[.5*E[0],0,.5*E[2],.5*E[0],0,.5*-E[2],.5*-E[0],0,.5*-E[2],.5*-E[0],0,.5*E[2]],Q=this.getVertices(I),g=havok.HP_Shape_CreateConvexHull(Q.byteOffset,4)[1],havok._free(Q.byteOffset);break;case"box":g=havok.HP_Shape_CreateBox(D,o,E)[1];break;case"sphere":g=havok.HP_Shape_CreateSphere(D,E[0])[1];break;case"particle":g=havok.HP_Shape_CreateSphere(D,A.pSize)[1];break;case"cylinder":g=havok.HP_Shape_CreateCylinder(w,i,E[0])[1];break;case"capsule":g=havok.HP_Shape_CreateCapsule(w,i,E[0])[1];break;case"convex":B=Math.floor(A.v.length/3),Q=this.getVertices(A.v),g=havok.HP_Shape_CreateConvexHull(Q.byteOffset,B)[1],havok._free(Q.byteOffset);break;case"mesh":B=A.v.length/3,Q=this.getVertices(A.v);let C=A.index.length/3,F=this.getTriangles(A.index);g=havok.HP_Shape_CreateMesh(Q.byteOffset,B,F.byteOffset,C)[1],havok._free(Q.byteOffset),havok._free(F.byteOffset)}return A.density&&havok.HP_Shape_SetDensity(g,A.density),A.isTrigger&&havok.HP_Shape_SetTrigger(g,!0),this.setMaterial(g,A),this.setFilter(g,A),g.volume=void 0!==A.volume?A.volume:N.getVolume(C,E,A.v),g}getVertices(A){const g=A.length,I=4*g,B=havok._malloc(I),Q=new Float32Array(havok.HEAPU8.buffer,B,g);for(let I=0;I<g;I++)Q[I]=A[I];return Q}getTriangles(A,g=!1){const I=A.length,B=I/3,Q=4*I,C=havok._malloc(Q),E=new Int32Array(havok.HEAPU8.buffer,C,I);let D,w=B,i=0;for(;w--;)D=3*i,g?(E[D+0]=A[D+2],E[D+1]=A[D+1],E[D+2]=A[D+0]):(E[D+0]=A[D+0],E[D+1]=A[D+1],E[D+2]=A[D+2]),i++;return E}setFilter(A,g){g.mask||(g.mask=-1),g.group||(g.group="body"===this.type?1:2),havok.HP_Shape_SetFilterInfo(A,[g.group,g.mask])}setMaterial(A,g){const I=void 0!==g.friction?g.friction:.5,B=void 0!==g.staticFriction?g.staticFriction:I,Q=void 0!==g.restitution?g.restitution:0,C=g.frictionMode??"GEOMETRIC_MEAN",E=g.restitutionMode??"GEOMETRIC_MEAN",D=[B,I,Q,this.materialCombine(C),this.materialCombine(E)];havok.HP_Shape_SetMaterial(A,D)}materialCombine(A){switch(A){case"GEOMETRIC_MEAN":case"geo":return havok.MaterialCombine.GEOMETRIC_MEAN;case"MINIMUM":case"min":return havok.MaterialCombine.MINIMUM;case"MAXIMUM":case"max":return havok.MaterialCombine.MAXIMUM;case"ARITHMETIC_MEAN":case"num":return havok.MaterialCombine.ARITHMETIC_MEAN;case"MULTIPLY":case"mult":return havok.MaterialCombine.MULTIPLY}}add(A={}){let g=this.setName(A);const I="body"===this.type?A.kinematic?"KINEMATIC":"DYNAMIC":"STATIC";let B,C=havok.HP_Body_Create()[1];switch(A.type){case"null":B=havok.HP_Shape_CreateContainer()[1],havok.HP_Body_SetShape(C,B),this.applyMass(C,B,A);break;case"compound":let g;B=havok.HP_Shape_CreateContainer()[1];for(let I=0;I<A.shapes.length;I++){g=A.shapes[I],void 0!==A.density&&(g.density=A.density),void 0!==A.friction&&(g.friction=A.friction),void 0!==A.restitution&&(g.restitution=A.restitution),void 0!==A.mask&&(g.collisionMask=A.mask),void 0!==A.group&&(g.collisionGroup=A.group),g.localQuat&&delete g.localQuat,g.localPos&&delete g.localPos;let Q=[g.pos||[0,0,0],g.quat||[0,0,0,1],[1,1,1]];havok.HP_Shape_AddChild(B,this.shape(g),Q)}havok.HP_Body_SetShape(C,B),this.applyMass(C,B,A);break;default:A.shapeType&&(A.type=A.shapeType),B=this.shape(A),havok.HP_Body_SetShape(C,B),this.applyMass(C,B,A)}C.name=g,C.type=this.type,C.breakable=A.breakable||!1,C.trigger=A.isTrigger||!1,C.isKinematic=A.kinematic||!1,C.isKinematic&&(this.kinematic[C.name]=C,C.first=!0),C.button=A.button||!1,C.transform=[A.pos||[0,0,0],A.quat||[0,0,0,1]],C.isKinematic&&havok.HP_Body_SetTargetQTransform(C,C.transform),havok.HP_Body_SetQTransform(C,C.transform),A.pos&&delete A.pos,A.quat&&delete A.quat,A.mass&&delete A.mass,havok.HP_Body_SetMotionType(C,havok.MotionType[I]),void 0!==A.kinematic&&delete A.kinematic,havok.HP_World_AddBody(Q.world,C,A.sleep||!1),this.addToWorld(C,A.id),this.set(A,C)}applyMass(A,g,I){if("solid"===this.type)return;let B=[[0,0,0],1,[1,1,1],[0,0,0,1]];const Q=havok.HP_Body_GetShape(A);if(Q[0]==havok.Result.RESULT_OK){const A=havok.HP_Shape_BuildMassProperties(Q[1]);A[0]==havok.Result.RESULT_OK&&(B=A[1])}I.massCenter&&(B[0]=I.massCenter),void 0!==I.mass&&(B[1]=I.mass),I.inertia&&(B[2]=I.inertia),I.inertiaOrientation&&(B[3]=I.inertiaOrientation),havok.HP_Body_SetMassProperties(A,B)}setMassInfo(A,g){const I=havok.HP_Body_GetMassProperties(A)[1];g.linearFactor&&(I[2]=N.mulArray(I[2],g.linearFactor)),g.angularFactor&&(I[3]=N.mulArray(I[3],g.angularFactor)),g.massCenter&&(I[0]=g.massCenter),g.mass&&(I[1]=g.mass),g.inertia&&(I[2]=g.inertia),g.inertiaOrientation&&(I[3]=g.inertiaOrientation),havok.HP_Body_SetMassProperties(A,I)}getMassInfo(A){const g=havok.HP_Body_GetMassProperties(A)[1],I={centerOfMass:g[0],mass:g[1],inertia:g[2],inertiaOrientation:g[3],damping:[havok.HP_Body_GetLinearDamping(A)[1],havok.HP_Body_GetAngularDamping(A)[1]]};console.log(I)}set(A={},g=null){if(null===g&&(g=this.byName(A.name)),null!==g){if(void 0!==A.getVelocity&&(g.getVelocity=A.getVelocity),void 0!==A.kinematic&&(havok.HP_Body_SetMotionType(g,havok.MotionType[A.kinematic?"KINEMATIC":"DYNAMIC"]),g.isKinematic=A.kinematic,g.isKinematic?this.kinematic[g.name]=g:delete this.kinematic[g.name]),void 0!==A.gravityScale&&havok.HP_Body_SetGravityFactor(g,A.gravityScale),void 0!==A.gravityFactor&&havok.HP_Body_SetGravityFactor(g,A.gravityFactor),void 0!==A.gravity&&havok.HP_Body_SetGravityFactor(g,A.gravity?1:0),A.sleep&&(havok.HP_Body_SetActivationState(g,havok.ActivationState.INACTIVE),g.deepSleep=!0,havok.HP_Body_SetActivationControl(g,havok.ActivationControl.ALWAYS_INACTIVE)),(A.activate||A.wake)&&(havok.HP_Body_SetActivationControl(g,havok.ActivationControl.SIMULATION_CONTROLLED),havok.HP_Body_SetActivationState(g,havok.ActivationState.ACTIVE)),void 0!==A.neverSleep&&havok.HP_Body_SetActivationControl(g,A.neverSleep?havok.ActivationControl.ALWAYS_ACTIVE:havok.ActivationControl.SIMULATION_CONTROLLED),void 0!==A.alwaySleep&&havok.HP_Body_SetActivationControl(g,A.alwaySleep?havok.ActivationControl.ALWAYS_INACTIVE:havok.ActivationControl.SIMULATION_CONTROLLED),A.priority&&havok.HP_Body_SetActivationPriority(g,A.priority),A.pos||A.quat){let I;A.pos||(I=havok.HP_Body_GetQTransform(g)[1],A.pos=I[0]),A.quat||(I=havok.HP_Body_GetQTransform(g)[1],A.quat=I[1]),g.transform=[A.pos,A.quat],g.isKinematic||havok.HP_Body_SetQTransform(g,g.transform)}if(A.damping&&(havok.HP_Body_SetLinearDamping(g,A.damping[0]),havok.HP_Body_SetAngularDamping(g,A.damping[1])),A.force){let I=A.forceMode||"force",B=A.forcePosition?A.forcePosition:havok.HP_Body_GetPosition(g)[1];"force"===I&&(A.force=N.scaleArray(A.force,Q.timestep,3)),havok.HP_Body_ApplyImpulse(g,B,A.force)}A.impulse&&(A.impulseCenter?havok.HP_Body_ApplyImpulse(g,A.impulseCenter,A.impulse):havok.HP_Body_ApplyImpulse(g,havok.HP_Body_GetPosition(g)[1],A.impulse)),A.angularImpulse&&havok.HP_Body_ApplyAngularImpulse(g,A.angularImpulse),A.torque&&havok.HP_Body_ApplyAngularImpulse(g,A.torque),A.linearVelocity&&(A.linear=A.linearVelocity),A.angularVelocity&&(A.angular=A.angularVelocity),void 0!==A.velocityOperation?this.velocityOperation(A,g):(A.linear&&havok.HP_Body_SetLinearVelocity(g,A.linear),A.angular&&havok.HP_Body_SetAngularVelocity(g,A.angular)),A.reset&&(havok.HP_Body_SetLinearVelocity(g,[0,0,0]),havok.HP_Body_SetAngularVelocity(g,[0,0,0])),A.inertiaScale&&(A.linearFactor=A.inertiaScale),(A.linearFactor||A.angularFactor)&&this.setMassInfo(g,A),A.massInfo&&this.getMassInfo(g)}}velocityOperation(A,g){let I=havok.HP_Body_GetLinearVelocity(g)[1],B=havok.HP_Body_GetAngularVelocity(g)[1];switch(A.velocityOperation){case"xz":A.linear&&(I=[A.linear[0],I[1],A.linear[2]]);break;case"add":A.linear&&(I=N.addArray(I,A.linear,3)),A.angular&&(B=N.addArray(B,A.angular,3));break;case"sub":A.linear&&(I=N.subArray(I,A.linear,3)),A.angular&&(B=N.subArray(B,A.angular,3));break;case"multy":A.linear&&(I=N.mulArray(I,A.linear,3)),A.angular&&(B=N.mulArray(B,A.angular,3));break;case"lerp":A.linear&&(I=N.lerpArray(I,A.linear,A.time)),A.angular&&(B=N.lerpArray(B,A.angular,A.time));break;case"step":A.linear&&(I=N.mulArray(I,Q.substep)),A.angular&&(B=N.mulArray(B,Q.substep));break;case"local":let C=havok.HP_Body_GetQTransform(g)[1][1];A.linear&&(I=N.applyQuaternion(I,C)),A.angular&&(B=N.applyQuaternion(B,C))}havok.HP_Body_SetLinearVelocity(g,I),havok.HP_Body_SetAngularVelocity(g,B)}getBoundingBox(A){const g=havok.HP_Shape_GetBoundingBox(A,[[0,0,0],[0,0,0,1]])[1];return{min:[g[0][0],g[0][1],g[0][2]],max:[g[1][0],g[1][1],g[1][2]]}}addCollisionCallback(A,g){if(A.trigger){let I=havok.HP_Body_GetShape(A)[1];havok.HP_Shape_SetTrigger(I,g)}else{const I=havok.EventType.COLLISION_STARTED.value|havok.EventType.COLLISION_CONTINUED.value|havok.EventType.COLLISION_FINISHED.value;havok.HP_Body_SetEventMask(A,g?I:0)}}freeze(A,g){g?(havok.HP_Body_SetGravityFactor(A,0),havok.HP_Body_SetLinearVelocity(A,[0,0,0]),havok.HP_Body_SetAngularVelocity(A,[0,0,0]),A.sleep=!0):A.sleep&&(havok.HP_Body_SetGravityFactor(A,1),A.sleep=!1)}setShapes(A={},g=null){}}class s extends k{constructor(){super(),this.Utils=C,this.type="joint",this.LimitMode={FREE:havok.ConstraintAxisLimitMode.FREE,LIMITED:havok.ConstraintAxisLimitMode.LIMITED,LOCKED:havok.ConstraintAxisLimitMode.LOCKED},this.ConstraintAxis={LINEAR_X:havok.ConstraintAxis.LINEAR_X,LINEAR_Y:havok.ConstraintAxis.LINEAR_Y,LINEAR_Z:havok.ConstraintAxis.LINEAR_Z,ANGULAR_X:havok.ConstraintAxis.ANGULAR_X,ANGULAR_Y:havok.ConstraintAxis.ANGULAR_Y,ANGULAR_Z:havok.ConstraintAxis.ANGULAR_Z,LINEAR_DISTANCE:havok.ConstraintAxis.LINEAR_DISTANCE},this.MotorType={NONE:havok.ConstraintMotorType.NONE,VELOCITY:havok.ConstraintMotorType.VELOCITY,POSITION:havok.ConstraintMotorType.POSITION,SPRING_FORCE:havok.ConstraintMotorType.SPRING_FORCE,SPRING_ACCELERATION:havok.ConstraintMotorType.SPRING_ACCELERATION},this.convert={x:"LINEAR_X",y:"LINEAR_Y",z:"LINEAR_Z",rx:"ANGULAR_X",ry:"ANGULAR_Y",rz:"ANGULAR_Z",distance:"LINEAR_DISTANCE",twist:"ANGULAR_X",swing1:"ANGULAR_Y",swing2:"ANGULAR_Z",free:"FREE",locked:"LOCKED",limited:"LIMITED"},this.angulars=["ANGULAR_X","ANGULAR_Y","ANGULAR_Z","rx","ry","rz"]}step(){}crossVectors(A,g){const I=A[0],B=A[1],Q=A[2],C=g[0],E=g[1],D=g[2];return[B*D-Q*E,Q*C-I*D,I*E-B*C]}add(A={}){let g=this.setName(A);const I=havok.HP_Constraint_Create()[1];let B=this.byName(A.b1),Q=this.byName(A.b2);null!==B&&havok.HP_Constraint_SetParentBody(I,B),null!==Q&&havok.HP_Constraint_SetChildBody(I,Q);const C=A.pos1?A.pos1:[0,0,0],E=A.axis1?A.axis1:[1,0,0],D=N.perpendicularArray(E);havok.HP_Constraint_SetAnchorInParent(I,C,E,D);const w=A.pos2?A.pos2:[0,0,0],i=A.axis2?A.axis2:[1,0,0],o=N.perpendicularArray(i);havok.HP_Constraint_SetAnchorInChild(I,w,i,o);let F=A.mode||"hinge";switch(F){case"fixe":this.lock(I,["x","y","z","rx","ry","rz"]);break;case"hinge":this.lock(I,["x","y","z","ry","rz"]);break;case"prismatic":this.lock(I,["y","z","rx","ry","rz"]);break;case"cylindrical":this.lock(I,["y","z","ry","rz"]);break;case"spherical":case"generic":this.lock(I,["x","y","z"])}let G=void 0!==A.collision&&A.collision;havok.HP_Constraint_SetCollisionsEnabled(I,G),havok.HP_Constraint_SetEnabled(I,!0),I.name=g,I.type=this.type,I.mode=F,I.visible=void 0===A.visible||A.visible,this.set(A,I),this.addToWorld(I)}set(A={},g=null){if(null===g&&(g=this.byName(A.name)),null===g)return;let I;switch(this.ConstraintAxis,this.LimitMode,void 0!==A.enable&&havok.HP_Constraint_SetEnabled(g,A.enable),g.mode){case"hinge":A.limit&&this.setLimit(g,["rx",...A.limit]),A.spring&&this.setSpring(g,["rx",...A.spring]),A.motor&&this.setMotor(g,A.motor[1],A.motor[2],"ANGULAR_X"),void 0!==A.friction&&this.setFriction(g,A.friction,"ANGULAR_X");break;case"prismatic":A.limit&&this.setLimit(g,["x",...A.limit]),A.spring&&this.setSpring(g,["x",...A.spring]),A.friction&&this.setFriction(g,"x",A.friction);break;case"cylindrical":A.lm&&this.setLimit(g,["x",...A.lm]),A.lmr&&this.setLimit(g,["rx",...A.lmr]);break;case"spherical":A.lm&&(this.setLimit(g,["rx",...A.lm]),this.setLimit(g,["ry",...A.lm]),this.setLimit(g,["rz",...A.lm]));break;case"distance":A.limit&&this.setLimit(g,["distance",...A.limit]),A.spring&&this.setSpring(g,["distance",...A.spring]),A.friction&&this.setFriction(g,"distance",A.friction);break;case"generic":if(A.motion)for(I=A.motion.length;I--;)this.setLimitMode(g,this.convert[A.motion[I][0]],this.convert[A.motion[I][1]]);if(A.lm)for(I=A.lm.length;I--;)this.setLimit(g,A.lm[I]);if(A.motor)for(I=A.motor.length;I--;)this.setMotor(g,A.motor[I][1],A.motor[I][2],this.convert[A.motor[I][0]]);if(void 0!==A.friction){if(!A.friction instanceof Array){let g=A.friction;A.friction=[["x",g],["y",g],["z",g],["rx",g],["ry",g],["rz",g]]}for(I=A.friction.length;I--;)this.setFriction(g,A.friction[I][0],A.friction[I][1])}}}lock(A,g){let I=g.length;for(;I--;)havok.HP_Constraint_SetAxisMode(A,this.ConstraintAxis[this.convert[g[I]]],this.LimitMode.LOCKED)}setLimitMode(A,g,I){havok.HP_Constraint_SetAxisMode(A,this.ConstraintAxis[g],this.LimitMode[I])}setLimit(A,g){let I=-1!==this.angulars.indexOf(g[0])?M:1;const B=this.ConstraintAxis[this.convert[g[0]]];havok.HP_Constraint_SetAxisMode(A,B,this.LimitMode.LIMITED),havok.HP_Constraint_SetAxisMinLimit(A,B,g[1]*I),havok.HP_Constraint_SetAxisMaxLimit(A,B,g[2]*I),void 0!==g[3]&&havok.HP_Constraint_SetAxisStiffness(A,B,g[3]),void 0!==g[4]&&havok.HP_Constraint_SetAxisDamping(A,B,g[4])}setSpring(A,g){const I=this.ConstraintAxis[this.convert[g[0]]];void 0!==g[1]&&havok.HP_Constraint_SetAxisStiffness(A,I,g[1]),void 0!==g[2]&&havok.HP_Constraint_SetAxisDamping(A,I,g[2])}setFriction(A,g,I=0){const B=this.ConstraintAxis[this.convert[g]];havok.HP_Constraint_SetAxisFriction(A,B,I)}setMotor(A,g,I,B){let Q=-1!==this.angulars.indexOf(B)?M:1;const C=this.ConstraintAxis[B];havok.HP_Constraint_SetAxisMotorType(A,C,this.MotorType.VELOCITY),havok.HP_Constraint_SetAxisMotorTarget(A,C,g*Q),I&&havok.HP_Constraint_SetAxisMotorMaxForce(A,C,I)}}class L extends k{constructor(){super(),this.type="terrain",this.Utils=C}add(A){this.setName(A);let g=new J(A);this.addToWorld(g,A.id)}set(A={},g=null){null===g&&(g=this.byName(A.name)),null!==g&&g.set(A)}}class J{constructor(A){this.type="terrain",this.name=A.name,this.needUpdate=!1,this.heightField=null,this.geometry=null,this.heights=null,this.init(A)}init(A){this.size=A.size,this.sample=A.sample,this.squarSize=[this.size[0]/(this.sample[0]-1),this.size[2]/(this.sample[1]-1)],this.setData(A),this.body=havok.HP_Body_Create()[1],havok.HP_Body_SetShape(this.body,this.geometry);let g=A.pos||[0,0,0];havok.HP_Body_SetPosition(this.body,g),A.quat&&havok.HP_Body_SetOrientation(this.body,A.quat),havok.HP_World_AddBody(Q.world,this.body,!1)}setData(A){this.getVertices(A.heightData),this.divid=A.sample?A.sample:this.sample,this.scale=[this.squarSize[0],this.size[1],this.squarSize[1]],console.log(A.heightData.length,this.sample[0]*this.sample[1]),this.geometry=havok.HP_Shape_CreateHeightField(this.divid[0],this.divid[1],this.scale,this.heights.byteOffset)[1],havok._free(this.heights.byteOffset),this.setMaterial(this.geometry,A)}getVertices(A){if(!this.heights){const g=A.length,I=g*4,B=havok._malloc(I);this.heights=new Float32Array(havok.HEAPU8.buffer,B,g)}let g=A.length,I=0;for(;g--;)this.heights[g]=A[I],I++}setMaterial(A,g){if(!g.friction&&!g.restitution)return;if(.5===g.friction&&0===!g.restitution)return;const I=g.friction??.5,B=g.staticFriction??I,Q=g.restitution??0,C=g.frictionCombine??"MINIMUM",E=g.restitutionCombine??"MAXIMUM",D=[B,I,Q,this.materialCombine(C),this.materialCombine(E)];havok.HP_Shape_SetMaterial(A,D)}release(){havok.HP_World_RemoveBody(Q.world,this.body),havok.HP_Body_Release(this.body)}set(A){A.heightData&&(this.geometry&&havok.HP_Shape_Release(this.geometry),this.getVertices(A.heightData),this.geometry=havok.HP_Shape_CreateHeightField(this.divid[0],this.divid[1],this.scale,this.heights.byteOffset)[1],this.setMaterial(this.geometry,A),havok.HP_Body_SetShape(this.body,this.geometry))}}class h extends k{constructor(){super(),this.Utils=C,this.type="contact"}step(){const A=Q.Ar,g=Q.ArPos[this.type];let I,B,E,D=this.list.length;for(;D--;)I=this.list[D],B=g+D*F.contact,E=C.byContact(I.cc)?1:0,E||(E=C.byContact(I.cr)?1:0),A[B]=E}add(A={}){this.setName(A);let g=this.byName(A.b1);if(this.byName(A.b2),null===g)return;Q.bodyRef.addCollisionCallback(g,!0);let I=new f(A);this.addToWorld(I,A.id),Q.needContact=!0,Q.needTrigger=!0}}class c{constructor(){this.body=null,this.position=[0,0,0],this.normal=[0,0,0]}}class a{constructor(){this.contactOnA=new c,this.contactOnB=new c,this.impulseApplied=0,this.type=0}static readToRef(A,g,I){const B=new Int32Array(A,g),Q=new Float32Array(A,g);I.contactOnA.body=C.byId(BigInt(B[2])),I.contactOnA.position=[Q[10],Q[11],Q[12]],I.contactOnA.normal=[Q[13],Q[14],Q[15]];I.contactOnB.body=C.byId(BigInt(B[18])),I.contactOnB.position=[Q[26],Q[27],Q[28]],I.contactOnB.normal=[Q[29],Q[30],Q[31]],I.impulseApplied=Q[34],I.type=(A=>{let g="COLLISION_STARTED";switch(A){case havok.EventType.COLLISION_STARTED.value:g="COLLISION_STARTED";break;case havok.EventType.COLLISION_FINISHED.value:g="COLLISION_FINISHED";break;case havok.EventType.COLLISION_CONTINUED.value:g="COLLISION_CONTINUED"}return g})(B[0])}}class P{constructor(){this.bodyA=BigInt(0),this.bodyB=BigInt(0),this.type=0}static readToRef(A,g,I){const B=new Int32Array(A,g);I.type=(A=>{let g="TRIGGER_ENTERED";return 16===A&&(g="TRIGGER_EXITED"),g})(B[0]),I.bodyA=C.byId(BigInt(B[2])),I.bodyB=C.byId(BigInt(B[6]))}}class f{constructor(A={}){this.type="contact",this.name=A.name,this.cc=A.b1+"_"+A.b2,this.cr=A.b2+"_"+A.b1}}var e,q=(e="undefined"!=typeof document&&document.currentScript?document.currentScript.src:void 0,async function(A){var g,I,B,Q=void 0!==(A=A||{})?A:{};function C(A){return A.startsWith("data:application/octet-stream;base64,")}g="data:application/octet-stream;base64,AGFzbQEAAAABqAdwYAN/f38AYAJ/fwBgA39/fwF/YAF/AX9gAn9/AX9gAX8AYAR/f39/AGAGf39/f39/AGAFf39/f38AYAl/f39/f39/f38AYAV/f39/fwF/YAR/f39/AX9gAn9+AX9gA39+fwBgAn5/AX9gCH9/f39/f39/AGAFf35/f38AYAR/fn9/AGACf34AYAABf2AGf35/f39/AX9gCn9/f39/f39/f38AYAd/f39/f39/AGADf35/AX9gA35/fwF/YAh/f39/f39/fwF/YAR/f39+AX9gBn9/f39/fwF/YAN/f34AYAV/fn9/fwF/YAd/fn9/f39/AX9gBH9+fX8AYAN+fn8Bf2ACf30Bf2ADfn99AX9gAn99AGAAAGADf399AGADf359AGABfwF9YAl/fn9/f399fX8Bf2ACfn0Bf2ADf39+AX5gBH9/fn4Bf2ABfwF7YAl/f39/f39/f38Bf2AHf35/f31/fwF/YAR/f31/AX9gAn5+AX9gA39/fQF/YAd/f39/f31/AX9gBH9+f38Bf2ANf39/f39/f39/f39/fwBgCH9+f39/f39/AX9gBX9/f399AGAEf399fwBgBH9/f34AYAd/fn9/f31/AX9gB39+fn9/f38Bf2ABfgF/YAR+f39/AX9gBH9/f30AYAJ/fwF+YAJ/fwF9YAV/f399fwF/YAJ/fQF9YAZ/fn99f38Bf2AFf35+f38Bf2ADf359AX9gA359fQF/YAR/f399AX9gAn9/AXtgC39/f39/f39/f39/AGADf31/AGAHf39/f39/fwF/YAR/f35/AGACf34BfWADf35/AX5gBn98f39/fwF/YAV/f39+fgBgAAF8YAN/fX8Bf2AFfn9/f38Bf2ADf39+AX9gBH9/fX0Bf2ABfwF+YAN/fn4Bf2ABfQF9YBB/f39/f39/f39/f39/f39/AGAMf39/f39/f39/f39/AGAFf39/fX8AYAd/fX9/f39/AGAKf39/f39/f31/fwF/YAV/f39+fwBgBH9/fX0AYAR/fX9/AX1gA39/fwF9YAV/f319fwBgBX9/f39/AXtgA399fQBgBn9/fX1/fwBgD39/f39/fX1/f39/f319fwBgEH9/f319fX9/f39/f39/f38Bf2APf39/f39/f39/f39/f39/AX9gCH9+fn9/f39/AGAGf35+f39/AGAEf39+fgBgCn9/f39/f39/f38Bf2AEf31/fwBgA399fwF9YAF9AX9gAnx/AXwC/QUZA2VudhhfZW12YWxfZ2V0X21ldGhvZF9jYWxsZXIABANlbnYXX2VtdmFsX2NhbGxfdm9pZF9tZXRob2QABgNlbnYcX2VtYmluZF9yZWdpc3Rlcl92YWx1ZV9hcnJheQAHA2VudiRfZW1iaW5kX3JlZ2lzdGVyX3ZhbHVlX2FycmF5X2VsZW1lbnQACQNlbnYcX2VtYmluZF9maW5hbGl6ZV92YWx1ZV9hcnJheQAFA2VudhVfZW1iaW5kX3JlZ2lzdGVyX2VudW0ABgNlbnYbX2VtYmluZF9yZWdpc3Rlcl9lbnVtX3ZhbHVlAAADZW52GV9lbWJpbmRfcmVnaXN0ZXJfZnVuY3Rpb24ABwNlbnYNX2VtdmFsX2RlY3JlZgAFA2VudgVhYm9ydAAkA2VudhVfZW1iaW5kX3JlZ2lzdGVyX3ZvaWQAAQNlbnYVX2VtYmluZF9yZWdpc3Rlcl9ib29sAAgDZW52GF9lbWJpbmRfcmVnaXN0ZXJfaW50ZWdlcgAIA2VudhdfZW1iaW5kX3JlZ2lzdGVyX2JpZ2ludABPA2VudhZfZW1iaW5kX3JlZ2lzdGVyX2Zsb2F0AAADZW52G19lbWJpbmRfcmVnaXN0ZXJfc3RkX3N0cmluZwABA2VudhxfZW1iaW5kX3JlZ2lzdGVyX3N0ZF93c3RyaW5nAAADZW52Fl9lbWJpbmRfcmVnaXN0ZXJfZW12YWwAAQNlbnYcX2VtYmluZF9yZWdpc3Rlcl9tZW1vcnlfdmlldwAAA2VudhVlbXNjcmlwdGVuX21lbWNweV9iaWcAAANlbnYgX2Vtc2NyaXB0ZW5fZ2V0X25vd19pc19tb25vdG9uaWMAEwNlbnYSZW1zY3JpcHRlbl9nZXRfbm93AFAWd2FzaV9zbmFwc2hvdF9wcmV2aWV3MQhmZF93cml0ZQALA2VudhdlbXNjcmlwdGVuX2dldF9oZWFwX21heAATA2VudhZlbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwAAMD1BTSFCQDUS8vCwIKCgM7DiAODhgYGA4ODg4pDhhSDgIODg4DMA4ODg4ODg4pDikOKQ4ODg4ODg4ODg4ODg4YDg4ODg4OAzAOMA48PA4ODg4iGCIY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cGVfQ3JlYXRlQ3lsaW5kZXIAHRJIUF9TaGFwZV9DcmVhdGVCb3gAHhlIUF9TaGFwZV9DcmVhdGVDb252ZXhIdWxsAB8TSFBfU2hhcGVfQ3JlYXRlTWVzaAAgGkhQX1NoYXBlX0NyZWF0ZUhlaWdodEZpZWxkACEYSFBfU2hhcGVfQ3JlYXRlQ29udGFpbmVyACIQSFBfU2hhcGVfUmVsZWFzZQAjEEhQX1NoYXBlX0dldFR5cGUAJBFIUF9TaGFwZV9BZGRDaGlsZAAlFEhQX1NoYXBlX1JlbW92ZUNoaWxkACYXSFBfU2hhcGVfR2V0TnVtQ2hpbGRyZW4AJxZIUF9TaGFwZV9HZXRDaGlsZFNoYXBlACgcSFBfU2hhcGVfU2V0Q2hpbGRRU1RyYW5zZm9ybQApHEhQX1NoYXBlX0dldENoaWxkUVNUcmFuc2Zvcm0AKhZIUF9TaGFwZV9TZXRGaWx0ZXJJbmZvACsWSFBfU2hhcGVfR2V0RmlsdGVySW5mbwAsFEhQX1NoYXBlX1NldE1hdGVyaWFsAC0USFBfU2hhcGVfR2V0TWF0ZXJpYWwALhNIUF9TaGFwZV9TZXREZW5zaXR5AC8TSFBfU2hhcGVfR2V0RGVuc2l0eQAwF0hQX1NoYXBlX0dldEJvdW5kaW5nQm94ADEQSFBfU2hhcGVfQ2FzdFJheQAyHEhQX1NoYXBlX0J1aWxkTWFzc1Byb3BlcnRpZXMAMxxIUF9TaGFwZVBhdGhJdGVyYXRvcl9HZXROZXh0ADQTSFBfU2hhcGVfU2V0VHJpZ2dlcgA1I0hQX1NoYXBlX0NyZWF0ZURlYnVnRGlzcGxheUdlb21ldHJ5ADYYSFBfRGVidWdHZW9tZXRyeV9HZXRJbmZvADcYSFBfRGVidWdHZW9tZXRyeV9SZWxlYXNlACMOSFBfQm9keV9DcmVhdGUAOA9IUF9Cb2R5X1JlbGVhc2UAIxBIUF9Cb2R5X1NldFNoYXBlADkQSFBfQm9keV9HZXRTaGFwZQA6FUhQX0JvZHlfU2V0TW90aW9uVHlwZQA7FUhQX0JvZHlfR2V0TW90aW9uVHlwZQA8FEhQX0JvZHlfU2V0RXZlbnRNYXNrAD0USFBfQm9keV9HZXRFdmVudE1hc2sAPhlIUF9Cb2R5X1NldE1hc3NQcm9wZXJ0aWVzAD8ZSFBfQm9keV9HZXRNYXNzUHJvcGVydGllcwBAGEhQX0JvZHlfU2V0TGluZWFyRGFtcGluZwBBGEhQX0JvZHlfR2V0TGluZWFyRGFtcGluZwBCGUhQX0JvZHlfU2V0QW5ndWxhckRhbXBpbmcAQxlIUF9Cb2R5X0dldEFuZ3VsYXJEYW1waW5nAEQYSFBfQm9keV9TZXRHcmF2aXR5RmFjdG9yAEUYSFBfQm9keV9HZXRHcmF2aXR5RmFjdG9yAEYQSFBfQm9keV9HZXRXb3JsZABHE0hQX0JvZHlfU2V0UG9zaXRpb24ASBNIUF9Cb2R5X0dldFBvc2l0aW9uAEkWSFBfQm9keV9TZXRPcmllbnRhdGlvbgBKFkhQX0JvZHlfR2V0T3JpZW50YXRpb24ASxVIUF9Cb2R5X1NldFFUcmFuc2Zvcm0ATB9IUF9Cb2R5X0dldFdvcmxkVHJhbnNmb3JtT2Zmc2V0AE0VSFBfQm9keV9HZXRRVHJhbnNmb3JtAE4ZSFBfQm9keV9TZXRMaW5lYXJWZWxvY2l0eQBPGUhQX0JvZHlfR2V0TGluZWFyVmVsb2NpdHkAUBpIUF9Cb2R5X1NldEFuZ3VsYXJWZWxvY2l0eQBRGkhQX0JvZHlfR2V0QW5ndWxhclZlbG9jaXR5AFIUSFBfQm9keV9BcHBseUltcHVsc2UAUxtIUF9Cb2R5X0FwcGx5QW5ndWxhckltcHVsc2UAVBtIUF9Cb2R5X1NldFRhcmdldFFUcmFuc2Zvcm0AVRpIUF9Cb2R5X1NldEFjdGl2YXRpb25TdGF0ZQBWGkhQX0JvZHlfR2V0QWN0aXZhdGlvblN0YXRlAFccSFBfQm9keV9TZXRBY3RpdmF0aW9uQ29udHJvbABYHUhQX0JvZHlfU2V0QWN0aXZhdGlvblByaW9yaXR5AFkUSFBfQ29uc3RyYWludF9DcmVhdGUAWhVIUF9Db25zdHJhaW50X1JlbGVhc2UAIxtIUF9Db25zdHJhaW50X1NldFBhcmVudEJvZHkAWxtIUF9Db25zdHJhaW50X0dldFBhcmVudEJvZHkAXBpIUF9Db25zdHJhaW50X1NldENoaWxkQm9keQBdGkhQX0NvbnN0cmFpbnRfR2V0Q2hpbGRCb2R5AF4fSFBfQ29uc3RyYWludF9TZXRBbmNob3JJblBhcmVudABfHkhQX0NvbnN0cmFpbnRfU2V0QW5jaG9ySW5DaGlsZABgIkhQX0NvbnN0cmFpbnRfU2V0Q29sbGlzaW9uc0VuYWJsZWQAYSJIUF9Db25zdHJhaW50X0dldENvbGxpc2lvbnNFbmFibGVkAGIYSFBfQ29uc3RyYWludF9TZXRFbmFibGVkAGMYSFBfQ29uc3RyYWludF9HZXRFbmFibGVkAGQdSFBfQ29uc3RyYWludF9TZXRBeGlzTWluTGltaXQAZR1IUF9Db25zdHJhaW50X0dldEF4aXNNaW5MaW1pdABmHUhQX0NvbnN0cmFpbnRfU2V0QXhpc01heExpbWl0AGcdSFBfQ29uc3RyYWludF9HZXRBeGlzTWF4TGltaXQAaBlIUF9Db25zdHJhaW50X0dldEF4aXNNb2RlAGkZSFBfQ29uc3RyYWludF9TZXRBeGlzTW9kZQBqHUhQX0NvbnN0cmFpbnRfU2V0QXhpc0ZyaWN0aW9uAGsdSFBfQ29uc3RyYWludF9HZXRBeGlzRnJpY3Rpb24AbB5IUF9Db25zdHJhaW50X1NldEF4aXNNb3RvclR5cGUAbR5IUF9Db25zdHJhaW50X0dldEF4aXNNb3RvclR5cGUAbihIUF9Db25zdHJhaW50X1NldEF4aXNNb3RvclBvc2l0aW9uVGFyZ2V0AG8oSFBfQ29uc3RyYWludF9HZXRBeGlzTW90b3JQb3NpdGlvblRhcmdldABwKEhQX0NvbnN0cmFpbnRfU2V0QXhpc01vdG9yVmVsb2NpdHlUYXJnZXQAcShIUF9Db25zdHJhaW50X0dldEF4aXNNb3RvclZlbG9jaXR5VGFyZ2V0AHIiSFBfQ29uc3RyYWludF9TZXRBeGlzTW90b3JNYXhGb3JjZQBzIkhQX0NvbnN0cmFpbnRfR2V0QXhpc01vdG9yTWF4Rm9yY2UAdCNIUF9Db25zdHJhaW50X1NldEF4aXNNb3RvclN0aWZmbmVzcwB1I0hQX0NvbnN0cmFpbnRfR2V0QXhpc01vdG9yU3RpZmZuZXNzAHYhSFBfQ29uc3RyYWludF9TZXRBeGlzTW90b3JEYW1waW5nAHchSFBfQ29uc3RyYWludF9HZXRBeGlzTW90b3JEYW1waW5nAHgeSFBfQ29uc3RyYWludF9TZXRBeGlzU3RpZmZuZXNzAHkcSFBfQ29uc3RyYWludF9TZXRBeGlzRGFtcGluZwB6IEhQX0NvbnN0cmFpbnRfU2V0QXhpc01vdG9yVGFyZ2V0AHsgSFBfQ29uc3RyYWludF9HZXRBeGlzTW90b3JUYXJnZXQAfA9IUF9Xb3JsZF9DcmVhdGUAfRBIUF9Xb3JsZF9SZWxlYXNlACMWSFBfV29ybGRfR2V0Qm9keUJ1ZmZlcgB+E0hQX1dvcmxkX1NldEdyYXZpdHkAfxNIUF9Xb3JsZF9HZXRHcmF2aXR5AIABEEhQX1dvcmxkX0FkZEJvZHkAgQETSFBfV29ybGRfUmVtb3ZlQm9keQCCARVIUF9Xb3JsZF9HZXROdW1Cb2RpZXMAgwEdSFBfV29ybGRfQ2FzdFJheVdpdGhDb2xsZWN0b3IAhAEkSFBfV29ybGRfUG9pbnRQcm94aW1pdHlXaXRoQ29sbGVjdG9yAIUBJEhQX1dvcmxkX1NoYXBlUHJveGltaXR5V2l0aENvbGxlY3RvcgCGAR9IUF9Xb3JsZF9TaGFwZUNhc3RXaXRoQ29sbGVjdG9yAIcBDUhQX1dvcmxkX1N0ZXAAiAEZSFBfV29ybGRfU2V0SWRlYWxTdGVwVGltZQCJARZIUF9Xb3JsZF9TZXRTcGVlZExpbWl0AIoBFkhQX1dvcmxkX0dldFNwZWVkTGltaXQAiwEeSFBfV29ybGRfR2V0TmV4dENvbGxpc2lvbkV2ZW50AIwBHEhQX1dvcmxkX0dldE5leHRUcmlnZ2VyRXZlbnQAjQEYSFBfUXVlcnlDb2xsZWN0b3JfQ3JlYXRlAI4BGUhQX1F1ZXJ5Q29sbGVjdG9yX1JlbGVhc2UAIxxIUF9RdWVyeUNvbGxlY3Rvcl9HZXROdW1IaXRzAI8BIkhQX1F1ZXJ5Q29sbGVjdG9yX0dldENhc3RSYXlSZXN1bHQAkAEpSFBfUXVlcnlDb2xsZWN0b3JfR2V0UG9pbnRQcm94aW1pdHlSZXN1bHQAkQEpSFBfUXVlcnlDb2xsZWN0b3JfR2V0U2hhcGVQcm94aW1pdHlSZXN1bHQAkgEkSFBfUXVlcnlDb2xsZWN0b3JfR2V0U2hhcGVDYXN0UmVzdWx0AJMBBG1haW4AlAEZX19pbmRpcmVjdF9mdW5jdGlvbl90YWJsZQEABm1hbGxvYwDTFARmcmVlANQUHEhQX0RlYnVnX1N0YXJ0UmVjb3JkaW5nU3RhdHMAigIbSFBfRGVidWdfU3RvcFJlY29yZGluZ1N0YXRzAIsCEF9fZXJybm9fbG9jYXRpb24AtBQFaHRvbnMAuRQFbnRvaHMAuRQNX19nZXRUeXBlTmFtZQCxFBtfZW1iaW5kX2luaXRpYWxpemVfYmluZGluZ3MAshQFaHRvbmwA6hQIc2V0VGhyZXcA6BQKc2F2ZVNldGptcADpFAlzdGFja1NhdmUA5RQMc3RhY2tSZXN0b3JlAOYUCnN0YWNrQWxsb2MA5xQJ7ycBAEEBC40UlQGWAb4FmgGZAZkBmwGfAZwBoAGdAaEBogGiAaMBpAGZAZ4BpgGlAaUBpwHrCucKkwvmCuUK5AqnAeMK4grhCuAK3wreCt0KkAuoAfQK8wqPC+gKjAuLC9wK+AX2CocE9QqoC6cL6grpCu8K8grxCvAK7grsCu0KqQGqAbEBsgGzAbQBjQKOAo8CkAKNAo4CjwKQAo0CjgKPApACjQKOAo8CkAKNAo4CjwKQAo0CjgKPApACkQKOApICkwKUAo4CkgKTApUCjgKWApcCmAKOApYClwKZApoCmwKOApYClwKZApoCnAKOApYClwKdAo4CkgKTAp4CnwKgAo4ClgKXApICkwKZApoClAKOAqECogKPApACowKOAqECogKhAqICpAKlApYClwKeAp8CpgKOApYClwKnAqgCqQKqAqECogKrAo4CkgKTAqwCrQKbAo4ClgKXApICkwKnAqgCqQKqAqECogKrAo4CkgKTAqwCrQKuAo4CoQKiApYClwKZApoCkgKTAqkCqgKhAqICrwKOApICkwKsAq0CowKOAqECogKZApoClgKXAqkCqgKhAqICrwKOApICkwKsAq0ClAKOAp4CnwKeAp8CsAKOAp4CnwKxAo4CngKfAqwCrQKSApMCmwKOAp4CnwKhAqICoQKiAo0CjgKeAp8CsgLEAbMCxQG0AsYBtQLHAbYCyAHJAbcCygG4AssBuQLMAboCzQG7Aiu8As4BvQItvgLPAb8CL8AC0AHBAtEBwgIlwwImwALSAcQC0wHAAtQBxQLVAcYCI8cC1gHIAtcBwwI1yQLYAcoC2QHGAiPBAtoBxgIjywI5yQLbAcMCO8AC3AHDAj3AAt0BzAI/xwLeAb8CQcAC3wFD4AFF4QHAAuQBzQJMzgLlAc8CSNAC4gHRAkrKAuMBT+YBUecBVdICU1TDAlbAAugBwwJYwwJZwQLpAcYCI8sCW8kC6gFd6wHTAl9gwwJjwALsAWHtAdQCa9UC7gHWAmrVAu8BZfABZ/EBeXrWAm3VAvIBe/MBc/QBb/UBcfYBdfcBd/gBwQL5AcYCI8AC+gHPAn/XAoEBywKCAcAC+wHYAoQB2QKFAdoChgHbAocB3AL9Ab8CiAGJAd0CigG8AvwBhALeAoYC3wKFAocCiALgAokC4QL+AcYCI8AC/wHiAoAC4gKBAuMCggLjAoMCigLkAosCjQKOAp4CnwKeAp8CjQKOAp4CnwKSApMCnAKOAp4CnwLlAuYClAKOAp4CnwKPApAClAKOAp4CnwKhAqICjQKOAp4CnwKeAp8C5wKOAp4CnwLoAukCjQKOAp4CnwKeAp8CmAKOAp4CnwLqAusCpgKOAp4CnwLsAu0ClAKOAp4CnwKhAqICjQKOAp4CnwKeAp8ClAKOAp4CnwKWApcCnQKOAp4CnwKZApoClAKOAp4CnwKhAqICjQKOAp4CnwKeAp8CjQKOAp4CnwKeAp8ClAKOAp4CnwKhAqIC5wKOAp4CnwKkAqUClAKOAp4CnwKhAqIC7gKOAp4CnwLvAvAC7gKOAp4CnwLvAvACsQKOAp4CnwLxAvICsQKOAp4CnwLxAvICjQKOAp4CnwKeAp8C8wKOAp4CnwL0AvUCpgKOAp4CnwL2AvcClAKOAp4CnwKhAqICnQKOAp4CnwKZApoCmAKOAp4CnwLqAusCkQKOAp4CnwKnAqgCjQKOAp4CnwKeAp8CkQKOAp4CnwKSApMCjAL4AvkC+gL7AvwC/QL+Av8CgAOBA4IDgwOEA4UDhgOHA4gDiQOKA4sDjAORC/wK/QrbBY4LjQv7CpwL9QWbC5oLmQuXC5gLlguVC5QLkgudC/8KqQumC6ULpAOkA6MDowOfC54L1wrHCsMKwArBCtQKyQrICr8KxArNCsoKywrRCtIKzwrTCtAKzgrVCtYK2AqHBMIKvAq9Cr4KxgrFCswK9Qj0CPMI9gj9CPoIgwmCCaQL/gj8CPsIsgiuCLUIsQitCKwIqwi7CL0Iqgi8CIcEtAi5CLgIugi2CLAIrwiLCZoD2wWFCYoJiQmICYcEhwm4CbkJvgm6CYYJjAmaCsQJhwrFCcoJigrHCcYJzQnMCaQKyQmfCp4KowqiCp0KyAmbCs8JzgmHBIsKkQqPCo4KywmQCpkKmArRCfkJoQqJCogK/An7Cf4JnAqNCv0J+gmSCv8J5gnkCeMJ4QnlCaYK4gmgCugJ5wnSCdEJ0AnKCdUJ1AnXCdYJ2wncCd0J0wneCdkJ2AnaCdEJ8gnxCe0J7AnvCe4J8An2CfUJ9AnzCdEJlgqlCowKsAquCq0KrAqrCq8KsQqzCrQKsgqqCo8IkAiQA5IIkQORCJIDkwiVCIEIgAiGCIIImAiXCJoImQiACZQDvAmVA5YDlwODCIQInAOFCI0DjgOZAZ0DmAOZA5oDmwOcA5gDngOfA50DmAOiA6MDowOjA6QDowOlA6QDpgOnA6gDqAOpA6kDqQOoA6kDqQOgA6MDoQOrA6wD2QOuA9QD1APUA9QD1APUA9UD1gPUA9cD1APUA9gD2APYA9gUrwPaA7MDtgO3A7gDuQO+A78DugO7A70DvAPAA8EDwgPbA8MDxAPGA8cDyAPFA8sDyQPPA9ADmQGAC4ELogGoA8wDmAPcA9ED0wOpA6gDmQHdA94D3wPgA+EDmgPiA50DmAOmA+UD6APqA+wD7gPwA/ID9AP1A/YDnQOYA/kD+gP7A/wD/QP/A5gD+QP6A/sDgAT9A/8DmAP5A/oD+wOBBP0D/wOYA/kD+gOCBIME/QP/A5gD+QP6A4QEhQT9A/8DmAP5A/oD+wOGBP0D/wOJBIoEiwSMBI0EjgSPBJIEkwSaAa4DxgTHBMkE3wTgBOAE4ATgBOAE4ATgBOAE4ATgBM0E4gSpBaEFmgXLBMwEnwWrBawFrQWuBZ0DmAOvBbAFsQWyBbQFtQWYA7YFpwWoBZgDugW7BZkBwQXCBe4GygXLBdIFzAXNBc8FjgTOBdUF1gXRBdAF0wXUBdcF2AXZBZoBrgOiAZoD2wWHBN0F3gXjBeQF2QXlBeYF5wXbBegFhwTgBOAE4ATpBfEF8gXZBfMFrgPsBe0F7QXuBe8F8AX0BfUF9gX2BfYF9wX4BfkF+QX5BfoF+wWJBooGiwaHBocEiwaIBowGmgOGBo0GjgaRBo8GkAaSBpMGlAaLBpoBrgOaA/YFlgaXBpoBmQGaBpsGnAadBp4GogGrBqAGogasBrMGtAayBrAGsQbtBpoBrgOHBJ0DvAbDBr0Gvga/BsAGnQWeBaIBxAbFBsEGxwbIBskGywbQBtEGogHUBtkG2gbbBtwG3QbeBt8G4QbiBuAG4wbkBuUG5gbnBugGogGHBJoD6gbrBuwGnQPFAe8G8AbxBvIG8wb0BvYG9wb4BvkG+gb7BvwG0AbRBv0G/gaqBZkFmAWBB/8GhweIB8oEkAeRB9kFmQGqC68LsAuuC60LrAurC/gFowuKC4cEqguqC6ILoAuSB5MH2QWUB5UHlgeZB5oHnQe5B6MHpAeLBqUHtAe1B6YHqAeqB7YHqwe6B7MHsQeuB8MHwgfEB8UHxgfHB8kHygfOB88H0AfRB8sHzAfNB58HmgGZAdIHvAfTB9QH1Qe9B9IH1geZAdcHuAfUB9UHuwfXB6IBmQHYB8AH1AfVB8EH2AeZAdkH2ge+B9QH1Qe/B9kH2wewB9wH3QeyB94H3weZAeAH4QfiB9QH1QfjB+QH5QfoB+kHmAPmB5gD5weYA+oH6AfpB/cH+Af5B/oH9geYA/wH/Qf7B5gD/geGCIcIiAiJCKUBpQGkCKYIqAipCL4IvwiYA/kDwAjBCMIIwwj/A5gD+QPACMQIxQjDCP8DmAPGCMcInQOYA84ImAPPCJgD0AiYA9EImAPSCJgD0wjjCOQI5QjmCO4I7wjxCPIImgGuA40JjgmPCZAJqwmsCbIJswm0CbUJsgHCCcMJsQHgCcIJwwnCCcMJwgnDCcMJmQG5CroK2gqyAZgD+QP6A/sD9wr9A/8D+Qr6Cq4DmAOhC7ELmAPOC88L0AvlC+YL8gvzC5kBkAyRDJkBmgygDJkBpgynDJkBmQGZAZkBmQHEDMUMmQGZAZkB1wzYDJkB6wzsDPEM8gyZAZkBoAycDJIMoQyoDLEMqAy6DL4MvgzGDMsMugyHDNkMhwyxDOcM/QvZDLEMmg2ZDZgNmgPMDIwMpAyGDYcNgw2BDYINgA2FDYsGhA2eDJgMlAydDJcMlgyUDZMNkg2RDZANjw2fDJsMkwyIDZsMogylDKQMowyLBqkMrQysDKsMqgywDLMMsgyvDK4Mogy3DLYMtQy0DLsMvQy8DLkMuAy/DL0MvAzBDMAMiAy9DMMMwgzADMgMxwyWDZUNygzJDMwMzwy8DM4MzQzSDL0MvAzRDNAMiAzWDNUM1AzTDNoM3gzdDNwM2wyIDIwMiwyKDIkMogzmDKQM5AzlDOIM4QzgDN8M4wyLBugM8AzvDO0M7gzqDOkM7Qv+C4UMhAyCDIMMgAz/C/MM+Qz4DPYM9wz1DPQM+gz/DP4M/Az9DPsMwAyXDY4NjQ2MDYkNig3ZBZkBmQGZAZkBmQGZAZ4Nnw2hDaINqg2rDboNuw3KDcsNmQHWDfgF6wfSDdMN1A3XDdgN2Q2ZAeIN5A3jDa4D2wXmDecN6g2iAdsF6g2iAdsF7g3xDe0N8g2YDpkOoA6hDqUOqg6rDqkOrA6YA/kD+gP7A7QO/QP/A5gD+QP6A4IEtQ79A/8DuQ66DpoBvQ6+DuMDvw7kA88OyQ7KDsgOhwTODtAOyw7NDtMO0Q7SDtQO1Q7ZDtoO1g7YDtwO3w7gDuMOrgPiDqIB+AXbBaIB4Q6ZAeQO5Q7mDpkB5w6GCIEPgg/5DvoO+w6DD4QP/A79Dv4Org