pico-8 cartridge // http://www.pico-8.com version 41 __lua__ -- setup modules={} real_modules={} function _init() -- printh("restarting") _doall"init" end function _update60() _doall"update" end function _draw() _doall"draw" end function music_on() if (stat(54) ~= 0) music(0) persist.music=true persist:write() menuitem(3, "music: on", music_off) end function music_off() music(-1) persist.music=false persist:write() menuitem(3, "music: off", music_on) end function gsv(s,sep1,sep2) local ret=split(s,sep1 or "\n") for i,v in ipairs(ret) do ret[i] = type(v) == "string" and split(v,sep2 or "`") or {v} end return ret end function cycle(tbl,period) period = period or 1 return tbl[t()%period*#tbl\period+1] end mnames={} function names(root) local n=mnames[root] if(n)return all(n) n={root.."0", root, root.."2", root.."3"} mnames[root]=n return all(n) end function _doall(x) for n in names(x) do for mod in all(modules) do local f=mod[n] if (f) f(mod) end end end -- source: https://www.lexaloffle.com/bbs/?pid=78990 gaps=split"57,23,10,4,1" --{701,301,132,57,23,10,4,1} function shellsort(a) for gap in all(gaps) do for i=gap+1,#a do local x,j=a[i],i-gap while j>=1 and a[j].key>x.key do a[j+gap]=a[j] j-=gap end a[j+gap]=x end end end function linefill(ax,ay,bx,by,r,c) if(c) color(c) local dx,dy=bx-ax,by-ay -- avoid overflow -- credits: https://www.lexaloffle.com/bbs/?tid=28999 local n,d=_mnmx(abs(dx),abs(dy)) n/=d d*=sqrt(n*n+1) if(d<0.001) return local ca,sa=dx/d,-dy/d -- polygon points local spans={} local function calcxy(u,v) return ax+u*ca+v*sa,ay-u*sa+v*ca end local x0,y0=calcxy(0,r) for s in all{{0,-r},{d,-r},{d,r},{0,r}} do local x1,y1=calcxy(unpack(s)) local _x1,_y1=x1,y1 if(y0>y1) x0,y0,x1,y1=x1,y1,x0,y0 local dx=(x1-x0)/(y1-y0) local cy0=y0\1+1 -- sub-pix shift x0+=(cy0-y0)*dx for y=cy0,min(y1\1,127) do -- open span? local span=spans[y] if (span) rectfill(x0,y,span,y) spans[y]=x0 x0+=dx end x0,y0=_x1,_y1 end end function _apply(x,ts,a) local t=deli(ts,1) for k,v in pairs(t) do if (k!="update") x[k]=v end if (t and t.update and not t.update(x,a)) add(ts,t,1) end function sgn0(x) return x!=0 and sgn(x) or 0 end function _mnmx(x,y) if (x>y)return y,x return x,y end function _rast( xys,x0,y0,x1,y1 ) local function _add() local n=#xys local xy0={x0,y0} if (n==0 or not _anch_eq(xys[n],xy0)) add(xys,xy0) end local dx,dy=abs(x1-x0),abs(y1-y0) local sx,sy=sgn(x1-x0),sgn(y1-y0) local err if dx>dy then err=dx/2.0 while x0!=x1 do _add() err-=dy if (err<0) y0+=sy err+=dx x0+=sx end else err=dy/2.0 while y0!=y1 do _add() err-=dx if (err<0) x0+=sx err+=dy y0+=sy end end _add() end -->8 -- anchor operations (for the rope code) function _anch_eq(a0,a1) if (a0 and a1) return a0[1]==a1[1] and a0[2]==a1[2] return a0==a1 end --[[ function _anch_unpack(anch) assert(anch[1]) assert(anch[2]) return anch[1],anch[2] end ]]-- _anch_unpack=unpack function _anch_new(prev,next,xy) local out={prev=prev,next=next,_anch_unpack(xy)} if (prev) prev.next=out if (next) next.prev=out return out end function _anch_del(n1,xy) local n0,n2=n1.prev,n1.next if (n0) n0.next=n2 if (n2) n2.prev=n0 end function _anch_update(a0,a1) a0[1]=a1[1] a0[2]=a1[2] end -->8 -- input kbd={} add(real_modules,kbd) function kbd:init() self.real=btn() self.state={btn=0} end function kbd:update() -- figure out what keys are _really_ pressed local now_real,was_real=btn(),self.real self.real=now_real -- add keys that are really pressed -- if they weren't really pressed before -- (they may have been force- -- released by :release()) local real_pressed=~was_real&now_real local state=self.state local now_down=state.btn&now_real|real_pressed local was_down=state.btn -- deduce pressed/released by changes in down state.btn,state.btnp,state.btnr= now_down, ~was_down&now_down, ~now_down&was_down end for _kbdi in all(split"btn,btnp,btnr") do kbd[_kbdi]=function(self,i,t) return 1<"..tostring(v).." " end return str.."}" end return tostr(any) end -->8 -- title screen title={} add(modules,title) lvlshimmer = split"4,9,10,10,9" function title:draw() cls"0" -- this is right for 72x32 spr(96,28,56,9,2) print("pyrex",32,73,7) print("[nyeogmi]",62,73,7) print("kistaro",32,79,7) local lvlstr = "⬅️ "..start_level.." ➑️" local lx, ly = 51+wrongbleep:vibrate(), 90+wrongbleep:vibrate() print(lvlstr,lx-1,ly+1,1) print(lvlstr,lx,ly,cycle(lvlshimmer)) end function title:init() start_level=persist.recent_level -- max_level=persist.max_level max_level = 31 --debugging/coding wiped = false end function title:update() if (btnp"0") start_level-=1 if (btnp"1") start_level+=1 start_level%=max_level+1 if btn"3" and not wiped then wrongbleep:bleep() if (wrongbleep:adequately_warned()) then persist:wipe() max_level = 0 start_level = 0 wiped=true -- todo: sfx(kaboom!) end end if (btnp"4" or btnp"5") modules=real_modules _init() end -->8 --level behaviors level={} add(real_modules,level) function level:init() level:reinit(start_level) end function level:reinit(n) self.hintlevel=0 self.ix=n self.todo={} self.bigx,self.bigy=n%8,n\8 self.dirty=false player.rope=nil -- reanchor will touch the rope otherwise self:load_dynobjs() self:recollide_reanchor() self:spawn_exit() persist:lvlstart() end function level:restart() self:reinit(self.ix) end function level:advance() self:reinit(self.ix+1) end normpal = {[1]=0,[8]=0,[14]=0} ixes=split"5,3,15,10,13,4,9" easy=split"1,131,6,129,6,141,12" moderate=split"3,139,15,5,6,4,9" hard=split"134,135,142,134,6,142,140" brutal=split"8,137,9,130,6,13,138" function level:draw3() local p=easy if (self.ix>=6) p=moderate if (self.ix>=12) p=hard if (self.ix>=21) p=brutal for i=1,7 do pal(ixes[i],p[i],1) end end function level:draw() pal(normpal) cls"10" map( self.bigx*16,self.bigy*16, 0,0,16,16, 64 -- flag 6: visible ) for _,pit in pairs(self._pits) do local px,py=pit.px,pit.py local pr=self._pits[_mix{px+1,py}] spr(pit.s,px,py) if pit.full then spr(15,pit.px,pit.py) end palt(8,true) spr(pit.s,px,py) palt() end for _,crate in pairs(self._crates) do spr(crate.s,crate.px,crate.py) end pal() end function level:busy() for _,crate in pairs(self._crates) do if (#crate.todo>0) return true end return end function level:update() _apply(self, self.todo) local remove={} for cix,crate in pairs(self._crates) do _apply(crate, crate.todo) if #crate.todo==0 then local pit=self._pits[_mix{crate.mx,crate.my}] if pit and not pit.full then add(remove,cix) crate.dead=true pit.full=true end end end for cix in all(remove) do self._crates[cix]=nil self.dirty=true end if self.dirty then self:recollide_reanchor() self.dirty=false end end function level:load_dynobjs() self._crates={} self._pits={} local crate_id=1 for mx=0,15,1 do for my=0,15,1 do local mxy=_mix{mx,my} local px,py=mx*8,my*8 local s=self:_mget(mx,my) local def=self:_get_cratedef(s) if def then self._crates[mxy]={ s=s,def=def, id=crate_id, mx=mx,my=my, px=px,py=py, todo={} } crate_id+=1 end -- pit if (fget(s,5)) self._pits[mxy]={s=s,mx=mx,my=my,px=px,py=py} end end end function level:recollide_reanchor() self._coll={} for mx=0,15 do local kmx=mx.."," for my=0,15 do local mxy=kmx..my self._coll[mxy]= fget(self:_mget(mx,my),7) or self._crates[mxy] end end local anch_new={} for dxy in all(gsv[[-1`-1 1`-1 -1`1 1`1]]) do local dx,dy=unpack(dxy) local c=self._coll for mx0=0,15 do local mx1=mx0+dx local kmx0,kmx1=mx0..",",mx1.."," for my0=0,15 do local my1=my0+dy -- bypass mcoll for MEGA SPEED if ( c[kmx0..my0] and not self:get_crate(mx0,my0) and not c[kmx0..my1] and not c[kmx1..my0] and not c[kmx1..my1] ) then local key=_mix{"GEOM",mx0,my0,dx,dy} anch_new[key]= { max(mx0,mx1),max(my0,my1),adx=-dx,ady=-dy } end end end for _,cr in pairs(self._crates) do local key=_mix{"CRATE",cr.id,dx,dy} local mx0,my0=cr.mx,cr.my local mx1,my1=mx0+dx,my0+dy anch_new[key]={ max(mx0,mx1),max(my0,my1),adx=-dx,ady=-dy } end end local moves={} for k,new in pairs(anch_new) do local old=(self._anch or {})[k] if old then anch_new[k]=new if (not _anch_eq(old,new)) add(moves,{old,new,key=k}) end end self._anch=anch_new self._anch_keys={} self._anch_by={} for k,v in pairs(self._anch) do local ax,ay=_anch_unpack(v) add(self._anch_keys,{key=k}) local pkey=_mix{ax,ay} self._anch_by[pkey]=self._anch_by[pkey] or v self._anch_by[_mix{ax,ay,v.adx,v.ady}]=v end shellsort(self._anch_keys) shellsort(moves) if player.rope then player.rope:experience_anchor_moves(moves) end end function level:win_at(mx,my) return self._wins[_mix{mx,my}] end function level:anchor_points() -- TODO: Return this to using all() local keys=all(self._anch_keys) return function() local k=keys() if (k) return self._anch[k.key] end end function level:anchor_at(point) return self._anch_by[_mix{_anch_unpack(point)}] end function level:anchor_at_tension(point,tension) local ax,ay=_anch_unpack(point) local adx,ady=_anch_unpack(tension) return self._anch_by[_mix{ax,ay,adx,ady}] end function level:get_open_pit(mx,my) local pit=self._pits[_mix{mx,my}] if (pit and not pit.full) return pit end function level:spawn_exit() self._wins={} local spawned local spawn_at=function(x,y) if (self:_mget(x,y)!=1) return assert(not spawned,x..","..y) spawned=true player:reinit(x,y) player.orientx=-1 if (x<8) player.orientx=1 end local win_at=function(x,y) if (self:_mget(x,y)!=18) return for nx=x-1,x+1 do for ny=y-1,y+1 do -- next check: is at least one of -- nx or ny out of range [0, 15]? if (nx | ny) & 0xFFF0 ~= 0 then self._wins[_mix{nx,ny}]=true end end end end for f in all{spawn_at,win_at} do for x=1,14 do f(x,0) f(x,15) end for y=0,15 do f(0,y) f(15,y) end end assert(spawned) end function level:mcoll(mxy) local mx,my=unpack(mxy) if ((mx | my) & 0xFFF0!=0) return true return self._coll[_mix{mx,my}] end function level:get_crate(mx,my) return self._crates[_mix{mx,my}] end function level:_mget(mx,my) return mget( self.bigx*16+mx, self.bigy*16+my ) end function _mix(arg) local out=arg[1] for i=2,#arg do out..=","..arg[i] end return out end -- crate spec: -- "up" == 1 -- "right" == 2 -- "down" == 4 -- "left" == 8 -- -- +1+ -- 8 2 -- +4+ function level:_get_cratedef(s) if (s<64 or s>=80) return return s & 0x000F end function level:get_latch(dx,dy,px,py) local mx,my=px\8,py\8 local mxy=_mix{mx,my} local crate=self._crates[mxy] local dx1,dy1=-sgn0(dx),-sgn0(dy) if crate then if crate.def & dy1*dy1*(2.5+1.5*dy1)+dx1*dx1*(5-3*dx1) ~= 0 then return { el="crate", dx=dx1,dy=dy1, ax_offset=dx1*0.5, ay_offset=dy1*0.5, rec=crate } end end local m=self:_mget(mx,my) if (m==60 and dy1<0) or (m==61 and dx1>0) or (m==62 and dy1>0) or (m==63 and dx1<0) then return { el="eyehook", dx=dx1,dy=dy1, ax_offset=dx1*0.5, ay_offset=dy1*0.5, rec={mx=mx,my=my,px=mx*8,py=my*8}, } end end ropecheck=split"-0.6,0.4,0.4" -- argument "o" is a rope operation: -- array of [mx0,my0,dmx,dmy] function level:can_move( is_player,o,exclude_src,exclude_dst ) local mx0,my0,dmx,dmy=unpack(o) local mx1,my1=mx0+dmx,my0+dmy if (is_player and self:win_at(mx1,my1)) return true if (is_player and self:get_open_pit(mx1,my1)) return wrongbleep:adequately_warned() if (self:mcoll{mx1,my1} or player.x==mx1 and player.y==my1) return if player.rope then local w,h=1.2,0.2 if (dmx==0) w,h=0.2,1.2 if (player.rope:collide_mrect(mx0+ropecheck[dmx+2],my0+ropecheck[dmy+2],w,h,exclude_src,exclude_dst)) return end return true end -- argument is a rope operation: -- array of [mx0,my0,dmx,dmy] -- must be a free function -- to use as a foreach target function level_tug_crate(t) local self,mx0,my0,dmx,dmy=level,unpack(t) local mxy0=_mix{mx0,my0} local existing=self._crates[mxy0] if (not existing) return self._crates[mxy0]=nil local mx1,my1=mx0+dmx,my0+dmy local px1,py1=mx1*8,my1*8 existing.todo={ {px=px1+dmx,py=py1+dmy,mx=mx1,my=my1,update=function() self.dirty=true return true end}, {px=px1,py=py1} } self._crates[_mix{mx1,my1}]=existing end -->8 -- particles particles={} add(real_modules,particles) function particles:init() self.a={} end function particles:update() local a2={} for i in all(particles.a) do i.t+=1 i[1]+=i.dx i[2]+=i.dy i.dy+=i.ddy if (i.t0) pset(unpack(i)) end end -->8 --player handling player={} add(real_modules,player) function player:init() -- don't change this on reinit: -- it stays the same when the level is changed or reloaded self.vanish_frame=0 end function player:reinit(x,y) self.x,self.y=x,y self.px,self.py=0,0 self.todo={} self.cooldown=4 self.rope=nil -- don't elide, needs to be cleared if present self.fall_frame=0 self.orientx,self.orienty=-1,0 end function player:update() -- this is a non-gameplay action that takes precedence over -- all gameplay actions self:_vanish_if_requested() if not (#self.todo>0 or level:busy()) then if level:win_at(self.x,self.y) then level:advance() return end if level:get_open_pit(self.x,self.y) then self.todo={{update=self._fall}} return end if kbd:btn(0) then self.orientx=-1 self.orienty=0 elseif kbd:btn(1) then self.orientx=1 self.orienty=0 elseif kbd:btn(2) then self.orienty=-1 elseif kbd:btn(3) then self.orienty=1 end function btncd(x) return (kbd:btn(x) and self.cooldown==0) or kbd:btnp(x) end if kbd:btn(4) then if kbd:btnp(4) and self.rope then self.rope:destroy() kbd:release(4) end -- wait for user to release it else local x,y=self.x,self.y local function try_move(dx,dy,f) if level:can_move(true,{x,y,dx,dy},0,2) then self.todo=f self.cooldown=8 local t=f[#f] t.x=x+dx t.y=y+dy particles:move(x,y,dx,dy) return end wrongbleep:bleep() end if btncd(0) then try_move(-1,0,{{orientx=-1,orienty=0,px=-2,py=0},{px=1}}) elseif btncd(1) then try_move(1,0,{{orientx=1,orienty=0,px=2,py=0},{px=-1}}) elseif btncd(2) then try_move(0,-1,{{orienty=-1,px=0,py=-2},{py=1}}) elseif btncd(3) then try_move(0,1,{{orienty=1,px=0,py=2},{py=-1}}) elseif not self.rope and kbd:btnr(4) then local dx,dy=self.orientx,self.orienty if (dy!=0) dx=0 while not level:mcoll{x,y} do x+=dx y+=dy end self.rope=rope:new( {x+0.5-dx*0.5,y+0.5-dy*0.5}, {self.x+0.5,self.y+0.5}, level:get_latch(dx,dy,x*8,y*8) ) self.todo={{ update=function() return not self.rope or self.rope:latched() end }} elseif kbd:btnp(5) then if (self.rope and not self.rope:tug()) wrongbleep:bleep(9) end end end if (#self.todo==0) self.px=0 self.py=0 _apply(self,self.todo) if (self.cooldown>0) self.cooldown-=1 if self.rope then self.rope:update() if self.rope:done_reeling() then local latch=self.rope.latch self.x=latch.rec.mx+latch.dx self.y=latch.rec.my+latch.dy end self.rope:drag_dst{ self.x+self.px/8+0.5, self.y+self.py/8+0.5 } local tdx,tdy=self.rope:tug_orientxy() if (tdx) self.orientx=tdx if (tdy) self.orienty=tdy if (self.rope:done()) self.rope=nil end end function player:_vanish_if_requested() if kbd:btn(5) then self.vanish_frame+=0.5 if (self.fall_frame>0 or self.vanish_frame>20) then self.rope=nil level:restart() kbd:release(5) self.vanish_frame=20 end else self.vanish_frame-=0.5 end self.vanish_frame=max(self.vanish_frame,0) end function player:_fall() if (self.fall_frame<10) self.fall_frame+=1 end function player:draw() local px=self.x*8+self.px+wrongbleep:vibrate() local py=self.y*8+self.py+wrongbleep:vibrate() local head=1-self.orienty local vanish_level=max((self.vanish_frame-4)/16,0) local invis_level=max(self.fall_frame/10,4*(vanish_level-0.75)) if (invis_level>=1.0) return --[[ local HEAD=14--3 local BODY=12--12 local TAIL=14--14 local IRIS=7--9 local PUPIL=0--0 ]] -- in order: head,body,iris,pupil,body again,tail local palette=split"-1,14,14,12,12,-1,-1,-1,7,0,-1,12,14,14,14" local function setpal() --[[ -- head nil,14,14, --body [2]=HEAD, [3]=HEAD, [4]=BODY, [5]=BODY, [9]=IRIS, [10]=PUPIL, [12]=BODY, [13]=TAIL, [14]=TAIL, [15]=TAIL, ]] pal(palette) -- vanish colors local vanish=split"13,15,14,5,4,12,2,3,9,10" for i,ilc in ipairs(vanish) do if (vanish_level>i/#vanish) pal(ilc,10) end if (self.fall_frame>3) local zc=@0x5f00&0xf0 for i=0x5f00,0x5f0c,4 do poke4(i,0x0505.0505) end poke(0x5f00,zc|0x01) end local rx,ry=self.x*8+self.px+1,self.y*8+self.py+2 if (self.orientx==1) rx+=6 if self.rope then local rx_adj,ry_adj=self.rope:affected_src_xy{rx,ry} if rx_adj then local drx,dry=rx_adj-rx,ry_adj-ry rx,ry=rx+drx,ry+dry px,py=px+drx,py+dry end end setpal() if self.orientx==-1 then spr(16,px+6,py-2,1,1) spr(17,px+1,py,1,1) if (self.rope and invis_level<=0.25) pal() self.rope:draw{self.x*8+self.px+1,self.y*8+self.py+2} setpal() spr(head,px-3,py-3,1,1) else spr(16,px-6,py-2,1,1,true) spr(17,px-1,py,1,1,true) if (self.rope and invis_level<=0.25) pal() self.rope:draw{self.x*8+self.px+7,self.y*8+self.py+2} setpal() spr(head,px+3,py-3,1,1,true) end pal() end -->8 -- rope physics rope={} rope.__index=rope function rope:new( src,dst,latch ) local r={ id=0, state={name="cast",frame=0}, latch=latch, flicker_t=t(), } r.src=src r.dst=dst r.src.next=r.dst r.dst.prev=r.src setmetatable(r,rope) return r end function rope:latched() return self.state.name=="latched" end function rope:done() return self.state.name=="done" end function rope:done_reeling() return self.state.name=="done" and self.state.reelin end function rope:update() if self.state.name=="cast" then self.state.frame+=1 if (self.state.frame>=3) self.state={name="latched"} elseif self.state.name=="latched" then if (not self.latch) wrongbleep:bleep(5) self:destroy() return if (self.latch.rec and self.latch.rec.dead) self:destroy() if (not self:_check_pinch()) self:destroy() elseif self.state.name=="destroy" then -- destroy self.state.frame+=1 if (self.state.frame>=4) self.state={name="done",reelin=self.state.reelin} else -- done state end end function rope:destroy(reelin) if (self.state.name=="destroy" or self.state.name=="done") return self.state={name="destroy",frame=0,reelin=reelin} end function rope:_resegment(points,artificial_pxy,cb) local n,perc_to_show,from_end=self.state.name,1.0 if (n=="done") return if (n=="cast") perc_to_show=self.state.frame/2 if (n=="destroy") perc_to_show=(1.0-self.state.frame/4)^2 if (self.state.reelin) from_end=true local artificial_px,artificial_py=unpack(artificial_pxy) points[#points]={x=artificial_px,y=artificial_py} local len=0 for i=1,#points-1 do len+=distance(points[i],points[i+1]) end local len_to_show,ia,iz,istep=perc_to_show*len,#points-1,1,-1 if (from_end) ia,iz,istep=iz,ia,1 for i=ia,iz,istep do local src,dst=points[i],points[i+1] local x,y=dst.x,dst.y local dx,dy=src.x-x,src.y-y local dist_base=sqrt(dx*dx+dy*dy) local coef=min(len_to_show/dist_base,1.0) len_to_show-=dist_base dx,dy=dx*coef,dy*coef if (from_end) x,y=src.x-dx,src.y-dy local v0,v1=cb(x,y,dx,dy,i) if (coef<1) return v0,v1 end end function rope:affected_src_xy(artificial_pxy) if (not self.state.reelin) return return self:_resegment( self:_anchors_simplified(),artificial_pxy, function(x,y) return x,y end ) end TONGUE_SEGS=gsv[[0`0.25`1 0.25`0.9`0.5 0.9`1`1]] function rope:draw(artificial_pxy) local points,highlight,hypo_ops,hypo_blocks=self:_tug(true) local function colorh(ix) color(8) if (highlight==ix) color(12) end self:_resegment(points,artificial_pxy, function(x,y,dx,dy,i) colorh(i) foreach(TONGUE_SEGS,function(row) local d0,d1,w=unpack(row) linefill(x+d0*dx,y+d0*dy,x+d1*dx,y+d1*dy,w) end) circfill(x+dx,y+dy,1) end ) -- draw latch local l=self.latch if l and l.rec and (self.state.reelin or self:latched()) then local function rfsplit(x) rectfill(unpack(split(x))) end colorh(0) camera(-l.rec.px,-l.rec.py) if (l.dx==-1) rfsplit"0,3,2,4" if (l.dx==1) rfsplit"5,3,7,4" if (l.dy==-1) rfsplit"3,0,4,2" if (l.dy==1) rfsplit"3,5,4,7" camera() color() end -- hypothetical local time=t()-self.flicker_t local flicker_on=time%0.5>0.25 if self:latched() and time>0 and not level:busy() then if flicker_on then foreach(hypo_ops, function(o) local mx0,my0,dmx,dmy=unpack(o) spr(14,(mx0+dmx)*8,(my0+dmy)*8) end) end foreach(hypo_blocks, function(o) local x,y,dx,dy=unpack(o) spr(34,8*x+4*dx,8*y+4*dy,1,1,flicker_on) end) end -- debug --[[ local n1=self.src local sy=0 while true do if (n1==nil) break local anch=level:anchor_at(n1) local ax,ay=_anch_unpack(n1) local x=ax*8 local y=ay*8 if anch then if (anch.adx>0) x-=1 if (anch.ady>0) y-=1 end rectfill(x-1,y-1,x+1,y+1,12) print("ax="..ax..",ay="..ay,72,sy) sy+=7 local n0=n1.prev local n2=n1.next if n0!=nil and n2!=nil then if anch then rectfill(x+2,y+2,x+4,y+4,3) else rectfill(x+2,y+2,x+4,y+4,2) end else rectfill(x+2,y+2,x+4,y+4,4) end n1=n1.next end for _,p in pairs(level._anch) do local ax,ay=_anch_unpack(p) local x,y=ax*8,ay*8 if (p.adx>0) x-=1 if (p.ady>0) y-=1 pset(x,y,11) pset(x+p.adx,y,11) pset(x,y+p.ady,11) end ]]-- end function rope:drag_dst(xy) self:drag(self.dst,xy) end function rope:drag(n1,axy) self:relax() self:_drag(n1,{axy[1],n1[2]}) self:_drag(n1,axy) self:relax() end function rope:relax() local n0=self.src while true do local n1=n0.next if (not n1) break local n2=n1.next if _anch_eq(n0,n1) then _anch_del(n1) else n0=n0.next end end local n0=self.src while n0 do local n1=n0.next if (not n1) return local n2=n1.next if (not n2) return local adxy,position_new=calc_tension(n0,n1,n2) local anch=level:anchor_at_tension(n1,adxy) if not anch then self:_drag(n1,position_new,{_anch_unpack(n1)}) _anch_del(n1) else n0=n0.next end end end function rope:_check_pinch() if (not self:latched()) return true if (level:busy()) return true local n0=self.src local qxys={} while true do local n1=n0.next if (not n1) break local n0ax,n0ay=_anch_unpack(n0) local n1ax,n1ay=_anch_unpack(n1) _rast(qxys,n0ax\0.5,n0ay\0.5,n1ax\0.5,n1ay\0.5) n0=n1 end local function _possible_tiles(t) local qx,qy=unpack(qxys[t]) local poss={} for mx=(qx-1)\2,qx\2 do for my=(qy-1)\2,qy\2 do if (not level:mcoll{mx,my}) add(poss,{mx,my}) end end return all(poss) end -- find cases where i move through an impassable zone for i=1,#qxys do if (not _possible_tiles(i)()) return end -- find cases where i am cut off diagonally for i=3,#qxys do local qx1,qy1=unpack(qxys[i-1]) if (qx1|qy1)&1==0 then local ok for m0 in _possible_tiles(i-2) do for m2 in _possible_tiles(i) do local mx0,my0=unpack(m0) local mx2,my2=unpack(m2) if (mx0==mx2 or my0==my2 or not level:mcoll{mx0,my2} or not level:mcoll{mx2,my0}) ok=true end end if (not ok) return end end return true end function calc_tension(xy0,xy1,xy2) local x0,y0=_anch_unpack(xy0) local x1,y1=_anch_unpack(xy1) local x2,y2=_anch_unpack(xy2) local dx,dy=x2-x0,y2-y0 local function switch_ends() dx,dy,x0,y0,x2,y2=-dx,-dy,x2,y2,x0,y0 end local function signs(douter,dinner) local adb=sgn0(dinner) return -sgn0(douter)*adb,adb end local adx,ady,x1_new,y1_new if abs(dx)>abs(dy) then if (x0>x2) switch_ends() x1_new,y1_new=x1,y0+(x1-x0)/dx*dy adx,ady=signs(dy,y1_new-y1) else if (y0>y2) switch_ends() x1_new,y1_new=x0+(y1-y0)/dy*dx,y1 ady,adx=signs(dx,x1_new-x1) end return {adx,ady},{x1_new,y1_new} end function would_stick(anch,tens) adx,ady=unpack(tens) return anch.adx==adx and anch.ady==ady end function rope:experience_anchor_moves(moves) local latch=self.latch self:_be_dragged_by(moves) self:_be_pushed_by(moves) if latch.rec then self:_drag(self.src,{ latch.rec.mx+0.5+latch.ax_offset, latch.rec.my+0.5+latch.ay_offset }) end self:relax() end function rope:_be_dragged_by(moves) local n=self.src while n do for t in all(moves) do local xy_old,xy_new=unpack(t) if (_anch_eq(xy_old,n)) n.dest=xy_new break end n=n.next end n=self.src while n do if (n.dest) self:_drag(n,n.dest) n.dest=nil n=n.next end end function rope:_be_pushed_by(moves) for i in all(moves) do self:_be_pushed_by1(unpack(i)) end end function rope:_be_pushed_by1(anch_old,anch_new) local n0=self.src local ax_old,ay_old=_anch_unpack(anch_old) local ax_new,ay_new=_anch_unpack(anch_new) while n0 do n1=n0.next if (not n1) return local nx0,ny0=_anch_unpack(n0) local nx1,ny1=_anch_unpack(n1) local nxmn,nxmx = _mnmx(nx0,nx1) local nymn,nymx = _mnmx(ny0,ny1) if (ax_new!=ax_old or (nxmnx1) x0,x1,mul=-x0,-x1,-mul local i=flr(x0) local top=flr(x1) return function() if (done) return i+=1 if i>top then done = true if (x1!=flr(x1)) return mul*x1 return end return mul*i end end function _which_side(xy,x0y0,x1y1) local x,y=_anch_unpack(xy) local x0,y0=_anch_unpack(x0y0) local x1,y1=_anch_unpack(x1y1) return sgn0((x1-x0)*(y-y0) - (y1-y0)*(x-x0)) end function distance(p1,p2) local dx=p2.x-p1.x local dy=p2.y-p1.y return sqrt(dx*dx+dy*dy) end function rope:collide_mrect(mx0,my0,mw,mh,exclude_src,exclude_dst) local mx1,my1=mx0+mw,my0+mh local n0=self.src while true do local n1=n0.next if (not n1) return local nd=n0 for i=1,exclude_dst do nd=nd.next if (not nd) return end local x1,y1=_anch_unpack(n0) local x2,y2=_anch_unpack(n1) local function _line_line(x3,y3,x4,y4) local denom=(y4-y3)*(x2-x1)-(x4-x3)*(y2-y1) local ua= ((x4-x3)*(y1-y3)-(y4-y3)*(x1-x3))/denom if (ua<0 or ua>1) return local ub= ((x2-x1)*(y1-y3)-(y2-y1)*(x1-x3))/denom if (ub<0 or ub>1) return return true end if exclude_src<=0 then if (_line_line(mx0,my0,mx1,my0) or _line_line(mx0,my0,mx0,my1) or _line_line(mx0,my1,mx1,my1) or _line_line(mx1,my0,mx1,my1)) return true end exclude_src-=1 n0=n1 end end -->8 -- moved here because it's complicated function rope:tug_orientxy() local a1=self.dst local a0=self.dst.prev local ax0,ay0=_anch_unpack(a0) local ax1,ay1=_anch_unpack(a1) local dx=ax0-ax1 local tdx if (dx>3/8) tdx=1 if (dx<-3/8) tdx=-1 local dy=ay0-ay1 local tdy if abs(dy)>abs(dx)/2 then if (dy>3/8) tdy=1 if (dy<-3/8) tdy=-1 end return tdx,tdy end function rope:tug() if (not self:latched()) return local success=self:_tug() if (success) self.flicker_t=t() return success end function rope:_tug(hypothetically) local ancs=self:_anchors_simplified() local touched={} local blocks = {} for i=#ancs-1,2,-1 do local ops_before_trash,blocks_before_trash=self:_calc_push(ancs[i+1],ancs[i],ancs[i-1],ancs[i-2]) local ops = {} for b in all(blocks_before_trash) do add(blocks, b) end if #ops_before_trash>0 then ops=ops_before_trash else local ops_after_trash,blocks_after_trash=self:_calc_push(ancs[i-2],ancs[i-1],ancs[i],ancs[i+1]) ops=ops_after_trash for b in all(blocks_after_trash) do add(blocks,b) end end if #ops>0 then if (hypothetically) return ancs,i-1,ops,blocks foreach(ops, level_tug_crate) return true end end local latch=self.latch if latch and latch.el=="eyehook" then if (hypothetically) return ancs,0,{},blocks player.todo={{ update=function(s) if not s.rope or s.rope:done() then return true end end }} self:destroy(true) return true end if latch and latch.el=="crate" then local dmx,dmy= sgn0(latch.dx), sgn0(latch.dy) local obj_anc=ancs[1] local pull_anc=ancs[2] local pull_dx=pull_anc.x-obj_anc.x local pull_dy=pull_anc.y-obj_anc.y local mx0=latch.rec.mx local my0=latch.rec.my local mxa=(pull_anc.x+dmx)\8 local mya=(pull_anc.y+dmy)\8 local invalid_move if (dmx!=0 and sgn0(pull_dx)!=dmx) or (dmy!=0 and sgn0(pull_dy)!=dmy) or sgn0(mx0-mxa)!= sgn0(mx0+dmx-mxa) or sgn0(my0-mya)!= sgn0(my0+dmy-mya) then invalid_move=true end if not invalid_move then local mv = {mx0,my0,dmx,dmy} if level:can_move(false,mv,1,0) then if (hypothetically) return ancs,0,{mv},blocks level_tug_crate(mv) return true else add(blocks, mv) end end end if (hypothetically) return ancs,32767,{},blocks -- invalid return end function rope:_calc_push( an,a0,a1,af ) local ops={} if (not an) return ops local ax0,ay0=_anch_unpack(a0) local ax1,ay1=_anch_unpack(a1) local anch=level:anchor_at(a0) if (not anch) return ops if ax0==ax1 then -- no far side applying pressure? local y0,y1=_mnmx(a0.y,a1.y) local my0,my1,smy=(y0+1)\8,(y1-1)\8,1 if a0.y>a1.y then my0,my1=my1,my0 smy=-smy end local dmx=1 -- maybe push right? if anch.adx==-1 and a0.x>an.x+7 then -- push left ax0, dmx=ax0-1,-1 elseif anch.adx!=1 or a0.x>=an.x-7 then return {} end for my=my0,my1,smy do add(ops,{ax0,my,dmx,0}) end end if ay0==ay1 then local x0,x1=_mnmx(a0.x,a1.x) local mx0,mx1,smx=(x0+1)\8,(x1-1)\8,1 if a0.x>a1.x then mx0,mx1=mx1,mx0 smx=-smx end local dmy=1 -- maybe push down? if anch.ady==-1 and a0.y>an.y+6 then -- push up ay0,dmy=ay0-1,-1 elseif anch.ady!=1 or a0.y>=an.y-6 then return {} end for mx=mx0,mx1,smx do add(ops,{mx,ay0,0,dmy}) end end local ops2,blocked={},{} for o in all(ops) do local mx,my=unpack(o) if level:mcoll{mx,my} then if (not level:get_crate(mx, my)) break if not level:can_move(false,o,0,0) then add(blocked,o) break end add(ops2,o) end end return ops2,blocked end function rope:_anchors_simplified() -- todo: cache this local points={} local _slope = function(p0,p1) return atan2(p1.y-p0.y,p1.x-p0.x) end a=self.src while a do local ax,ay=_anch_unpack(a) local point={ ax,ay, x=flr(ax*8+0.5),y=flr(ay*8+0.5), } local aw=level:anchor_at(a) local l=self.latch if aw then if (aw.adx==1) point.x-=1 if (aw.ady==1) point.y-=1 elseif not a.prev and l then if (l.ax_offset<0) point.x-=1 if (l.ay_offset<0) point.y-=1 end local p0,p1=points[#points-1],points[#points] if not p0 then add(points,point) elseif _slope(p0,p1)==_slope(p1,point) then -- epsilon? points[#points]=point else add(points,point) end a=a.next end return points end -->8 --wrongbleeps wrongbleep={} add(modules,wrongbleep) add(real_modules,wrongbleep) function wrongbleep:init() self.duration=0 self.continuous=0 end function wrongbleep:update() if (self.duration>5) self.duration=5 if self.duration>0 then sfx(63,3) self.continuous+=1 else self.continuous=0 end self.duration=max(self.duration-1,-4) end function wrongbleep:bleep(duration) self.duration+=duration or 2 end function wrongbleep:vibrate(duration) if (self.continuous<10) return 0 return (rnd()*2-1)*min(self.continuous/10,2) end function wrongbleep:adequately_warned(duration) return self.continuous>45 end -->8 -- text level_text={by_lvl={}} add(real_modules,level_text) level_text_raw=gsv[[ 0`9`11`press πŸ…ΎοΈ to mlem & unmlem, 0`33`17`❎ to yoink]] function level_text:init() for i=0,31 do self.by_lvl[i]={} end for row in all(level_text_raw) do if (row) add(self.by_lvl[row[1]],row) end end function level_text:draw2() for xys in all(self.by_lvl[level.ix]) do print(xys[4],xys[2],xys[3],7) end end -->8 --hint system --hint file format: -- each row is one hint. -- 4 or 5 columns -- separated with a -- grave (`) character -- [1] room# -- [2] x coord -- [3] y coord -- [4] message line 1 (rot13) -- [5] message llne 2 (rot13) -- [6] arrow (semicolon separated list: each element is two comma-separated integers) -- row 5 can be omitted -- for a 1-line hint -- row 6 can be omitted if there is no arrow -- -- multiple hints for the same -- room are revealed in order hints = {} add(real_modules,hints) function hints:init() local h = gsv[[0`42`57`πŸ…ΎοΈ pULL` β–  0`42`73`❎, ❎ pULL``69,67;55,67 1`35`33`⁘` pULL`62,35;41,35 1`79`82`pULL β– ``100,94;100,88 1`42`98`⁘`IGNORE`66,99;52,99;52,75;28,75;28,120 2`75`65` `⁘`86,67;76,67;76,71 2`104`73` β– `pULL`81,75;86,75 2`27`42`⁘``36,16;36,44;31,44 3`51`106`β– ``52,97;52,104 3`-1`-1```28,78;28,45 3`-1`-1```65,35;83,35 3`-1`-1```97,35;105,35 24`-1`-1```41,51;47,51 24`59`49`β–  24`-1`-1```75,62;75,51 24`-1`-1```78,49;67,49 24`-1`-1```36,62;36,51 24`-1`-1```56,59;56,51 24`67`17`β–  24`-1`-1```62,83;58,83 ]] for rec in all(h) do if(rec[6]) rec[6]=gsv(rec[6],";",",") local lh = self[rec[1]] if lh then add(lh,rec) else self[rec[1]] = {rec} end end menuitem(1,"get hint",function() level.hintlevel+=1 end) menuitem(2,"hide hints",function() level.hintlevel=0 end) end hintflicker=split"7,10,9,8,8,9,10,7" function hints:draw2() pal() local c=cycle(hintflicker) local function body() for i,h in ipairs(self[level.ix]) do if (i > level.hintlevel) return local _,x,y,txt,txt2,arrow=unpack(h) print(txt,x,y) if (txt2) print(txt2,x,y+8) if arrow then line() local x0,y0,x1,y1 for i=1,#arrow do x0,y0,x1,y1=x1,y1,unpack(arrow[i]) line(x1,y1) end local dir=atan2(x1-x0,y1-y0) local function _ahead(d,r) line(x1+r*sgn0(cos(dir+d)),y1+r*sgn0(sin(dir+d))) end _ahead(0.375,2) _ahead(0.625,2) _ahead(0,0) end end end color(7) camera(1,-1) pal(7,1) body() camera() pal(7,c) body() pal() end -->8 -- debug mouse support debugmouse = {} -- comment this out to disable debug mode add(real_modules, debugmouse) function debugmouse:init() poke(0x5f2d,1) end debugflicker=split"5,6,7,15,14,8,2,4,9,10,11,3,12,13" debugchs = split" ,β–‘,x" function debugmouse:draw3() if (stat(34) == 0) return pal(15,cycle(debugflicker,1.5)) local x, y, c = stat(32), stat(33), debugchs[stat(34) & 0x3] if not c or c == " " then spr(50,x,y) else print(c,x,y,15) end print(x..", "..y, mid(0,x,97), mid(0, y > 117 and y - 6 or y + 6, 117), 15) pal() end -->8 -- save/load persist={} add(modules, persist) add(real_modules, persist) function persist:init0() cartdata("ulimate_lizard_total_destruction_0_1") self.init0 = self.read self:read() end function persist:read() self.ready=false local m = dget(0) == 0 self.music = m if m then music_on() else music_off() end self.max_level = dget(1) self.recent_level = dget(2) self.ready=true end function persist:wipe() for i=0,64 do dset(i,0) end self:read() end function persist:lvlstart() self.recent_level = level.ix self.max_level = max(self.max_level, level.ix) self:write() end function persist:write() if (not self.ready) return dset(0, self.music and 0 or -1) dset(1, self.max_level) dset(2, self.recent_level) end __gfx__ 000030000000002200003000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeff1ff1ff1fffffff1ffffff1fffffff1dddddddd111111110000000033300333 003333300000332200333330eeffffffffffffffffffffeee5e555e55e555e5eff1ff1ffffffffffffffffffffffffffdddddddd111111110cc00cc033300333 099333990039932009333339effeeeeeeeeeeeeeeeeeeffee5eeeeeeeeeeee5eff1ff1ffff111111ff1111ff111111ffdddddddd111111110cccccc033333333 09a333a9033a932009333339efee33e3333e333e3333eefee5e333e333333e5eff1ff1ffff1fffffff1ff1fffffff1ffdddddddd1111111100c00c0000300300 023333323333320000222220efe333e3333e333e33333efee5e333e333333e5eff1ff1ffff1fffffff1ff1fffffff1ffdddddddd1111111100c00c0000300300 002222200000220000222220efe33eeeeeeeeeeeeee33efeeee33eeeeee33eeeff1111ffff111111ff1ff1ff111111ffdddddddd111111110cccccc033333333 000222c002222c0000022200efeeee555e555e55e5eeeefee5eeeeffffeeee5effffffffffffffffff1ff1ffffffffffdddddddd111111110cc00cc033300333 00000cc00000cc0000000cc0efe33e5eeeeeeeeee5e33efee5e33efeefe33e5e1ffffff11fffffffff1ff1fffffffff1dddddddd111111110000000033300333 0000ff000000000000000000efe33e5e11111111e5e33efee5e33efeefe33e5eff1ff1ffffffffffffffffffffffffff88888888aaaaaaaaaaaaaaaa88888888 000f00f0000000000aa00aa0efe33eee11ffff11eee33efeeee33effffe33e5eff1ff1ffffffffffffffffffffffffff88888888aa88aa88aa88aa8888888888 00d0000f000000000aaaaaa0efe33e5e1ff11ff1e5e33efee5e33eeeeee33eeeff1ff1fffff11111ffffffff11111fff88888888888888888888888888888888 00d0d00f00c040500aaaaaa0efeeee5e1f1111f1e5eeeefee5e333e333333e5eff1ff1fffff1ffffff1111ffffff1fff88888888888888888888888888888888 00dd00ee00c4455000999900efe33e5e1f1111f1e5e33efee5e333e333333e5eff1111fffff1ffffff1ff1ffffff1fff88888888888888888888888888888888 00000ee00c44455500aaaa00efe33eee1ff11ff1eee33efeeeeeeeeeeeeeee5efffffffffff11111ff1ff1ff11111fff88888888888888888888888888888888 00eeee000c004005000aa000efe33e5e11ffff11e5e33efee5555e555e555e5effffffffffffffffff1ff1ffffffffff888888888888888888aa88aa88aa88aa eeee0000cc04405500444400efeeee5e11111111e5eeeefeeeeeeeeeeeeeeeeeffffffffffffffffff1ff1ffffffffff8888888888888888aaaaaaaaaaaaaaaa 00000000000a900000000000efe33eeeeeeeeeeeeee33efeff1ff1ffffffffffffffffff00000000000000000000000000000000000000000000000000000000 00000aaaaaaa910000000000efe33e5555e555e555e33efeff1ff1ffffffffffffffffff00000000000000000000000000000000000000000000000000000000 0000aaaaaa1a911000a00200efe33eeeeeeeeeeeeee33efeff1ff1ff11111111ff1111ff00000000000000000000000000000000000000000000000000000000 0aaaaaaaaa1a9111000a2000efe333e3333e333e33333efeff1ff1ffffffffffff1ff1ff00000000000000000000000000000000000000000000000000000000 0aaaaaaaa41a91a10002a000efee33e3333e333e3333eefeff1ff1ffffffffffff1ff1ff00000000000000000000000000000000000000000000000000000000 0a000aa4441a91a100200a00effeeeeeeeeeeeeeeeeeeffeff1ff1ff11111111ff1111ff00000000000000000000000000000000000000000000000000000000 00a0044449a110a100000000eeffffffffffffffffffffeeff1ff1ffffffffffffffffff00000000000000000000000000000000000000000000000000000000 000aa1119911111000000000eeeeeeeeeeeeeeeeeeeeeeeeff1ff1ffffffffffffffffff00000000000000000000000000000000000000000000000000000000 0000000099100000f765000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111999999111111111 00000000990000007700000000000000000000000000000000000000000000000000000000000000000000000000000019911991999999911999999119999999 00000000990000006060000000000000000000000000000000000000000000000000000000000000000000000000000019977991999999911999999119999999 00000000090000005005000000000000000000000000000000000000000000000000000000000000000000000000000019911991999117111991199111711999 00000000aa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000019911991999117111991199111711999 0000000077a000000000000000000000000000000000000000000000000000000000000000000000000000000000000019999991999999911997799119999999 00000007777a00000000000000000000000000000000000000000000000000000000000000000000000000000000000019999991999999911991199119999999 00044444444444000000000000000000000000000000000000000000000000000000000000000000000000000000000019999991111111111111111111111111 44444444444004444444444444400444444444444440044444444444444004444444444444400444444444444440044444444444444004444444444444400444 477dd77447711774477dd77447711774477dd77447711774477dd77447711774477dd77447711774477dd77447711774477dd77447711774477dd77447711774 47777774477777744777777447777774477777744777777447777774477777744777777447777774477777744777777447777774477777744777777447777774 4d7117d44d7117d44d7117104d7117104d7117d44d7117d44d7117104d711710017117d4017117d40171171001711710017117d4017117d40171171001711710 4d7117d44d7117d44d7117104d7117104d7117d44d7117d44d7117104d711710017117d4017117d40171171001711710017117d4017117d40171171001711710 47777774477777744777777447777774477777744777777447777774477777744777777447777774477777744777777447777774477777744777777447777774 477dd774477dd774477dd774477dd77447711774477117744771177447711774477dd774477dd774477dd774477dd77447711774477117744771177447711774 44444444444444444444444444444444444004444440044444400444444004444444444444444444444444444444444444400444444004444440044444400444 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000cc0cc0cccccccccccccccccccccccccccccccc0bb000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000cc0cc0000cc0000000000000000000cc0000000bb0bb0bbbb0bbbbb0bbbbb0bbb000000000000000000000000000000000000000000000000000000000000 000cc0cc0cc0cc0cc0cccccccc0ccccc0cc0ccccc0bb0bb000bb0000bb0bb0bb0bb0b00000000000000000000000000000000000000000000000000000000000 000cc0cc0cc0cc0cc0cc0cc0cc0000cc0cc0cc0cc0bb0bb0bb000bbbbb0bbb000bb0b00000000000000000000000000000000000000000000000000000000000 000cc0cc0cc0cc0cc0cc0cc0cc0ccccc0cc0ccccc0bb0bb0bbbb0bbbbb0bb0bb0bbbb00000000000000000000000000000000000000000000000000000000000 000cc0cc0cc0000cc0cc0cc0cc0cc0cc0cc0cc0000bb000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000ccccc0ccccc0cc0cc0cc0cc0ccccc0cc0ccccc0bbbbbbbbbbbbbbbbbbbbbbbbbbb00000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 88888888888888888888880aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa00000000000000000000000000000000000000000000000000000000 0088000000088000000000000000000000000aa00000000000000000aa0000000000000000000000000000000000000000000000000000000000000000000000 00880888880880888880880aaa00aaa0aaaa0aa0aaaaa0aa0a0aaaa0aa0aa0aaaaa0aaa000000000000000000000000000000000000000000000000000000000 00880880880880000880880aa0a0aa00aa000aa0aa0aa0aa0a0aa000aa0aa0aa0aa0aa0a00000000000000000000000000000000000000000000000000000000 00880880880880888880880aa0a0aa0000aa0aa0aaa000aa0a0aa000aa0aa0aa0aa0aa0a00000000000000000000000000000000000000000000000000000000 00880880880880880880880aaaa0aaa0aaaa0aa0aa0aa0aaaa0aaaa0aa0aa0aaaaa0aa0a00000000000000000000000000000000000000000000000000000000 00880888880880888880880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000888888800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 d0d0d0304040404050d0d0d0d0d0d0d0d0d0d0d0d0d0d010d0d0d0d0d0d0d0d0d0d0d0d0d0d030404050d0d0d0d0d0d000000000000000000000000000000000 00000000000000000000000000000000d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000 d0d0d0310000000051d0d0d0d0d0d0d0d0d0d0d0d0d0410041d0d0d0d0d0d0d0304040404050316400510041d0d0d0d000000000000000000000000000000000 0000000000000000000000000000000010000000c1d000000000d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000 d0d0d0320042420052d0d0d0d0d0d0d0d0d0d0d0d0d0410041d0d0d0d0d0d0d0317400000051000000000030404050d000000000000000000000000000000000 00000000000000000000000000000000d0c1c100c1d000c1c100d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000 d0d0d0300040400050d0d0d0d0d0d0d0d0d0d030405030003040404050d0d0d0310000e1e1000042e1520000000051d000000000000000000000000000000000 00000000000000000000000000000000d0c1c300c1c100c1c300c1c1c1c1d0d00000000000000000000000000000000000000000000000000000000000000000 d0d0413100000000614040404050d0d0d0d0d031005131000000000051d0d0d0100000000451304000500031000051d000000000000000000000000000000000 00000000000000000000000000000000d0c1a400f10000c1a400f10000c1d0d00000000000000000000000000000000000000000000000000000000000000000 100000000000040000e300000051d0d0d0d0d03100d1d100d1d1820051d0d0d031000400000000000051003242d152d000000000000000000000000000000000 00000000000000000000000000000000d0c1000000c1c1c1000000c100c1d0d00000000000000000000000000000000000000000000000000000000000000000 d0d0413270000000000000000051d0d0d0d0d0d300f1f10014c1f30051d0d0d031000000005131000051003040f1405000000000000000000000000000000000 00000000000000000000000000000000d0c1c1c1c1c1c1c1c1c1c1c100c1d0d00000000000000000000000000000000000000000000000000000000000000000 d0d00000e1000000d10000040051d0d0d0d0d0310051310082f1820051d0d0d03242424242523242425200000000005100000000000000000000000000000000 00000000000000000000000000000000d0d0c1c1c1c1c1c1c1c1c1c100c1d0d00000000000000000000000000000000000000000000000000000000000000000 d030005031e1d100c100d1d1005141d0d0d0d031005131000000000051d0d0d03040404050304040405000310000005100000000000000000000000000000000 00000000000000000000000000000000d0d0d0c1000000000000000000c1d0d00000000000000000000000000000000000000000000000000000000000000000 d03100513100c100c100c100605241d0d0d0d032005232424200d14252d0d0d03100000051d300000051003242d1425200000000000000000000000000000000 00000000000000000000000000000000d0d0d0c100c1c1c1c1c1c1c1c1c1d0d00000000000000000000000000000000000000000000000000000000000000000 d03100513100c100c100c10051304050d0d0d030005030404000c140504141d031000000d1d100440051003040f150d000000000000000000000000000000000 00000000000000000000000000000000d0d0d0c100c1c100000000c1c1c1d0d00000000000000000000000000000000000000000000000000000000000000000 d03100513100f1e1f1e1f10051310051d0d0d0310000000000a4f1000000002131000000f1f1001400510000000051d000000000000000000000000000000000 00000000000000000000000000000000d0d0c1c100c1c100c1c100c1c1c1d0d00000000000000000000000000000000000000000000000000000000000000000 d0310051310000000000000000000051d0d0d0324252324242424242524141d0310000005131000000510031000051d000000000000000000000000000000000 00000000000000000000000000000000d0d0c1c300c1c100c1c300c1c1c1d0d00000000000000000000000000000000000000000000000000000000000000000 d0320052324242424242424252310051d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0324242005232e14200521432424252d000000000000000000000000000000000 00000000000000000000000000000000d0d0c13400f10000c1a400f1000000210000000000000000000000000000000000000000000000000000000000000000 d0410041d0d0d0d0d0d0d0d0d0324252d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0000000004100000041d0d0d0d000000000000000000000000000000000 00000000000000000000000000000000d0d0c1000000c1c1c1000000c1c1d0d00000000000000000000000000000000000000000000000000000000000000000 d0d021d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d021d0d0d0d0d0d0d0d0d000000000000000000000000000000000 00000000000000000000000000000000d0d0c1c1c1c1c1c1c1c1c1c1c1d0d0d00000000000000000000000000000000000000000000000000000000000000000 d0d0d0d0d0d0d0d0e3d0d0d0d0d0d0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 d0d0d0d0d0d04100000041d0d0d0d0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000c0 d0d0d0d0d0d04100000041d0d0d0d0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000c0 4141304040404040004040404050d0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000c0 d300e1e1e1e1d1d100d1d1d1d151d0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000c0 d00031000000c1f100c1f1c1f151d0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000c0 d00031000400f100e1f124c1005141d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000c0 d000e10000000404f30400c100000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000212000000000000c0 d00031000400e1e1e1e1e1f1005141d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000313000000000000c0 d000310000000000000000000051d0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000c0 4100e1e1e1e1e1e1a4e1e1e1e151d0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000c0 4141324242424242004242424252d0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000c0 d0d0d0d0d0d0d0410041d0d0d0d0d0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000c0 d0d0d0d0d0d0d0410041d0d0d0d0d0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000c0 d0d0d0d0d0d0d0410041d0d0d0d0d0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000c0 d0d0d0d0d0d0d0d021d0d0d0d0d0d0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 __label__ 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77766777777667777776677777766777777667777776677777766777777667777776677777766777777667777776677777766777777667777776677777766777 77766777777667777776677777766777777667777776677777766777777667777776677777766777777667777776677777766777777667777776677777766777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777700000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777700000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777700000000000000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000000777667777776677700000000000000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000000777667777776677700000000000000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000000000000777777777777777700000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777700000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777700000000000000000000000000000000000000000000000077777777 77777777000000000000000077777777000000000000000000000000000000000000000000000000000000000000000077777777000000000000000077777777 77777777000000000000000077777777000000000000000000000000000000000000000000000000000000000000000077777777000000000000000077777777 77777777000000000000000077777777000000000000000000000000000000000000000000000000000000000000000077777777000000000000000077777777 77766777000000000000000077766777000000000000000000000000000000000000000000000000000000000000000077766777000000000000000077766777 77766777000000000000000077766777000000000000000000000000000000000000000000000000000000000000000077766777000000000000000077766777 77777777000000000000000077777777000000000000000000000000000000000000000000000000000000000000000077777777000000000000000077777777 77777777000000000000000077777777000000000000000000000000000000000000000000000000000000000000000077777777000000000000000077777777 77777777000000000000000077777777000000000000000000000000000000000000000000000000000000000000000077777777000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777777000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777777000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777777000000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000077766777000000000000000077766777000000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000077766777000000000000000077766777000000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000077777777000000000000000077777777000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777777000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777777000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000007777777700000000777777770000000000000000000000000000000000000000000000007777777700000000777777770000000077777777 77777777000000007777777700000000777777770000000000000000000000000000000000000000000000007777777700000000777777770000000077777777 77777777000000007777777700000000777777770000000000000000000000000000000000000000000000007777777700000000777777770000000077777777 77766777000000007776677700000000777667770000000000000000000000000000000000000000000000007776677700000000777667770000000077766777 77766777000000007776677700000000777667770000000000000000000000000000000000000000000000007776677700000000777667770000000077766777 77777777000000007777777700000000777777770000000000000000000000000000000000000000000000007777777700000000777777770000000077777777 77777777000000007777777700000000777777770000000000000008000000000000000080000000000000007777777700000000777777770000000077777777 77777777000000007777777700000000777777770000000000000088888888888888888888000000000000007777777700000000777777770000000077777777 77777777000000000000000000000000000000000000000000000088888877777778888888800000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088877777777777777788880000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088877777777777777708888000000000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000088877667777776677700888800000000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000088777667777776677700088880000000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000000000088777777777777777700008888000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088777777777777777700000888000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088777777777777777700000008880000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088777777777777777700000000888000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088777777777777777700000000088800000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088777777777777777700000000008880000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000088777667777776677700000000000888000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000088877667777776677700000000000088800000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000000000088877777777777777700000000000008880000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088877777777777777700000000000000888000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088877777777777777700000000000000088800000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088880000000000000000000000000000008880000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088888800000000000000000000000000000888000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000088888000000000000000000000000000088800000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000000000088880000000000000000000000000000888000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000000000000088880000000000000000000000000888800000000000000000000000077766777 77777777000000000000000000000000000000000000000000000000000000000888880000000000000000000000088880000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000008888880000000000000000000008888000000033000000000000077777777 777777770000000000000000000000000000000000000000000000000000000000000888880000000000000000000008883330003bb300000000000077777777 777777770000000077777777000000007777777700000000000000007777777777777778880000000000000077777777833b33003ab337770000000077777777 77777777000000007777777700000000777777770000000000000000777777777777777888800000000000007777777733333300331137770000000077777777 77777777000000007777777700000000777777770000000000000000777777777777777788800000000000007777777700883330711337770000000077777777 77766777000000007776677700000000777667770000000000000000777667777776677788800000000000007776677703333333733367770000000077766777 77766777000000007776677700000000777667770000000000000000777667777776677708880000000000007776677700333330333667770000000077766777 77777777000000007777777700000000777777770000000000000000777777777777777700880000000000007777777700033133311777770000000077777777 77777777000000007777777700000000777777770000000000000000777777777777777700888000000000007777777700003100317777770000000077777777 77777777000000007777777700000000777777770000000000000000777777777777777700088000000000007777777700033103317777770000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000088800000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000008800000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000008880000000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000000000000000000000000000888000000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000000000000000000000000000888000000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000000000000000000000000000000000888800000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000088800000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000088880000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777778880000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777778880000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777778800000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000077766777000000000000000077766778800000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000077766777000000000000000077766778800000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000077777777000000000000000077777778800000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777778880000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777778880000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777700000088880000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777700000888800000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777700008888000000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000000777667777776677700088800000000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000000777667777776677700880000000000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000000000000777777777777777708800000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777788000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777778880000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000888800000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000008888000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000008880000000000000000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77766777777667777776677777766777777667777776677777766777777667777776677777766777777667777776677777766777777667777776677777766777 77766777777667777776677777766777777667777776677777766777777667777776677777766777777667777776677777766777777667777776677777766777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 __gff__ 000000c0c0c0c0c0c0c0c0c0c0c00000000000c0c0c0c0c0c0c0c0c020202020404000c0c0c0c0c0c008080800000000404000000000080808080808c0c0c0c000000000080808080808080800000008000000000808080808080808000000000008080808080808080808080000000000080808080808080808080800000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 __map__ 0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d1203040404050d0d0d0d010d0d0d0d0d0d0d0d0d0d0d0d0d0d120d0d0d0d0d0d0d0d0d0d0d0d0d03043e0a040404050d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d 0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0a0d0d0d0d0a0d0304040405140013004f00150d0d0d1400140d0d0d0d0d0d0d0d0d0d0d0d1400140d0d0d0d0d0304040404040417000026000000150d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d030404043e050d0d0d0d0d0d033e0404040404050d0d0d0d0d0d0d 0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d03042604040404260417000000151400001e0000150304040400040404050d0d0d0d0d03040404050003040404050d1300000000000000000018000000150d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0304041700000000150d0d0d0d0d0d134400000000001514140d0d0d0d0d 0d0d0d0d0d0d0d0d0d0a0d0d0d0d0d0d0d14130018000000001800000000001514141300000015130000000000000015030404040513000000160017000000150d1300000000000000421e00000000150d0d0d0d0d0d0d0d0d0a0d0d0d0d0d0d0d0d1300000000000000150d0d0d0d0d12001d0000000000000003040404050d 0d0d0d0d0d0d0d0d0d260d0d0d0d0d0d010000001e0000004f000000000000150d031700000015130000000000000015130000001513004200001e43000000150d130000000000000000001a000041150d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d0d13000000001d1d00150d0d0d0d0d0d131c0000000000150013000000150d 0d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d1413001a000000001a0000000000150d13000000001513000000000000001513001d1d0000000000000000000000150d232424002424240700002600001e150d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d0d1346062407471c00150d0d0d0d0d0d231c24241d2424250000000000150d 0d0d0d0d03040404042604050d0d0d0d0d0d232426242424242624071e001e150d13000000001513000000000000001513001f481523242424070006242424250d0304040004040523242408242400250d0d0d0d03040404041804050d0d0d0d0d0d1346150d131c1f0016040404050d0d031f04051c0d030404170000001605 0d14141413000000001800151414140d0d0d0d0d080d0d0d0d080d23240024250d23240000242513000000000000001513000000150d0d0d0d2324250d0d0d0d0d3d001c001c003f03040404040400050d1414141300001d1d1d003f1414140d0d0d13441604171f1a0000000000150d0d130000161f053d44001d1d001d0015 0100000000000000004f0000000000120d0d0304040404050d0d0d0d1400140d0d030400000405130000004f000000151300000015030404050d0d0d030404050d13001c1d1c00151300000000000015010000000000001c1c1c0000000000120d0d13001c000000181d1a1d1a1d150d0d131d1d0000151342001c1c001c003f 0d14141413000000001a00151414140d0d0d1300000000150d0304040400050d0d13001e1e4f15130000001e00000015130000001513000016040404170000150d13001f401f00151300481e000000150d1414141300001f1f1f003f1414140d0d0d13001f0043003f1f181c181f150d0d131f1f0000151300001c1c1d1c4915 0d0d0d0d23242424242624250d0d0d0d0d0d1300000000150d1300000000150d0d130000000015130000150013000015130000431513000000000000000000150d1300000000001523242400242424250d0d0d0d23242424241a24250d0d0d0d0d0d13001a001a1d1a00001f0000150d0d230747000015131e1e1f1f1f1f3e15 0d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d091b00191b00192727271b1e19270b0d2324240024252324242500232424251300000000004d0000000000000000150d1300000000001503040000040514140d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d0d131e1800181f18001a00063c250d0d0d2324243c25130040000000000015 0d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d0d1300001e4f1e000000004f00150d0d0d03040004050d0d0d1400140d0d0d232424242513000000000000000000150d130000000000151300001d1d0000140d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d1413000000000000001800000000120d140304040405130000000000000015 0d0d0d0d0d0d0d0d0d080d0d0d0d0d0d0d0d230024242425141300000000150d0d0d134f1e00151414141400140d0d0d0d0d0d0d0d13000006240024070000150d2324240024242513000040441500140d0d0d0d0d0d0d0d0d080d0d0d0d0d0d0100000000000000062424242514140d0100001d1d483f230024242424242425 0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d1400140d0d0d0d2324242424250d0d0d13000000000000000000140d0d0d0d0d0d0d0d23242425140014232424250d0d0d1400140d0d13000000001500120d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d1423242424243c250d0d0d0d0d0d0d0d14131f1f00000000140d0d0d0d0d0d 0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d120d0d0d0d0d0d0d0d0d0d0d0d0d0d23242424251414141414140d0d0d0d0d0d0d0d0d0d0d0d0d010d0d0d0d0d0d0d0d0d010d0d0d232424242425140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d23242424251414140d0d0d0d0d0d 0d0d0d0d0d0d0d0d030404040404050d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d010d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d120d0d0d0d0d0d0d0d0d0d0d0d0d0d0d120d0d0d0d0d0d0d0d0d0d0304040404050304040404050d0d0d0d0d0d0d0d0d0d0d0d0d120d0d0d 0d03040404040405133d00001c00150d0d0d0d0d0d0d0d0d0304043e0404050d0d0d0d0d030404000404050d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0304040004050d0d0d0d0d0d0d0d0d0d0d0d1400140d0d0d0d0d0d0d0d0d1300000000151300000000150d0d0d0d14030404040404041400140d0d 0d13001c1c004f0000421e1d1f00150d0d0d0d0d0d0d0d0d130000000000150d0d0d0d0317420000004816050d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d1300000000150d0d0d0d0d0d0d0d0d0d0d0d1400140d0d0d0d0d0d0d0d0d1300000000151300000000150d0d0d141413000000000000001e003f0d 0d13001c1c1d00150000001c000000010d03040404040405130000000000150d0d0d141300191b1d191b0015140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d1300000000150d0d0d0d0d0d0d0d0d0d0d030400040404050d0d0d0d0d0d130000001e1e1e00004848150d0d0d030417001d1d1d1d1d0015140d0d 0d13001f1f000015131e1e1f1d1d150d0d13460044004c15130000000000150d0d3d001e0042001f0048001e003f0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d2307000006250d0d0d0d0d0d0d0d0d0d0d131c001c0000150d0d0d0d0d0d2324442424252324241d24250d0d0d130000001c1c421c1c00150d0d0d 0d13000000000015130000001c1c150d0d131d1d1e1d1d152324241d2424250d0d140023240700410006242500140d0d0d0d0d0d030404040404050d0d0d0d0d0d030404040523001d2503040404050d0d0d0d0d0d0d3d1c001c0000150d0d0d0d0d0d0304000404050304041f04050d0d0d13001d1d1f1f001c1c00150d0d0d 0927271b1e1e0015130014001c1c150d0d131c3d001c1c000000001f040404050d1400000023243c2425000000140d0d0d0d0d0d130000001c000000000d0d0d0d1300000000461d1c4c00000000150d0d0d0d030404171f1f1f2800150d0d0d0d0d0d1343004c1e151300000000150d0d0d13001c1c0000001c1c00150d0d0d 0d131c1c00000000000000001c1c150d0d131f1f1e1f1f1514141300280000150d14000000001f1f1f00000000140d0d0d141414130028001c4516050014140d0d13000000001c1c1c1c00000000150d0d0d0d130000000000000000150d0d0d0d0d0d2324002424251300004100150d0d0d13001c1c001e001c1c00150d0d0d 0d131c1c0014001513001e1e1927270b0d1300004100001514141300000000010d144f47411400000014000000140d0d01000000000000001f000015000000120100004000001c1c1c1c000000003f0d0d0d0d13000000000000004a150d0d0d0d0d0d0304001e3e052324240024250d0d0d13001c1c0000001c1c00150d0d0d 0d131c1c00000015130000000000150d0927271b001927270b031741280000150d14434b491400000014000000140d0d0d14141413002800000000151414140d0d1300000000431c1c4900000000150d0d0d0d1300001d1d1d062424250d0d0d0d0d0d1300000000150304040004050d0d0d13001c1c001d1d1f1f00150d0d0d 0d131f1f1d1e1e151300001d1d00150d0d131f1c001c1c151f130000004900150d03040404040000000304040405140d0d0d0d0d13000000000006250d0d0d0d0d2324242425031c1f0523242424250d0d0d0d1300001c411c3f0d0d0d0d0d0d0d0d0d130000000015131e004100150d0d0d13001c1c481c1c000000150d0d0d 120000001c00000013001f1c1c00150d0d13001f001f1c0000131d1d000000150d1300000000000003170000000000120d0d0d0d232424242424250d0d0d0d0d0d0d0d0d0d03171f0016050d0d0d0d0d0d0d0d1300281c1c1c150d0d0d0d0d0d0d0d0d23241d241d252324240024250d0d1413001f1f1f1f1f000624250d0d0d 0d13001d1f1e4800004f001c1c00150d0d13000000001f1500232424242424250d13000000001d1d1d0000000015140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d1300000000150d0d0d0d0d0d0d0d230024242424250d0d0d0d0d0d0d0d0d03041f041f050304040004050d010000000000000000001514140d0d0d 0d13001c00003f15232424242424250d0d1300000000001500140d0d0d0d0d0d0d130000000625031700000000150d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d1300000000150d0d0d0d0d0d0d0d1400140d0d0d0d0d0d0d0d0d0d0d0d0d130000000000000000410000120d14232424242424242425140d0d0d0d 0d232424242424250d0d0d0d0d0d0d0d0d2324242424242500140d0d0d0d0d0d0d130000062503170000000000150d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d2324242424250d0d0d0d0d0d0d0d1400140d0d0d0d0d0d0d0d0d0d0d0d0d23243c2400252324242424250d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d 0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d120d0d0d0d0d0d0d0d232424250d23242424242424250d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d010d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d010d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d __sfx__ 00110000250002500025030250302503000000230350000023030230302303023030230302303023030230302103021030210302103021030210300000000000177401774017740177311e7501e7501e7501e750 00110000290202a0212a0202a0202a0202a02025030250052503025030250302503025030250302503025030250302503025030250302503225030230322504526030260302a040000002d0402d0402d0402d040 001100001e7401e7401e7401e74010730107301073010730157301573015730157301573015730157301573015730157301573015730000000000000000000000000000000000000000019030190300000000000 001100002d0422d0402a0302a0302c0302c0302c0322c0322d0402d0312d0302d0302d0302d0302d0302d0302d0302d0302d0322d03200000000000000000000000000000000000000002b0402c0410000000000 001100001274012740127401274012740127401274012740177301773017730177301773017730177301773014730147301474014740107401074010740000001573015730157301573009720097300973009730 001100002a0402a0412a0412a0402a0402a0402a042290412a0412a0402a0402a0402a0402a0402a0422903128041280402804028040280402804226032000002504025040250402603026030260322803200000 001100000e0300e0300e0300e0300e0300e0300000000000000000000000000000000000000000150301503014030140301403014030120301203012030120300d0200d0200d0200d0200d0200d0200d0200d020 001100002804028040280402804028040280402104000000210402104021040210402104021040150001500014000140001400014000120001200012000240342503125030250302503025030250322503225032 00110000150301503015030150301503015030150301503015030150301503015030150301503015030150300b0200b0200b0200b0200b0200b0200b0200b0200b0200b0200b0200b02000000000000000000000 001100002501425010250102501025010250102501025010250212502025020250202502125020250202502027540275402754027540275402754027540275402703027030270302703027030270302703027030 001100002312023120231202312023120231202312023120231202312023120231202312023120231202212123141231402314023140231402314021140201401e1401e1401e1401e1401c140001001e14020140 00110000000000000006322063250d3320d33209320093200932009325093200932509320000001703017030170300b0200b0200b0200b02017030170300b0301403014030140301403514030140300000014330 0011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b0301b0301b030000001b0301b0301b030000001b0301b0301b03000000 0011000020140201402013020130201302013020130201301d1401e1411e1401e1401c140002001b2401b2401b240000000000022554235512355023550235402354023540235402354023540235402314023140 0011000000000150301503000000000000e0300e0300e0300e0320e0320e0320e0320e0300e0300e030000000d0300d0300d0300d0300d0300d0300d0300d0300d0300d0300d0300d0300d0300d0300d0300d030 00110000190331903019030000001a0331a0301a0301a0301a0301a0301a0301a0301a0301a0301a0300000027320273202732027320000000000027320273202732027320273202732000000000000000000000 00110000211402d1402d145000002a1302a1302a1302a1302a1322a1322a1322a1322a1322a13000100000002c3202c3202d3202d3202f320003002d3302d3302d3302d3302c3312c3302a3302a3302833000000 001100000b0300b0300b0000b0000b0300b0300b0300b0300b0300b0300b0300b0300b0300b0300b0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001100002704027040000000000027040270402704027040270402704027040270402704027040000000000028020280202a020000002c030000002a0202a02000000000002c0302c0302c0302c0300000000000 001100002a3302a3302c330003002a3302a3302a3302a3302a3302a3322a3322a3322a3322a332283322a3322c3302c3302d330003002f3302f3052d3302d33000300003002f3302f3302f3302f3302804028045 00110000000000000015310153101531015310153101531000000000001032010320103201032010320103200e3200e3200e3200e3200e3200e3200e3200e32000000000000d3200d3200d3200d3200d3200d320 001100003102031022310223102231022310222f0322d0302c030000002a0400000028030000002603026030260302603026030260302603026030000000000029040000002a040000002c040000002d0502d050 0111000034040340403404034042340423404232042310422f040000002d040000002c040000002a0402a0402a0402a0402a0422a0422a0422a042290402a0402c040000002d040000002f040000003104031040 001100001203012030120351230010030100301003010030020200202002020020200202002020020200202002020020200202002020020220202202022020220b0400b040000000000010040100400000000000 0011000000000000002c0402c04000000000002a0302a0302a0302a0302a0302a0302a0302a0302a0302a0302a0302a0302a0302a0302a0302a0302a030000002604026040000000000028040280400000000000 0011000000000000002f0402f04000000000002d0402d0402d0422d0422d0422d0422d0422d0422d0402d0402d0402d0402d0402d0402d0402d0402d040000002a0402a04000000000002c0302c0300000000000 001100000932209322093220932209322093220932209322043220432204322043220432204322023220232202322023220232202322023120231204312023120131000000033100000005310000000632006320 00110000250402504025040250402504025040230402104020040000001e040000001c040000001a0401a0401a0401a0401a0401a0401a0400000000000000000000000000000000000000000000000000000000 0011000028030280302803028030280302803026030250402304000000210400000020040000001e0401e0401e0401e0401e0401e0401e040000001d0401e0402004000000210400000023040000002504025040 00110000063200632012310123100431004310103101031002310023100231002310023150200002745017450b7351770017735060001274506000107550400004000107550b7550400004755010000172001722 00110000250502505023040230402304023040250402303021050210502105221050210502105021050210502a030000002d030000003203000000310403104031040310402f0302d0402f0502f0502d0402c040 001100000e7450e7050000012745000000070010740107401074210742107421074210740000000e7400e7400d7450d00500000117450000000000127401274012742127421e7421e7421c7401c7451074010745 001100002a05512005000003205500000000002f0502f0502f0502f0502f0502f0502f050000002c0402a0502905500000000003105500000000002d0402d0402d0402d0402d0402d0402c0402c0402c0402c040 001100000e0400e0400e0400e0400e0400e0400d040000000b0400b0400b0400b0400b0400b040020400000004040040400404004040040400404504040000000404004040040300400001000010000104001030 001100002a0402a0402a0402a0400000000000260302503023030230302303023030320503205232052320523104031040310403104031040310402f040000002f0402f0402f0402f0002a0402c0402a04028040 001100001731517310173151731517020170251033010330103301033010330103300233002325023300232501330013300133501335013300133506330063300633006330063300633004040040400404004040 00110000173601733023030233300b6630b3352a66317330173302a6532c230282302c230282302a6531a230190301903025030250330b6650b6702a6231e0302a7001e7302a6231e730287301c7302a6231c730 001100002634026340263403234032340323402f3402f3402f3422f3422f3422f3422f3422f34228342263402533025330253303135031350313502d3402d3402d3422d3422d3422b3412c3412c3422c34229341 001100000e7300e7300e7300e7300e7300e7300d7300d7300b7400b7400b7400e7400e7400e740100401004010030100300403004030040300403004030040300403004030040300403004030040300403000000 00110000260301a030260301a030260301a03000000000002304017040230402603017030260302a0401c0402a0401c0402a0401c0402a0401c0402a0401c040280401c040280401c04028040000001c04000000 00110000293402a3412a3422a3422a3422a34228350000002634026340263403234032340323402f3502f3502f3522f3522f3522f3422f3422f3422f3422f3422f3422f3422f3422f3422f340000002d3402d345 001100001004010040100401004010040100401004010040100301003010030100301003010030100301003010020100201000010000100051000010000100000000000000000000000000000000000000000000 001100002604028040260302803026040280402603028030260202802026020280202601028010260102801025010250152500028000250052800025000340000d5100d0300d0300000000000125140603006030 001100002d3322d3322d3322d3322d3322d3322d3322d3322d3222d3222d3222d3222d3222d3222d3222d3222d4122d4122d4022d4052d4002d4002d400000003843038430384303843500000000003473034730 001100000601006015000000000000000000000000000000215401a030210400000000000000001c540150301c0400000000000000001e540170301e040000000000000000195401203019040120300d0350d005 0011000034720347203472034720347250000000000001003173031730317302f7352d735001002c7402c7402c7402d7452f745007002d7502d7502d7502c7452a74500700287402874028740007002574500100 001100001a0302a0321a0301a0351a0001a00000000000000000000000000000000000000000000000000000000000000000000000002f0401c0222f04000000000001c0202d0422502019040190401904019040 00110000217302173021710217102171021715217002170021000210002100021000210002100021000210000000000000000001c700387303873038730387300000000000347303473034730347303473034730 0111000025020250202d0402c0402a140022150e0251202012020151250d2152502019020280351a030230251702026030260301703023030200001c000200301c02023040040200402004020040200000000000 001100003403034030317302f7302d7302d7302d7202f72031720001002f7402f7402f740007002d740007002a7502a75032750327502f7402f7402f7402f7422f7422f7422f7422f74500700007001c75000700 00110000253401c34009360093600936009340093401734004340043400434004340043401734002340023400234002340023401a340023400434002340023400134000300033400030005340003000635006350 001100001c567285303453034540345403454032540315402f540255402d540255402c540255402a5402a5402a5402a54021540215402154021540295302a5302c540235402d540255402f540255403155031550 00110000000000000000000000000000000000000000000021440204401e4401e4401e4401e4401e4401e4401a44000000174401a000174401a00012440124401224012240102401024010240102400d0000d000 001100000635006350123401234004350043501034010340023400234002340023400234002340023400234017340230001a3402a0001a340000002d3402d3402d3402d3402c3402a3402c3402c3402d0352c035 0011000031560255602f5602f5602f56025560315602f5602d5602f5602d5602d5602d5602d5602d5602c5601e16000100211500000026130000002514025140251402514023130211402315023155201001e100 011100002804026040280402604028030260302803026030280302603028030260302802026020280202602028020250202802025020280102501028010250102801025010280102501028010250102802025020 001120002d3202d3202d3202d3202d3202d3202d3202d3202d3202d3202d3202d3202d3202d3202d3202d3202d3112d3102d3102d3102d3102d3102d310014000140001400014000140001400014000140001400 0111000034530345323453234532345323453232532315302f540005002d540005002c540005002a5402a5402a5402a5402a5402a5402a5402a540295402a5402c540005002d540005002f540001003104031040 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 010300000015000250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 __music__ 01 00014140 00 02034340 00 04054540 00 06074740 00 08090a40 00 0b0c0d40 00 0e0f1040 00 11121340 00 14151640 00 17181940 00 1a1b1c40 00 1d1e5e40 00 1f206040 00 21226240 00 23242540 00 26272840 00 292a2b40 00 2c2d6d40 00 2e2f6f40 00 30317140 00 14153940 00 17181940 00 32335472 00 34353640 00 1f204040 00 21224040 00 23242561 00 26272840 02 37387840