<div id="app">
<canvas id="c"></canvas>
<div id="hints">
<div id="cred" class="btn">blackhole</div>
<div id="mode" class="btn">contain</div>
<div class="btn">
<label for="file">browse</label>
<input type="file" id="file" accept="image/*" />
</div>
</div>
</div>
#app{width:100%;height:100%;display:flex;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;touch-action:none}canvas{display:block;width:100%;height:100%;opacity:0;transition:opacity .66s ease;cursor:none}#file{display:none}.btn{padding:.1rem .3rem;border:none;cursor:pointer;font-family:inherit;pointer-events:all;background:rgba(0, 0, 0, 0.27);mix-blend-mode:color-burn}.btn label{cursor:pointer}#hints{position:fixed;bottom:0px;width:100%;display:flex;justify-content:space-evenly;pointer-events:none;color:#b6b6b6;transition:opacity .66s ease,visibility .66s ease}#hints.hide{opacity:0}#mode{display:none}
(function(U,A){const fg=L,E=U();while(!![]){try{const Y=parseInt(fg(0x20b))/0x1*(-parseInt(fg(0x20e))/0x2)+-parseInt(fg(0x191))/0x3*(parseInt(fg(0x21d))/0x4)+parseInt(fg(0x1a7))/0x5*(-parseInt(fg(0x221))/0x6)+parseInt(fg(0x1f1))/0x7+-parseInt(fg(0x1c8))/0x8*(-parseInt(fg(0x21c))/0x9)+parseInt(fg(0x1ff))/0xa+parseInt(fg(0x196))/0xb;if(Y===A)break;else E['push'](E['shift']());}catch(t){E['push'](E['shift']());}}}(c,0x3d594));function c(){const Z4=['map','error','preventDefault','then','createBuffer','HOLES','VtSG9sZXMpYnJlYWs7ZmxvYXQgcz1jbGFtcChzdHJlbmd0aHNb','3Vmsckn','tyZXR1cm4gbzt9dm9pZCBtYWluKCl7dmVjMiBjb29yZD0odmVj','1wKChjb29yZCtkaXNwKS90ZXhTaXplLHZlYzIoMCksdmVjMigx','texSize','addEventListener','2238687wWEixb','onchange','FRAGMENT_SHADER','innerWidth','QtY2VudGVyc1toXTtmbG9hdCByPWxlbmd0aChkKTtpZihyPC4w','bufferData','src','attachShader','mouse','cos','TEXTURE_MAG_FILTER','texParameteri','dHVyZTt2YXJ5aW5nIHZlYzIgc2NyZWVuVVY7ZmxvYXQgb3V0QW','5nbGVGbihmbG9hdCBhKXtmbG9hdCBvPTAuLHA9MS47Zm9yKGlu','bmp\x20fail','Renum.uncmin:\x20gradient\x20is\x20zero\x20(local\x20extremum)','TEXTURE_WRAP_T','155EzjXLE','slice','tan','Renum.uncmin:\x20converged\x20(small\x20step)','set','classList','hide','viewport','b3JkL3RleFNpemU7aWYoYmFzZVRjLng8MC58fGJhc2VUYy54Pj','Renum.uncmin:\x20line\x20search\x20step\x20too\x20small','add','pow','shader\x20compile:\x20','undefined','constructor','toString','LINEAR','RGBA','cover','compileShader','b2xvcj12ZWM0KDAsMCwwLDEpO3JldHVybjt9YmFzZVRjPWNsYW','textContent','pointerId','link:\x20','MihzY3JlZW5VVi54LDEuLXNjcmVlblVWLnkpKnZpZXdTaXplLW','sqrt','reduce','replaceAll','open','getElementById','EufHxiYXNlVGMueTwwLnx8YmFzZVRjLnk+MS4pe2dsX0ZyYWdD','atan2','push','7608cutgZq','naturalWidth','QW5nbGU9dGFuKG91dEFuZ2xlRm4oaW5BbmdsZSkpKmRpc3Q7ZG','CLAMP_TO_EDGE','remove','vertexAttribPointer','files','COMPILE_STATUS','pageX','isArray','NdLGNvZWZmc1tIT0xFU107dW5pZm9ybSBzYW1wbGVyMkQgdGV4','resize','bind','getContext','shaderSource','maxInAngle','uniform2f','apply','uniform1f','getProgramParameter','angle','uniform2fv','drawArrays','length','(((.+)+)+)+$','body','min','target','TEXTURE_WRAP_S','anonymous','ARRAY_BUFFER','createTexture','opacity','innerHeight','getProgramInfoLog','height','UNSIGNED_BYTE','https://github.com/cliffcrosland/black-hole.js','az0wLjtmb3IoaW50IGg9MDtoPEhPTEVTO2grKyl7aWYoaD49bn','abs','useProgram','90153bYfAVX','number','max','entries','getShaderInfoLog','mode','catch','pointerType','width','onload','viewSize','getShaderParameter','Renum.uncmin:\x20step\x20too\x20small','MDEpY29udGludWU7ZmxvYXQgaW5BbmdsZT1hdGFuKHIsZGlzdC','1186120eekdHh','pageY','coeffs','bindTexture','9mZnNldCkvZmFjdG9yLGRpc3A9dmVjMigwKTtmbG9hdCBibGFj','onclick','k7aWYoaW5BbmdsZTw9bWF4SW5BbmdsZSpzKWJsYWNrPTEuO2lu','O2dsX1Bvc2l0aW9uPXZlYzQocG9zaXRpb24qMi4tMS4sMCwxKT','Renum.gradient:\x20did\x20not\x20converge','aF0sMC4sMS4pO3M9cypzKigzLi0yLipzKTt2ZWMyIGQ9Y29vcm','TEXTURE_2D','_blank','1901EKZlei','cred','dist','174yldcmA','offset','style','webgl','delete','Renum.uncmin:\x20f(x0)\x20is\x20a\x20NaN','hypot','LINK_STATUS','getUniformLocation','STATIC_DRAW','dCBpPTA7aTxIT0xFUztpKyspbys9Y29lZmZzW2ldKnAscCo9YT','naturalHeight','Not\x20enough\x20photonPath\x20coords','uniform1fv','4293utzTsF','486308wZuImJ','lmb3JtIGludCBudW1Ib2xlczt1bmlmb3JtIHZlYzIgY2VudGVy','contain','NjcmVlblVWO3ZvaWQgbWFpbigpe3NjcmVlblVWPXBvc2l0aW9u','48462VRlZCI','crossOrigin','c1tIT0xFU107dW5pZm9ybSBmbG9hdCBzdHJlbmd0aHNbSE9MRV','devicePixelRatio','xiYXNlVGMpLHZlYzQoMCwwLDAsMSksYmxhY2spO30=','getAttribLocation','bindBuffer','size'];c=function(){return Z4;};return c();}function L(f,Z){f=f-0x190;const U=c();let A=U[f];return A;}const Z=(function(){let U=!![];return function(A,E){const Y=U?function(){const fl=L;if(E){const t=E[fl(0x1d9)](A,arguments);return E=null,t;}}:function(){};return U=![],Y;};}()),f=Z(this,function(){const fI=L;return f['toString']()['search'](fI(0x1e0))[fI(0x1b6)]()[fI(0x1b5)](f)['search'](fI(0x1e0));});f(),function(){const fm=L;function A(f0,f1,f2){const fz=L,f3=Array[fz(0x1d1)](f0),f4=Array[fz(0x1d1)](f1);return f3&&f4?f0[fz(0x229)]((f5,f6)=>A(f5,f1[f6],f2)):f3?f0['map'](f5=>A(f5,f1,f2)):f4?f1['map'](f5=>A(f0,f5,f2)):f2(f0,f1);}function t(f0,f1){return A(f0,f1,(f2,f3)=>f2-f3);}function p(f0,f1){const fd=L;let f2=0x0;for(let f3=0x0;f3<f0[fd(0x1df)];f3++)f2+=f0[f3]*f1[f3];return f2;}function h(f0){const fj=L;return Math[fj(0x1c0)](p(f0,f0));}function v(f0){const fy=L;let f1=0x0;for(let f2=0x0;f2<f0[fy(0x1df)];f2++){const f3=Math[fy(0x1ef)](f0[f2]);f3>f1&&(f1=f3);}return f1;}function x(f0){const fn=L;return Array['isArray'](f0)?f0[fn(0x229)](f1=>x(f1)):f0;}function q(f0){const f1=[];for(let f2=0x0;f2<f0;f2++){f1[f2]=[];for(let f3=0x0;f3<f0;f3++)f1[f2][f3]=f2===f3?0x1:0x0;}return f1;}function g(f0,f1){const fV=L,f2=f0[fV(0x1df)],f3=Array(f2);for(let f4=0x0;f4<f2;f4++){let f5=0x0;for(let f6=0x0;f6<f1['length'];f6++)f5+=f0[f4][f6]*f1[f6];f3[f4]=f5;}return f3;}function l(f0,f1,f2){const fD=L,f3=f0[fD(0x1df)],f4=f1[fD(0x1df)],f5=[];for(let f6=0x0;f6<f3;f6++){f5[f6]=[];for(let f7=0x0;f7<f4;f7++)f5[f6][f7]=f2*f0[f6]*f1[f7];}return f5;}function z(f0,f1){const fQ=L;return f0[fQ(0x229)]((f2,f3)=>f2[fQ(0x229)]((f4,f5)=>f4+f1[f3][f5]));}function d(f0,f1){const fi=L;var f2=null,f3=0x0,f4={};const f5=fU=>{const fe=L,fA=fU[fe(0x1df)],fE=f0(fU);if(isNaN(fE))throw Error('Renum.gradient:\x20f(x)\x20is\x20a\x20NaN');const fY=Array(fA),ft=x(fU);for(let fp=0x0;fp<fA;fp++){let fh=Math[fe(0x1f3)](0.000001*fE,1e-8);for(let fv=0x0;;fv++){if(fv===0x14)throw Error(fe(0x207));ft[fp]=fU[fp]+fh;var fK=f0(ft);ft[fp]=fU[fp]-fh;const fM=f0(ft);ft[fp]=fU[fp];if(!isNaN(fK)&&!isNaN(fM)){fY[fp]=(fK-fM)/(0x2*fh);const fx=fU[fp]-fh,fq=fU[fp]+fh;fK=Math[fe(0x1e2)](Math[fe(0x1ef)](fY[fp]*(fq-fx)),Math[fe(0x1ef)](fK-fM))/(0x3e8*(Math[fe(0x1ef)](fE)+0x1));if(fx===fU[fp]||fq===fU[fp]||fY[fp]===0x0&&fE!==0x0||fK<=0.001)break;}fh/=0x10;}}return fY;};f2=f2===null?1e-8:f2;var f6=x(f1);f1=f6[fi(0x1df)];var f7=f0(f6);if(isNaN(f7))throw Error(fi(0x213));f3=f3||0x3e8;let f8=0x0;var f9=f5(f6);f4=f4['ma']||q(f1);let ff='';for(;f8<f3;){f8++;if(v(f9)===0x0){ff=fi(0x1a5);break;}const fU=g(f4,f9)[fi(0x229)](ft=>-ft);var fZ=p(f9,fU);if(fZ>=0x0){f4=q(f1);for(fZ=0x0;fZ<f1;fZ++)fU[fZ]=-f9[fZ];fZ=p(f9,fU);}let fA=0x1;var fc=f6,fL=h(fU);if(fL<f2){ff=fi(0x1fd);break;}let fE,fY;for(;f8<f3&&!(fA*fL<f2);){fE=fc[fi(0x229)]((ft,fK)=>ft+fA*fU[fK]),fY=f0(fE);if(fY-f7<0.1*fA*fZ&&!isNaN(fY))break;fA*=0.5,f8++;}if(fA*fL<f2){ff=fi(0x1b0);break;}if(Math[fi(0x1ef)](fY-f7)<=f2*(Math['abs'](fY)+Math['abs'](f7)+0x1)&&h(fU[fi(0x229)](ft=>fA*ft))<f2){f6=fE,f7=fY,ff='Renum.uncmin:\x20converged';break;}fZ=f5(fE),f9=t(fZ,f9),fc=fU[fi(0x229)](ft=>fA*ft),f6=p(f9,fc),f6>1e-12&&(f7=g(f4,f9),f9=l(fc,fc,(f6+p(f9,f7))/(f6*f6)),fL=l(f7,fc,-0x1/f6),f6=l(fc,f7,-0x1/f6),f4=z(z(f4,f9),z(fL,f6))),f6=fE,f7=fY,f9=fZ;if(h(fc)<f2){ff=fi(0x1aa);break;}}return{'ia':f6,'f':f7,'oa':f9,'pa':f4,'iterations':f8,'message':ff};}function j(f0){const fP=L;var f1=0x64,f2=0x14*Math['PI'],f3=k,f4=void 0x0;const f5=[0.2,0.3,0.8,0x8/0x9,0x1,0x1],f6=[[0.2],[0.075,0.225],[0x2c/0x2d,-0x38/0xf,0x20/0x9],[0x4bac/0x19a1,-0x6310/0x88b,0xfbc0/0x19a1,-0xd4/0x2d9],[0x2339/0xc60,-0x163/0x21,0xb68c/0x147f,0x31/0xb0,-0x13ef/0x48e0],[0x23/0x180,0x0,0x1f4/0x459,0x7d/0xc0,-0x88b/0x1a80,0xb/0x54]],f7=[0x47/0xe100,0x0,-0x47/0x4137,0x47/0x780,-0x4365/0x52d00,0x16/0x20d,-0.025];typeof f4===fP(0x1b4)&&(f4=0.000001),typeof f1===fP(0x1b4)&&(f1=0x3e8);const f8=typeof f0===fP(0x1f2);var f9=f8?[f0]:x(f0);f0=f8?(fx,fq)=>[f3(fx,fq[0x0])]:f3;const ff=[0x0];f9=[f9];const fZ=[];let fc=0x0,fL=f9[0x0];var fU=f2-0x0;let fA=fU/f1;fU=Math['abs'](fU)/0x64;let fE=0x0,fY=0x0;f1*=0x64;const ft=f2>0x0?0x1:-0x1;for(;ft*fc<ft*f2&&fY<f1;){fY++,ft*(fc+fA)>ft*f2&&(fA=f2-fc);var fK=[];fK[0x0]=f0(fc,fL);for(var fp=0x1;fp<0x7;fp++){var fh=fL['slice']();for(var fv=0x0;fv<fp;fv++)if(f6[fp-0x1][fv]!==void 0x0){for(var fM=0x0;fM<fh['length'];fM++)fh[fM]+=fA*f6[fp-0x1][fv]*fK[fv][fM];}fK[fp]=f0(fc+(fp<0x6?f5[fp-0x1]:0x1)*fA,fh);}fp=fL[fP(0x1a8)]();for(fh=0x0;fh<0x6;fh++)for(fv=0x0;fv<fp[fP(0x1df)];fv++)fp[fv]+=fA*f6[0x5][fh]*fK[fh][fv];fh=0x0;for(fv=0x0;fv<fL[fP(0x1df)];fv++){fM=0x0;for(let fx=0x0;fx<0x7;fx++)fM+=f7[fx]*fK[fx][fv];fM*=fA,fM=Math['abs'](fM)/(f4*(0x1+Math[fP(0x1ef)](fL[fv]))),fM>fh&&(fh=fM);}if(fh>0x1&&fY<f1){fA*=Math[fP(0x1f3)](0.1,0.8*Math[fP(0x1b2)](fh,-0.2));continue;}fc+=fA,fL=fp,fE++,ff[fE]=fc,f9[fE]=fL,fZ[fE-0x1]=fK,fK=!0x0;for(fp=0x0;fp<fL['length'];fp++)if(!Number['isFinite'](fL[fp])){fK=!0x1;break;}if(!fK)break;fA*=fh===0x0?0x5:Math['min'](0x5,0.8*Math[fP(0x1b2)](fh,-0.2)),Math[fP(0x1ef)](fA)>fU&&(fA=ft*fU);}return{'x':ff,'y':f8?f9[fP(0x229)](fq=>fq[0x0]):f9,'na':fZ,'S':f0,'v':f8,'at'(fq){return y(this,fq);}};}function y(f0,f1){const fk=L;var f2=f0['x'],f3=f0['v']?f0['y'][fk(0x229)](fc=>[fc]):f0['y'],f4=0x0,f5=f2[fk(0x1df)]-0x1;if(f1<=f2[0x0])return f0['v']?f3[0x0][0x0]:f3[0x0][fk(0x1a8)]();if(f1>=f2[f5])return f0['v']?f3[f5][0x0]:f3[f5]['slice']();for(;f5-f4>0x1;){var f6=f4+f5>>0x1;f2[f6]<=f1?f4=f6:f5=f6;}f6=f2[f4];var f7=f2[f5];f2=f7-f6,f1=(f1-f6)/f2,f4=f3[f4],f3=f3[f5],f5=f0['S'](f6,f4),f6=f0['S'](f7,f3),f7=Array(f4[fk(0x1df)]);var f8=f1*f1,f9=f8*f1;const ff=0x2*f9-0x3*f8+0x1;f1=f9-0x2*f8+f1;const fZ=-0x2*f9+0x3*f8;f8=f9-f8;for(f9=0x0;f9<f4[fk(0x1df)];f9++)f7[f9]=ff*f4[f9]+f1*f2*f5[f9]+fZ*f3[f9]+f8*f2*f6[f9];return f0['v']?f7[0x0]:f7;};function n(f0){return f0*Math['PI']/0xb4;}function e(){const fO=L,f0=i(),f1=[];for(let f2=0x0;f2<=2.2;f2++)f1[fO(0x1c7)](0x1);return{'$':d(f3=>f0['da'][fO(0x1c1)]((f4,f5,f6)=>{let f7=0x0;for(let f8=0x0;f8<=2.2;f8++)f7+=f3[f8]*Math['pow'](f5,f8);return f5=f7-f0['ha'][f6],f4+f5*f5;},0x0),f1)['ia'],'L':f0['L']};}function i(){const fH=L,f0=[];for(let f5=0x0;f5<0x78;f5+=0.048)f0['push'](f5);const f1=f0[fH(0x229)](f6=>{const fW=fH;var f7=j([0x1/0x5d,0x1/(0x5d*Math[fW(0x1a9)](n(f6)))]),f8=f7['x'];f6=[];for(let f9=0x0;f9<f7['y']['length'];f9++){const ff=0x1/f7['y'][f9][0x0];if(ff<0x0)break;f6['push']([ff*Math[fW(0x19f)](f8[f9]),ff*Math['sin'](f8[f9])]);}if(f6[fW(0x1df)]<0x1)throw Error('At\x20least\x20one\x20photonPath\x20coord\x20required');f7=f6[f6[fW(0x1df)]-0x1];if(Math[fW(0x1ef)](f7[0x0])<0x1&&Math[fW(0x1ef)](f7[0x1])<0x1)f6={'ea':!0x0};else{if(f6['length']<0x2)throw Error(fW(0x21a));f7=f6[f6[fW(0x1df)]-0x2],f8=f6[f6[fW(0x1df)]-0x1],f6=f8[0x0]-f7[0x0],f7=f8[0x1]-f7[0x1],f6={'angle':Math[fW(0x1c6)](f7,f6)*0xb4/Math['PI']};}return f6;});let f2=0x0;const f3=[],f4=[];return f0['forEach']((f6,f7)=>{const fS=fH;f7=f1[f7],f7['ea']?f2=f6:isNaN(f6)||isNaN(f7[fS(0x1dc)])||(f3['push'](f6+Math['PI']),f6=f7[fS(0x1dc)],f4[fS(0x1c7)](f6<0x0?-0xb4-f6:0xb4-f6));}),{'L':n(f2),'da':f3[fH(0x229)](n),'ha':f4[fH(0x229)](n)};}function k(f0,f1){return f0=f1[0x0],[f1[0x1],0x3*f0*f0-f0];}const m=atob('YXR0cmlidXRlIHZlYzIgcG9zaXRpb247dmFyeWluZyB2ZWMyIH'+fm(0x220)+fm(0x206)+'t9');function a(f0){const fF=fm,f1=f0['i'][fF(0x1d5)](fF(0x211),{'premultipliedAlpha':!0x1,'alpha':!0x1,'preserveDrawingBuffer':!0x0});if(f1){f0['m']=f1;var f2=atob('cHJlY2lzaW9uIGhpZ2hwIGZsb2F0O3VuaWZvcm0gZmxvYXQgZG'+'lzdCxtYXhJbkFuZ2xlO3VuaWZvcm0gdmVjMiB0ZXhTaXplLHZp'+'ZXdTaXplLG9mZnNldDt1bmlmb3JtIGZsb2F0IGZhY3Rvcjt1bm'+fF(0x21e)+fF(0x223)+fF(0x1d2)+fF(0x1a2)+fF(0x1a3)+fF(0x218)+fF(0x192)+fF(0x1bf)+fF(0x203)+fF(0x1ee)+fF(0x190)+fF(0x208)+fF(0x19a)+fF(0x1fe)+fF(0x205)+fF(0x1ca)+'lzcCs9ZC9yKihpbkFuZ2xlLXIpKnM7fXZlYzIgYmFzZVRjPWNv'+(fF(0x1af)+fF(0x1c5)+fF(0x1bb)+fF(0x193)+'KSk7Z2xfRnJhZ0NvbG9yPW1peCh0ZXh0dXJlMkQodGV4dHVyZS'+fF(0x225)))[fF(0x1c2)](fF(0x22e),0x10[fF(0x1b6)](0xa));f0['B']=o(f0,f2),f1[fF(0x1f0)](f0['B']),f2=f1[fF(0x22d)](),f1[fF(0x227)](f1[fF(0x1e6)],f2),f1[fF(0x19b)](f1[fF(0x1e6)],new Float32Array([0x0,0x0,0x1,0x0,0x0,0x1,0x1,0x1]),f1[fF(0x217)]),f2=f1[fF(0x226)](f0['B'],'position'),f1['enableVertexAttribArray'](f2),f1[fF(0x1cd)](f2,0x2,f1['FLOAT'],!0x1,0x0,0x0),f0['h']=Object['entries']({'ca':fF(0x20d),'fa':fF(0x1d7),'ka':fF(0x194),'la':fF(0x1fb),'offset':fF(0x20f),'l':'factor','ga':'numHoles','aa':'centers','ja':'strengths','ba':fF(0x201),'qa':'texture'})[fF(0x1c1)]((f4,[f5,f6])=>({...f4,[f5]:f1[fF(0x216)](f0['B'],f6)}),{}),f2=f0['N']['$'];var f3=new Float32Array(0x10);f3[fF(0x1ab)](f2[fF(0x1a8)](0x0,0x10)),f1[fF(0x21b)](f0['h']['ba'],f3),f1[fF(0x1da)](f0['h']['fa'],f0['N']['L']),f0['K']=f1[fF(0x1e7)](),f1[fF(0x202)](f1[fF(0x209)],f0['K']),f1[fF(0x1a1)](f1[fF(0x209)],f1['TEXTURE_MIN_FILTER'],f1['LINEAR']),f1[fF(0x1a1)](f1['TEXTURE_2D'],f1[fF(0x1a0)],f1[fF(0x1b7)]),f1['texParameteri'](f1['TEXTURE_2D'],f1[fF(0x1e4)],f1[fF(0x1cb)]),f1['texParameteri'](f1[fF(0x209)],f1[fF(0x1a6)],f1['CLAMP_TO_EDGE']),f0['A']=new Float32Array(0x20),f0['J']=new Float32Array(0x10);}else document[fF(0x1e1)]['textContent']='no\x20WebGL';}function B(f0){const fa=fm;Object[fa(0x1f4)]({'touchstart':f0['V'],'pointerdown':f0['X'],'pointermove':f0['Y'],'pointerup':f0['R'],'pointercancel':f0['R'],'pointerout':f0['Z']})['forEach'](([f1,f2])=>f0['i'][fa(0x195)](f1,f3=>f2[fa(0x1d4)](f0)(f3))),document[fa(0x1c4)](fa(0x20c))[fa(0x204)]=()=>window[fa(0x1c3)](fa(0x1ed),fa(0x20a)),f0['P'][fa(0x204)]=()=>{const fX=fa;f0[fX(0x1f6)]=0x1-f0[fX(0x1f6)],f0['P'][fX(0x1bc)]=f0[fX(0x1f6)]?fX(0x21f):fX(0x1b9),s(f0);},document['getElementById']('file')[fa(0x197)]=f1=>w(f0,f1[fa(0x1e3)]?.['files']?.[0x0]),window[fa(0x195)]('dragover',f1=>f1[fa(0x22b)]()),window['addEventListener']('drop',f1=>{const fB=fa;f1[fB(0x22b)](),w(f0,f1['dataTransfer']?.[fB(0x1ce)]?.[0x0]);}),window['addEventListener'](fa(0x1d3),()=>s(f0));}function w(f0,f1){const fu=fm,f2=f0['m'],f3=f5=>{const fw=L;f0['O']=f5,f0['F']=f5[fw(0x1c9)]||f5[fw(0x1f9)],f0['D']=f5[fw(0x219)]||f5[fw(0x1eb)],f2[fw(0x202)](f2['TEXTURE_2D'],f0['K']),f2['texImage2D'](f2[fw(0x209)],0x0,f2[fw(0x1b8)],f2[fw(0x1b8)],f2[fw(0x1ec)],f5),f2[fw(0x1d8)](f0['h']['ka'],f0['F'],f0['D']),f0['C']=!0x0,s(f0),C(f0),f0['i'][fw(0x210)][fw(0x1e8)]='1';};f0['C']&&(f0['i']['style'][fu(0x1e8)]='0');const f4=()=>{const fo=fu;if(f1 instanceof File)createImageBitmap(f1)[fo(0x22c)](f5=>f3(f5))[fo(0x1f7)](f5=>{const fR=fo;console[fR(0x22a)](fR(0x1a4),f5);});else{const f5=new Image();f5[fo(0x222)]=fo(0x1e5),f5[fo(0x1fa)]=()=>f3(f5),f5[fo(0x19c)]=f1;}};f0['C']?setTimeout(f4,0x190):f4();}function u(f0,f1){const fG=fm;requestAnimationFrame(f3=>u(f0,f3));if(f0['C']){if(f0['g'][fG(0x228)]!==0x0||f0['G']){f0['u']||(f0['u']=f1);var f2=(f1-f0['u'])/0x3e8;f0['u']=f1,f2>0.1&&(f2=0.1),f1=0x1-Math['exp'](-0x40*f2);for(const [f3,f4]of f0['g']){f4['x']+=(f4['T']-f4['x'])*f1,f4['y']+=(f4['U']-f4['y'])*f1;const f5=f4['o']?0x0:0x1;f4['j']<f5?f4['j']=Math[fG(0x1e2)](f5,f4['j']+0x4*f2):f4['j']>f5&&(f4['j']=Math[fG(0x1f3)](f5,f4['j']-5.5*f2)),f4['o']&&f4['j']<=0.0001&&(f0['g'][fG(0x212)](f3),f0['g'][fG(0x228)]===0x0&&f0['M'][fG(0x1ac)][fG(0x1cc)]('hide'));}C(f0),f0['G']=f0['g'][fG(0x228)]>0x0;}else f0['u']=0x0;}}function o(f0,f1){const fJ=fm,f2=f0['m'],f3=f2['createProgram']();f2[fJ(0x19d)](f3,G(f0,f2['VERTEX_SHADER'],m)),f2[fJ(0x19d)](f3,G(f0,f2[fJ(0x198)],f1)),f2['linkProgram'](f3);if(!f2[fJ(0x1db)](f3,f2[fJ(0x215)]))throw fJ(0x1be)+f2[fJ(0x1ea)](f3);return f3;}function G(f0,f1,f2){const fs=fm;f0=f0['m'],f1=f0['createShader'](f1),f0[fs(0x1d6)](f1,f2),f0[fs(0x1ba)](f1);if(!f0[fs(0x1fc)](f1,f0[fs(0x1cf)]))throw fs(0x1b3)+f0[fs(0x1f5)](f1);return f1;}function s(f0){const fN=fm;if(f0['O']){var f1=f0['m'],f2=window[fN(0x199)],f3=window[fN(0x1e9)],f4=Math[fN(0x1e2)](window[fN(0x224)]||0x1,0x2);f0['i'][fN(0x1f9)]=f2*f4,f0['i'][fN(0x1eb)]=f3*f4,f1[fN(0x1ae)](0x0,0x0,f0['i']['width'],f0['i']['height']),f4=f0['F'];var f5=f0['D'],f6=f2/f4,f7=f3/f5,f8=Math[fN(0x1e2)](f6,f7);f6=f0[fN(0x1f6)]?Math[fN(0x1f3)](f6,f7):f8,f0['l']=f6,f0['H']=(f2-f4*f6)/0x2,f0['I']=(f3-f5*f6)/0x2,f1[fN(0x1da)](f0['h']['ca'],Math[fN(0x214)](f2,f3)/Math[fN(0x1a9)](f0['W'])/f6),f1[fN(0x1d8)](f0['h']['la'],f2,f3),f1['uniform2f'](f0['h'][fN(0x20f)],f0['H'],f0['I']),f1[fN(0x1da)](f0['h']['l'],f0['l']),f0['G']=!0x0;}}function C(f0){const fC=fm,f1=f0['m'];let f2=0x0;for(const [,f3]of f0['g']){if(f2>=0x10)break;f0['A'][f2*0x2]=f3['x'],f0['A'][f2*0x2+0x1]=f3['y'],f0['J'][f2]=f3['j'],f2++;}f1['uniform1i'](f0['h']['ga'],f2),f2>0x0&&(f1[fC(0x1dd)](f0['h']['aa'],f0['A']),f1[fC(0x21b)](f0['h']['ja'],f0['J'])),f1[fC(0x1de)](f1['TRIANGLE_STRIP'],0x0,0x4);}function b(f0,f1,f2,f3){const fb=fm;f2=(f2-f0['H'])/f0['l'],f3=(f3-f0['I'])/f0['l'];let f4=f0['g']['get'](f1);f4?(f4['o']=!0x1,f4['T']=f2,f4['U']=f3):f0['g'][fb(0x1ab)](f1,{'x':f2,'y':f3,'T':f2,'U':f3,'j':0x0,'o':!0x1});}class r{constructor(){const fT=fm;this['O']=this['K']=this['F']=this['D']=this['i']=this['m']=this['h']=this['B']=this['A']=this['J']=this['H']=this['I']=this['l']=null,this['G']=!0x0,this['P']=document[fT(0x1c4)](fT(0x1f6)),this['M']=document['getElementById']('hints'),this[fT(0x1f6)]=0x1,this['g']=new Map(),this['u']=0x0,this['C']=!0x1,this['W']=0x49*Math['PI']/0xb4,this['N']=e(),this['i']=document[fT(0x1c4)]('c'),a(this),B(this),w(this,'media/void/city.webp'),requestAnimationFrame(f0=>u(this,f0));}['V'](f0){const fr=fm;f0[fr(0x22b)]();}['X'](f0){const Z0=fm;f0[Z0(0x1f8)]!==Z0(0x19e)&&(b(this,f0[Z0(0x1bd)],f0[Z0(0x1d0)],f0[Z0(0x200)]),this['g'][Z0(0x228)]===0x1&&this['M']['classList'][Z0(0x1b1)](Z0(0x1ad)));}['Y'](f0){const Z1=fm;b(this,f0[Z1(0x1f8)]===Z1(0x19e)?Z1(0x19e):f0['pointerId'],f0['pageX'],f0[Z1(0x200)]);}['R'](f0){const Z2=fm;if(f0[Z2(0x1f8)]!==Z2(0x19e)){if(f0=this['g']['get'](f0[Z2(0x1bd)]))f0['o']=!0x0;this['g'][Z2(0x228)]===0x0&&this['M'][Z2(0x1ac)][Z2(0x1cc)](Z2(0x1ad));}}['Z'](f0){const Z3=fm;if(f0=this['g']['get'](f0['pointerType']===Z3(0x19e)?Z3(0x19e):f0['pointerId']))f0['o']=!0x0;}}new r();}['call'](this);