P:0$_i 0 Q:0$_i 1 ."\\m i ",$1+Q+P .m.c:"_exit 0" open:{while[*r:.[3::;,`,x;:];];r 1} send:{while[*r:.[3:;(x;y);:];];r 1} R:open P send[R;(`connect;Q)] G:1 2 6 3 8 5 7 4 H:1 0 3 2 7 6 5 4 connect:{[s;u]V::&*/2#2+S::s;I::map[S;!S;G];J::map[S+2;1+!S;G H];init u} map:{[s;t;m]{(),s _sv++x}'+(t;s-1;0)3_vs m} neighbors:{W::open'1+P+K::x} index:{(x+/:(1;-1;y;-y;y+1;y-1;-y+1;-y-1))!y*y} init:{[u]U::u;T::*F::!0} set:{{send[x;(`get;,z@&y _lin U)]}'[W;I;J]} get:{[i]F,:i;if[8=T+:1;u:next[U;F;,/J;V;2#S];send[R;(`next;Q,diff[u;U])];init u]} diff:{(x _dvl y;y _dvl x)} next:{[u;f;j;v;s] u:&,/v:@[v;f,(2+s)_sv 1+s _vs u;:;1] a:index[u;2+*s];w:(?,/a)_dvl u;b:index[w;2+*s] s _sv -1+(2+s)_vs((u@&(2=k)|3=k:+/v a),w@&3=+/v b)_dvl j}