class Runescape{constructor(){this.mondrian=null,this.txList=[]}launch(t,e,i){this.blockHeight=`${t}`,this.txValueCache=e,this.parcelId=i?Number(i.split(":").pop()):null,this.loadRoutine()}async loadRoutine(){const t=await fetch("/r/sat/980154123863903/at/-1").then((t=>t.json())),e=await fetch(`/content/${t.id}`).then((t=>t.text())),i=await fetch("/r/sat/717782965662484/at/-1").then((t=>t.json())),n=await fetch(`/content/${i.id}`).then((async t=>JSON.parse(decodeURIComponent(escape(atob(await t.text()))))));window.enableApp=window.fullScreen||window.innerWidth==screen.width||window.innerWidth>=n.enableApp&&screen.width>=n.enableApp,window.enableRecursion=window.innerWidth>=n.enableRecursion&&screen.width>=n.enableRecursion,window.tipSatAmount=n.tipSatAmount,window.parcelHighLight=n.parcelHighLight,window.enableQG=n.enableQG;const o=!(!window.enableQG||!window.enableApp||!window.ethereum&&!window.XverseProviders),s=o&&await fetch("/r/sat/717782964480455/at/-1").then((t=>t.json())),a=o&&await fetch(`/content/${s.id}`).then((async t=>JSON.parse(decodeURIComponent(escape(atob(await t.text()))))));window.tipCreator=o&&n.tipCreator,window.ethContracAbi=o&&a.ethContracAbi;const r=o&&await fetch("/r/sat/980154123853997/at/-1").then((t=>t.json())),h=o&&await fetch(`/content/${r.id}`),l=o&&document.createElement("script");o&&(l.innerHTML=decodeURIComponent(escape(atob(await h.text()))),document.body.appendChild(l),window.assetName=`${this.parcelId?this.parcelId+"."+this.blockHeight:this.blockHeight}.bitmap`,"518357"===this.blockHeight?window.titleName=`NAKAMOTO MATRIX ${window.assetName} ${this.parcelId?"parcel":""} (inscribed on Nakamoto rare sats)`:window.titleName=window.assetName,window.introMsg=`Welcome to ${window.titleName} on Blocks Of Bitcoin! This metaverse property lives forever on Bitcoin!>This onchain asset is a key to the future of the BTC metaverse.>${window.enableQG?"It links Bitcoin and Ethereum blockchains using their shared elliptic curve, SECP256K1.>In this brave new orange world on Blocks of Bitcoin, will you mine some Quark20 ($Q)?":""}`,window.ethContractAddress=n.evm[e].contractAddress,window.targetChainName=a.evm[e].chainName,window.ethMsg=`You are verified on Bitcoin. Verifying on ${window.targetChainName} via elliptic curve SECP256K1...`,window.quark20Msg=n.quark20Msg,window.targetChainId=a.evm[e].id,window.targetChainRPC=a.evm[e].rpc,window.targetChainExplorer=a.evm[e].explorer,window.targetChainCurrencyName=a.evm[e].currencyName,window.targetChainCurrencySymbol=a.evm[e].currencySymbol,initGate());const d=await fetch("/content/a9f6a9b050af3de1a4ce714978c1f2231ba731f1f46731a16d0e411f89308566i0"),c=document.createElement("script");c.innerHTML=await d.text(),document.body.appendChild(c);const w=document.createElement("div");function p(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}w.setAttribute("id","css3d"),document.body.appendChild(w),document.getElementById("css3d").style="margin: 0; overflow: hidden; position: absolute; top: 0px;";const f={};let m=null,u={},x=[],g=!1;window.selfInscriptionId,window.canCheckInventory=!1,null!==this.parcelId||(g=!0);if(m=(t=>{t=BigInt(t);const e=5000000000n,i=210000n,n=t=>e/2n**t,o=t/i;let s=0n;for(let t=0n;t<o;t++)s+=n(t)*i;return s+=t%i*n(o),String(s)})(this.blockHeight),Number(this.blockHeight)<84e4){const t=await import("/content/d36f3434809b4b4bed7da6c17d45fbb3e72b89d31f3334d9d34e168519b51bd9i0"),e=await t.getBitmapSat(Number(this.blockHeight)),i=await fetch(`/r/sat/${e}/at/-1`).then((t=>t.json()));try{const t=await fetch(`/r/metadata/${i.id}`).then((async t=>{if(t.ok)return await t.text();throw new Error(`${t.status} ${i.id} metadata not found`)})).then((t=>CBOR.decode(p(t.replace(/"/g,"")))));if(Number(t.blockHeight)===Number(this.blockHeight)&&(m=e,g)){window.selfInscriptionId=i.id,window.canCheckInventory=!0,window.selfSat=e;const t=await fetch(`/r/inscription/${i.id}`).then((t=>t.json()));window.ownerAddress=t.address}}catch(t){}}if(g&&(window.enableApp||window.enableRecursion)&&m){const t=await fetch(`/r/sat/${m}/at/-1`).then((t=>t.json()));let e=!0,i=0;try{if(t&&t.id)for(;e;){const n=await fetch(`/r/children/${t.id}/inscriptions/${i}`).then((t=>t.json()));e=n.more,x=x.concat(n.children),i+=1}}catch(t){}if(x.length>0){let t=!1;for(let e=0;e<x.length;e++){const i=x[e];t||fetch(`/r/metadata/${i.id}`).then((async t=>{if(t.ok)return await t.text();throw new Error(`${t.status} ${i.id} metadata not found`)})).then((t=>CBOR.decode(p(t.replace(/"/g,""))))).then((async e=>{if(e&&e.parcelId){const n=Number(e.parcelId.split(":").pop());if(!(n in f)&&(f[n]=i.id,!g&&n===this.parcelId)){window.selfInscriptionId=i.id,window.selfSat=i.sat,window.canCheckInventory=!0,t=!0;const e=await fetch(`/r/inscription/${i.id}`).then((t=>t.json()));return void(window.ownerAddress=e.address)}}})).catch((t=>{}))}}}window.THREE=await import("/content/0d013bb60fc5bf5a6c77da7371b07dc162ebc7d7f3af0ff3bd00ae5f0c546445i0");const{default:b}=await import("/content/036f12ea42d0fd664948e952b61f4c2f0d04e5672e7a7b3e2c33ac2544b6b1a7i0"),{iframe3DRenderer:y,iframe3D:E}=await import("/content/3b7fd16da25b50dc8042cee1b0ef7947c4ef83993fb9c74420d24bec94824155i0");function M(t,e,i,n,o,s,a,r){const h=document.createElement("div");h.style.width="350px",h.style.height="350px",h.style.backgroundColor="transparent",h.style.border="0px",h.style.overflow="hidden";const l=document.createElement("iframe");l.style.overflow="hidden",l.style.width="350px",l.style.height="350px",l.style.border="0px",l.setAttribute("scrolling","no"),l.src=t.includes("http")?t:`/content/${t}`,h.appendChild(l);const d=r||130,c=new E(h);return c.position.set(e,i,n),c.rotation.set(o-Math.PI/2,s,a),c.scale.set(1/d,1/d,1/d),c}const{POSTPROCESSING:R}=await import("/content/5f68b5b0e97c51679eba9f8987fc3945dc04fc894a0bb7c099385145cbd3a617i0"),S=R.BloomEffect,C=R.EffectComposer,v=R.EffectPass,H=R.RenderPass,I=R.BlendFunction,T={headers:{Accept:"application/json"}},k=await fetch("/r/blockheight",T).then((t=>t.json())),$=await fetch(`/r/blockinfo/${k}`,T).then((t=>t.json())),A=Math.floor($.transaction_count/2);await this.fetchData();const N=A<this.txList.length?this.txList[A].value:0;for(let t=0;t<this.txList.length;t++)this.txList[t].size=this.logTxSize(this.txList[t].value);let L=0;for(let t of this.txList)L+=t.size*t.size;let B=Math.ceil(Math.sqrt(L));this.mondrian=new MondrianLayout(B,B),b.install({THREE:THREE});const P=window.innerWidth,O=window.innerHeight,j=new THREE.Clock,G=new THREE.Scene,z=new THREE.PerspectiveCamera(90,P/O,.01,1e3);z.position.set(0,B/1.6+2,0);const D=new y;D.setSize(P,O),document.getElementById("css3d").appendChild(D.domElement);const Q=new THREE.WebGLRenderer({powerPreference:"high-performance",antialias:!0,alpha:!0});Q.setSize(P,O),Q.shadowMap.enabled=!0,Q.setClearColor(0,0),Q.setPixelRatio(window.devicePixelRatio),Q.shadowMap.type=THREE.PCFSoftShadowMap;let W=new THREE.HemisphereLight(16777215,0,2);G.add(W);let F=new THREE.DirectionalLight(16777215,1);F.position.set(-10,100,-10),F.target.position.set(0,0,0),F.castShadow=!0,G.add(F),document.getElementById("root").appendChild(Q.domElement);const q=new b(z,Q.domElement),U=new b(z,D.domElement);let K=13576336;this.blockHeight<84e4&&(K=16356896);const V=new THREE.MeshStandardMaterial({color:K,wireframe:!1}),X=new THREE.MeshStandardMaterial({color:16775424,wireframe:!1,roughness:.375});let _=0;const J=x.length-1;let Y=!1;for(let t=0;t<this.txList.length;t++){const e=this.mondrian.place(this.txList[t].size),i=.5*e.r,n=new THREE.Mesh(new THREE.BoxGeometry(.9*e.r,.2*e.r,.9*e.r),this.txList[t].value===N&&_<=J?X:V);if(g&&f&&f[t])if(6!==e.r||Y){let n=null;n=(t in f&&t in u&&u[t]&&u[t].length,new THREE.MeshStandardMaterial({color:16777215,wireframe:!1}));const o=new THREE.Mesh(new THREE.BoxGeometry(.7*e.r,.25*e.r,.7*e.r),n);o.position.set(e.position.x-B/2+i,.1*e.r/2,e.position.y-B/2+i),G.add(o)}else{const t=new THREE.Group;t.add(new M(window.parcelHighLight,e.position.x-B/2+i,.1*e.r+.35,e.position.y-B/2+i,0,0,0,70)),G.add(t),Y=!0}else if(null!==this.parcelId&&t===this.parcelId){const t=new THREE.MeshStandardMaterial({color:16777215,wireframe:!1}),n=new THREE.Mesh(new THREE.BoxGeometry(.7*e.r,.25*e.r,.7*e.r),t);n.position.set(e.position.x-B/2+i,.1*e.r/2,e.position.y-B/2+i),G.add(n)}this.txList[t].value===N&&(_+=1),G.add(n),n.position.set(e.position.x-B/2+i,.1*e.r/2,e.position.y-B/2+i)}const Z=new C(Q);Z.addPass(new H(G,z));const tt=new S({blendFunction:I.ADD,mipmapBlur:!0,luminanceThreshold:.4,luminanceSmoothing:.12,intensity:2});Z.addPass(new v(z,tt)),Q.render(G,z),Z.render();let et=!0;!function t(){const e=j.getDelta(),i=j.getElapsedTime(),n=q.update(e);U.update(e);et&&(tt.intensity=1+1*Math.sin(i),Z.render(),D.render(G,z)),requestAnimationFrame(t),n&&(et=!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}}}}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 n=t.position.y;n<i.top;n++){let o=this.getRow({x:t.position.x,y:n});if(null!==o){let s=[],a=0;for(let e of o.slots)if(!(e.position.x+e.r<i.left||e.position.x>=i.right)){s.push(e);let i=Math.max(0,e.position.x+e.r-(t.position.x+t.r));a=Math.max(a,i)}i.right<this.width&&!o.map.hasOwnProperty(i.right)&&this.addSlot({position:{x:i.right,y:n},r:t.r-e+a});for(let e of s)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:n},r:t.position.x}),i.right<this.width&&this.addSlot({position:{x:i.right,y:n},r:this.width-i.right})}for(let i=Math.max(0,t.position.y-e);i<t.position.y;i++){let n=this.getRow({x:t.position.x,y:i});if(null!==n)for(let i=0;i<n.slots.length;i++){let o=n.slots[i];if(o.position.x<t.position.x+e&&o.position.x+o.r>t.position.x&&o.position.y+o.r>=t.position.y){let e=o.r;o.r=t.position.y-o.position.y;let i={x:o.position.x+o.r,y:o.position.y,width:e-o.r,height:o.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,n=null;for(let e of this.rows){for(let o of e.slots)if(o.r>=t){i=!0,n=this.fillSlot(o,t);break}if(i)break}if(!i){let e=this.addRow(),i=this.addSlot({position:{x:0,y:e.y},r:this.width});n=this.fillSlot(i,t)}for(let t=0;t<n.r;t++)for(let i=0;i<n.r;i++)this.setTxMapCell({x:n.position.x+t,y:n.position.y+i},e);return n.position.x+n.r>this.xMax&&(this.xMax=n.position.x+n.r),n.position.y+n.r>this.yMax&&(this.yMax=n.position.y+n.r),n}setTxMapCell(t,e){let i=t.y-this.rowOffset;if(i>=0&&i<this.height&&t.x>=0&&t.x<this.width){let n=i*this.width+t.x;n>=0&&n<this.txMap.length&&(this.txMap[n]=e)}}}