aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarshall Lochbaum <mwlochbaum@gmail.com>2020-08-02 17:08:51 -0400
committerMarshall Lochbaum <mwlochbaum@gmail.com>2020-08-02 17:08:51 -0400
commite1ce7b201e662757b62c480c8ae1c76e41ad8a5f (patch)
treeeb419f56e2ca2654f4deb945c6b61f0eef1584db
parentd2427937164a9f790ec08f9c14412472404d0afe (diff)
Add self-hosted Javascript script
-rw-r--r--bqn.js129
-rw-r--r--src/c.bqn132
-rwxr-xr-xsrc/cjs.bqn15
-rwxr-xr-xsrc/pr.bqn47
-rwxr-xr-xtest/tj.js27
5 files changed, 350 insertions, 0 deletions
diff --git a/bqn.js b/bqn.js
new file mode 100644
index 00000000..1ce3aea4
--- /dev/null
+++ b/bqn.js
@@ -0,0 +1,129 @@
+// Virtual machine
+let assert = x => { if (!x) throw Error(); }
+let has = x => x!==undefined;
+let call = (f,x,w) => {
+ let ff = f;
+ if (typeof f === "function") {
+ assert(!f.m1&&!f.m2);
+ } else {
+ ff = ()=>f;
+ }
+ return !has(x) ? x : ff(x,w);
+}
+let get1= i => (v=>(assert(v!==null),v))(i[0][i[1]]);
+let get = i => i.a ? arr(i.map(get),i.sh) : get1(i);
+let set = (d,id,v) => {
+ let eq = (a,b) => a.length===b.length && a.every((e,i)=>e===b[i]);
+ if (id.a) {
+ assert(v.a&&eq(id.sh,v.sh)); id.map((n,j)=>set(d,n,v[j]));
+ } else {
+ let [a,i]=id; assert((a[i]===null)==d); a[i]=v;
+ }
+ return v;
+}
+let run = (B,O,S) => { // Bytecode, Objects, Sections/blocks
+ // Turn each block into an environment=>pushable value map
+ let D = S.map(([t,i,st,l]) => e => {
+ let v=Array(l).fill(null);
+ let c = sv => vm(st,[sv.concat(v)].concat(e));
+ return [
+ n => n([]),
+ n => {let r=(f )=>n([r,f ]);r.m1=1;return r;},
+ n => {let r=(f,g)=>n([r,f,g]);r.m2=1;return r;}
+ ][t]([
+ v => {let r=(x,w)=>c([r,x,w].concat(v));return r;},
+ c
+ ][i]);
+ });
+ // Execute
+ let vm = (p,e) => { // Program counter, Environment
+ let s=[]; // Stack
+ let num = () => {
+ let b=128,n=B[p++];
+ if (n<b) return n;
+ let i=1, t=0;
+ do { t+=i*(n-b); i*=b; n=B[p++]; } while (n>=b);
+ return t+i*n;
+ }
+ while (1) switch(B[p++]) {
+ case 0: s.push(O[num()]);break;
+ case 3: case 4: {let a=s.splice(s.length-num());s.push(list(a));break;}
+ case 5: case 16:{let[x,f] =s.splice(-2);s.push(call(f,x ));break;}
+ case 6: case 17:{let[x,f,w]=s.splice(-3);s.push(call(f,x,w));break;}
+ case 7: {let[m,f] =s.splice(-2);assert(m.m1);s.push(m(f ));break;}
+ case 8: {let[g,m,f]=s.splice(-3);assert(m.m2);s.push(m(f,g));break;}
+ case 9: {let[h,g] =s.splice(-2);s.push((x,w)=>call(g,call(h,x,w)));break;}
+ case 10:case 19:{let[h,g,f]=s.splice(-3);s.push((x,w)=>call(g,call(h,x,w),has(f)?call(f,x,w):f));break;}
+ case 11: {let[v, i]=s.splice(-2);s.push(set(1,i,v));break;}
+ case 12: {let[v, i]=s.splice(-2);s.push(set(0,i,v));break;}
+ case 13: {let[x,f,i]=s.splice(-3);s.push(set(0,i,call(f,x,get(i))));break;}
+ case 14:{s.pop();break;}
+ case 15:{s.push(D[num()](e));break;}
+ case 21:{let v=e[num()][num()];assert(v!==null);s.push(v);break;}
+ case 22:{s.push([e[num()],num()]);break;}
+ case 25:assert(s.length===1);return s[0];
+ }
+ }
+ try {
+ return D[0]([]);
+ } catch (err) {
+ return "error"
+ }
+}
+
+// Runtime
+let arr = (r,sh) => {r.sh=sh;r.a=1;return r;}
+let list = l => arr(l,[l.length]);
+let str = s => list(Array.from(s));
+let m1 = m => {m.m1=1;return m;}
+let m2 = m => {m.m2=1;return m;}
+let lesseq = (x,w) => {
+ let s=typeof w, t=typeof x;
+ return +(s!==t ? s<=t : w<=x);
+}
+let table = m1(f => (x,w) => !has(w)
+ ? arr(x.map(e=>call(f,e)),x.sh)
+ : arr([].concat.apply([],w.map(d=>x.map(e=>call(f,e,d)))),w.sh.concat(x.sh)));
+let scan = m1(f => (x,w) => {
+ let s=x.sh;assert(!has(w)&&x.a&&s.length>0);
+ let c=1;for(let i=1;i<s.length;i++)c*=s[i];
+ let l=x.length,r=Array(l),i=0;
+ for(;i<c;i++) r[i]=x[i];
+ for(;i<l;i++) r[i]=call(f,x[i],r[i-c]);
+ return arr(r,s);
+});
+
+let runtime = run(
+ new Uint8Array([15,1,25,21,0,1,22,0,3,22,0,4,22,0,5,22,0,6,22,0,7,22,0,8,22,0,9,22,0,10,22,0,11,22,0,12,22,0,13,22,0,14,22,0,15,22,0,16,22,0,17,22,0,18,22,0,19,22,0,20,4,18,11,14,15,2,22,0,21,11,14,15,3,22,0,22,11,14,15,4,22,0,23,11,14,15,5,21,0,22,15,6,8,22,0,24,11,14,15,7,22,0,25,11,14,15,8,22,0,26,11,14,15,9,22,0,27,11,14,15,10,22,0,28,11,14,15,11,22,0,29,11,14,15,12,22,0,30,11,14,21,0,25,21,0,14,7,21,0,8,0,0,19,21,0,22,15,13,8,22,0,31,11,14,21,0,14,21,0,8,0,0,19,22,0,32,11,14,3,0,21,0,15,3,2,21,0,21,21,0,3,8,22,0,33,11,14,0,0,21,0,33,21,0,17,0,1,19,3,2,21,0,21,21,0,13,21,0,31,0,1,19,8,22,0,34,11,14,15,14,22,0,35,11,14,21,0,35,22,0,36,11,14,21,0,3,21,0,8,0,0,19,21,0,30,21,0,31,8,22,0,37,11,14,15,15,22,0,38,11,14,15,16,22,0,39,11,14,15,17,22,0,40,11,14,15,18,22,0,41,11,14,15,19,22,0,42,11,14,21,0,42,21,0,7,7,22,0,43,11,14,21,0,42,21,0,8,7,22,0,44,11,14,21,0,42,21,0,9,21,0,22,21,0,32,21,0,44,21,0,31,19,21,0,28,0,1,8,8,7,22,0,45,11,14,21,0,42,21,0,10,7,22,0,46,11,14,21,0,42,21,0,11,7,22,0,47,11,14,21,0,25,21,0,46,21,0,29,21,0,47,8,7,21,0,22,0,2,21,0,46,16,21,0,29,21,0,47,8,8,22,0,48,11,14,21,0,42,15,20,21,0,22,21,0,12,8,7,22,0,49,11,14,21,0,42,15,21,21,0,22,21,0,44,21,0,26,21,0,49,21,0,26,21,0,44,8,8,8,7,22,0,50,11,14,21,0,42,15,22,21,0,22,21,0,45,21,0,29,21,0,45,8,8,7,22,0,51,11,14,21,0,44,21,0,43,0,0,19,22,0,52,11,14,21,0,45,22,0,53,11,14,21,0,45,21,0,44,21,0,43,19,22,0,54,11,14,21,0,42,21,0,25,21,0,14,7,21,0,52,9,7,21,0,22,15,23,8,22,0,55,11,14,21,0,42,21,0,32,7,22,0,56,11,14,21,0,42,21,0,13,21,0,26,21,0,52,8,7,21,0,22,21,0,34,8,22,0,57,11,14,21,0,42,21,0,13,7,21,0,22,21,0,13,8,22,0,58,11,14,21,0,42,21,0,14,7,21,0,22,0,1,21,0,26,21,0,6,8,8,22,0,59,11,14,21,0,42,21,0,25,21,0,59,7,7,21,0,22,0,1,21,0,26,21,0,6,8,8,22,0,60,11,14,21,0,43,0,1,3,2,21,0,44,0,1,3,2,21,0,45,0,0,3,2,21,0,46,0,0,3,2,21,0,47,0,0,3,2,21,0,48,0,0,3,2,21,0,53,0,0,3,2,21,0,54,0,1,3,2,21,0,51,0,1,3,2,21,0,49,0,3,3,2,21,0,50,0,4,3,2,21,0,55,0,1,3,2,21,0,59,0,0,3,2,21,0,58,0,0,3,2,21,0,60,0,0,3,2,21,0,56,0,1,3,2,21,0,57,0,1,3,2,0,1,21,0,26,21,0,6,8,3,1,21,0,17,0,1,17,3,18,21,0,36,15,24,7,16,22,0,61,11,14,21,0,58,21,0,28,21,0,49,8,0,1,3,2,21,0,21,21,0,3,8,22,0,62,11,14,21,0,58,21,0,28,21,0,49,8,21,0,53,21,0,59,21,0,28,0,1,8,19,0,1,3,2,21,0,21,21,0,3,8,22,0,63,11,14,15,25,21,0,16,3,2,21,0,21,21,0,3,8,22,0,64,11,14,21,0,37,21,0,29,15,26,8,22,0,65,11,14,21,0,65,21,0,22,21,0,64,8,22,0,66,11,14,15,27,22,0,67,11,14,21,0,3,21,0,27,21,0,57,8,0,1,3,2,21,0,23,21,0,26,21,0,3,8,21,0,52,9,21,0,58,3,2,21,0,58,21,0,27,21,0,57,8,0,1,3,2,21,0,33,21,0,27,21,0,57,8,21,0,36,21,0,54,7,9,0,1,3,2,15,28,3,5,21,0,36,15,29,7,16,22,0,68,11,14,0,1,15,30,3,2,21,0,21,21,0,3,8,22,0,69,11,14,21,0,67,22,0,70,11,14,21,0,68,21,0,22,21,0,69,8,22,0,71,11,14,21,0,68,21,0,52,9,21,0,22,21,0,33,8,22,0,72,11,14,15,31,22,0,73,11,14,21,0,72,21,0,29,21,0,73,8,22,0,74,11,14,15,32,21,0,22,15,33,8,22,0,75,11,14,21,0,66,21,0,26,21,0,57,8,21,0,55,0,1,19,21,0,30,15,34,8,22,0,76,11,14,21,0,56,21,0,22,21,0,76,8,22,0,77,11,14,21,0,75,21,0,26,21,0,77,8,22,0,78,11,14,15,35,22,0,79,11,14,15,36,22,0,80,11,14,21,0,80,22,0,81,11,14,15,37,22,0,82,11,14,21,0,82,22,0,83,11,14,15,38,22,0,84,11,14,15,39,22,0,85,11,14,21,0,85,22,0,86,11,14,15,40,22,0,87,11,14,15,41,22,0,88,11,14,0,0,21,0,87,21,0,88,8,21,0,28,21,0,37,8,22,0,89,11,14,21,0,89,21,0,22,21,0,89,21,0,28,0,1,8,8,22,0,90,11,14,15,42,22,0,91,11,14,15,43,22,0,92,11,14,15,44,22,0,93,11,14,21,0,92,21,0,22,21,0,93,8,22,0,94,11,14,15,45,22,0,95,11,14,15,46,22,0,96,11,14,21,0,95,21,0,22,21,0,96,8,22,0,97,11,14,15,47,22,0,98,11,14,15,48,22,0,99,11,14,0,1,21,0,87,15,49,8,22,0,100,11,14,15,50,22,0,101,11,14,21,0,90,21,0,28,21,0,101,8,22,0,102,11,14,21,0,57,21,0,58,0,1,19,21,0,44,0,0,19,21,0,87,21,0,23,21,0,102,21,0,57,21,0,29,21,0,25,21,0,66,7,8,19,15,51,3,2,21,0,21,15,52,8,8,22,0,103,11,14,21,0,98,21,0,22,21,0,70,8,22,0,104,11,14,21,0,100,21,0,22,21,0,99,8,22,0,105,11,14,21,0,103,21,0,22,21,0,101,8,22,0,106,11,14,21,0,66,21,0,26,21,0,57,8,21,0,55,0,1,19,21,0,30,15,53,8,22,0,107,11,14,15,54,22,0,108,11,14,21,0,91,21,0,22,21,0,107,8,22,0,109,11,14,21,0,108,21,0,22,0,0,21,0,81,21,0,57,8,21,0,104,9,21,0,29,21,0,108,8,8,22,0,110,11,14,15,55,22,0,111,11,14,21,0,111,15,56,3,2,21,0,21,21,0,24,21,0,26,21,0,41,21,0,3,7,8,21,0,66,21,0,26,21,0,36,21,0,54,7,8,9,8,22,0,112,11,14,21,0,112,21,0,28,21,0,66,21,0,23,3,2,21,0,21,21,0,3,8,8,22,0,113,11,14,21,0,113,21,0,22,21,0,113,21,0,28,21,0,72,21,0,26,21,0,41,0,1,7,8,8,8,22,0,114,11,14,15,57,22,0,115,11,14,15,58,22,0,116,11,14,15,59,22,0,117,11,14,15,60,22,0,118,11,14,21,0,116,21,0,22,0,1,21,0,26,21,0,6,8,8,22,0,119,11,14,21,0,23,21,0,26,21,0,57,8,21,0,55,21,0,25,21,0,119,7,19,21,0,22,21,0,117,8,22,0,120,11,14,21,0,118,21,0,22,21,0,106,21,0,28,21,0,120,8,8,22,0,121,11,14,15,61,22,0,122,11,14,21,0,58,21,0,55,0,1,19,21,0,30,21,0,122,21,0,28,21,0,25,0,0,7,21,0,44,21,0,58,19,8,8,22,0,123,11,14,21,0,122,21,0,22,21,0,123,8,22,0,124,11,14,15,62,22,0,125,11,14,15,63,22,0,126,11,14,15,64,15,65,3,2,21,0,115,21,0,3,21,0,27,21,0,54,8,8,22,0,127,11,14,15,66,22,0,128,1,11,14,15,67,22,0,129,1,11,14,15,68,22,0,130,1,11,14,21,0,130,1,21,0,127,7,21,0,22,21,0,129,1,21,0,127,7,8,22,0,131,1,11,14,21,0,130,1,21,0,127,21,0,26,21,0,44,8,7,21,0,22,21,0,129,1,21,0,127,21,0,26,21,0,44,8,7,8,22,0,132,1,11,14,21,0,53,21,0,22,21,0,90,21,0,28,21,0,131,1,8,8,22,0,133,1,11,14,21,0,54,21,0,22,21,0,90,21,0,28,21,0,132,1,8,8,22,0,134,1,11,14,21,0,131,1,21,0,26,21,0,131,1,8,21,0,90,21,0,44,21,0,23,19,21,0,25,21,0,119,7,19,22,0,135,1,11,14,15,69,22,0,136,1,11,14,21,0,136,1,21,0,22,21,0,135,1,8,22,0,137,1,11,14,21,0,43,21,0,25,21,0,44,7,21,0,22,21,0,43,8,21,0,44,21,0,44,21,0,45,21,0,25,21,0,46,7,21,0,22,21,0,23,8,21,0,46,21,0,46,21,0,47,21,0,42,21,0,5,7,21,0,48,21,0,25,21,0,47,7,21,0,22,0,2,21,0,29,21,0,47,8,8,21,0,133,1,21,0,25,21,0,46,7,21,0,22,21,0,23,8,21,0,134,1,21,0,23,21,0,44,0,0,19,21,0,46,21,0,25,21,0,44,7,19,21,0,22,21,0,23,8,21,0,55,0,1,21,0,26,21,0,6,8,21,0,22,15,70,8,21,0,106,0,1,21,0,26,21,0,6,8,21,0,22,15,71,8,3,20,21,0,66,21,0,28,21,0,57,21,0,25,21,0,46,7,0,2,19,21,0,25,21,0,109,7,0,2,19,8,16,21,0,124,16,15,72,16,22,0,138,1,11,14,15,73,22,0,139,1,11,14,15,74,22,0,140,1,11,14,21,0,140,1,22,0,141,1,11,14,15,75,22,0,142,1,11,14,21,0,142,1,22,0,143,1,11,14,21,0,43,21,0,44,21,0,45,21,0,46,21,0,47,21,0,48,21,0,49,21,0,50,21,0,51,21,0,52,21,0,133,1,21,0,134,1,21,0,55,21,0,77,21,0,57,21,0,58,21,0,59,21,0,60,21,0,71,21,0,72,21,0,24,21,0,23,21,0,66,21,0,109,21,0,78,21,0,94,21,0,97,21,0,104,21,0,105,21,0,124,21,0,106,21,0,131,1,21,0,132,1,21,0,90,21,0,114,21,0,119,21,0,137,1,21,0,120,21,0,121,21,0,110,21,0,6,21,0,25,21,0,84,21,0,41,21,0,40,21,0,139,1,21,0,36,21,0,86,21,0,20,21,0,26,21,0,27,21,0,28,21,0,29,21,0,143,1,21,0,22,21,0,115,21,0,83,21,0,81,21,0,141,1,3,59,25,21,0,1,15,76,21,0,5,21,1,17,21,0,1,21,0,4,21,0,2,17,17,7,21,0,2,17,25,21,0,1,21,0,4,21,0,5,3,2,21,1,21,0,1,21,1,8,21,0,2,15,77,0,0,7,16,17,8,21,0,2,17,25,21,0,1,25,21,0,2,25,21,0,1,25,21,0,1,21,1,24,21,0,2,17,21,0,4,21,0,1,17,25,21,0,1,21,0,5,21,0,2,17,21,0,4,16,25,21,0,1,21,0,5,16,21,0,4,21,0,2,21,0,5,16,17,25,21,0,1,21,0,5,21,0,1,21,1,24,21,0,2,17,21,0,4,16,17,25,21,0,1,21,0,5,16,21,0,4,21,0,1,21,1,24,21,0,2,17,17,25,21,0,1,15,78,21,1,23,21,0,4,3,2,21,1,17,21,0,1,21,0,5,21,0,2,17,17,7,21,0,2,17,25,21,0,1,3,1,21,1,16,3,0,17,25,21,0,1,21,1,13,16,21,1,13,0,0,17,21,1,6,16,14,21,0,1,22,0,5,11,21,1,34,16,22,0,6,11,14,21,0,4,22,0,7,11,14,21,0,1,21,1,24,21,1,22,15,79,15,80,3,2,21,1,21,21,0,6,21,1,31,0,1,17,8,8,21,0,2,17,22,0,8,11,14,21,0,6,21,1,18,16,21,1,19,21,1,8,21,1,28,0,0,21,1,8,21,0,6,17,8,7,16,21,1,19,15,81,7,16,14,21,0,8,25,21,0,2,21,1,34,16,22,0,3,11,14,21,0,1,21,1,34,16,21,1,7,21,0,3,17,21,1,18,16,21,1,19,21,0,2,21,1,29,21,1,17,8,21,1,25,21,0,1,7,21,1,17,21,0,3,21,1,29,21,1,8,8,19,3,2,21,1,21,21,1,14,21,1,28,21,0,3,8,8,7,16,25,15,82,22,0,2,11,14,21,0,2,21,0,1,7,21,1,25,21,0,2,21,1,25,21,0,1,7,7,7,3,2,21,1,21,21,1,13,21,1,27,21,1,32,8,8,25,21,1,37,21,1,27,21,1,19,21,0,1,7,8,25,21,1,37,21,1,27,21,1,39,21,0,1,7,8,21,1,22,21,1,40,21,0,1,7,8,25,21,0,1,21,1,41,15,83,21,0,1,7,7,3,2,21,1,21,21,1,3,21,1,27,21,1,9,21,1,8,21,1,7,19,21,1,22,21,1,23,8,8,8,25,21,0,2,21,0,1,3,2,21,1,17,21,0,1,21,1,32,21,0,2,17,17,25,21,0,2,21,0,1,3,2,21,1,17,21,0,1,21,1,31,21,0,2,17,17,25,21,0,2,21,1,46,21,0,1,17,21,1,49,16,21,1,45,21,0,2,17,21,1,44,21,0,1,17,25,21,0,1,3,1,21,1,16,3,0,17,25,21,0,1,21,0,2,21,1,17,0,0,17,3,2,21,1,21,15,84,21,0,2,21,1,17,0,1,17,7,8,25,21,0,1,3,1,25,21,0,2,21,1,58,16,21,1,60,0,0,17,21,1,6,16,14,21,0,2,21,1,64,16,22,0,2,12,14,21,0,2,21,1,41,21,1,63,7,16,21,1,36,21,1,53,7,16,21,1,6,16,14,21,0,2,21,1,36,21,1,45,7,16,22,0,3,11,14,21,0,1,21,1,33,16,21,1,36,21,1,45,7,16,22,0,4,11,14,21,0,1,21,0,4,21,1,57,21,0,3,17,21,1,30,15,85,8,16,21,1,16,21,0,2,17,25,15,86,22,0,3,11,14,15,87,22,0,4,11,14,21,0,1,21,0,3,21,0,4,3,2,21,1,21,21,1,3,8,16,25,21,0,1,21,1,41,21,1,68,7,21,0,2,17,21,1,66,16,21,1,36,21,1,53,7,16,25,21,0,2,21,1,17,0,0,17,21,0,1,3,2,21,1,21,21,0,2,21,1,17,0,1,17,21,1,26,21,1,52,8,8,25,21,0,1,21,1,66,16,21,1,41,21,1,69,7,16,21,1,36,21,1,50,7,0,1,17,21,1,43,0,0,17,25,21,0,1,21,1,57,16,21,1,25,21,1,44,7,21,0,2,17,21,1,70,16,21,1,43,21,0,2,17,21,1,41,21,0,1,21,1,29,21,1,17,8,7,16,25,21,0,2,21,0,1,3,2,25,21,0,1,3,1,25,21,0,1,21,1,66,16,21,1,17,0,1,17,21,1,72,16,22,0,3,11,14,21,0,1,21,1,41,21,1,72,21,1,71,21,0,3,19,7,16,21,1,66,16,21,1,36,21,1,53,7,16,21,1,6,16,14,21,0,3,21,1,36,21,1,45,7,16,21,1,70,16,21,1,66,21,0,3,17,21,1,40,21,1,25,21,1,66,21,1,29,21,1,17,8,7,7,21,0,1,17,25,21,0,1,21,1,26,21,1,66,8,21,1,23,21,1,26,21,1,55,8,21,1,41,21,1,17,7,21,1,57,21,1,29,21,1,25,21,1,51,21,1,43,0,0,19,21,1,44,21,1,24,19,7,8,19,0,0,0,1,3,2,21,1,22,0,2,3,1,8,19,25,21,0,1,21,1,79,21,0,5,7,21,0,2,17,22,0,6,11,21,1,77,0,1,17,22,0,7,11,14,21,0,4,22,0,8,11,14,15,88,22,0,9,11,14,21,0,1,21,0,9,21,0,6,7,21,0,2,17,25,21,0,1,21,1,79,21,0,5,7,21,1,41,21,1,44,21,1,29,21,1,49,8,21,1,44,21,1,50,0,1,19,3,2,21,1,21,21,1,23,21,1,59,0,1,19,8,7,21,1,58,21,1,27,21,1,75,8,19,21,0,2,17,22,0,6,11,14,15,89,22,0,7,11,14,21,1,23,21,1,55,9,21,0,7,21,1,23,21,1,41,21,1,55,7,9,3,3,21,1,21,21,1,58,21,1,29,21,1,60,8,21,1,43,0,1,21,1,29,21,1,77,8,19,8,22,0,7,12,14,21,0,1,21,0,7,21,0,6,21,1,17,21,1,28,21,1,57,21,1,25,21,1,44,7,0,0,19,8,16,17,21,1,41,21,0,4,7,21,0,2,21,0,7,21,0,6,21,1,17,0,1,17,17,17,21,1,77,16,25,0,5,21,1,83,21,0,1,8,25,21,0,1,21,1,58,16,21,1,59,0,0,17,21,1,6,16,14,21,0,1,21,1,84,21,1,55,7,16,21,1,36,21,0,4,7,21,0,2,17,25,21,0,1,22,0,3,11,14,15,90,15,91,3,2,21,1,21,21,1,24,21,1,26,21,1,71,21,1,55,21,0,2,19,8,8,25,21,0,2,21,1,3,16,21,1,6,16,14,21,0,2,21,1,41,21,1,62,7,16,21,1,66,16,21,1,36,21,1,53,7,16,21,1,6,16,14,21,0,1,21,1,57,16,21,1,55,21,1,53,21,1,44,21,1,29,21,1,60,8,19,21,0,2,17,21,1,66,16,21,1,36,21,1,53,7,16,21,1,6,16,14,0,1,21,1,55,21,0,2,17,21,1,45,21,0,1,21,1,57,16,17,21,1,43,21,0,2,17,22,0,2,12,14,21,0,1,15,92,15,93,3,2,21,1,21,21,1,23,21,1,26,21,1,58,8,21,1,57,0,0,19,8,21,0,2,17,25,21,0,1,21,1,72,21,1,27,21,1,75,8,21,0,2,17,22,0,3,11,14,21,0,3,21,1,41,21,1,57,7,16,22,0,4,11,21,1,36,21,1,50,7,0,0,17,22,0,5,11,14,21,0,4,21,1,44,21,0,5,17,21,1,60,0,0,17,21,1,36,21,1,53,7,16,21,1,6,16,14,21,0,3,21,1,41,21,1,90,21,1,28,0,0,21,1,44,21,0,5,17,21,1,70,16,21,1,29,21,1,43,8,8,7,21,0,5,21,1,52,21,0,4,17,17,22,0,6,11,14,21,0,6,21,1,36,21,1,71,7,16,21,1,6,16,14,21,0,3,21,1,41,0,0,21,1,23,21,1,17,0,1,19,3,2,21,1,21,21,1,24,8,7,21,0,4,21,1,58,21,0,5,17,17,21,1,36,21,1,43,7,16,22,0,7,11,14,21,0,1,21,1,66,21,1,27,21,1,38,8,21,0,2,17,21,1,66,21,0,6,21,1,17,0,1,17,21,1,38,21,0,7,3,1,17,17,25,15,94,22,0,3,11,14,21,0,1,21,1,66,21,1,28,21,1,72,21,1,26,21,1,38,21,1,28,21,1,23,21,1,57,21,1,27,21,1,44,8,21,0,2,19,21,1,50,0,1,19,21,1,25,21,1,66,7,0,0,3,1,19,8,8,8,16,0,1,21,1,87,21,0,3,8,21,0,2,17,25,21,0,1,21,1,58,16,21,1,59,0,0,17,21,1,6,16,14,21,0,1,21,1,55,16,21,1,41,21,1,92,7,21,0,1,21,1,57,16,21,1,43,0,0,17,21,1,70,16,17,25,21,0,1,21,1,72,16,21,1,57,21,1,29,21,1,44,8,21,1,50,0,1,19,21,1,25,21,1,66,7,0,0,19,21,1,25,21,1,38,7,21,1,23,19,21,1,94,21,1,24,19,21,0,2,21,1,57,16,17,22,0,3,11,14,21,0,1,21,1,94,21,0,2,21,1,49,21,0,3,17,21,1,50,21,0,3,21,1,44,16,17,21,1,43,0,1,21,1,77,21,0,2,17,21,1,47,0,5,17,21,1,45,21,0,3,17,17,17,25,21,0,1,21,1,58,16,21,1,59,0,0,17,21,1,6,16,14,21,0,1,21,1,55,16,21,1,41,21,1,95,7,21,0,1,21,1,57,16,21,1,43,0,0,17,21,1,70,16,17,25,21,0,1,21,1,3,16,21,1,6,16,14,21,0,2,21,1,58,16,21,1,60,0,0,17,21,1,6,16,14,21,0,1,21,1,72,16,21,1,57,21,1,27,21,1,59,8,21,0,2,17,21,1,6,16,14,21,0,2,21,1,66,16,21,1,41,21,1,63,7,16,21,1,36,21,1,53,7,16,21,1,6,16,14,21,0,1,21,1,72,16,21,1,94,21,0,2,21,1,57,16,17,22,0,3,11,14,21,0,3,21,1,43,0,0,17,21,1,59,21,0,2,17,21,1,36,21,1,53,7,16,21,1,6,16,14,21,0,1,21,0,2,21,1,57,16,21,1,55,0,1,17,21,1,30,15,95,8,21,0,2,17,25,21,0,1,21,1,58,16,21,1,59,0,0,17,21,1,6,16,14,21,0,1,21,1,90,21,0,1,21,1,57,16,21,1,52,21,1,28,21,1,70,8,16,21,1,44,16,17,25,21,0,2,21,1,62,16,21,1,6,16,14,21,0,1,21,1,57,16,22,0,3,11,14,21,0,1,21,1,90,21,0,3,21,1,70,16,21,1,43,21,0,2,17,21,1,51,21,0,3,17,17,25,21,0,1,21,1,58,16,21,1,58,0,0,17,21,1,6,16,14,21,0,1,21,1,41,21,1,63,7,16,21,1,36,21,1,53,7,16,21,1,6,16,14,21,0,1,21,1,57,16,21,1,70,16,21,1,41,21,1,66,7,21,0,1,17,21,1,36,21,1,38,7,3,0,17,25,21,0,1,21,1,57,21,1,27,21,1,58,8,21,0,2,17,21,1,6,16,14,21,0,1,21,1,102,21,0,2,17,25,21,0,2,21,1,58,16,21,1,55,0,1,17,25,21,1,23,21,1,36,21,1,40,21,1,38,21,1,28,21,1,66,8,7,7,3,0,21,1,55,16,19,22,0,3,11,14,21,0,1,21,1,3,16,21,1,6,16,14,21,0,1,21,1,41,21,1,72,7,16,22,0,4,11,14,21,0,4,21,1,66,16,21,1,17,0,1,17,21,1,57,16,22,0,5,11,14,21,0,4,21,1,41,21,1,57,7,16,21,1,58,21,0,5,17,21,1,66,16,21,1,36,21,1,53,7,16,21,1,6,16,14,21,0,1,21,1,58,16,21,1,60,21,0,5,17,21,1,6,16,14,21,0,1,22,0,6,11,21,1,58,16,22,0,7,11,21,1,104,16,22,0,8,11,21,1,41,15,96,7,21,0,1,21,1,72,16,17,22,0,9,11,14,21,0,9,21,0,3,16,21,1,71,21,0,4,21,1,41,21,1,94,7,21,0,7,17,17,21,1,6,16,14,21,0,9,21,1,41,15,97,7,16,21,0,3,16,22,0,10,11,14,21,0,1,21,1,106,21,0,9,17,21,1,41,21,1,90,21,1,28,21,1,41,21,1,55,7,8,7,21,0,10,17,21,1,77,16,25,21,0,1,21,1,3,16,21,1,6,16,14,15,98,22,0,3,11,14,21,0,2,21,0,3,15,99,3,2,21,1,21,21,1,71,21,1,55,0,0,19,8,16,22,0,4,11,14,21,0,1,21,1,72,16,21,1,57,21,1,27,21,1,59,8,21,0,4,17,21,1,6,16,14,21,0,1,21,1,72,16,21,1,94,21,1,28,21,1,57,8,21,0,4,17,21,1,58,21,0,4,17,21,1,36,21,1,53,7,16,21,1,6,16,14,21,0,2,0,0,21,1,81,21,1,36,21,1,50,7,8,0,5,17,21,1,43,0,0,17,21,1,104,16,21,1,41,21,1,25,21,0,1,7,21,1,106,21,1,58,21,1,28,21,0,2,8,19,7,16,25,21,0,2,21,1,58,16,21,1,58,0,0,17,21,1,6,16,14,21,0,1,21,1,72,16,22,0,3,11,21,1,57,21,1,27,21,1,58,8,21,0,2,17,21,1,6,16,14,21,0,2,21,1,41,21,1,62,7,16,21,1,36,21,1,53,7,16,21,1,6,16,14,21,0,3,21,1,55,21,1,53,21,1,44,21,1,29,21,1,60,8,19,21,0,2,17,21,1,36,21,1,53,7,16,21,1,6,16,14,0,1,21,1,55,21,0,2,17,21,1,45,21,0,3,17,21,1,43,21,0,2,17,22,0,2,12,14,21,0,2,21,1,57,16,21,1,52,21,1,28,21,1,104,8,16,21,1,44,16,21,1,36,21,1,23,21,1,45,21,0,3,21,1,29,21,1,17,8,19,21,1,43,21,0,2,21,1,29,21,1,17,8,19,7,0,1,17,21,1,25,21,1,17,7,21,0,1,21,1,66,16,17,25,21,0,2,21,1,41,21,0,1,21,1,29,21,1,112,8,7,16,25,21,0,1,15,100,21,0,5,21,1,114,21,0,1,21,0,4,21,0,2,17,17,7,21,0,2,17,25,21,0,2,21,1,58,16,21,1,25,21,1,44,7,0,0,17,22,0,3,11,14,21,0,3,21,1,59,0,1,17,21,1,6,16,14,21,0,1,21,1,23,21,1,26,21,0,3,21,1,83,0,1,8,8,21,0,3,0,3,3,2,21,1,83,21,0,3,21,1,83,21,1,72,8,8,21,1,20,21,1,53,7,21,1,86,21,1,43,7,9,9,3,2,21,1,115,21,0,2,21,1,57,16,21,1,55,0,1,17,8,21,0,2,17,25,21,0,1,21,1,58,16,21,1,59,0,0,17,21,1,6,16,14,21,0,1,21,1,94,0,1,17,22,0,3,11,14,21,0,1,21,1,84,15,101,0,1,3,2,21,1,115,15,102,8,7,16,25,21,0,2,21,1,58,16,22,0,3,11,14,21,0,1,21,1,58,16,21,1,59,21,0,3,17,21,1,6,16,14,21,0,1,21,0,3,21,1,83,21,1,104,8,21,0,2,21,1,72,16,17,21,0,3,21,1,83,21,1,71,8,21,0,2,17,25,21,0,1,21,1,71,21,1,58,0,1,19,21,1,30,21,1,55,8,16,22,0,1,12,14,21,0,2,21,1,58,16,21,1,60,0,0,17,21,1,6,16,14,21,0,2,21,1,66,16,22,0,2,12,14,21,0,1,21,1,72,16,21,1,57,21,1,27,21,1,59,8,21,0,2,17,21,1,6,16,14,21,0,2,21,1,66,16,21,1,41,21,1,63,7,16,21,1,36,21,1,53,7,16,21,1,6,16,14,21,0,2,21,1,120,16,21,1,52,16,21,1,36,21,1,43,7,16,21,1,44,21,0,1,21,1,58,16,17,22,0,3,11,14,21,0,3,21,1,55,21,0,2,17,21,1,36,21,1,53,7,16,21,1,6,16,14,21,0,3,21,1,104,16,21,1,23,21,1,106,21,1,25,21,1,120,21,1,26,21,1,52,8,7,19,21,0,2,17,21,1,109,21,0,2,17,22,0,2,12,14,21,0,1,21,1,72,16,21,1,110,21,0,2,17,21,1,41,21,1,36,21,1,49,7,7,16,21,1,104,16,21,1,41,21,1,25,21,0,1,7,21,1,114,21,1,90,21,1,28,21,0,2,8,19,7,16,25,21,0,1,21,1,58,21,1,28,0,1,8,21,1,36,21,1,54,7,9,21,1,27,21,1,25,21,1,44,7,8,21,0,2,17,22,0,5,11,14,21,0,4,22,0,6,11,14,21,0,1,0,1,21,0,5,3,2,15,103,3,2,21,1,115,0,1,21,1,58,21,0,5,17,8,21,0,2,17,25,21,0,4,22,0,5,11,14,21,0,2,22,0,6,11,14,21,0,1,22,0,7,11,14,15,104,25,21,0,1,21,1,55,21,1,44,21,1,77,19,21,0,2,17,25,21,0,1,21,1,72,21,1,27,21,1,125,21,0,1,21,1,3,21,1,27,21,1,44,8,21,0,2,17,7,8,21,0,2,17,22,0,3,11,14,21,0,3,21,1,36,21,1,126,21,0,1,21,1,66,16,21,1,29,21,1,114,8,21,1,29,21,1,127,21,1,28,21,0,2,21,1,66,16,21,1,29,21,1,114,8,8,8,7,7,16,22,0,4,11,14,0,1,21,1,25,21,0,4,7,16,25,21,0,1,22,0,2,11,14,21,1,55,21,1,28,0,1,8,21,1,30,15,105,8,25,21,0,1,21,1,58,16,21,1,59,0,0,17,21,1,6,16,14,21,0,1,21,1,74,0,0,17,21,1,36,21,1,45,7,16,22,0,5,11,14,21,0,1,21,1,66,16,21,1,29,21,1,114,8,21,1,27,21,0,4,8,22,0,6,11,14,0,1,21,1,126,21,0,6,7,21,0,5,17,22,0,7,11,14,15,106,22,0,8,11,14,21,0,1,21,1,57,16,0,0,21,1,29,21,1,44,8,21,1,25,21,1,44,7,21,1,104,19,16,21,1,45,21,0,5,17,21,1,36,15,107,7,3,0,17,25,21,0,2,21,1,58,16,21,1,25,21,1,44,7,0,0,17,22,0,5,11,14,21,0,5,21,1,59,0,1,17,21,1,6,16,14,21,0,1,21,1,58,16,21,1,59,21,0,5,17,21,1,6,16,14,21,0,2,21,1,74,0,0,17,22,0,6,11,21,1,36,21,1,45,7,16,22,0,7,11,14,0,1,21,1,126,21,0,2,21,1,66,16,21,1,29,21,1,114,8,21,1,27,21,0,4,8,7,21,0,7,17,22,0,8,11,14,21,0,2,21,1,57,16,0,0,0,0,21,1,29,21,1,44,21,1,26,21,1,104,8,8,21,1,45,21,0,7,19,21,1,43,21,1,28,21,0,7,8,21,1,29,21,1,41,21,0,8,7,8,9,21,1,25,21,1,59,7,0,1,19,21,1,36,21,1,53,7,9,3,2,21,1,115,21,1,55,21,1,28,0,1,8,8,16,21,1,6,16,14,21,0,1,21,1,58,16,21,1,25,21,1,44,7,21,0,5,17,22,0,9,11,14,21,0,1,21,1,74,21,0,9,17,22,0,10,11,14,21,0,10,21,1,125,0,1,7,21,0,6,17,22,0,11,11,14,21,0,11,21,1,36,21,1,126,21,0,1,21,1,66,16,21,1,29,21,1,114,8,21,1,29,21,0,4,21,1,28,21,0,2,21,1,66,16,21,1,29,21,1,114,8,8,8,7,7,16,22,0,12,11,14,21,1,25,0,1,7,21,1,59,21,0,12,21,1,28,21,1,45,21,1,28,21,0,6,21,1,36,21,1,45,7,16,8,8,19,22,0,13,11,14,21,0,9,21,1,104,16,21,1,41,21,0,1,21,1,72,16,21,1,29,21,1,114,8,7,16,21,1,36,21,1,45,7,21,1,104,9,21,1,29,21,1,66,8,16,21,1,45,21,0,10,21,1,36,21,1,45,7,16,17,21,1,41,15,108,7,21,0,2,21,1,57,16,17,25,21,0,1,21,1,119,21,1,28,21,0,2,8,21,1,135,1,21,1,29,21,1,84,21,1,78,7,8,9,21,1,27,21,1,119,8,21,0,2,17,25,21,0,1,21,1,3,16,21,1,6,16,14,21,0,1,21,1,58,16,21,1,58,0,1,17,21,1,6,16,14,21,0,1,21,1,114,16,25,21,0,1,21,1,57,21,1,26,21,1,104,8,21,1,71,21,1,131,1,19,16,21,1,6,16,14,21,0,1,21,1,110,16,21,1,41,21,1,57,7,16,25,21,1,25,0,1,21,1,26,21,1,6,8,3,1,21,1,109,21,0,1,21,1,90,0,0,17,17,7,21,1,114,21,1,55,21,1,119,21,0,1,21,1,90,0,1,17,19,21,1,114,9,19,25,21,0,1,21,1,138,1,16,25,21,0,1,21,0,5,21,0,2,17,22,0,6,11,14,0,1,22,0,7,11,22,0,8,11,14,21,0,6,0,1,21,1,81,15,109,8,16,14,21,0,1,22,0,9,11,14,15,110,22,0,10,11,14,21,0,7,21,0,10,21,1,23,21,0,4,21,0,2,19,7,16,22,0,11,11,14,21,0,8,21,1,44,16,21,0,10,21,1,23,21,1,139,1,21,0,4,7,21,0,2,19,7,16,22,0,12,11,14,21,0,6,0,1,21,1,81,21,1,25,21,0,11,21,0,12,3,2,7,21,1,114,0,1,21,1,29,21,1,55,8,19,21,1,114,21,1,51,19,8,16,25,21,0,1,21,1,72,16,22,0,6,11,21,1,36,21,1,45,7,16,21,1,104,16,22,0,7,11,14,21,0,1,21,0,5,21,1,27,21,0,4,8,21,0,2,17,21,1,66,16,22,0,8,11,14,21,0,7,21,1,66,21,0,6,17,21,0,5,16,21,1,66,16,22,0,9,11,14,21,0,9,21,1,120,21,0,7,17,21,1,52,16,22,0,10,11,14,21,0,8,21,1,109,21,0,1,21,1,66,16,21,1,106,21,0,10,17,17,21,1,90,21,0,9,21,1,109,21,0,10,21,1,106,16,17,21,1,131,1,16,17,21,1,66,21,0,6,17,25,21,0,1,25,21,0,1,25,21,0,1,25,21,0,1,14,21,1,7,21,2,61,16,25,0,0,21,2,8,21,1,6,17,22,1,6,12,14,21,0,1,21,2,17,21,1,6,17,25,21,1,8,21,1,7,21,1,5,21,2,17,21,0,1,17,17,22,1,8,12,25,21,0,2,21,2,33,16,22,0,5,11,21,2,34,16,22,0,6,11,14,21,0,1,21,2,33,16,22,0,7,11,14,21,0,6,21,2,18,16,21,2,19,21,0,7,21,2,29,21,2,17,8,21,2,13,21,0,5,21,2,29,21,2,17,8,19,7,16,21,2,36,21,2,9,7,0,0,17,21,2,6,16,14,21,0,6,21,2,8,21,2,28,21,2,34,8,21,0,7,17,21,2,18,16,21,2,19,21,2,7,21,2,28,21,0,6,8,21,2,25,21,2,17,7,21,0,7,19,7,16,21,2,36,21,2,9,7,0,0,17,22,0,8,11,14,21,0,2,21,2,16,16,22,0,9,11,14,21,0,1,21,2,16,16,22,0,10,11,14,21,0,8,21,2,18,21,2,27,21,2,19,21,2,25,21,0,10,7,21,2,17,21,2,7,21,2,28,21,2,9,21,2,28,21,0,8,8,8,19,21,0,4,21,0,9,21,2,29,21,2,17,8,19,7,8,21,0,9,21,2,34,16,17,21,2,16,16,21,2,16,21,0,7,17,25,21,0,1,21,2,42,21,0,4,7,21,0,2,17,25,21,0,1,21,2,58,21,0,4,17,25,21,1,3,21,2,18,16,21,2,40,21,2,24,7,21,2,28,21,2,4,8,15,111,21,2,28,21,2,16,8,3,2,21,2,21,21,1,4,21,2,55,0,1,17,8,21,0,1,17,25,21,0,1,21,2,63,16,21,2,6,16,14,21,0,1,21,2,18,16,25,21,0,1,21,2,58,16,21,2,58,0,0,17,21,2,6,16,14,21,0,1,21,2,41,21,1,3,7,16,21,2,36,21,2,40,21,2,38,21,2,28,21,2,66,8,7,7,3,0,21,2,55,16,17,25,21,1,9,21,1,7,21,2,43,21,0,4,17,7,22,0,5,11,14,21,0,1,21,2,41,21,0,5,7,21,2,24,21,2,26,21,2,41,21,0,1,21,2,29,21,0,5,8,7,8,21,2,23,21,2,26,21,2,41,21,2,23,21,0,5,21,0,2,19,7,8,21,1,8,3,4,21,2,21,21,2,71,21,2,27,21,2,75,8,21,2,60,21,0,4,21,2,50,0,1,17,19,21,2,54,0,1,21,2,60,21,0,4,17,21,2,53,21,1,7,17,19,21,2,66,0,2,19,21,2,36,21,2,43,21,2,28,0,2,21,2,29,21,2,45,8,8,7,9,8,21,0,2,17,25,21,0,2,21,2,70,16,21,2,41,21,0,1,21,2,72,16,21,2,29,21,2,17,8,7,16,22,0,3,11,14,21,0,1,21,2,74,21,0,2,17,22,0,4,11,21,2,36,21,2,45,7,16,22,0,5,11,14,21,0,3,21,2,36,21,2,45,7,16,21,2,70,16,21,2,41,21,2,23,21,2,45,21,0,5,19,21,2,43,21,0,5,21,2,70,16,21,2,66,21,0,4,17,19,21,2,26,21,2,41,21,0,1,21,2,66,16,21,2,29,21,2,17,8,7,8,7,16,21,2,66,21,0,3,17,25,21,0,1,21,2,58,16,21,2,59,0,0,17,21,2,6,16,14,21,0,1,21,1,3,21,0,2,17,25,21,0,2,21,2,58,16,21,2,60,0,0,17,21,2,6,16,14,21,0,1,21,2,72,16,21,2,57,21,2,27,21,2,59,8,21,0,2,17,21,2,6,16,14,15,112,21,2,30,15,113,8,22,0,3,11,14,21,0,1,21,0,3,21,0,2,17,25,21,0,2,21,2,41,21,0,1,21,2,29,21,2,17,8,7,16,25,21,0,1,21,2,74,0,0,17,22,0,3,11,21,2,36,21,2,45,7,16,22,0,4,11,14,21,0,4,21,2,70,16,21,2,66,21,0,3,17,21,2,40,21,2,43,7,21,0,2,21,2,45,21,0,4,17,17,21,2,41,21,0,1,21,2,66,16,21,2,29,21,2,17,8,7,16,25,21,0,2,21,2,62,16,21,2,6,16,14,21,0,1,21,2,57,16,22,0,3,11,14,21,0,2,21,2,51,16,21,2,70,16,21,2,43,21,0,3,21,2,43,21,0,2,17,21,2,45,0,1,21,2,55,21,0,2,17,17,17,21,2,49,21,0,3,17,21,2,50,0,5,17,21,2,51,0,0,21,2,43,21,0,3,17,17,22,0,4,11,14,21,0,1,21,0,4,21,2,58,21,0,3,17,21,2,36,21,2,54,7,16,21,2,30,21,2,4,21,2,66,21,2,74,21,2,28,0,0,8,19,21,2,29,21,2,91,8,8,16,21,2,90,21,0,4,17,25,21,0,2,21,2,66,16,21,2,23,21,2,70,21,2,27,21,2,40,21,2,43,7,8,21,2,52,19,21,1,3,17,21,2,41,21,0,1,21,2,29,21,2,90,21,2,28,21,2,41,21,2,55,7,8,8,7,16,21,2,77,21,2,66,21,2,72,21,2,26,21,0,1,21,2,72,16,21,2,97,21,2,28,21,2,57,8,21,0,2,17,21,2,29,21,2,38,8,8,19,16,25,21,0,2,21,2,104,16,21,2,41,21,2,45,21,2,28,21,0,1,21,2,58,21,1,8,17,8,21,2,25,21,2,111,7,21,1,6,19,21,2,72,21,2,29,21,2,17,8,21,0,1,19,7,16,25,21,0,1,21,2,94,16,21,2,41,21,2,36,21,2,43,7,7,16,22,0,3,11,14,21,0,3,21,2,97,0,5,17,21,2,106,21,0,1,17,21,2,44,21,0,3,21,2,105,16,21,2,17,0,1,17,21,2,104,16,17,25,21,0,1,21,2,58,16,21,2,58,0,0,17,21,2,6,16,14,21,0,1,21,2,41,21,2,62,7,16,21,2,36,21,2,53,7,16,21,2,6,16,14,21,0,1,21,2,59,0,5,17,21,2,36,21,2,53,7,16,21,2,6,16,14,21,0,1,21,2,57,16,25,21,0,1,21,2,58,16,21,2,58,0,0,17,21,2,6,16,14,21,0,1,21,2,41,21,1,3,7,16,25,21,0,1,25,21,0,1,21,2,109,21,1,3,17,22,1,3,12,14,0,0,25,21,0,1,21,2,116,21,1,3,17,21,2,114,16,21,2,77,21,1,3,21,2,57,16,17,25,21,0,1,21,2,57,21,2,27,21,2,44,8,21,0,2,17,21,2,43,21,1,6,17,21,2,45,16,22,0,3,11,14,21,0,1,21,2,57,21,2,27,21,2,49,8,21,0,2,17,22,0,4,11,14,21,0,1,15,114,21,2,28,21,2,57,21,2,43,21,0,4,21,2,104,16,21,2,43,0,0,17,21,2,44,16,19,8,21,2,27,15,115,8,21,0,2,17,22,0,5,11,14,21,0,5,21,0,3,3,2,25,21,0,2,22,0,3,11,14,21,0,1,22,0,4,11,14,15,116,21,1,7,3,2,21,2,115,21,2,58,21,2,28,21,1,6,8,8,22,0,5,11,14,0,1,21,0,5,16,25,15,117,22,0,3,11,14,0,5,21,0,3,0,0,21,2,43,21,0,1,17,17,21,2,43,0,0,17,25,21,0,1,21,2,57,16,22,0,3,11,21,2,43,0,0,17,21,2,104,16,21,2,41,21,0,1,21,2,29,21,2,114,8,21,0,3,21,2,25,21,0,1,7,21,2,114,0,0,21,2,29,21,2,44,8,19,3,3,21,2,115,21,2,55,21,2,43,21,2,59,19,21,2,28,21,0,2,8,8,7,16,25,21,0,1,21,2,57,16,21,2,128,1,21,0,1,21,2,29,21,2,114,8,21,2,45,21,1,5,19,21,2,25,21,2,25,0,1,7,21,2,59,21,1,7,19,7,21,0,2,19,7,16,21,2,25,21,1,8,7,21,0,1,17,25,21,0,2,21,2,128,1,21,0,1,21,2,29,21,1,13,8,7,16,25,21,0,1,21,2,62,16,21,2,6,16,14,21,0,1,21,2,49,21,1,8,17,22,1,8,12,14,21,0,1,21,2,50,21,1,7,17,22,1,7,12,25,21,1,9,21,2,55,16,21,2,66,21,0,1,21,2,43,0,0,17,17,21,2,20,21,2,24,21,2,26,21,0,4,8,7,16,25,21,0,1,21,3,51,21,2,4,17,21,3,41,21,0,2,21,3,29,21,3,17,8,7,16,25,21,0,2,21,3,57,16,21,3,55,0,1,17,25,21,0,1,21,3,84,21,1,3,21,3,28,21,0,2,21,3,73,0,0,17,8,7,16,21,2,3,21,0,2,21,3,66,16,21,3,17,0,1,17,17,25,21,0,2,21,3,41,21,0,1,21,3,29,21,3,114,8,7,16,25,21,0,1,21,3,58,21,0,2,17,21,3,20,21,3,53,7,16,21,3,36,21,3,43,7,16,22,0,3,11,14,21,0,3,21,3,104,16,21,3,41,21,0,2,21,3,29,21,3,114,8,7,16,21,3,36,21,3,45,7,16,22,0,4,11,14,21,0,3,21,3,77,21,3,28,21,1,4,8,21,3,30,21,0,2,21,0,1,3,2,21,3,29,21,3,41,21,3,114,7,8,21,3,26,15,118,8,8,16,14,21,0,4,25,21,1,4,21,3,43,21,3,28,21,0,1,8,21,3,27,21,2,5,8,21,1,3,17,21,3,58,21,3,28,0,1,8,21,3,30,21,0,1,21,3,43,0,0,17,21,3,26,21,1,5,8,8,16,25,21,0,1,0,0,21,3,29,21,3,77,8,21,3,30,15,119,8,21,0,2,17,25,21,0,1,21,4,36,21,4,44,7,16,21,4,45,16,22,2,3,12,14,21,0,1,21,4,36,21,4,49,7,16,21,4,45,21,1,4,17,22,1,4,12,25,0,2,21,4,46,21,0,2,17,21,4,49,16,22,0,3,11,21,4,43,21,0,1,17,22,0,4,11,21,3,2,16,22,0,5,11,14,21,0,1,21,0,4,3,2,21,4,114,21,0,5,17,21,2,3,21,0,2,21,4,51,0,2,17,21,4,45,21,0,5,17,21,4,43,21,0,3,17,17,25])
+ ,[1,0,2,Infinity,-Infinity,-1]
+ ,[[0,1,0,0],[0,0,3,144],[2,0,2537,6],[2,0,2565,6],[0,0,2600,3],[0,0,2604,3],[0,0,2608,3],[1,0,2612,5],[2,0,2630,6],[2,0,2645,6],[2,0,2664,6],[2,0,2686,6],[2,0,2708,6],[0,0,2741,3],[1,0,2753,9],[0,0,2873,4],[1,1,2956,3],[1,1,3002,2],[1,1,3017,2],[1,1,3043,2],[0,0,3087,3],[0,0,3110,3],[0,0,3133,3],[0,0,3162,3],[0,0,3174,3],[0,0,3205,3],[0,0,3211,5],[0,0,3329,5],[0,0,3363,3],[0,0,3390,3],[0,0,3425,3],[0,0,3457,3],[0,0,3502,3],[0,0,3511,3],[0,0,3517,4],[1,1,3619,2],[2,0,3690,10],[2,0,3749,8],[1,1,3939,2],[1,0,3949,5],[2,1,3990,4],[0,0,4026,3],[0,0,4177,8],[0,0,4415,4],[0,0,4496,3],[0,0,4547,4],[0,0,4666,3],[0,0,4717,4],[0,0,4880,3],[0,0,4928,4],[0,0,4981,3],[0,0,5056,3],[0,0,5089,3],[0,0,5103,11],[0,0,5368,5],[0,0,5539,4],[0,0,5752,3],[2,0,5771,6],[0,0,5799,4],[0,0,5915,4],[0,0,5968,4],[0,0,6035,4],[1,0,6303,7],[1,0,6383,8],[0,0,6410,3],[0,0,6428,5],[1,1,6535,3],[1,0,6559,9],[1,0,6695,14],[0,0,7132,3],[0,0,7173,3],[0,0,7211,3],[0,0,7254,3],[1,1,7307,2],[2,0,7316,13],[2,0,7468,11],[1,1,7616,2],[1,1,7620,2],[1,1,7624,2],[0,0,7628,3],[0,0,7640,3],[0,0,7665,3],[1,0,7687,11],[1,0,7932,5],[1,0,7947,5],[0,0,7958,3],[0,0,8008,3],[0,0,8028,3],[1,0,8083,6],[0,0,8238,6],[0,0,8374,3],[0,0,8403,4],[0,0,8471,3],[0,0,8490,5],[0,0,8568,5],[0,0,8718,3],[0,0,8820,3],[0,0,8875,4],[0,0,8937,3],[0,0,9009,3],[1,1,9039,2],[0,0,9043,3],[0,0,9061,3],[0,0,9087,6],[0,0,9199,6],[0,0,9248,4],[0,0,9277,4],[0,0,9360,3],[0,0,9423,3],[0,0,9443,3],[1,0,9485,5],[0,0,9521,3],[0,0,9547,3],[0,0,9561,3],[0,0,9603,3],[0,0,9622,5],[0,0,9736,3],[0,0,9791,3],[0,0,9814,3],[0,0,9857,6]]
+)(list([
+ (x,w) => +(x.a===1) // IsArray
+ ,(x,w) => 0 // Type
+ ,(x,w) => has(w)?Math.log(x)/Math.log(w):Math.log(x) // Log
+ ,(x,w) => assert(x===1) // !
+ ,(x,w) => has(w)?w+x:x // +
+ ,(x,w) => (has(w)?w:0)-x // -
+ ,(x,w) => w*x // ×
+ ,(x,w) => (has(w)?w:1)/x // ÷
+ ,(x,w) => has(w)?Math.pow(w,x):Math.exp(x) // ⋆
+ ,(x,w) => Math.floor(x) // ⌊
+ ,(x,w) => has(w)?+(x===w):x.a?x.sh.length:0 // =
+ ,lesseq // ≤
+ ,(x,w) => list(x.sh) // ≢
+ ,(x,w) => (r=>arr(r,has(w)?w:[r.length],1))(x.slice()) // ⥊
+ ,(x,w) => x[w] // ⊑
+ ,(x,w) => list(Array(x).fill(undefined).map((_,i)=>i)) // ↕
+ ,table // ⌜
+ ,scan // `
+]));
+
+// Compiler
+let compile = run(
+ new Uint8Array([0,70,22,0,0,11,14,0,71,22,0,1,11,14,0,72,22,0,2,11,14,0,73,22,0,3,11,14,0,74,22,0,4,11,14,0,75,22,0,5,11,0,76,0,77,0,78,0,20,21,0,1,17,0,79,0,80,0,81,0,82,0,83,21,0,2,0,84,0,85,0,20,21,0,3,17,0,20,21,0,4,17,21,0,0,0,20,0,86,17,3,13,22,0,6,11,0,20,16,22,0,7,11,14,21,0,6,0,38,0,13,7,16,0,26,16,0,35,16,22,0,8,22,0,9,22,0,10,22,0,11,22,0,12,22,0,13,22,0,14,22,0,15,22,0,16,22,0,17,22,0,18,22,0,19,22,0,20,4,13,11,14,21,0,6,0,22,0,50,17,0,38,0,13,7,16,0,41,0,0,7,16,22,0,21,11,14,0,51,0,20,0,54,0,24,16,0,25,16,0,26,0,53,17,17,0,20,21,0,6,0,22,0,52,17,0,38,0,13,7,16,0,20,0,51,17,0,26,16,0,22,21,0,16,0,13,16,0,1,21,0,21,17,17,17,22,0,22,11,14,0,52,0,51,3,2,0,39,0,1,7,0,52,0,53,0,55,3,3,17,0,19,16,22,0,23,11,14,15,1,22,0,24,11,14,15,2,22,0,25,11,14,0,30,0,45,0,57,8,0,23,0,45,0,57,8,21,0,25,3,3,0,48,0,29,0,31,0,89,0,20,0,91,17,19,0,30,9,8,22,0,26,11,14,15,3,22,0,27,11,14,15,4,22,0,28,11,14,15,5,22,0,29,11,14,21,0,29,25,0,87,0,14,21,0,1,17,22,0,3,11,14,0,88,0,14,21,0,1,17,0,9,0,45,0,23,0,45,0,54,8,0,22,0,13,19,8,16,0,26,16,22,0,4,11,14,0,89,0,14,21,0,1,17,0,26,16,22,0,5,11,14,21,0,4,21,0,5,0,23,0,56,17,21,0,3,0,26,16,3,3,0,20,16,22,0,6,11,0,27,16,22,0,7,11,14,21,0,6,0,29,21,0,7,17,22,0,6,12,14,21,0,4,0,0,0,54,17,21,0,5,0,23,0,57,17,0,57,0,20,21,1,1,0,14,21,0,1,17,17,0,26,16,0,26,0,45,21,0,3,0,42,0,0,7,16,0,20,0,51,17,0,46,0,29,0,43,0,18,0,20,0,51,19,0,23,0,56,19,0,1,0,18,19,8,8,8,16,3,3,0,20,16,0,29,21,0,7,17,22,0,8,11,14,15,6,0,49,15,7,8,22,0,9,11,14,21,0,8,0,27,21,0,6,17,0,13,0,46,0,20,8,16,0,13,0,36,0,22,7,0,57,19,0,46,21,0,9,8,16,0,23,0,56,17,22,0,10,11,14,21,0,8,0,37,0,20,7,21,0,6,17,0,26,21,0,10,17,22,0,11,11,14,0,19,0,36,0,20,7,21,0,1,0,13,16,19,0,40,0,26,7,9,0,23,0,56,19,22,0,12,11,14,21,0,11,21,0,12,16,0,42,0,13,7,16,0,8,16,22,0,13,11,14,21,0,11,0,26,21,0,3,0,29,21,0,6,0,26,21,0,10,17,17,0,8,16,17,22,0,14,11,14,21,0,14,21,0,12,16,0,42,0,13,7,16,0,2,21,0,14,0,37,0,30,7,16,21,0,12,16,0,42,0,0,7,16,17,0,36,0,1,7,0,57,17,0,36,0,35,7,21,0,1,17,22,0,15,11,0,34,16,22,0,16,11,14,21,0,14,0,37,0,25,0,43,0,30,8,7,16,21,0,12,16,0,26,21,0,13,17,22,0,17,11,14,21,0,1,0,26,21,0,13,17,0,31,21,1,7,17,22,0,18,11,14,21,1,17,21,1,18,21,1,19,3,3,0,20,16,0,33,21,0,18,17,22,0,19,11,0,11,0,45,0,18,0,20,0,51,19,0,22,0,13,19,8,16,22,0,20,11,14,21,0,18,0,35,21,0,20,0,42,0,0,7,16,0,2,21,0,19,17,0,36,0,1,7,0,57,17,17,22,0,21,11,14,21,1,3,0,13,16,22,0,22,11,14,21,1,19,0,30,0,56,17,22,0,23,11,14,21,0,21,0,38,0,26,0,45,0,13,0,45,21,0,23,8,8,7,16,0,15,0,45,21,1,19,0,30,16,0,46,0,0,8,8,0,2,0,17,19,0,1,0,18,19,21,0,22,17,22,0,24,11,14,21,0,24,0,29,0,45,0,28,8,21,0,18,0,26,21,0,20,17,0,36,0,33,7,21,1,19,17,17,0,34,16,22,0,25,11,14,21,0,25,0,38,0,30,7,16,0,36,0,33,7,21,1,19,17,0,41,0,0,7,16,22,0,26,11,14,21,0,18,0,26,0,45,21,0,17,8,0,47,21,0,15,0,31,21,0,16,17,0,0,21,0,25,0,13,16,17,0,0,21,1,21,17,8,16,0,26,0,45,21,0,20,8,0,47,21,0,24,0,31,21,0,25,17,0,0,21,1,21,17,8,16,0,26,21,1,20,0,33,21,0,18,17,0,10,21,0,19,17,0,8,16,0,10,21,0,20,17,17,22,0,18,12,14,21,1,11,0,33,21,0,18,17,0,9,0,45,0,18,0,10,21,1,13,0,29,0,54,0,58,3,2,17,0,33,21,0,18,17,19,0,20,0,57,19,0,22,0,13,19,8,16,0,8,16,0,36,0,26,7,22,0,18,13,14,21,1,11,0,33,21,0,18,17,0,9,21,1,13,0,29,0,52,0,53,3,2,17,0,33,21,0,18,17,0,36,0,20,7,0,57,17,0,23,0,57,17,17,0,8,16,0,36,0,26,7,22,0,18,13,14,21,0,21,0,38,0,30,7,16,0,36,0,1,7,21,1,19,0,30,16,17,0,36,0,3,0,43,0,5,8,7,21,0,22,17,0,6,0,51,17,0,14,0,45,0,54,8,0,46,0,9,8,0,0,0,18,19,21,0,21,0,38,0,30,0,45,0,56,8,7,16,0,14,21,0,23,17,17,22,0,27,11,14,21,1,21,0,1,21,0,18,17,21,0,25,0,13,16,0,46,0,11,8,0,9,0,15,0,45,0,51,8,19,16,22,0,28,11,14,21,1,22,0,29,21,0,18,0,5,21,1,21,17,17,0,26,0,45,21,0,28,8,0,47,21,0,27,8,16,22,0,29,11,14,21,1,16,0,22,0,53,17,0,33,21,0,18,17,0,2,0,53,17,0,0,22,0,18,13,14,21,0,18,21,0,29,21,0,26,21,0,16,0,20,21,0,25,0,23,21,0,26,17,17,3,4,25,21,1,18,22,0,3,22,0,4,22,0,5,22,0,6,4,4,11,14,21,1,17,0,30,16,0,46,0,1,8,0,25,0,43,0,41,0,2,0,45,0,59,8,0,46,0,0,8,7,8,9,22,0,7,11,14,21,0,7,0,23,0,45,0,57,8,21,0,7,9,0,1,9,3,2,0,48,0,30,0,14,21,0,3,19,8,22,0,8,11,14,0,23,0,45,0,57,0,46,0,0,8,8,0,51,0,13,0,4,0,59,19,0,3,21,0,7,19,3,2,0,48,0,13,0,11,0,51,19,8,9,0,0,0,22,0,43,21,0,7,8,19,0,45,21,0,4,0,11,16,0,46,0,31,8,8,22,0,9,11,14,0,60,0,61,21,0,9,3,3,0,48,0,29,0,31,21,0,5,21,0,6,3,2,19,0,30,9,8,22,0,10,11,14,0,90,0,11,16,0,31,21,1,7,17,0,31,21,0,1,17,0,30,16,22,0,11,11,14,21,0,1,0,22,21,0,11,17,21,0,10,0,23,0,45,0,57,8,21,0,10,9,0,1,9,3,2,0,48,0,30,0,14,21,0,3,19,8,16,22,0,12,11,14,21,0,12,21,0,1,0,13,16,0,11,21,0,11,17,0,49,0,36,0,17,0,23,0,57,0,0,21,0,11,17,19,21,0,8,9,0,4,0,59,19,0,46,0,2,8,7,8,21,0,1,17,25,0,62,22,0,3,11,14,21,0,1,0,6,0,57,17,0,40,0,4,7,21,0,3,17,0,5,16,22,0,4,11,14,21,0,4,0,0,0,57,17,0,26,16,0,32,16,0,27,16,0,27,16,22,0,5,11,14,21,0,1,15,8,21,0,4,17,0,29,21,0,5,17,25,21,0,2,22,0,3,22,0,4,4,2,11,14,21,0,1,0,31,0,18,0,7,0,54,19,0,4,0,56,19,0,2,0,12,0,45,0,13,8,19,0,17,19,21,1,13,17,22,0,5,11,0,42,0,0,7,16,0,27,16,22,0,6,11,14,21,1,13,0,29,0,54,0,52,3,2,17,0,33,21,0,1,17,0,2,21,0,5,17,22,0,7,11,14,21,1,14,0,33,21,0,1,17,0,10,0,45,0,25,0,45,0,57,8,8,16,22,0,8,11,14,21,0,8,0,29,0,45,21,0,6,8,0,47,0,25,0,45,0,56,8,8,16,22,0,9,11,14,21,0,9,0,10,21,0,8,17,22,0,10,11,14,21,0,8,0,29,21,0,6,17,0,27,16,0,36,0,29,7,22,0,6,13,14,21,0,10,0,8,16,0,2,22,0,4,13,14,0,51,0,12,21,0,5,17,22,0,11,11,14,21,0,4,0,15,0,57,17,0,10,21,0,4,0,14,0,52,17,0,29,0,45,21,0,6,8,0,47,0,25,0,45,0,56,8,8,16,17,0,18,0,2,0,45,0,13,0,43,0,24,8,0,0,0,57,19,8,0,42,0,6,7,9,0,44,0,14,8,0,10,0,45,0,8,8,19,0,9,0,17,19,21,1,13,0,30,0,57,17,0,14,21,0,1,17,0,11,21,0,10,17,17,0,0,22,0,4,13,14,21,1,11,0,33,21,0,1,17,0,10,21,0,8,17,0,10,21,0,11,17,0,29,0,36,0,20,7,0,1,0,20,0,43,0,42,0,0,7,8,19,0,57,19,0,27,0,46,0,27,0,46,0,36,0,29,7,8,0,1,0,36,0,29,7,19,0,29,0,45,0,27,8,0,17,19,8,0,17,0,20,0,56,19,19,21,0,6,17,0,23,0,56,17,0,0,0,57,17,0,42,0,0,7,16,0,27,16,22,0,12,11,14,21,0,7,0,29,21,0,12,17,0,42,0,0,7,16,22,0,13,11,0,27,16,22,0,14,11,14,21,0,14,0,36,0,29,7,22,0,12,13,14,21,0,14,0,36,0,29,7,22,0,13,13,14,21,0,12,0,36,0,29,7,22,0,1,13,14,21,0,7,0,29,21,0,12,17,22,0,15,11,14,0,51,0,11,21,0,15,17,0,26,16,22,0,16,11,14,0,51,0,12,21,0,15,17,22,0,17,11,0,42,0,0,7,16,22,0,18,11,14,0,51,0,46,0,20,8,0,42,0,0,7,9,0,26,0,57,0,20,21,0,17,17,19,0,18,0,20,0,51,19,0,22,0,13,19,0,46,0,1,8,9,22,0,19,11,14,0,18,0,0,21,1,16,0,30,0,53,17,19,0,33,21,0,1,19,21,0,19,9,0,23,0,57,19,0,11,0,51,19,22,0,20,11,14,0,58,0,19,16,21,0,20,16,0,2,0,54,17,0,6,0,52,0,19,16,21,0,20,16,17,0,2,0,54,17,0,0,0,52,0,24,16,21,0,20,16,17,0,20,0,51,17,22,0,21,11,14,21,0,4,0,29,21,0,12,17,0,29,0,45,21,0,16,8,0,47,0,58,0,24,16,0,26,0,45,0,15,0,45,0,54,8,0,0,0,57,19,8,16,0,29,21,0,21,0,23,0,57,17,17,8,16,22,0,4,12,14,21,1,21,0,1,21,0,1,17,22,0,22,11,21,0,3,0,46,0,11,8,0,9,0,15,0,45,0,51,8,19,16,22,0,23,11,0,26,16,22,0,24,11,14,21,0,1,0,29,21,0,24,17,22,0,25,11,14,21,1,16,0,33,21,0,1,17,0,26,16,22,0,26,11,14,21,1,12,0,30,16,0,14,21,0,1,17,0,29,21,1,12,0,33,21,0,1,17,0,2,0,45,0,13,0,43,0,24,8,8,16,0,42,0,6,7,16,17,22,0,27,11,14,21,0,7,0,1,21,0,5,17,0,29,21,0,12,17,0,42,0,0,7,16,0,27,16,22,0,6,12,14,21,0,12,0,29,21,0,6,17,22,0,28,11,14,21,0,8,0,1,21,0,9,17,0,29,21,0,28,17,0,12,0,26,0,44,0,1,8,0,11,19,0,51,17,0,36,0,3,7,0,54,17,0,0,0,57,17,22,0,29,11,14,21,1,13,0,30,0,53,17,0,14,21,0,1,17,0,29,21,0,6,17,0,26,16,22,0,30,11,14,21,0,8,0,29,21,0,28,17,0,27,16,22,0,31,11,0,36,0,29,7,22,0,6,13,14,21,0,12,0,29,21,0,6,17,22,0,28,12,14,21,0,6,0,36,0,29,7,22,0,1,13,14,21,0,6,0,36,0,29,7,22,0,4,13,14,21,0,28,0,36,0,29,7,22,0,11,13,14,21,0,8,0,12,21,0,9,17,0,29,21,0,28,17,0,26,16,22,0,32,11,14,21,0,6,0,27,16,22,0,33,11,14,21,0,31,0,27,16,0,29,22,0,30,13,14,21,1,11,0,33,21,0,1,17,22,0,34,11,14,21,0,8,0,29,21,0,28,17,0,10,21,0,11,17,0,10,21,0,34,17,22,0,35,11,14,21,1,12,0,22,0,54,17,0,33,21,0,1,17,22,0,36,11,14,21,0,36,0,10,21,0,35,17,0,1,22,0,4,13,14,0,54,0,16,21,0,4,17,22,0,37,11,14,0,52,0,14,21,0,4,17,0,25,0,57,17,0,10,0,57,0,16,21,0,4,17,17,22,0,38,11,14,21,0,38,0,29,21,0,35,0,25,0,56,17,0,2,0,45,0,13,0,43,0,24,8,8,16,0,42,0,6,7,16,17,22,0,39,11,14,21,0,38,0,25,0,57,17,0,9,21,1,12,0,30,0,57,17,0,14,21,0,1,17,17,0,11,21,0,39,17,22,0,40,11,14,0,52,0,14,21,0,4,17,0,25,0,57,17,0,11,21,0,36,17,0,10,21,0,37,17,22,0,41,11,14,21,0,40,0,10,21,0,41,17,0,8,16,0,25,16,0,2,0,43,0,42,0,6,7,8,0,1,0,17,19,0,45,0,13,0,43,0,24,8,8,16,0,25,16,22,0,42,11,14,21,0,36,0,26,16,21,0,42,0,46,0,29,8,0,0,0,57,19,0,0,0,18,19,16,22,0,43,11,14,0,57,0,1,21,0,43,17,0,33,21,0,1,0,13,16,0,24,16,17,0,18,0,20,0,51,19,0,22,0,13,19,0,46,0,1,8,16,0,29,21,0,33,17,0,42,0,0,7,16,0,25,0,56,17,22,0,44,11,0,29,21,0,6,17,22,0,45,11,14,21,0,4,0,26,0,45,21,0,45,8,0,47,0,38,0,56,7,8,16,22,0,4,12,14,21,0,41,0,8,16,0,42,0,0,7,0,2,0,43,0,42,0,6,7,8,0,1,0,18,19,21,0,35,19,0,15,0,11,0,7,19,0,54,19,0,9,0,18,19,16,0,9,21,0,35,0,2,0,45,0,13,0,43,0,24,8,0,0,0,57,19,8,0,42,0,6,7,9,0,44,0,15,8,21,0,36,17,17,22,0,46,11,14,21,0,36,0,10,21,0,35,17,0,36,0,20,7,0,51,17,0,23,0,57,17,0,12,21,0,37,17,22,0,47,11,14,21,0,47,0,26,16,0,25,16,22,0,48,11,14,21,0,47,0,25,0,56,17,0,11,21,0,37,17,0,10,0,57,0,14,21,0,4,17,17,0,11,21,0,47,0,25,0,57,17,0,9,21,0,41,17,17,0,9,21,0,39,0,8,16,0,10,21,0,46,17,17,0,11,21,0,45,0,25,0,57,17,17,0,26,16,22,0,49,11,14,0,51,0,14,21,0,4,17,0,11,21,0,41,17,0,10,0,51,0,16,21,0,4,17,0,9,21,0,39,17,17,0,9,21,1,15,0,30,16,0,13,21,0,1,17,17,0,36,0,20,7,0,51,17,0,23,0,57,17,0,29,21,0,49,17,22,0,50,11,14,21,0,3,0,0,21,1,21,17,0,16,21,0,1,17,22,0,51,11,14,21,1,10,0,30,0,56,17,0,15,21,0,1,17,0,10,21,0,51,17,0,26,16,22,0,52,11,14,21,0,1,0,29,21,0,52,17,22,0,53,11,0,34,16,0,9,16,22,0,54,11,14,21,1,13,0,30,0,58,17,0,14,21,0,1,0,26,21,0,11,17,17,22,0,55,11,14,0,57,0,20,21,0,35,17,0,9,21,0,11,0,20,0,57,17,17,0,1,0,51,0,20,21,0,34,17,17,0,42,0,0,7,16,0,26,0,57,0,20,21,0,11,17,17,0,23,0,45,0,1,8,0,1,0,23,19,0,57,17,0,26,21,0,55,17,0,0,0,57,17,22,0,56,11,14,21,0,55,0,20,0,51,17,0,29,0,45,0,42,0,0,7,8,21,0,11,17,0,12,21,0,34,17,0,26,16,22,0,57,11,14,21,1,13,0,30,0,54,17,0,14,21,0,1,17,0,26,16,22,0,58,11,14,21,0,44,0,9,21,0,27,17,0,9,21,0,23,17,22,0,59,11,0,29,21,0,24,17,22,0,60,11,14,21,0,59,21,0,19,16,22,0,61,11,14,21,0,18,0,29,21,0,24,17,0,36,21,0,14,0,29,21,0,16,17,0,20,21,0,1,0,13,16,17,7,0,29,0,26,0,45,21,0,60,8,19,0,20,21,0,14,0,26,21,0,17,17,0,20,0,56,17,0,46,0,29,8,19,16,0,27,16,22,0,62,11,14,21,0,62,0,29,0,45,21,0,25,0,26,0,45,21,0,60,8,0,46,0,20,8,16,0,46,0,29,8,0,27,9,8,16,0,29,0,45,21,0,60,0,36,0,26,7,16,0,1,16,0,20,21,0,60,17,0,46,0,29,0,43,0,42,0,0,7,8,8,0,27,9,8,16,0,26,0,45,21,0,24,0,13,16,0,46,0,11,8,8,16,22,0,62,12,14,21,0,24,0,29,0,45,21,0,62,8,0,47,0,29,0,45,0,2,0,45,0,13,0,43,0,24,8,8,0,42,0,6,7,9,8,8,21,0,60,17,22,0,63,11,14,21,0,22,0,29,21,0,26,17,0,0,0,54,17,0,15,0,45,0,51,8,0,46,0,0,8,16,0,0,21,0,21,0,7,0,54,17,0,2,0,52,17,0,29,21,0,18,0,29,21,0,26,17,17,17,0,20,21,0,59,0,42,0,0,7,16,0,8,0,45,0,2,0,45,21,0,17,8,0,42,0,6,7,9,8,16,0,1,21,1,23,0,29,21,0,21,17,0,29,21,0,18,17,17,0,29,21,0,63,17,17,22,0,64,11,14,21,0,26,0,20,21,0,24,17,22,0,65,11,0,11,16,0,19,0,52,17,0,20,16,22,0,66,11,14,21,0,44,0,29,21,0,65,17,0,0,0,63,17,21,0,26,0,38,0,51,7,16,0,20,21,0,63,21,0,13,0,46,0,29,8,0,44,0,1,8,21,0,24,17,17,21,0,64,3,3,22,0,67,11,14,21,0,33,0,29,22,0,16,13,14,21,0,52,21,0,52,21,0,16,21,0,16,21,0,58,21,0,57,21,0,30,21,0,30,21,0,32,21,0,32,21,0,43,21,0,42,0,29,21,0,48,17,0,6,0,57,17,0,0,21,0,48,17,21,0,50,0,0,21,0,49,17,0,0,0,45,21,0,42,0,46,0,29,8,0,2,21,0,50,19,8,16,3,13,0,20,16,0,36,0,29,7,21,0,6,17,0,20,21,0,66,17,0,27,16,22,0,68,11,14,21,0,52,0,38,0,51,7,16,21,0,53,0,31,21,0,54,17,21,0,16,0,38,0,64,7,16,21,0,16,0,13,16,0,24,16,0,0,0,57,17,3,4,0,20,21,0,67,17,0,20,16,22,0,69,11,14,21,0,58,0,38,0,65,7,16,21,0,57,0,38,0,66,7,16,21,0,45,0,29,21,0,30,17,0,0,0,52,17,21,0,56,21,0,45,0,29,21,0,32,17,0,0,0,52,17,21,0,29,21,0,1,0,0,21,0,40,17,0,26,21,0,36,17,0,0,21,1,12,0,30,16,0,1,0,67,17,17,21,0,4,0,29,21,0,48,17,0,0,0,53,17,21,0,39,0,29,21,0,49,17,0,2,0,69,17,0,1,21,0,50,17,0,0,0,68,17,0,14,0,45,0,59,8,0,2,0,50,19,0,0,0,18,19,16,3,9,0,20,16,0,20,21,0,69,17,0,29,21,0,68,17,22,0,70,11,14,21,1,23,0,29,21,0,21,17,0,0,21,0,61,17,0,38,0,11,0,44,0,21,8,7,21,0,58,0,13,0,44,0,24,0,46,0,0,8,8,21,0,69,17,0,33,21,0,68,17,0,20,0,57,17,0,26,16,0,36,0,29,7,21,0,70,0,6,0,57,17,0,40,0,4,7,0,62,17,0,5,16,0,0,0,57,17,0,20,0,51,17,0,42,0,0,7,16,17,17,0,38,0,20,7,0,54,0,24,0,44,0,25,0,46,0,39,0,21,7,8,8,0,52,17,0,19,16,0,29,21,0,21,17,17,22,0,71,11,14,0,65,0,20,21,0,70,17,21,1,27,16,21,0,54,21,0,71,3,3,25,21,0,1,21,1,24,16,22,0,3,22,0,4,22,0,5,22,0,6,4,4,11,14,21,0,3,21,1,28,21,0,5,21,0,4,3,2,17,22,0,7,22,0,8,22,0,9,4,3,11,14,21,0,6,0,38,21,1,26,7,16,0,20,21,0,2,17,0,29,21,1,21,0,16,21,0,8,17,0,2,21,0,2,0,13,16,0,1,21,0,5,17,0,0,21,1,21,17,17,0,1,21,0,8,17,17,22,0,10,11,14,21,0,7,21,0,10,21,0,9,3,3,25,21,0,1,0,25,16,0,30,16,0,14,0,51,17,25,21,0,1,0,29,0,45,21,0,2,0,26,21,0,1,17,8,0,47,0,38,0,57,7,8,16,21,1,9,21,0,2,0,36,0,29,7,16,17,25,21,0,2,0,2,16,22,0,3,11,14,21,0,1,21,0,3,0,41,0,10,7,16,0,49,0,26,0,45,21,0,3,8,0,44,21,1,3,0,46,0,3,8,0,5,9,0,46,21,0,0,8,8,0,20,0,7,0,0,21,0,3,0,46,0,2,8,19,0,45,21,1,3,8,19,8,0,57,0,1,21,0,2,17,17,25])
+ ,[runtime[0],runtime[1],runtime[2],runtime[3],runtime[4],runtime[6],runtime[7],runtime[8],runtime[9],runtime[10],runtime[11],runtime[12],runtime[13],runtime[14],runtime[15],runtime[16],runtime[17],runtime[20],runtime[21],runtime[22],runtime[23],runtime[24],runtime[25],runtime[26],runtime[27],runtime[28],runtime[30],runtime[31],runtime[32],runtime[33],runtime[34],runtime[35],runtime[36],runtime[37],runtime[38],runtime[39],runtime[41],runtime[42],runtime[43],runtime[44],runtime[45],runtime[46],runtime[48],runtime[49],runtime[50],runtime[51],runtime[52],runtime[53],runtime[55],runtime[58],9,0,3,5,2,6,-1,1,4,10,3.14159265358979,Infinity,128,21,15,25,14,11,16,7,'\t','\n',str("0123456789"),str("ABCDEFGHIJKLMNOPQRSTUVWXYZ"),str("abcdefghijklmnopqrstuvwxyz"),str("+-×÷⋆√⌊⌈|¬∧∨<>≠=≤≥≡≢⊣⊢⥊∾≍↑↓↕⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔!"),str("˜˘¨⌜⁼´˝`"),str("∘○⊸⟜⌾⊘◶⎉⚇⍟"),str("⋄,"),str("←↩→"),str("(){}⟨⟩"),str("‿"),str("·"),str("𝕊𝕏𝕎𝔽𝔾𝕤𝕩𝕨𝕗𝕘"),str("¯.π∞"),str("_"),str(" "),'#','\'','"','e',str("'")]
+ ,[[0,1,0,30],[0,0,359,30],[0,0,1484,13],[0,0,1801,6],[0,0,1874,72],[0,0,4856,11],[0,0,4979,3],[0,0,4994,3],[0,0,5034,4]]
+)
+let bqn = src => run.apply(null,compile(str(src),runtime));
+
+if(typeof module!=='undefined'){module.exports=bqn;}
diff --git a/src/c.bqn b/src/c.bqn
new file mode 100644
index 00000000..eed5f843
--- /dev/null
+++ b/src/c.bqn
@@ -0,0 +1,132 @@
+#! ./dzref
+
+tab←' '⋄nl←'
+'
+dig ← "0123456789"
+alph ← "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+alow ← "abcdefghijklmnopqrstuvwxyz"
+charSet←∾charGroups←⟨
+ chF←"+-×÷⋆√⌊⌈|¬∧∨<>≠=≤≥≡≢⊣⊢⥊∾≍↑↓↕⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔!" # Function
+ "˜˘¨⌜⁼´˝`" # Modifier
+ "∘○⊸⟜⌾⊘◶⎉⚇⍟" # Composition
+ nl∾"⋄," # Separator
+ "←↩→" # Gets
+ "(){}⟨⟩" # Bracket
+ "‿" # Ligature
+ "·" # nOthing
+ "𝕊𝕏𝕎𝔽𝔾𝕤𝕩𝕨𝕗𝕘" # Input (𝕣 pending; ℝ not allowed)
+ dig # Digit
+ "¯.π∞" # Numeric
+ alow∾alph∾"_" # Alphabetic
+ " "∾tab # Whitespace
+# #'" eliminated during tokenization
+⟩
+bF‿bM‿bC‿bS‿bG‿bB‿bL‿bO‿bI‿bD‿bN‿bA‿bW←⊔/≠¨charGroups
+vi←+´≠¨9↑charGroups
+charRole←((vi-≠bI)↑/0∾≠¨3↑charGroups)∾(5/⌽↕2)∾0
+spc←⥊3‿5‿6-⌜3‿0
+
+Tokenize←{
+ r←𝕩='#'⋄s←/(≠↑2⊸↓)⊸∧𝕩='''⋄d←/𝕩='"'
+ g←⍋q←∾⟨ s⋄¯1↓d⋄/r⟩ ⋄q↩g⊏q
+ e← g⊏∾⟨2+s⋄ 1↓d⋄(⊢-¯1↓0∾⊢)∘⊏⟜(0∾+`r)⊸//(𝕩=nl)∾1⟩
+ Se←{(⊏˜𝕨)Se 1¨⌾((𝕩/𝕨)⊸⊏)𝕩}⍟{0=⊑⌽𝕩}
+ st←¯1↓Se⟜(1↑˜≠)∾⟜≠q⍋e⋄b←st/q∾˘e
+ ToI←¯1↓·/⁼(≠𝕩)∾˜⥊⋄f←¬≠`ToI b
+ cb←(¬(st/q)⊏r)/b
+ lu←⍷lit←𝕩⊔˜1-˜(+`ToI⊑˘cb)×≠`ToI cb
+ cl←f/ToI⊑∘⌽˘cb
+
+ c←charSet⊐f/𝕩
+ w←(≠↑0∾⊢)⊸<l←c∊∾bD‿bN‿bA
+ i←(1-˜l×+`w)⊔c
+ na←≠alph⋄us←¯1⊑bA
+ in←na(⊢-⊣×+⟜(⊑bA)⊸≤)us⊸≠⊸/¨i
+ id←⍷(bA∊˜w/c)⍒⊸⊏in⋄nv←+´bA∊˜⊑¨id
+
+ c↩(w∨¬l∨c∊bW)/(vi+id⊐in)⌾(w⊸/)(vi+(≠id)+lu⊐lit)⌾(cl⊸/)c
+ c/˜↩¬(≠↑1∾(c∊2‿4⊏bB)∨⊢)⊸∧c∊bS⋄c/˜↩¬(1↓1∾˜c∊3‿5⊏bB)∧c∊bS
+ ti←(us=¯1⊸⊑¨i)(⊢+∧⟜(2⊸=))0⌈na⌊∘÷˜(⊑bA)-˜⊑¨i
+ ic←(0⊸≤∧<⟜(≠id))c-vi⋄t←ti⌾(ic⊸/)(vi⌊c)⊏charRole
+ c+↩5×c∊5↑bI
+ ⟨c,t,nv,(nv↓id)∾lu⟩
+}
+
+ReadNum←{
+ n‿d‿p‿i←bN # ¯.π∞
+ Nat←+⟜(10⊸×)´∘⌽ -⟜(⊑bD)
+ Int←(n=⊑)◶⟨Nat,-·Nat 1⊸↓⟩
+ Dec←⊐⟜(<d)⊸(Nat∘↑ + ·(0<≠)◶⟨0,Nat÷10⋆≠⟩+⟜1⊸↓)
+ Pos←(⊑p‿i⊐⊏)◶⟨π,∞,Dec⟩
+ e←⊑𝕩⊐charSet⊐<'e'
+ m←(n=⊑)◶⟨Pos,-·Pos 1⊸↓⟩e↑𝕩
+ 𝕩×⟜(10⋆·Int(e+1)↓⊣)˜⍟(e<≠𝕩)m
+}
+LitVal←(⊑("'"∾'"')⊐⊏)◶⟨1⊸⊑,1⊸↓,ReadNum⟩
+
+
+LEBv ← {
+ b←128
+ l←⌊b⋆⁼1⌈𝕩
+ o←⍋⍋⊒/1+l
+ o⊏l{f←×𝕨⋄(𝕨-1)(b⊸(×⟜f+|)∾𝕊⟜(⌊÷⟜b)○(f⊸/))⍟(∨´f)𝕩}𝕩
+}
+
+Parse ← {nv‿r←𝕨
+ g←⍋+`p←bB(⊣(≠⊸>ׯ1⋆2|⊢)⊐)𝕩⋄br←p×𝕩∊2‿3⊏bB
+ sl←1⊸⌽⊸∨𝕩∊bL⋄sr←¯1⊸⌽⌾(g⊸⊏)sl⋄sa←sl∨sr
+ g⊏˜↩⍋g⊏sl⋄r×↩¬sa⋄o←p>0
+ r+↩(sa<𝕩=1⊑bB)(⊣∧¬⊸∨=○(⌈`(1+↕∘≠)⊸×)⊢)(¯1⊸⌽⌾(g⊸⊏)3=r)∨1≤r
+ rev←⍋+`1+¯1↓g((¯1∾⊣)(⊣⍋⊸⊏⊏˜-⊏˜⟜⍋)⟜⍋1(+`∘∾-∾˜)⊏)o∨sl∨𝕩∊bS
+
+ gf←⍋fd←+`rev⊏br
+ rev⊏˜↩gf⋄fd⊏˜↩gf
+ 𝕩⊏˜↩rev⋄bv←rev⊏br⋄b←/bv<0⋄fi←+`c←bv>0
+
+ FC←-⟜(≠↑0∾⊢)(c∾1)/·+`∾⟜0
+ H←0<1↓·FC𝕩∊(5⊑bI)+⊢
+ ft←0∾(H↕3)+2×(H⥊3)⌈2×H⥊4
+ r↩((1↓ft)⊏(1+2⊸≤)⊸/↕4)⌾(b⊸⊏)rev⊏r
+
+ id←/idm←(0⊸≤∧<⟜nv)xv←𝕩-vi⋄idx←id⊏𝕩⋄sp←/𝕩∊bI
+ ad←(⌈`↕∘≠⊸×𝕩∊bG)⊏𝕩=⊑bG
+
+ g↩⍋+`rev⊏p-br⋄gr←g⊏rev⋄sll←1+2÷˜0(<-○/>)gr⊏sr-sl⋄l←/g⊏𝕩=5⊑bB
+ g⊏˜↩gs←⍋gr⊏sl⋄gr↩g⊏rev⋄𝕩⊏˜↩g⋄r⊏˜↩g⋄o⊏˜↩gr⋄si←/gr⊏sr>sl
+ gi←⍋g⋄l⊏↩⍋gs
+ s←𝕩∊bS⋄ps←s∨o∨gr⊏sl⋄a←𝕩∊2↑bG
+ r-↩ps∨a⋄op←r≥2⋄fe←(r≥1)∨1⌽r=3
+ tr←(⌈`↕∘≠⊸ׯ1⌽ps)⊏fe
+ ma←tr<(𝕩=1⊑bG)∧1⌽fe
+ ro←op∨a<1⌽r=3⋄os←⌽↕∘≠⊸(⊣-⌈`∘×)⌽¬ro∨ma⋄at←(⊢+1+⊏⟜os)/a
+ aa←g⊏asn←¯1⌽+`gi⊏-⟜(≠↑0∾⊢)(↕≠𝕩)∊at-1⋄r↩¯1¨⌾(aa⊸/)r
+ tf←(a≤○(⌈`(1+↕∘≠)⊸×)ps)∧(⊢∧2(|<≤)ps(⊢-⌈`∘×)+`)¬ro
+ opa←op>1↓0∾˜ps∨a
+ oa←⌽/opa⋄fa←/(1⌽aa)<(tf∨¬tr)∧(ro∧1⌽opa)<(r=1)∨op<¯1⌽opa
+ dy←fa⊏1↓0∾˜(𝕩≠⊑bO)∧(tr∧r≥0)∨ro<r=0
+ n←𝕩≥vi+nv⋄cn←/n∨𝕩≤¯1⊑bC⋄u←∧⍷ob←cn⊏𝕩
+ lo←(o/𝕩)=4⊑bB⋄ll←1+lo/1(↓--⊸↓)(o∾1)/+`(s∾0)-(1∾o)∧ps∾1
+ dr←/s>o+`⊸⊏0∾lo⋄rt←/𝕩=2⊑bB
+
+ d←id⊏dec←idm∧ad∧asn⋄lc←FC dec
+ ig←⍋(⊏⟜(¯1∾c/gf)∾d⊸/⊏((≠𝕩)∾b⊏gf)˜)id⊏fi
+ ig↩<⟜(≠id)⊸/(⍋+`∘⊏⟜(d∾-/˜d))⊸⊏(⍋⊏⟜(∾⟜(d⊸/)idx))⊸⊏ig
+ ui←d(⌈`↕∘≠⊸×)⊸⊏⌾(ig⊸⊏)id
+ ii←(ui⊏(fi⊏ft⊏spc)-(⌈`c⊸×)⊸¬+`dec)∾((sp⊏fi)⊏3×2|ft)++⟜(0⊸≤)2+sp⊏xv
+ idor←∾3⥊<is←id∾sp
+ idbc←⟨21+is⊏asn,(id-○(⊏⟜fd)ui)∾0¨sp,ii⟩
+
+ b⊏↩gi
+ or←⍋idor∾g⊏˜∾⟨cn,cn,b,b,rt,dr,l,l,si,si,at,oa+1⌈oa⊏os,(dy×⊏⟜os)⊸+fa+dy⟩
+ bc0←∾idbc∾⟨0¨cn,u⊐ob,15¨b,1+↕≠b⟩
+ bc←or⊏bc0∾∾⟨25¨rt,14¨dr,3+l⊏aa,ll,3+si⊏aa,sll,(11-⊑bG)+a/ma+𝕩,5+oa⊏r,(⊢+9×10⊸=)16+dy-7×fa⊏tr⟩
+ fs←(ft⊏⥊3≍⌜⟜⌽○↕2)∾¨((+`0∾1+⌊128⋆⁼1⌈bc)⊏˜/1∾or∊bc0+⟜↕○≠rt)≍○<¨lc+ft⊏spc
+ ⟨LEBv bc∾25,u,fs⟩
+}
+
+Compile←{
+ ⟨t,r,nVar,lits⟩←Tokenize𝕩
+ ⟨bc,u,blk⟩←nVar‿r Parse t
+ o←(u-(vi+nVar-≠𝕨)×u≥vi)⊏𝕨∾LitVal¨lits
+ ⟨bc,o,blk⟩
+}
diff --git a/src/cjs.bqn b/src/cjs.bqn
new file mode 100755
index 00000000..cb60b7df
--- /dev/null
+++ b/src/cjs.bqn
@@ -0,0 +1,15 @@
+#! /usr/bin/env dbqn
+
+compile ← ⟨•path∾"../c.bqn"⋄"DGenFn"⟩ •EX •path∾"../dzref"
+Symcomp ← ((<"runtime["∾⍕∾"]"˜)¨↕59)⊸Compile
+FP ← ∞⊸=◶⟨⍕,"Infinity"⟩
+Str ← "str("""∾∾⟜""")"
+Char ← "'"(∾∾⊣)(⟨"\t","\n","\'"⟩∾<)⊑˜("'"∾˜•UCS 9‿10)⊑∘⊐⊢
+Fmt ← ≡◶⟨(⊑⍋)∘(∾⟜∞)◶⟨0⊸≤◶⟨"-"∾FP∘|,FP⟩,Char⟩⋄Str⋄⊑⟩
+L ← "["∾"]"∾˜1↓·∾","⊸∾⟜⍕¨
+G ← ⟨L∾⟜25,L Fmt¨,L⟨⊑"fmd"⊸⊐,⊢,⊢,≠⟩⊸(L{𝕎𝕩}¨)¨⟩ {𝕎𝕩}¨ 0‿1‿3 ⊏ Symcomp
+Gen ← L G
+GenLong ← ∾ (1‿2/⟨" new Uint8Array("∾∾⟜")"⋄((•UCS 10)∾" ,")⊸∾⟩) {𝕎𝕩}¨ G
+• ← ∾∾⟜(•UCS 10)¨ Gen¨ •args
+#• ← GenLong •EX •path∾"pr.bqn"
+#• ← GenLong ∾∾⟜(•UCS 10)¨ (•LNS •path∾"c.bqn")∾<"Compile"
diff --git a/src/pr.bqn b/src/pr.bqn
new file mode 100755
index 00000000..d68b3453
--- /dev/null
+++ b/src/pr.bqn
@@ -0,0 +1,47 @@
+#!/usr/bin/env dbqn
+
+# Process BQN runtime
+
+impl ← •LNS •path∾"../impl.bqn"
+
+chrs←⟨
+ "+-×÷⋆√⌊⌈|¬∧∨<>≠=≤≥≡≢⊣⊢⥊∾≍↑↓↕⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔!"
+ "˜˘¨⌜⁼´˝`"
+ "∘○⊸⟜⌾⊘◶⎉⚇⍟"
+⟩
+nc ← ≠¨chrs
+chr ← ∾chrs
+itr ← 0⥊˜≠chr
+
+init ← " "⊸∾¨(/⟜"_"¨nc/0‿1‿1)∾¨(nc/"FMD")∾¨(nc+´⊸↑⥊"ABC"∾⌜•a)
+post ← ∾⟜" "¨/⟜"_"¨nc/0‿0‿1
+names ← init∾¨(•UCS 48)∾¨post
+
+Inc ← {
+ i←⊑chr⊐𝕩
+ n←0 ⋄ itr↩{n↩1+𝕩}⌾(i⊑⊢)itr
+ names↩((i⊑init)∾(•UCS 48+n)∾i⊑post)⌾(i⊑⊢)names
+}
+
+# Required functionality passed in as an argument
+pnam ← ⟨"IsArray", "Type", "Log"⟩∾names⊏˜chr⊐"!+-×÷⋆⌊=≤≢⥊⊑↕⌜`"
+
+
+E_isdef ← (3≤≠)◶⟨0,∧´⟨chr," ","←↩"⟩∊˜¨3⊸↑⟩
+E_proc ← {
+ l←≠chr
+ q←≠`𝕩∊"""'" ⋄ f←¬∨`q¬⊸∧𝕩='#'
+ ∾ (((l×f/q)+chr⊸⊐) (≥⟜l)◶⟨⊑⟜names,⥊∘⊢⟩¨ ⊢) f/𝕩
+}
+E_redef ← { # handles [fmd] [←↩]
+ tail ← E_proc 3↓𝕩 # must use old def
+ Inc ⊑𝕩
+ (E_proc 1↑𝕩) ∾ "←" ∾ tail
+}
+
+ref ← ∾ ∾⟜(•UCS 10)¨ ∾⟨
+ ⟨"{"⟩
+ ⟨"←𝕩"∾˜"⟨"∾"⟩"∾˜1↓∾","⊸∾¨pnam⟩
+ E_isdef◶E_proc‿E_redef¨ impl∾<"⟨"∾"⟩"∾˜1↓⥊","⊸∾˘∾chrs
+ ⟨"}"⟩
+⟩
diff --git a/test/tj.js b/test/tj.js
new file mode 100755
index 00000000..7fa44614
--- /dev/null
+++ b/test/tj.js
@@ -0,0 +1,27 @@
+//usr/bin/env node "$0" $@;exit $?
+
+const bqn=require(__dirname+'/../bqn.js')
+ , load=f=>require('fs').readFileSync(__dirname+'/'+f,'utf8');
+
+if (process.argv.length <= 2) {
+ const t=load('cases.bqn').split('\n').filter(x=>x).map(x=>x.split(' % '))
+ , test=t.map(e=>e[1])
+ , expt=t.map(e=>+e[0]);
+//let test= load('testref.bqn').split('\n')
+// .filter(x=>x.charAt(0)===' '
+// &&x.charAt(1)===' '
+// &&x.charAt(2)!=='#'
+// &&x.indexOf(':')===-1
+// &&x.indexOf('e¯')===-1)
+// .map(x=>x.slice(2))
+// , t=test.map(e=>[0,e])
+// , expt=test.map(e=>1);
+
+ test.map((t,i) => {
+ console.log(t);
+ let e=expt[i], r=bqn(t);
+ console.log(e===r ? " Passed!" : " Expected "+e+" but received "+r);
+ });
+} else {
+ console.log(process.argv.slice(2).map(bqn));
+}