class Runescape{constructor(){this.mondrian=null,this.txList=[]}launch(t,e,i){this.blockHeight=`${t}`,this.txValueCache=e,this.parcelId=i?Number(i.split(":")[1]):null,this.loadRoutine()}async loadRoutine(){const t={};if(this.parcelId)console.log("parcelId",this.parcelId);else{console.log("isParent",!0);let C="";if(C=(t=>{t=BigInt(t);const e=5000000000n,i=210000n,o=t=>e/2n**t,s=t/i;let n=0n;for(let t=0n;t<s;t++)n+=o(t)*i;return n+=t%i*o(s),String(n)})(this.blockHeight),console.log("runescape gen-2 on sat",C),C){const P=await fetch(`/r/sat/${C}/at/-1`).then((t=>t.json()));console.log("inscriptionId",P.id);let z=[],A=!0,D=0;for(;A;){const _=await fetch(`/r/children/${P.id}/${D}`).then((t=>t.json()));A=_.more,z=z.concat(_.ids),D+=1}console.log("Num of children",z.length);const O=await fetch("/content/a9f6a9b050af3de1a4ce714978c1f2231ba731f1f46731a16d0e411f89308566i0"),$=document.createElement("script");function G(t){const e=new Uint8Array(t.length/2);for(var i=0;i<e.length;i++)e[i]=parseInt(t.substring(2*i,2*i+2),16);return e.buffer}if($.innerHTML=await O.text(),document.body.appendChild($),z.length>0)for(let j=0;j<z.length;j++){const N=z[j];fetch(`/r/metadata/${N}`).then((async t=>{if(t.ok)return await t.text();throw new Error(`${t.status} ${N} metadata not found`)})).then((t=>CBOR.decode(G(t.replace(/"/g,""))))).then((e=>{if(e){const i=e.parcelId.split(":").pop();i in t||(t[i]=N,console.log("parcelId",i,"indexed"))}})).catch((t=>console.log(t)))}}}window.THREE=await import("/content/0d013bb60fc5bf5a6c77da7371b07dc162ebc7d7f3af0ff3bd00ae5f0c546445i0");const{default:e}=await import("/content/036f12ea42d0fd664948e952b61f4c2f0d04e5672e7a7b3e2c33ac2544b6b1a7i0"),{POSTPROCESSING:i}=await import("/content/5f68b5b0e97c51679eba9f8987fc3945dc04fc894a0bb7c099385145cbd3a617i0"),o=i.BloomEffect,s=i.EffectComposer,n=i.EffectPass,r=i.RenderPass,a=i.BlendFunction,l={headers:{Accept:"application/json"}},h=await fetch("/r/blockheight",l).then((t=>t.json())),c=await fetch(`/r/blockinfo/${h}`,l).then((t=>t.json()));console.log("latest blockHeight",h,"tx_count",c.transaction_count);const d=Math.floor(c.transaction_count/2);console.log("treasure tx: 1/2 tx x latest tx_count =",d),await this.fetchData();const p=d<this.txList.length?this.txList[d].value:0;console.log("treasure tx #",d,"in block",this.blockHeight,"has tx value in total of",p,"sats");for(let F=0;F<this.txList.length;F++)this.txList[F].size=this.logTxSize(this.txList[F].value);let f=0;for(let W of this.txList)f+=W.size*W.size;let x=Math.ceil(Math.sqrt(f));this.mondrian=new MondrianLayout(x,x),e.install({THREE:THREE});const w=window.innerWidth,u=window.innerHeight,g=new THREE.Clock,m=new THREE.Scene,y=new THREE.PerspectiveCamera(90,w/u,.01,1e3);y.position.set(0,x/1.6,0);const E=new THREE.WebGLRenderer({powerPreference:"high-performance",antialias:!1,stencil:!1,depth:!1});E.setSize(w,u),E.shadowMap.enabled=!0,E.shadowMap.type=THREE.BasicShadowMap;let M=new THREE.HemisphereLight(16777215,0,2);m.add(M);let b=new THREE.DirectionalLight(16777215,1);b.position.set(-10,100,-10),b.target.position.set(0,0,0),b.castShadow=!0,m.add(b),document.getElementById("root").appendChild(E.domElement);const R=new e(y,E.domElement);let S=13576336;this.blockHeight<84e4&&(S=16356896);const T=new THREE.MeshStandardMaterial({color:S,wireframe:!1}),H=new THREE.MeshStandardMaterial({color:16777215,wireframe:!1}),L=new THREE.MeshStandardMaterial({color:16775424,wireframe:!1,roughness:.375}),I=new s(E);I.addPass(new r(m,y));const k=new o({blendFunction:a.ADD,mipmapBlur:!0,luminanceThreshold:.4,luminanceSmoothing:.12,intensity:2});I.addPass(new n(y,k));let v=0;for(let q=0;q<this.txList.length;q++){const U=this.mondrian.place(this.txList[q].size),V=.5*U.r,X=new THREE.Mesh(new THREE.BoxGeometry(.9*U.r,.2*U.r,.9*U.r),this.txList[q].value===p?L:T);if(t&&t[q]){const J=new THREE.Mesh(new THREE.BoxGeometry(.6*U.r,.25*U.r,.6*U.r),H);J.position.set(U.position.x-x/2+V,.1*U.r/2,U.position.y-x/2+V),m.add(J)}if(this.parcelId&&q===this.parcelId){const K=new THREE.Mesh(new THREE.BoxGeometry(.6*U.r,.25*U.r,.6*U.r),H);K.position.set(U.position.x-x/2+V,.1*U.r/2,U.position.y-x/2+V),m.add(K)}this.txList[q].value===p&&(v+=1),m.add(X),X.position.set(U.position.x-x/2+V,.1*U.r/2,U.position.y-x/2+V)}console.log("found",v,1!==v?"treasure parcels":"treasure parcel","with the same output value for BlockDrop"),E.render(m,y),I.render();let B=!1;!function t(){const e=g.getDelta(),i=g.getElapsedTime(),o=R.update(e);B&&(k.intensity=2+2*Math.sin(i),I.render(),i>30&&(B=!1)),requestAnimationFrame(t),o&&(B=!0)}()}async fetchData(){const t=await fetch(this.txValueCache).then((t=>t.text()));if(t){let e=t.split(/\r?\n/);this.txList=new Array(e.length);for(let t=0;t<e.length;t++){let i=parseInt(e[t]);this.txList[t]={value:i}}}}decompress=t=>{const e=Uint8Array.from(atob(t),(t=>t.charCodeAt(0))),i=new DecompressionStream("gzip"),o=i.writable.getWriter();return o.write(e),o.close(),new Response(i.readable).arrayBuffer().then((function(t){return(new TextDecoder).decode(t)}))};logTxSize(t){if(0===t)return 1;let e=Math.ceil(Math.log10(t))-5;return Math.min(Number.MAX_SAFE_INTEGER,Math.max(1,e))}}class MondrianLayout{constructor(t,e){this.width=t,this.height=e,this.xMax=0,this.yMax=0,this.rowOffset=0,this.rows=[],this.txMap=[]}getSize(){return{width:this.xMax,height:this.yMax}}getRow(t){let e=t.y-this.rowOffset;return e<this.rows.length?this.rows[e]:null}getSlot(t){let e=this.getRow(t);return null!==e&&e.map.hasOwnProperty(t.x)?e.map[t.x]:null}addRow(){let t={y:this.rows.length+this.rowOffset,slots:[],map:{},max:0};return this.rows.push(t),t}addSlot(t){if(t.r<=0)return null;let e=this.getSlot(t.position);if(null!==e)return e.r=Math.max(e.r,t.r),e;{let e=this.getRow(t.position);if(null===e)return null;let i=e.slots.findIndex((e=>e.position.x>t.position.x));return-1===i?e.slots.push(t):e.slots.splice(i,0,t),e.map[t.position.x]=t,t}}removeSlot(t){let e=this.getRow(t.position);if(null!==e){delete e.map[t.position.x];let i=e.slots.findIndex((e=>e.position.x===t.position.x));-1!==i&&e.slots.splice(i,1)}}fillSlot(t,e){let i={left:t.position.x,right:t.position.x+e,bottom:t.position.y,top:t.position.y+e};this.removeSlot(t);for(let o=t.position.y;o<i.top;o++){let s=this.getRow({x:t.position.x,y:o});if(null!==s){let n=[],r=0;for(let e of s.slots)if(!(e.position.x+e.r<i.left||e.position.x>=i.right)){n.push(e);let i=Math.max(0,e.position.x+e.r-(t.position.x+t.r));r=Math.max(r,i)}i.right<this.width&&!s.map.hasOwnProperty(i.right)&&this.addSlot({position:{x:i.right,y:o},r:t.r-e+r});for(let e of n)e.r=t.position.x-e.position.x,0===e.r&&this.removeSlot(e)}else this.addRow(),t.position.x>0&&this.addSlot({position:{x:0,y:o},r:t.position.x}),i.right<this.width&&this.addSlot({position:{x:i.right,y:o},r:this.width-i.right})}for(let i=Math.max(0,t.position.y-e);i<t.position.y;i++){let o=this.getRow({x:t.position.x,y:i});if(null!==o)for(let i=0;i<o.slots.length;i++){let s=o.slots[i];if(s.position.x<t.position.x+e&&s.position.x+s.r>t.position.x&&s.position.y+s.r>=t.position.y){let e=s.r;s.r=t.position.y-s.position.y;let i={x:s.position.x+s.r,y:s.position.y,width:e-s.r,height:s.r};for(;i.width>0&&i.height>0;)i.width<=i.height?(this.addSlot({position:{x:i.x,y:i.y},r:i.width}),i.y+=i.width,i.height-=i.width):(this.addSlot({position:{x:i.x,y:i.y},r:i.height}),i.x+=i.height,i.width-=i.height)}}}return{position:t.position,r:e}}place(t){let e={},i=!1,o=null;for(let e of this.rows){for(let s of e.slots)if(s.r>=t){i=!0,o=this.fillSlot(s,t);break}if(i)break}if(!i){let e=this.addRow(),i=this.addSlot({position:{x:0,y:e.y},r:this.width});o=this.fillSlot(i,t)}for(let t=0;t<o.r;t++)for(let i=0;i<o.r;i++)this.setTxMapCell({x:o.position.x+t,y:o.position.y+i},e);return o.position.x+o.r>this.xMax&&(this.xMax=o.position.x+o.r),o.position.y+o.r>this.yMax&&(this.yMax=o.position.y+o.r),o}setTxMapCell(t,e){let i=t.y-this.rowOffset;if(i>=0&&i<this.height&&t.x>=0&&t.x<this.width){let o=i*this.width+t.x;o>=0&&o<this.txMap.length&&(this.txMap[o]=e)}}}