From 5199bc3835b6509f01560660750cd102cd5cf033 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Wed, 28 Apr 2021 14:01:15 -0400 Subject: Split r.bqn into r0.bqn and r1.bqn, but compile as one unit --- docs/bqn.js | 6 +- src/pr.bqn | 3 +- src/r.bqn | 862 ------------------------------------------------------------ src/r0.bqn | 47 ++++ src/r1.bqn | 828 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 880 insertions(+), 866 deletions(-) delete mode 100644 src/r.bqn create mode 100644 src/r0.bqn create mode 100644 src/r1.bqn diff --git a/docs/bqn.js b/docs/bqn.js index 2114bf87..458349ca 100644 --- a/docs/bqn.js +++ b/docs/bqn.js @@ -244,9 +244,9 @@ let provide = [ ]; let [runtime,setPrims] = run( - [0,73,22,0,0,11,14,15,1,22,0,1,11,14,15,2,22,0,2,11,14,15,3,22,0,3,11,14,15,4,22,0,4,11,14,15,5,22,0,5,11,14,15,6,0,21,15,7,8,22,0,6,11,14,15,8,22,0,7,11,14,15,9,22,0,8,11,14,15,10,22,0,9,11,14,15,11,22,0,10,11,14,15,12,22,0,11,11,14,15,13,22,0,12,11,14,15,14,22,0,13,11,14,0,0,0,12,0,23,19,22,0,14,11,14,0,23,0,12,21,0,11,0,11,8,3,2,21,0,4,0,0,0,12,0,24,19,8,22,0,15,11,14,0,23,0,12,21,0,11,0,11,8,0,8,0,13,21,0,11,0,23,8,19,3,2,21,0,4,0,0,0,12,0,24,19,8,22,0,16,11,14,15,15,0,15,3,2,21,0,4,21,0,14,8,22,0,17,11,14,15,16,0,21,15,17,8,22,0,18,11,14,15,18,22,0,19,11,14,21,0,14,0,7,0,24,19,21,0,13,21,0,19,8,22,0,20,11,14,21,0,8,0,13,7,22,0,21,11,14,21,0,21,0,7,0,24,19,0,21,21,0,19,8,22,0,22,11,14,0,13,0,7,0,24,19,22,0,23,11,14,0,7,0,8,21,0,21,19,0,7,21,0,6,19,0,21,0,11,8,22,0,24,11,14,0,7,0,8,0,13,19,0,7,21,0,6,19,0,21,0,7,21,0,9,21,0,24,21,0,9,0,7,8,8,8,22,0,25,11,14,0,7,21,0,5,3,2,21,0,4,0,13,21,0,11,0,23,8,8,22,0,26,11,14,0,24,0,14,0,16,0,23,19,3,2,21,0,4,0,12,21,0,22,0,23,19,8,22,0,27,11,14,15,19,22,0,28,11,14,31,0,28,22,0,29,11,14,15,20,22,0,30,11,14,15,21,22,0,31,11,14,15,22,22,0,32,11,14,0,14,21,0,12,21,0,32,8,22,0,33,11,14,21,0,5,0,20,15,23,15,24,3,2,21,0,4,21,0,5,21,0,9,0,12,8,0,12,0,24,19,8,8,22,0,34,11,14,31,0,34,22,0,35,11,14,15,25,22,0,36,11,14,15,26,22,0,37,11,14,15,27,22,0,38,11,14,21,0,38,0,33,7,22,0,39,11,14,15,28,22,0,40,11,14,15,29,22,0,41,11,14,0,34,0,23,0,35,0,23,0,36,0,24,0,37,0,24,0,38,0,24,0,39,0,24,0,40,0,26,0,41,0,27,0,42,0,23,0,43,0,24,0,44,0,23,0,45,0,24,0,46,0,23,0,47,0,24,3,28,21,0,41,21,0,7,0,23,7,0,5,0,75,19,8,15,30,9,22,0,42,11,14,15,31,22,0,43,11,14,15,32,22,0,44,11,14,0,13,0,7,21,0,21,19,22,0,45,11,14,0,24,0,15,0,16,0,23,19,21,0,12,0,13,0,8,0,25,19,0,7,0,24,19,15,33,3,2,21,0,4,21,0,5,21,0,9,21,0,14,8,8,8,3,2,21,0,4,21,0,5,21,0,9,0,14,8,21,0,29,0,8,7,0,24,19,21,0,22,0,23,19,8,22,0,46,11,14,15,34,22,0,47,11,14,15,35,22,0,48,11,14,21,0,45,21,0,46,21,0,8,21,0,46,7,0,7,9,3,2,21,0,4,21,0,6,21,0,9,21,0,14,8,8,15,36,3,3,21,0,4,21,0,14,21,0,10,0,6,8,8,22,0,49,11,14,15,37,22,0,50,11,14,15,38,22,0,51,11,14,15,39,22,0,52,11,14,21,0,52,21,0,49,7,0,21,21,0,50,0,23,7,8,22,0,53,11,14,31,0,52,21,0,8,21,0,49,7,7,0,21,31,0,50,0,24,7,8,22,0,54,11,14,15,40,22,0,55,11,14,15,41,22,0,56,11,14,21,0,35,21,0,11,21,0,56,8,22,0,57,11,14,21,0,20,21,0,5,0,20,15,42,8,3,2,21,0,4,0,12,21,0,22,0,23,19,8,22,0,58,11,14,15,43,21,0,13,21,0,5,0,20,15,44,8,8,22,0,59,11,14,15,45,22,0,60,11,14,15,46,22,0,61,11,14,15,47,22,0,62,11,14,15,48,22,0,63,11,14,0,90,0,91,3,2,0,92,0,93,3,2,3,2,0,18,15,49,7,16,22,0,64,22,0,65,4,2,11,14,15,50,22,0,66,11,14,21,0,20,21,0,12,15,51,8,22,0,67,11,14,31,0,67,15,52,3,2,21,0,4,21,0,6,21,0,9,0,15,21,0,9,0,18,21,0,14,7,8,8,21,0,29,0,6,7,0,23,19,21,0,22,0,23,19,8,22,0,68,11,14,31,0,66,21,0,68,3,2,21,0,4,21,0,6,21,0,9,21,0,14,8,8,22,0,69,11,14,15,53,22,0,70,11,14,15,54,22,0,71,11,14,21,0,5,0,15,0,1,0,16,21,0,11,0,23,8,3,2,21,0,4,21,0,27,21,0,22,0,23,19,8,9,3,2,21,0,4,21,0,14,8,22,0,72,11,14,15,55,22,0,73,11,14,15,56,22,0,74,11,14,15,57,22,0,75,11,14,0,23,0,12,21,0,11,21,0,7,21,0,75,7,8,3,2,21,0,4,0,0,0,12,0,29,19,8,22,0,76,11,14,15,58,22,0,77,11,14,21,0,43,0,12,7,21,0,29,0,8,7,0,24,19,22,0,78,11,14,21,0,14,21,0,10,0,12,8,0,23,3,2,21,0,5,21,0,9,21,0,14,8,0,12,3,2,0,12,21,0,10,0,12,8,0,23,3,2,0,14,21,0,10,21,0,78,8,0,23,3,2,15,59,3,5,21,0,29,15,60,7,16,22,0,79,11,14,21,0,5,21,0,14,9,0,12,21,0,10,0,12,8,0,14,21,0,10,21,0,78,8,3,3,21,0,29,15,61,7,16,22,0,80,11,14,0,23,15,62,3,2,21,0,4,21,0,14,8,22,0,81,11,14,21,0,79,0,21,21,0,81,8,22,0,82,11,14,21,0,79,0,7,0,24,19,0,21,3,0,0,14,3,2,21,0,4,21,0,14,8,8,22,0,83,11,14,15,63,22,0,84,11,14,21,0,82,21,0,9,0,5,8,21,0,6,21,0,5,19,22,0,85,11,14,0,15,21,0,9,0,1,0,20,21,0,5,8,21,0,29,21,0,85,0,20,21,0,5,8,7,3,2,21,0,4,21,0,27,21,0,22,0,23,19,8,8,22,0,86,11,14,15,64,22,0,87,11,14,21,0,14,21,0,13,21,0,30,21,0,87,15,65,8,8,22,0,88,11,14,15,66,22,0,89,11,14,15,67,22,0,90,11,14,21,0,14,0,5,0,107,19,21,0,6,15,68,31,0,87,21,0,88,21,0,90,21,0,89,3,2,21,0,4,0,18,0,12,0,12,0,24,19,7,21,0,29,0,8,7,0,24,19,8,31,0,90,3,3,21,0,4,0,12,21,0,24,0,25,19,8,8,19,22,0,91,11,14,21,0,5,21,0,5,21,0,5,21,0,29,15,69,7,9,15,70,15,71,15,72,3,6,21,0,4,21,0,6,8,22,0,92,11,14,15,73,22,0,93,11,14,15,74,22,0,94,11,14,21,0,94,0,118,21,0,26,21,0,12,0,12,8,0,7,0,24,19,15,75,3,3,7,22,0,95,11,14,31,0,94,0,119,0,12,21,0,11,0,23,8,0,7,0,24,19,15,76,3,3,7,22,0,96,11,14,15,77,22,0,97,11,14,15,78,22,0,98,11,14,15,79,22,0,99,11,14,15,80,22,0,100,11,14,15,81,22,0,101,11,14,15,82,22,0,102,11,14,15,83,22,0,103,11,14,15,84,22,0,104,11,14,21,0,5,0,20,21,0,27,0,12,0,23,19,0,7,0,24,19,21,0,104,15,85,15,86,3,2,21,0,4,21,0,6,21,0,9,0,12,8,21,0,22,0,23,19,8,8,8,22,0,105,11,14,0,4,21,0,11,21,0,84,0,24,7,8,22,0,106,11,14,15,87,22,0,107,11,14,21,0,107,21,0,5,0,19,0,6,7,0,28,19,21,0,8,21,0,35,7,21,0,8,21,0,35,21,0,11,21,0,56,8,21,0,9,21,0,53,21,0,9,21,0,106,8,8,7,19,7,22,0,108,11,14,0,31,0,17,16,21,0,37,0,135,8,22,0,109,11,14,15,88,22,0,110,11,14,0,15,0,21,21,0,17,8,22,0,111,11,14,15,89,22,0,112,11,14,15,90,22,0,113,11,14,15,91,21,0,11,21,0,20,8,22,0,114,11,14,15,92,22,0,115,11,14,21,0,44,0,9,7,22,0,116,11,14,21,0,44,0,10,7,22,0,117,11,14,21,0,8,21,0,116,21,0,12,21,0,117,8,7,0,21,0,25,21,0,116,16,21,0,12,21,0,117,8,8,22,0,118,11,14,21,0,44,15,93,0,21,21,0,26,8,7,22,0,119,11,14,21,0,44,15,94,0,21,21,0,24,8,7,22,0,120,11,14,21,0,44,15,95,0,21,0,7,21,0,9,21,0,120,21,0,9,0,7,8,8,8,7,22,0,121,11,14,21,0,44,0,8,7,0,21,21,0,35,21,0,11,21,0,53,8,8,22,0,122,11,14,21,0,44,0,8,0,7,0,6,19,7,0,21,21,0,35,21,0,11,21,0,54,8,8,22,0,123,11,14,21,0,44,0,8,0,21,21,0,23,0,7,21,0,22,19,21,0,11,0,23,8,8,7,22,0,124,11,14,21,0,44,21,0,21,0,7,0,24,19,7,0,21,31,0,19,8,22,0,125,11,14,21,0,44,0,13,0,7,0,24,19,7,0,21,31,0,88,8,22,0,126,11,14,21,0,44,0,12,0,7,0,24,19,7,0,21,21,0,27,8,22,0,127,11,14,21,0,44,0,12,7,0,21,0,12,8,22,0,128,11,14,21,0,44,21,0,21,7,0,21,21,0,7,0,23,7,0,5,0,147,19,8,22,0,129,11,14,21,0,44,0,13,7,0,21,21,0,7,0,23,7,0,5,0,148,19,8,22,0,130,11,14,21,0,44,0,6,7,22,0,131,11,14,21,0,44,0,7,7,22,0,132,11,14,21,0,132,21,0,131,0,24,19,22,0,133,11,14,21,0,6,21,0,128,21,0,128,21,0,127,21,0,82,21,0,83,3,4,19,21,0,29,21,0,131,7,9,21,0,13,15,96,8,22,0,134,11,14,15,97,22,0,135,11,14,15,98,22,0,136,11,14,15,99,22,0,137,11,14,15,100,22,0,138,11,14,15,101,22,0,139,11,14,21,0,85,0,20,21,0,111,21,0,10,21,0,30,8,15,102,3,2,21,0,4,21,0,128,21,0,125,0,24,19,21,0,10,21,0,123,8,8,8,22,0,140,11,14,15,103,22,0,141,11,14,31,0,102,0,21,21,0,101,8,22,0,142,11,14,0,23,21,0,104,31,0,61,8,0,21,21,0,60,8,22,0,143,11,14,31,0,105,0,21,21,0,56,8,22,0,144,11,14,21,0,85,0,21,21,0,5,8,0,20,21,0,98,0,21,31,0,98,21,0,11,21,0,100,8,8,8,22,0,145,11,14,21,0,85,0,21,21,0,5,8,0,20,21,0,99,0,21,31,0,99,21,0,11,31,0,100,8,8,8,22,0,146,11,14,15,104,22,0,147,11,14,31,0,95,0,21,31,0,62,8,22,0,148,11,14,31,0,96,0,21,31,0,63,8,22,0,149,11,14,31,0,115,0,21,31,0,113,8,22,0,150,11,14,21,0,55,0,24,7,0,21,31,0,108,8,22,0,151,11,14,21,0,8,31,0,55,0,23,7,7,0,21,31,0,107,21,0,5,7,8,22,0,152,11,14,21,0,138,22,0,153,11,14,21,0,20,21,0,10,15,105,8,22,0,154,11,14,21,0,53,21,0,9,21,0,53,8,21,0,35,21,0,132,21,0,5,19,21,0,8,21,0,151,7,19,0,1,0,23,19,22,0,155,11,14,15,106,0,1,0,23,19,22,0,156,11,14,15,107,22,0,157,11,14,21,0,5,0,20,15,108,8,22,0,158,11,14,15,109,22,0,159,11,14,15,110,22,0,160,11,14,15,111,22,0,161,11,14,15,112,22,0,162,11,14,15,113,22,0,163,11,14,0,24,21,0,5,15,114,21,0,9,0,23,0,16,21,0,11,21,0,7,0,24,7,21,0,132,21,0,127,19,8,31,0,38,0,48,7,9,3,2,21,0,4,0,16,21,0,11,0,23,8,21,0,128,0,32,19,8,8,9,3,2,21,0,4,0,0,21,0,130,0,29,19,8,22,0,164,11,14,15,115,21,0,10,15,116,8,22,0,165,11,14,15,117,22,0,166,11,14,15,118,21,0,5,0,16,21,0,11,0,24,8,15,119,9,21,0,7,21,0,7,0,23,7,0,5,0,166,19,7,0,16,21,0,11,0,25,8,21,0,165,0,16,21,0,11,0,24,8,19,31,0,166,0,16,21,0,11,0,25,8,15,120,21,0,12,15,121,8,0,16,21,0,11,0,24,8,19,0,16,21,0,11,0,25,8,15,122,21,0,12,15,123,8,21,0,35,21,0,11,0,24,0,29,3,2,8,19,3,6,21,0,4,21,0,6,8,0,16,21,0,11,0,23,8,19,9,22,0,167,11,14,15,124,31,0,167,21,0,7,0,23,7,0,5,0,167,19,3,3,21,0,144,0,29,0,24,0,25,3,3,17,21,0,4,0,0,8,22,0,168,11,14,31,0,140,0,21,21,0,91,8,22,0,169,11,14,0,5,21,0,11,0,168,8,22,0,170,11,14,0,5,21,0,11,0,169,8,22,0,171,11,14,21,0,7,0,23,7,0,5,0,170,19,22,0,172,11,14,15,125,22,0,173,11,14,15,126,22,0,174,11,14,15,127,22,0,175,11,14,21,0,5,0,20,0,24,31,0,104,31,0,71,8,21,0,11,21,0,20,8,0,21,31,0,70,8,8,22,0,176,11,14,0,34,21,0,8,21,0,132,7,0,21,21,0,131,8,0,35,21,0,132,0,36,21,0,8,21,0,116,7,0,21,21,0,124,21,0,173,21,0,5,8,8,0,37,21,0,116,0,38,21,0,44,0,2,7,0,49,21,0,8,21,0,117,7,0,21,21,0,8,21,0,124,7,8,0,43,21,0,8,21,0,116,7,0,21,21,0,122,21,0,173,21,0,5,8,8,0,42,21,0,6,21,0,132,0,24,19,21,0,116,21,0,8,21,0,132,7,19,0,21,21,0,123,21,0,173,21,0,5,8,8,0,39,21,0,133,0,50,0,23,21,0,9,21,0,170,8,0,21,15,128,8,0,51,21,0,5,0,52,21,0,82,21,0,9,21,0,171,8,21,0,6,21,0,5,19,0,21,21,0,5,8,0,33,15,129,0,21,0,23,21,0,9,21,0,170,8,8,0,53,15,130,0,21,15,131,8,0,54,0,23,21,0,9,21,0,170,8,0,21,21,0,148,21,0,173,0,16,21,0,11,0,28,8,8,8,0,55,0,23,21,0,9,21,0,170,8,0,21,21,0,149,21,0,173,0,16,21,0,11,0,23,8,8,8,0,56,0,23,21,0,9,21,0,170,8,0,21,21,0,142,21,0,173,21,0,83,8,8,0,57,21,0,143,21,0,11,21,0,132,8,0,21,21,0,143,8,0,58,31,0,160,0,21,31,0,59,8,0,59,0,23,21,0,9,21,0,170,8,0,21,15,132,8,0,60,31,0,175,0,21,31,0,174,8,3,42,21,0,41,21,0,172,8,22,0,177,11,14,0,34,21,0,8,21,0,132,7,0,21,0,25,21,0,12,21,0,116,8,8,0,35,21,0,131,0,21,0,23,21,0,9,21,0,170,8,8,0,36,21,0,8,21,0,116,7,0,21,21,0,118,8,0,37,21,0,124,0,21,0,23,21,0,9,21,0,170,8,8,0,38,21,0,118,0,21,0,23,21,0,9,21,0,170,8,8,0,49,0,2,21,0,116,9,0,21,0,23,21,0,9,21,0,170,8,8,0,43,21,0,8,21,0,116,7,0,21,21,0,118,8,0,42,21,0,6,21,0,132,0,24,19,21,0,116,21,0,8,21,0,132,7,19,0,21,21,0,133,21,0,9,21,0,118,8,21,0,133,9,8,0,39,21,0,7,0,24,7,21,0,132,21,0,131,19,0,21,0,23,21,0,9,21,0,170,8,8,3,18,21,0,41,21,0,172,8,22,0,178,11,14,15,133,22,0,179,11,14,0,61,21,0,178,0,62,15,134,0,63,15,135,0,64,15,136,0,65,15,137,21,0,9,15,138,8,3,10,21,0,41,21,0,7,21,0,172,7,8,22,0,180,11,14,31,0,141,22,0,181,11,14,31,0,77,22,0,182,11,14,15,139,0,66,31,0,165,0,67,15,140,0,68,15,141,0,69,21,0,7,0,23,21,0,9,21,0,170,8,7,15,142,15,143,3,2,21,0,4,21,0,130,21,0,11,0,23,8,8,3,2,21,0,4,21,0,5,21,0,9,21,0,15,8,8,0,70,15,144,0,71,15,145,15,146,21,0,5,3,2,21,0,4,21,0,6,8,21,0,6,21,0,9,21,0,164,8,19,0,72,15,147,3,14,31,0,41,21,0,7,21,0,172,7,8,7,22,0,183,11,14,31,0,139,22,0,184,11,14,31,0,163,22,0,185,11,14,21,0,69,0,21,31,0,72,8,22,0,186,11,14,15,148,22,0,187,11,14,31,0,137,22,0,188,11,14,21,0,110,0,21,21,0,17,8,22,0,189,11,14,31,0,85,0,21,21,0,5,8,0,20,21,0,18,21,0,9,21,0,126,8,8,22,0,190,11,14,31,0,159,0,21,31,0,58,8,22,0,191,11,14,31,0,156,0,21,21,0,155,8,22,0,192,11,14,31,0,154,0,21,21,0,144,21,0,11,21,0,152,8,8,22,0,193,11,14,21,0,131,21,0,132,21,0,124,21,0,116,31,0,117,31,0,118,21,0,120,21,0,121,21,0,119,21,0,133,21,0,122,21,0,123,21,0,125,21,0,126,21,0,127,21,0,128,21,0,130,21,0,129,21,0,82,21,0,83,21,0,6,21,0,5,31,0,189,21,0,169,31,0,190,21,0,148,21,0,149,21,0,142,31,0,146,21,0,145,21,0,143,31,0,191,21,0,144,21,0,53,21,0,54,21,0,176,21,0,186,21,0,151,31,0,192,21,0,152,31,0,193,21,0,150,0,5,21,0,7,21,0,8,21,0,103,21,0,84,21,0,179,31,0,185,21,0,29,31,0,184,0,19,21,0,9,21,0,10,21,0,11,21,0,12,21,0,182,0,21,31,0,187,21,0,153,31,0,188,21,0,181,0,22,3,63,15,149,16,25,0,23,21,0,1,3,2,25,21,0,1,25,21,0,1,22,1,1,22,1,2,4,2,12,25,21,0,1,15,150,21,0,5,0,16,21,0,1,21,0,4,21,0,2,17,17,7,21,0,2,17,25,21,0,1,25,21,0,2,25,21,0,1,25,21,0,1,14,21,0,4,25,21,0,1,21,1,6,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,6,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,6,21,0,2,17,17,25,21,0,1,15,151,21,1,5,21,0,4,3,2,0,16,21,0,1,21,0,5,21,0,2,17,17,7,21,0,2,17,25,21,0,1,3,1,0,1,21,0,1,17,25,21,0,2,21,0,1,3,2,25,21,0,1,3,1,25,21,0,1,3,1,0,15,3,0,17,0,1,21,0,1,17,25,21,0,1,0,12,16,0,12,0,24,17,0,5,0,74,17,14,21,0,1,22,0,5,11,21,1,27,16,22,0,6,11,14,21,0,4,22,0,7,11,14,21,0,1,21,1,6,0,21,15,152,15,153,3,2,21,1,4,21,0,6,21,1,22,0,23,17,8,8,21,0,2,17,22,0,8,11,14,21,0,6,0,17,16,0,18,21,1,7,21,0,1,7,0,16,0,7,21,1,11,0,24,0,7,21,0,6,17,8,19,15,154,9,7,16,14,21,0,8,25,21,0,2,21,1,27,16,22,0,3,11,14,21,0,1,21,1,27,16,0,6,21,0,3,17,0,17,16,0,18,21,0,2,21,1,12,0,16,8,21,1,8,21,0,1,7,0,16,21,0,3,21,1,12,0,7,8,19,3,2,21,1,4,0,13,21,1,11,31,0,3,8,8,7,16,25,21,0,2,0,17,16,0,18,21,0,1,21,1,12,0,16,8,7,16,25,21,0,2,0,7,21,0,1,21,1,27,16,17,0,17,16,0,18,21,1,7,21,0,1,7,0,16,0,6,21,1,11,21,0,2,8,19,7,16,25,21,0,1,21,1,33,0,24,17,22,0,3,11,21,1,29,0,8,7,0,24,17,22,0,4,11,14,21,0,4,0,17,16,0,15,31,0,3,17,0,18,0,6,21,1,11,0,8,21,1,11,31,0,4,8,8,21,1,8,0,16,7,21,0,1,0,15,16,19,7,21,0,2,17,25,21,0,2,0,18,21,0,1,21,1,12,0,16,8,7,16,25,21,1,22,0,18,0,12,0,7,0,24,19,7,21,0,1,19,0,19,0,8,7,9,21,1,29,0,6,7,9,25,21,1,7,21,1,0,0,18,21,1,36,21,0,1,7,21,1,8,0,16,7,21,0,2,19,7,16,7,0,16,15,155,19,25,15,156,0,12,21,0,1,21,1,36,21,1,0,7,16,19,25,0,25,0,9,21,0,1,21,1,27,16,17,0,17,16,0,18,0,8,21,1,11,0,25,8,7,16,22,0,3,11,14,21,0,1,21,1,35,21,0,3,17,21,0,1,21,1,35,31,0,3,0,18,0,6,21,1,11,0,24,8,7,16,17,3,2,25,21,0,2,21,1,40,16,22,0,3,22,0,4,4,2,11,14,21,0,1,3,1,21,1,30,31,0,4,17,21,1,37,31,0,3,8,25,0,23,21,0,1,16,25,15,157,22,0,2,11,14,15,158,22,0,3,11,14,21,0,3,21,0,1,7,21,1,8,31,0,3,21,1,8,21,0,1,7,7,7,3,2,21,1,4,0,12,21,1,10,21,1,23,8,8,31,0,2,21,0,1,7,3,2,21,1,4,0,12,21,1,10,0,12,8,8,25,15,159,21,0,1,7,22,0,2,11,14,21,0,1,21,0,2,0,20,15,160,15,161,3,2,21,1,4,21,1,14,21,1,10,21,1,23,8,8,0,21,0,18,21,0,2,7,8,8,21,0,2,0,20,21,1,43,21,0,2,7,8,3,3,21,1,4,21,1,14,21,1,10,0,6,8,8,25,21,0,1,21,1,46,21,0,2,17,25,21,0,1,0,18,21,1,22,21,1,11,0,23,8,7,21,1,29,0,8,7,0,24,19,21,1,10,0,7,8,21,0,2,17,22,0,3,11,14,21,0,1,21,0,3,0,23,3,2,15,162,3,2,21,1,4,0,23,0,12,31,0,3,17,8,21,0,2,17,25,21,0,4,22,0,5,11,14,0,23,21,1,6,21,0,2,17,22,0,6,11,14,21,0,1,22,0,7,11,14,15,163,22,0,8,11,14,31,0,8,21,0,7,0,12,0,24,17,21,1,13,21,1,7,21,0,5,7,15,164,0,21,21,1,5,8,21,0,2,19,8,16,25,21,0,1,0,14,21,1,10,21,1,47,8,21,0,2,17,22,0,3,11,14,31,0,3,21,1,29,21,1,48,21,0,1,0,15,16,21,1,12,0,16,8,21,1,12,21,1,49,21,1,11,21,0,2,0,15,16,21,1,12,0,16,8,8,8,7,7,16,22,0,4,11,14,0,23,21,1,8,31,0,4,7,16,25,21,0,1,22,0,2,11,14,21,1,49,21,1,45,21,1,7,0,23,7,0,13,21,1,49,19,0,13,3,4,21,0,1,21,1,13,0,18,15,165,7,8,16,22,0,3,11,14,15,166,0,1,0,23,19,25,21,0,1,22,0,2,11,14,21,1,22,21,1,11,0,23,8,21,1,13,15,167,8,25,21,0,2,0,12,16,21,1,8,0,7,7,0,24,17,22,0,5,11,14,21,0,5,0,13,0,23,17,0,5,0,79,17,14,21,0,1,0,12,16,0,13,21,0,5,17,0,5,0,80,17,14,21,0,1,21,1,20,16,22,0,1,12,14,21,0,2,21,1,33,0,24,17,22,0,6,11,21,1,29,0,8,7,0,24,17,22,0,7,11,14,21,0,7,21,1,48,21,0,2,0,15,16,21,1,12,0,16,8,21,1,10,21,0,4,8,7,16,22,0,8,11,14,21,0,2,21,1,27,16,0,24,0,24,21,1,12,0,7,21,1,9,0,17,8,8,0,18,0,8,21,1,11,21,0,7,8,21,1,9,0,6,21,1,11,31,0,7,8,21,1,12,21,1,7,0,23,7,0,13,31,0,8,19,8,8,7,9,21,1,29,0,8,7,0,24,19,3,2,21,1,4,21,1,22,21,1,11,0,23,8,8,16,0,5,0,81,17,14,21,0,1,0,12,16,21,1,8,0,7,7,31,0,5,17,22,0,9,11,14,21,0,1,21,1,33,21,0,9,17,22,0,10,11,14,21,0,10,21,1,47,21,0,6,17,22,0,11,11,14,31,0,11,21,1,29,21,1,48,21,0,1,0,15,16,21,1,12,0,16,8,21,1,12,21,0,4,21,1,11,21,0,2,0,15,16,21,1,12,0,16,8,8,8,7,7,16,22,0,12,11,14,21,1,7,0,23,7,0,13,31,0,12,21,1,11,0,8,21,1,11,31,0,6,21,1,29,0,8,7,0,24,17,8,8,19,22,0,13,11,14,31,0,9,0,17,16,0,18,21,0,1,0,14,16,21,1,12,0,16,8,7,16,21,1,5,21,1,29,0,8,7,0,24,19,0,17,9,21,1,12,0,15,8,16,0,18,0,8,21,1,11,31,0,10,21,1,29,0,8,7,0,24,17,8,7,16,0,18,15,168,21,1,11,21,0,2,21,1,27,16,8,7,16,0,1,0,23,17,25,21,0,1,22,0,2,11,14,21,1,29,0,8,7,0,7,0,24,19,0,19,0,8,7,21,1,29,0,6,7,9,3,2,0,16,21,0,1,17,22,0,3,11,14,15,169,0,1,0,23,19,25,21,0,1,0,12,16,0,12,0,24,17,0,5,0,84,17,14,21,0,1,21,1,27,16,22,0,3,11,14,21,0,1,21,0,3,21,1,22,0,23,17,21,1,13,15,170,8,16,0,1,0,23,17,25,21,0,1,21,1,27,16,22,0,3,11,14,21,0,1,21,1,33,0,24,17,22,0,4,11,21,1,29,0,8,7,0,24,17,22,0,5,11,14,31,0,3,0,17,16,0,18,21,1,7,21,0,1,0,15,16,7,0,16,0,8,21,1,11,21,0,5,8,21,1,12,0,6,8,19,7,31,0,5,0,17,16,0,15,31,0,4,17,17,25,21,0,1,21,1,14,16,21,1,171,16,14,21,0,1,0,12,16,21,1,22,0,23,17,25,21,0,1,0,12,16,21,1,8,0,7,7,0,24,17,22,0,3,11,14,21,0,1,0,14,16,22,0,4,11,14,21,0,4,0,16,21,0,3,17,22,0,5,11,14,31,0,3,0,17,16,0,18,31,0,4,21,1,12,0,16,8,7,16,22,0,6,11,14,21,0,6,21,1,29,0,8,7,0,24,17,0,17,16,0,15,31,0,6,17,0,18,21,1,7,21,0,1,0,15,16,7,0,16,0,8,21,1,11,21,0,5,8,21,1,12,0,6,8,19,7,31,0,5,0,17,16,17,25,21,0,1,0,12,16,0,13,0,24,17,0,5,0,86,17,14,21,0,1,21,1,27,16,22,0,3,11,14,21,0,1,21,1,35,21,0,3,0,17,16,0,18,0,7,21,1,11,0,24,0,7,31,0,3,17,8,7,16,17,25,21,0,2,21,1,15,16,0,5,0,87,17,14,21,0,1,21,1,27,16,22,0,3,11,14,0,23,0,12,21,0,3,17,0,6,21,0,3,17,0,9,21,0,2,17,21,1,24,16,0,8,21,0,3,17,0,7,22,0,2,13,14,21,0,1,21,1,35,21,0,3,0,17,16,0,18,21,1,5,0,13,21,0,2,0,7,21,0,3,17,19,0,8,31,0,3,19,0,7,21,1,5,19,0,6,21,0,2,19,7,16,17,25,21,0,1,0,12,16,0,13,0,24,17,0,5,0,88,17,14,21,0,1,21,1,27,16,0,6,0,24,17,0,17,16,0,18,21,0,1,21,1,12,21,1,35,21,1,11,0,17,8,8,7,16,0,1,21,1,11,0,16,21,1,11,0,23,8,8,16,25,21,0,1,0,12,16,0,13,0,24,17,0,5,0,89,17,14,21,0,1,21,1,27,16,22,0,3,11,14,21,0,3,0,6,0,24,17,0,17,16,0,18,21,0,1,21,1,12,21,1,35,21,1,11,15,171,8,8,7,16,0,1,21,1,11,0,16,21,1,11,21,0,3,8,8,16,25,21,0,1,22,0,3,22,0,4,4,2,11,14,15,172,22,0,5,11,14,21,1,5,21,1,9,21,1,15,8,0,5,31,0,3,19,21,1,6,0,6,21,0,5,0,13,21,1,11,0,23,8,7,9,31,0,5,21,1,23,7,3,2,21,1,4,0,13,21,1,11,0,23,8,8,19,25,21,0,1,0,12,16,0,12,0,24,17,0,5,0,94,17,14,21,0,2,21,1,64,21,0,1,21,1,27,16,17,21,1,8,0,16,7,21,0,1,17,25,21,0,2,0,12,16,0,12,0,24,17,0,5,0,95,17,14,21,0,1,0,14,16,22,0,3,11,21,1,27,21,1,10,0,12,8,21,0,2,17,0,5,0,96,17,14,0,23,22,0,4,11,14,21,0,2,21,1,27,16,0,17,16,0,18,31,0,3,21,1,12,0,16,8,15,173,21,0,2,21,1,12,0,16,8,19,7,16,14,21,0,1,21,1,17,16,0,16,21,0,4,17,25,21,0,2,0,18,21,0,1,21,1,12,21,1,68,8,7,16,25,21,0,1,0,12,16,0,13,0,24,17,0,5,0,97,17,14,21,0,1,21,1,27,16,21,1,22,0,23,17,0,5,0,98,17,14,21,0,1,21,1,35,0,23,21,1,22,16,17,25,21,0,2,21,1,14,16,0,5,0,99,17,14,21,0,1,21,1,35,21,1,11,0,18,21,1,65,21,1,11,21,0,1,21,1,27,16,8,7,8,21,0,2,17,25,21,0,1,21,1,1,16,22,0,3,11,14,21,0,3,0,16,0,23,17,0,23,21,1,12,0,13,8,21,0,3,21,1,9,21,1,27,8,21,1,8,0,7,7,0,24,19,0,17,9,21,1,29,0,8,21,1,11,0,6,21,1,11,0,24,8,21,1,8,0,16,7,31,0,3,19,21,0,0,9,8,7,0,24,19,3,2,21,1,4,0,13,21,1,11,0,25,8,8,16,25,21,0,1,15,174,21,1,6,21,1,73,9,21,1,13,15,175,8,3,2,21,1,4,21,1,6,21,1,9,0,0,8,0,13,0,29,19,8,21,0,2,17,25,21,0,1,25,21,0,1,21,0,5,21,1,10,21,0,4,8,21,0,2,17,22,0,6,11,14,21,1,60,21,1,29,21,1,5,21,1,14,9,21,1,13,0,15,21,1,12,0,16,8,8,7,21,0,1,19,0,23,0,14,21,1,5,21,1,29,0,8,7,0,24,19,0,17,9,21,1,12,0,15,8,9,3,2,21,1,4,21,1,14,8,9,22,0,7,11,14,15,176,22,0,8,11,14,21,1,1,0,23,0,16,21,1,11,0,25,8,0,12,21,1,7,21,0,8,7,19,3,2,21,1,4,0,16,21,1,11,0,23,8,0,12,0,31,19,8,9,22,0,9,11,14,21,0,5,21,1,93,21,0,9,17,22,0,10,11,14,0,23,21,0,8,0,28,8,22,0,11,11,14,31,0,11,31,0,10,16,0,23,21,1,75,3,2,21,1,1,21,1,35,0,24,0,29,3,2,19,3,2,21,1,4,31,0,9,8,16,22,0,12,22,0,13,4,2,11,14,21,1,5,21,1,9,21,1,76,8,0,7,0,24,19,21,1,13,15,177,8,22,0,14,11,14,21,1,5,0,20,15,178,8,22,0,15,11,14,31,0,13,31,0,14,21,0,6,17,21,1,7,21,0,1,7,21,1,12,31,0,15,8,21,1,7,21,0,5,7,21,1,168,9,15,179,9,3,2,21,1,4,21,1,76,8,16,25,21,0,1,21,1,43,21,1,79,7,21,0,2,17,0,15,16,21,1,29,0,8,7,0,24,17,25,21,0,2,0,16,0,24,17,21,0,1,3,2,21,1,4,21,0,2,0,16,0,23,17,8,25,0,23,21,0,1,3,2,21,1,4,21,0,2,8,25,21,0,1,0,15,16,0,18,21,1,81,7,16,21,1,29,21,1,25,7,0,23,17,0,6,0,24,17,25,21,0,1,21,1,20,21,1,10,21,0,4,21,1,74,21,1,43,21,0,4,7,0,21,0,18,21,0,4,7,8,8,8,21,0,2,17,25,0,1,21,1,12,21,1,5,0,20,21,1,7,3,0,7,0,15,21,1,83,21,1,10,21,0,2,8,19,8,8,21,1,86,21,1,5,0,20,21,1,6,8,21,0,1,19,3,2,21,1,4,0,15,21,1,9,21,1,27,8,21,1,22,0,23,19,8,25,21,0,1,0,15,16,0,16,0,23,17,21,1,83,16,22,0,3,11,14,21,0,1,0,15,16,0,18,21,1,83,0,23,21,1,78,3,2,21,1,4,21,1,27,21,1,10,0,12,8,8,21,0,3,19,0,5,0,101,19,7,16,14,21,0,3,21,1,29,0,8,7,0,24,17,0,17,16,0,15,31,0,3,17,0,18,21,1,8,0,16,7,7,21,0,1,0,18,21,1,17,7,16,17,25,0,28,22,0,3,11,22,0,4,11,14,3,0,22,0,5,11,14,21,0,1,22,0,6,11,14,21,0,1,0,18,21,1,27,7,16,21,1,56,16,0,18,15,180,7,16,25,21,0,1,0,15,16,22,0,3,11,21,1,27,16,22,0,4,11,14,21,0,3,0,18,21,1,83,7,16,22,0,5,11,14,21,0,5,0,16,0,23,17,21,1,27,16,22,0,6,11,14,21,0,1,0,12,16,22,0,7,11,14,21,0,5,0,18,21,1,27,0,12,21,0,6,19,7,16,21,1,29,0,8,7,0,24,17,0,5,0,102,17,14,21,0,7,21,1,21,21,0,6,17,0,5,0,103,17,14,15,181,22,0,8,11,14,21,0,1,21,1,83,16,22,0,9,11,14,0,24,22,0,10,11,14,0,23,21,1,22,16,22,0,11,11,22,0,12,11,14,21,0,7,0,17,16,21,1,84,15,182,7,21,0,9,21,1,60,16,21,0,8,0,8,7,0,24,17,21,1,60,16,17,14,21,1,84,15,183,31,0,3,0,18,0,15,7,16,7,7,22,0,13,11,14,21,0,11,21,0,13,15,184,3,2,21,1,4,21,0,6,21,1,22,21,0,7,17,8,21,0,12,17,25,21,0,2,21,1,27,16,22,0,3,11,14,21,0,1,21,1,27,16,22,0,4,11,14,21,0,3,21,1,21,21,0,4,17,0,5,0,106,17,14,31,0,4,0,17,16,0,18,21,0,1,21,1,12,0,16,8,21,1,12,0,8,21,1,11,21,0,2,21,1,12,0,16,8,8,21,1,5,3,2,21,1,4,21,1,6,0,13,31,0,3,19,8,8,7,16,25,21,0,1,21,0,2,9,25,21,0,1,22,0,3,22,0,4,22,0,5,4,3,11,14,31,0,5,31,0,4,31,0,3,19,25,21,0,1,22,0,3,22,0,4,4,2,11,14,31,0,4,31,0,3,7,25,21,0,1,22,0,3,22,0,4,22,0,5,4,3,11,14,31,0,5,31,0,4,31,0,3,8,25,21,1,7,21,1,75,7,22,0,0,11,14,15,185,22,0,1,11,14,0,0,21,1,21,0,29,19,21,1,13,21,0,1,21,1,76,7,8,22,0,2,11,14,15,186,22,0,3,11,14,15,187,22,0,4,11,14,15,188,22,0,5,11,14,0,108,21,1,5,0,109,0,23,21,0,3,0,24,8,21,0,4,9,0,110,0,24,21,0,3,0,23,8,21,0,4,9,0,111,0,24,21,0,3,0,24,8,31,0,4,9,0,112,0,24,21,0,3,0,24,8,31,0,5,9,0,113,0,24,31,0,3,0,24,8,3,12,21,1,40,16,22,0,6,22,0,7,4,2,11,14,15,189,3,1,21,1,30,31,0,7,21,1,57,21,1,11,0,18,21,1,27,7,8,21,0,6,17,17,21,1,37,31,0,6,21,1,89,16,8,22,0,8,11,14,15,190,22,0,9,11,14,15,191,21,1,12,21,1,5,0,16,0,24,19,31,0,9,21,1,6,19,21,0,2,9,21,1,7,21,1,7,21,1,75,7,7,15,192,21,1,92,0,16,21,1,11,0,23,8,19,21,1,5,0,16,0,24,19,31,0,2,9,3,4,21,1,4,21,1,5,0,16,0,23,19,21,1,9,0,29,21,1,5,0,25,3,2,21,1,4,0,13,21,1,11,0,25,8,8,3,2,21,1,4,0,13,21,1,11,0,23,8,8,8,8,8,25,21,0,1,22,0,2,22,0,3,22,0,4,4,3,11,14,0,115,21,1,30,31,0,2,17,21,1,30,0,114,17,22,0,5,11,14,0,116,22,0,6,11,14,0,117,22,0,7,11,14,15,193,25,21,0,1,21,1,26,16,22,0,5,11,21,1,22,21,1,11,21,0,2,8,21,1,13,21,0,4,8,16,14,31,0,5,0,17,16,0,18,21,0,1,0,6,21,0,2,17,21,1,12,0,6,8,7,0,18,0,23,21,1,12,21,1,22,8,21,1,13,0,27,8,7,9,0,18,0,13,21,1,11,21,0,2,8,21,1,13,0,27,8,7,3,2,21,1,4,21,0,1,21,1,22,0,23,17,8,16,25,21,0,1,14,0,6,21,1,25,0,23,19,0,17,9,0,7,21,1,25,0,23,19,0,17,9,0,18,0,6,7,21,1,5,21,1,9,21,1,22,8,19,3,2,21,1,4,21,1,22,21,1,11,0,23,8,8,25,21,0,1,0,12,16,0,13,0,24,17,0,5,0,120,17,14,21,0,2,0,12,21,1,10,0,7,8,21,0,1,17,22,0,3,11,14,21,0,3,0,13,0,23,17,0,5,0,121,17,14,21,0,3,21,1,21,0,24,17,0,5,0,122,17,14,21,0,1,21,1,33,0,24,17,22,0,4,11,14,21,0,4,21,1,27,16,0,17,16,0,18,21,1,7,21,0,2,21,1,83,16,7,0,16,31,0,3,0,7,0,24,17,21,1,12,0,6,8,19,0,12,21,0,4,21,1,12,0,16,8,19,7,16,21,1,29,0,8,7,0,24,17,0,5,0,123,17,14,31,0,4,21,1,29,0,8,7,0,24,17,25,21,0,1,21,1,97,21,0,2,17,22,0,3,11,14,21,0,2,0,24,21,1,27,3,2,21,1,4,21,1,5,0,12,21,1,10,0,13,8,21,0,1,19,8,16,0,8,21,0,3,17,22,0,4,11,14,21,0,1,21,1,27,16,0,8,31,0,3,17,0,17,16,0,18,21,0,2,21,1,17,16,21,1,12,0,16,8,21,1,7,21,0,1,0,15,16,7,0,16,21,0,4,21,1,12,0,7,8,19,3,2,21,1,4,0,13,21,1,11,31,0,4,8,8,7,16,0,15,21,0,1,21,1,83,16,17,25,21,0,1,21,1,97,21,0,2,17,22,0,3,11,14,21,0,1,21,1,27,16,0,8,21,0,3,17,22,0,4,11,14,21,0,2,0,24,21,1,27,3,2,21,1,4,21,1,5,0,12,21,1,10,0,13,8,21,0,1,19,8,16,0,8,31,0,3,17,22,0,5,11,14,21,0,5,0,7,21,0,4,17,22,0,6,11,14,31,0,4,0,17,16,0,18,21,1,7,21,0,1,0,15,16,7,0,16,31,0,5,21,1,12,0,6,8,19,21,1,7,21,0,2,21,1,17,16,7,0,16,21,0,6,21,1,12,0,7,8,19,3,2,21,1,4,0,13,21,1,11,31,0,6,8,8,7,16,0,15,21,0,1,21,1,83,16,17,25,21,0,1,0,12,16,0,13,0,24,17,0,5,0,120,17,14,21,0,1,21,1,33,0,24,17,21,1,5,21,1,29,0,8,7,0,24,19,0,17,9,21,1,12,0,15,8,16,0,18,21,0,1,0,1,16,7,16,25,15,194,22,0,3,11,14,15,195,22,0,4,11,14,21,0,1,21,0,3,31,0,4,3,2,21,1,4,21,1,14,8,16,25,21,0,2,0,12,16,21,1,21,0,24,17,0,5,0,126,17,14,21,0,2,21,1,17,16,22,0,2,12,21,1,27,16,22,0,3,11,14,21,0,1,21,0,3,21,1,22,0,23,17,21,1,13,21,1,5,0,20,15,196,8,8,21,0,2,17,25,21,0,1,0,28,21,1,138,21,0,4,8,21,0,2,17,25,21,0,1,22,0,3,11,14,21,1,20,21,1,12,15,197,15,198,3,2,21,1,4,21,1,6,21,1,9,21,1,82,21,1,22,21,0,2,19,8,8,8,25,21,0,2,21,1,14,21,1,13,0,15,0,16,0,23,19,8,16,22,0,2,12,14,21,0,2,21,1,16,16,0,5,0,85,17,14,21,0,2,22,0,3,11,22,0,4,11,14,21,0,1,21,1,35,21,0,1,21,1,27,16,0,8,21,0,3,17,0,17,16,0,19,21,1,8,15,199,21,1,13,15,200,8,7,7,16,17,25,21,0,1,21,1,27,21,1,10,0,12,8,21,0,2,17,0,5,0,133,17,14,21,0,1,21,1,57,21,0,2,17,25,21,0,1,0,12,16,0,13,0,24,17,0,5,0,134,17,14,21,0,1,21,1,53,16,22,0,5,11,14,21,0,1,21,1,27,16,0,17,16,0,18,0,24,21,1,5,21,0,1,0,12,21,1,22,0,24,19,21,1,13,21,1,103,21,1,22,7,8,16,21,1,35,21,0,5,17,21,1,12,0,16,8,21,1,10,21,1,83,8,0,24,21,1,12,0,7,8,19,3,2,21,1,4,21,1,22,21,1,11,0,23,8,8,7,16,21,0,4,21,0,5,17,21,1,35,31,0,5,21,1,106,16,17,0,1,0,23,17,25,21,0,2,0,12,16,21,1,21,0,24,17,0,5,0,136,17,14,21,0,2,21,1,17,16,22,0,3,11,14,21,0,3,0,18,21,1,16,0,7,0,24,19,7,16,22,0,4,11,21,1,29,0,6,7,0,23,17,22,0,5,11,14,21,0,5,21,1,21,0,24,17,0,5,0,137,17,14,21,0,1,21,1,17,16,22,0,6,11,21,1,27,16,22,0,7,11,14,21,0,3,21,1,5,21,1,29,0,8,7,0,24,19,15,201,3,2,21,1,4,31,0,5,8,16,22,0,8,11,14,21,0,6,21,0,7,0,12,21,0,8,17,0,7,0,24,17,21,1,13,21,1,5,0,20,15,202,8,8,16,0,15,21,0,3,17,25,21,0,1,0,18,21,1,15,7,16,21,1,29,0,8,7,0,24,17,0,5,0,141,17,14,21,0,1,0,18,0,13,21,1,11,0,28,8,7,16,21,1,29,0,8,7,0,24,17,0,5,0,142,17,14,0,3,22,0,5,11,14,21,0,1,21,1,6,0,21,0,23,8,21,1,13,21,1,5,15,203,21,1,27,21,1,12,21,1,8,0,7,7,8,19,8,21,0,2,17,22,0,1,12,14,21,0,1,0,4,21,0,1,21,0,5,16,22,0,6,11,17,22,0,7,11,14,0,23,22,0,8,11,14,31,0,6,0,18,0,17,21,1,9,0,18,15,204,7,8,21,0,4,9,7,16,25,21,0,1,0,12,16,0,12,0,24,17,0,5,0,143,17,14,21,1,112,21,1,5,7,22,0,3,11,14,21,0,1,21,0,3,0,1,0,23,21,1,9,0,17,8,19,0,18,15,205,7,21,1,29,0,18,0,18,21,1,30,7,7,7,3,0,21,1,22,16,21,1,22,16,19,0,1,0,18,0,23,7,3,0,21,1,12,21,1,111,8,0,1,21,1,5,19,9,19,3,2,21,1,4,21,1,82,21,1,22,0,24,19,8,16,25,21,0,2,0,12,16,22,0,3,11,14,21,0,1,0,12,16,0,13,21,0,3,17,0,5,0,144,17,14,21,0,1,21,1,83,16,22,0,4,11,21,1,31,21,0,3,17,21,1,84,0,7,7,21,0,2,21,1,83,16,17,22,0,5,11,14,21,0,5,0,23,0,16,21,1,11,0,23,8,0,12,0,24,19,3,2,21,1,4,21,0,3,0,12,0,24,17,8,16,22,0,6,11,14,31,0,5,0,18,0,12,21,1,11,0,23,8,7,21,1,29,0,8,7,0,24,19,0,24,3,2,21,1,4,21,0,6,8,16,0,5,0,145,17,14,21,0,1,21,1,12,21,1,5,0,20,21,1,6,21,1,9,21,0,1,21,1,111,16,15,206,15,207,3,2,21,1,4,21,0,1,0,12,16,0,12,21,0,3,17,8,16,8,8,8,22,0,7,11,14,21,0,2,21,1,111,16,21,1,112,21,0,7,7,31,0,6,17,0,1,3,0,31,0,7,16,17,25,21,0,1,21,1,14,16,0,5,0,146,17,14,21,0,1,21,1,114,21,1,147,3,2,21,1,4,21,0,2,21,1,82,16,0,13,0,25,17,8,21,0,2,17,25,21,0,2,21,1,116,21,0,1,17,21,1,24,16,0,8,21,0,2,17,0,7,21,0,1,17,25,21,0,2,21,0,1,3,2,0,16,21,0,1,21,1,23,21,0,2,17,17,25,21,0,2,21,0,1,3,2,0,16,21,0,1,21,1,22,21,0,2,17,17,25,21,0,1,0,21,21,0,1,0,1,0,23,21,0,2,16,19,8,25,21,0,1,21,1,128,16,21,1,129,0,24,17,0,5,0,149,17,14,21,0,1,21,1,111,16,22,0,1,12,14,21,0,1,21,1,127,16,0,29,21,1,12,21,1,130,8,21,1,122,21,1,130,21,1,11,0,24,8,19,16,0,5,0,150,17,14,21,0,1,0,18,21,1,15,7,16,21,1,29,21,1,122,7,0,24,17,0,5,0,151,17,14,21,0,1,25,21,0,1,21,1,9,21,1,135,8,21,1,5,21,1,9,21,1,125,8,21,1,84,0,16,7,21,1,127,21,1,12,21,1,8,21,1,119,21,1,131,0,24,19,21,1,132,21,1,6,19,7,8,19,0,24,0,23,3,2,0,21,0,25,3,1,8,19,25,21,0,1,21,1,136,21,0,5,7,21,0,2,17,22,0,6,11,21,1,126,0,23,17,22,0,7,11,14,21,0,4,22,0,8,11,14,15,208,22,0,9,11,14,21,0,1,21,0,9,31,0,6,7,21,0,2,17,25,21,0,1,21,1,136,21,0,5,7,21,1,84,21,1,132,21,1,12,21,1,120,8,21,1,132,21,1,121,0,23,19,3,2,21,1,4,21,1,5,21,1,130,0,23,19,8,7,21,1,128,21,1,10,21,1,18,8,19,21,0,2,17,22,0,6,11,14,15,209,22,0,7,11,14,21,1,5,21,1,125,9,21,0,7,21,1,5,0,18,21,1,125,7,9,3,3,21,1,4,21,1,128,21,1,12,21,1,129,8,21,1,131,0,24,19,21,1,124,0,23,21,1,12,21,1,126,8,19,8,22,0,7,12,14,21,0,1,21,0,7,21,0,6,0,16,21,1,11,21,1,127,21,1,8,21,1,132,7,0,24,19,8,16,17,21,1,84,21,0,4,7,21,0,2,31,0,7,31,0,6,0,16,0,23,17,17,17,21,1,126,16,25,21,0,1,21,1,128,16,21,1,130,0,24,17,0,5,0,152,17,14,21,0,4,22,0,5,11,14,15,210,22,0,6,11,14,21,0,1,31,0,6,15,211,3,2,21,1,4,0,24,0,21,21,1,127,21,1,125,0,23,19,8,8,21,0,2,17,25,21,0,1,21,1,83,21,1,10,21,1,18,8,21,0,2,17,22,0,3,11,14,21,0,3,0,18,21,1,127,7,16,22,0,4,11,21,1,29,21,1,121,7,0,24,17,22,0,5,11,14,21,0,4,21,1,132,21,0,5,17,21,1,129,0,24,17,21,1,29,21,1,122,7,0,24,17,0,5,0,154,17,14,21,0,3,21,1,84,21,1,35,21,1,11,0,24,21,1,132,21,0,5,17,0,17,16,21,1,12,21,1,131,8,8,7,21,0,5,21,1,133,21,0,4,17,17,22,0,6,11,14,21,0,6,21,1,29,21,1,78,7,16,0,5,0,155,17,14,31,0,3,21,1,84,0,24,21,1,5,0,16,0,23,19,3,2,21,1,4,21,1,6,8,7,31,0,4,21,1,128,31,0,5,17,17,21,1,29,21,1,131,7,0,23,17,22,0,7,11,14,21,0,1,21,1,111,21,1,10,21,1,30,8,21,0,2,17,21,1,111,31,0,6,0,16,0,23,17,21,1,30,31,0,7,3,1,17,17,25,21,0,4,22,0,6,11,14,0,23,15,212,0,21,21,1,7,15,213,7,8,21,0,2,17,22,0,7,11,14,21,0,1,21,0,5,21,0,2,17,22,0,8,11,14,15,214,22,0,9,11,14,21,0,1,31,0,9,15,215,3,2,21,1,4,21,0,8,21,1,16,16,8,16,25,21,0,2,21,1,128,16,21,1,128,0,24,17,0,5,0,157,17,14,21,0,2,0,18,21,1,128,7,16,22,0,3,11,21,1,29,21,1,131,7,0,23,17,22,0,4,11,14,21,0,1,21,1,128,16,21,1,130,21,0,4,17,0,5,0,158,17,14,21,0,1,21,1,83,16,21,1,31,21,0,4,17,21,1,132,21,0,2,0,18,21,1,83,7,16,21,1,91,16,17,22,0,5,11,14,21,0,5,21,0,3,21,1,128,0,24,17,21,1,144,21,0,3,17,21,1,12,21,1,130,8,21,1,122,21,1,130,21,1,11,0,23,8,19,16,21,1,29,21,1,122,7,0,24,17,0,5,0,145,17,14,0,23,3,1,21,1,30,31,0,5,17,21,1,35,21,0,3,0,19,21,1,131,7,16,21,1,145,0,23,17,17,21,1,120,31,0,3,17,22,0,6,11,14,21,0,2,0,18,21,1,111,7,16,22,0,2,12,0,18,21,1,127,7,16,21,1,8,21,1,132,7,21,0,6,17,22,0,7,11,14,21,1,7,21,0,1,7,21,1,110,21,0,1,21,1,33,31,0,4,17,21,1,12,21,1,30,8,19,22,0,8,11,14,21,0,7,21,1,29,21,1,124,7,0,24,17,3,1,21,0,8,16,21,1,12,21,1,35,8,22,0,9,11,14,21,0,2,0,16,21,1,11,0,23,8,21,1,10,21,1,112,21,0,9,7,8,21,1,84,21,1,112,21,1,5,7,7,21,1,124,31,0,7,21,1,143,16,21,1,145,0,24,17,0,19,21,1,124,7,16,21,1,143,16,19,21,1,29,0,18,0,18,21,1,131,7,7,7,9,0,18,31,0,9,7,9,3,2,21,1,4,21,1,5,21,1,9,21,1,127,8,21,1,127,0,24,19,8,31,0,6,17,0,1,21,0,2,0,18,0,23,7,16,31,0,8,16,17,25,21,0,2,21,1,128,16,22,0,3,11,14,21,0,1,21,1,128,16,21,1,130,21,0,3,17,0,5,0,159,17,14,21,0,1,21,0,3,21,1,153,21,1,142,21,1,11,21,0,2,21,1,83,16,21,1,120,21,0,1,21,1,83,16,21,1,148,21,1,11,21,1,132,8,21,0,3,17,21,1,131,0,24,17,17,8,8,16,31,0,3,21,1,153,21,1,82,8,21,0,2,17,0,1,0,23,17,25,21,0,2,21,1,128,16,21,1,8,21,1,132,7,0,24,17,22,0,3,11,14,21,0,3,21,1,130,0,23,17,0,5,0,160,17,14,21,0,1,21,1,128,16,21,1,130,31,0,3,17,0,5,0,161,17,14,21,0,1,21,1,151,21,1,11,21,0,2,8,21,1,111,21,1,9,21,1,155,8,21,1,111,21,1,83,19,21,1,12,21,1,84,21,1,18,7,8,9,21,1,10,21,1,151,8,21,0,2,17,25,21,0,2,21,1,128,16,21,1,129,0,24,17,0,5,0,162,17,14,21,0,1,21,1,83,16,21,1,127,21,1,10,21,1,130,8,21,0,2,17,0,5,0,163,17,14,21,0,2,21,1,111,16,0,18,21,1,16,7,16,21,1,29,21,1,122,7,0,24,17,0,5,0,164,17,25,21,0,1,21,1,83,16,21,1,150,21,0,2,17,0,18,21,1,29,21,1,120,7,7,16,21,1,142,16,0,18,21,1,7,21,0,1,7,21,1,69,21,1,35,21,1,11,21,0,2,8,19,7,16,25,21,0,1,21,1,157,21,0,2,17,14,21,0,2,21,1,111,16,22,0,2,12,14,21,0,2,21,1,152,16,21,1,133,16,21,1,29,21,1,131,7,0,23,17,21,1,132,21,0,1,21,1,128,16,17,22,0,3,11,14,21,0,3,21,1,125,21,0,2,17,21,1,29,21,1,122,7,0,24,17,0,5,0,165,17,14,21,0,1,21,1,158,31,0,3,21,1,142,16,21,1,5,21,1,144,21,1,8,21,1,152,21,1,9,21,1,133,8,7,19,21,0,2,17,21,1,30,21,0,2,17,17,25,21,0,1,21,1,157,21,0,2,17,14,21,0,2,21,1,111,16,22,0,2,12,14,21,0,1,21,1,128,16,22,0,3,11,14,21,0,2,21,0,3,21,1,12,21,1,125,8,21,1,122,21,1,152,19,16,21,1,29,21,1,122,7,0,24,17,21,1,170,16,14,21,0,1,21,1,158,31,0,3,21,1,142,16,21,1,5,21,1,144,21,1,8,21,1,152,21,1,9,21,1,133,8,7,19,21,0,2,17,21,1,30,21,0,2,17,21,1,106,16,17,25,21,0,1,21,1,168,16,25,21,0,5,14,21,0,1,21,0,4,21,0,2,17,25,21,0,1,21,1,168,16,21,1,5,15,216,3,2,21,1,4,0,23,21,1,5,21,1,1,21,1,9,0,24,0,16,21,1,11,21,1,7,0,25,7,21,1,132,21,1,127,19,8,21,1,83,21,1,7,21,1,162,7,19,3,2,21,1,4,0,16,21,1,11,0,23,8,21,1,128,0,31,19,8,8,9,3,2,21,1,4,21,1,83,21,1,11,21,1,7,21,1,172,7,8,21,1,122,21,1,83,19,8,8,21,0,1,17,25,21,0,1,21,1,1,16,25,21,0,1,21,1,168,16,25,21,0,2,21,1,12,21,0,1,8,0,21,21,0,2,21,0,1,9,8,25,21,0,1,22,0,3,22,0,4,22,0,5,22,0,6,4,4,11,14,21,1,164,21,1,133,9,22,0,7,11,14,31,0,6,15,217,15,218,21,1,7,21,1,172,7,3,2,21,1,4,21,1,5,21,1,9,21,0,7,8,8,3,2,21,1,4,21,1,6,21,1,9,31,0,7,8,8,31,0,4,17,25,21,0,1,21,1,1,16,25,21,0,1,21,1,177,16,25,21,0,1,21,1,180,16,25,21,0,2,21,0,1,16,25,21,0,1,21,1,183,16,25,21,0,2,21,1,29,21,0,1,7,16,25,21,1,5,21,1,82,21,1,9,21,1,171,8,21,0,1,19,21,1,6,21,1,5,19,25,21,0,1,21,0,4,21,0,2,17,22,0,6,11,14,21,0,6,21,0,5,21,0,2,17,21,1,82,21,0,1,17,21,1,171,16,14,31,0,6,25,21,0,1,21,1,82,16,21,1,128,0,25,17,21,1,170,16,14,21,0,1,0,18,21,1,128,7,16,21,1,128,0,24,17,21,1,29,21,1,122,7,0,24,17,21,1,171,16,14,21,0,1,21,1,169,16,22,0,3,11,14,21,0,3,0,18,21,1,16,7,16,21,1,29,21,1,122,7,0,24,17,21,1,171,16,14,21,0,1,21,1,84,21,1,145,7,0,28,17,21,1,169,16,21,1,126,21,0,3,17,21,1,29,21,1,122,7,0,24,17,21,1,171,16,14,21,0,3,0,3,16,22,0,4,11,14,0,24,21,1,130,21,0,4,17,21,1,29,21,1,122,7,0,24,17,21,1,171,16,14,31,0,4,21,1,133,16,21,1,144,16,22,0,5,11,14,21,0,5,21,1,84,0,28,7,16,21,1,169,21,0,1,21,1,84,21,1,127,7,16,21,1,144,16,17,21,1,35,31,0,5,21,1,169,31,0,3,17,21,1,53,16,17,25,21,0,2,21,1,128,16,21,1,128,0,24,17,21,1,170,16,14,21,0,2,0,18,21,1,16,7,16,21,1,29,21,1,122,7,0,24,17,21,1,170,16,14,21,0,2,21,1,150,16,22,0,3,11,14,21,0,1,21,1,84,21,1,127,7,21,1,10,21,1,82,8,21,0,3,17,21,1,171,16,14,21,0,1,21,1,169,21,1,10,21,1,35,21,1,11,21,1,53,8,8,31,0,3,17,25,21,0,1,21,1,14,16,21,1,171,16,14,21,0,1,21,1,128,16,21,1,128,0,23,17,21,1,171,16,14,21,0,1,21,1,111,16,0,16,0,23,17,25,21,0,2,21,1,128,21,1,10,21,1,132,8,21,0,1,17,22,0,3,11,14,21,0,3,0,24,21,1,12,21,1,130,8,21,1,122,21,1,130,21,1,11,0,23,8,19,16,21,1,171,16,14,21,0,2,0,24,21,1,127,3,2,21,1,4,21,0,3,8,16,22,0,4,11,14,21,0,1,21,1,127,16,21,1,130,21,0,4,17,21,1,171,16,14,21,0,1,21,1,176,21,1,148,21,1,11,21,0,4,8,3,2,21,1,4,31,0,3,8,16,21,1,82,21,0,2,17,21,1,171,16,14,21,0,1,21,1,149,31,0,4,17,25,21,0,1,21,1,127,16,21,1,128,0,25,17,21,1,171,16,14,21,0,1,21,1,176,16,21,1,82,21,0,2,17,21,1,171,16,14,21,0,1,21,1,176,0,24,17,25,21,0,1,21,1,127,16,21,1,128,0,24,17,21,1,171,16,14,21,0,1,21,1,176,16,25,21,0,1,21,1,128,16,21,1,128,0,24,17,21,1,170,16,14,21,0,1,0,18,21,1,16,7,16,21,1,29,21,1,122,7,0,24,17,21,1,170,16,14,21,0,1,21,1,149,21,1,11,0,24,8,21,1,130,21,1,149,21,1,11,0,28,8,19,21,1,29,21,1,122,7,0,24,19,16,21,1,171,16,14,21,0,1,0,3,16,25,21,0,1,21,1,20,21,1,10,21,0,4,21,1,74,0,18,21,0,4,7,8,8,21,0,2,17,25,21,1,5,21,1,9,21,1,82,8,21,1,125,0,23,19,21,1,171,9,21,1,6,21,1,84,21,1,161,21,0,1,7,7,19,25,21,1,5,21,1,9,21,1,82,8,21,1,125,0,23,19,21,1,171,9,21,1,6,0,23,21,1,9,21,1,170,8,0,21,21,1,179,21,1,161,21,0,1,7,7,8,19,25,21,1,5,21,1,9,21,1,128,8,21,1,125,0,23,19,21,1,171,9,21,1,6,21,1,103,21,1,161,21,0,1,7,21,1,5,21,1,11,21,1,14,21,1,9,21,1,171,8,8,9,7,19,25,21,1,84,21,1,161,21,0,1,7,7,25,21,1,5,21,1,9,21,1,128,8,21,1,125,0,23,19,21,1,171,9,21,1,6,21,1,5,21,0,1,21,1,145,19,0,21,21,1,127,21,1,125,0,24,19,21,1,13,21,1,149,21,1,11,0,24,8,21,0,1,21,1,149,21,1,11,0,28,8,19,21,1,169,21,1,176,19,8,8,19,25,21,0,1,21,1,7,15,219,7,3,2,21,1,4,21,1,128,21,1,11,21,1,7,21,1,162,7,8,8,25,21,1,161,21,0,2,7,22,0,3,11,14,21,0,3,21,1,11,21,0,1,8,0,21,31,0,3,8,21,1,161,21,0,1,7,9,25,21,0,1,21,1,182,21,1,161,21,0,2,7,8,25,21,0,1,21,1,181,21,0,2,8,21,1,173,21,0,1,21,1,132,16,21,1,181,21,0,2,8,8,25,21,0,1,21,1,132,16,21,1,181,21,0,2,8,25,21,1,161,21,0,1,7,0,21,21,1,161,21,0,2,7,8,25,21,1,161,21,0,1,7,21,1,11,21,0,2,8,25,21,0,1,0,21,21,1,172,8,25,21,1,161,21,0,2,7,21,1,161,21,0,1,7,9,0,21,21,0,1,21,1,7,0,23,21,1,9,21,1,170,8,7,15,220,3,2,21,1,4,21,1,5,21,1,9,21,1,164,8,8,21,0,2,17,8,25,21,0,1,15,221,21,0,5,21,1,186,21,0,1,21,0,4,21,0,2,17,17,7,21,0,2,17,25,21,1,125,21,1,151,21,0,1,19,21,1,186,9,22,1,2,12,14,21,0,1,21,1,3,3,2,25,21,0,1,25,21,0,1,25,21,0,1,14,21,1,7,21,2,42,16,25,0,24,0,7,21,1,6,17,22,1,6,12,14,21,0,1,0,16,21,1,6,17,25,21,1,8,21,1,7,21,0,1,17,22,1,8,12,25,21,0,1,21,2,2,16,25,21,0,1,21,2,2,16,25,21,0,2,0,14,16,22,0,5,11,14,21,0,2,0,12,16,0,17,16,21,2,29,0,8,21,2,11,21,0,1,0,14,16,21,2,12,0,16,8,0,12,21,0,5,21,2,12,0,16,8,19,8,7,0,24,17,0,5,0,76,17,14,21,0,5,21,2,29,0,8,7,0,24,17,0,17,16,0,18,21,0,1,0,15,16,21,2,12,0,16,8,21,0,4,21,0,2,0,15,16,21,2,12,0,16,8,19,7,16,0,15,31,0,5,17,25,21,0,2,0,14,16,22,0,5,11,14,21,0,2,0,12,16,22,0,6,11,14,21,0,1,0,14,16,22,0,7,11,14,21,0,6,0,17,16,21,2,29,0,8,21,2,11,21,0,7,21,2,12,0,16,8,0,12,31,0,5,21,2,12,0,16,8,19,8,7,0,24,17,0,5,0,77,17,14,21,0,6,0,7,21,0,1,0,12,16,17,0,17,16,21,2,29,0,8,21,2,11,0,6,21,2,11,31,0,6,8,21,2,8,0,16,7,21,0,7,19,8,7,0,24,17,22,0,8,11,14,21,0,2,0,15,16,22,0,9,11,14,21,0,1,0,15,16,22,0,10,11,14,21,0,8,0,17,21,2,10,0,18,21,2,7,31,0,10,7,0,16,0,6,21,2,11,0,8,21,2,11,31,0,8,8,8,19,21,0,4,21,0,9,21,2,12,0,16,8,19,7,8,31,0,9,21,2,27,16,17,0,15,16,0,15,31,0,7,17,25,21,0,1,21,2,44,21,0,4,7,21,0,2,17,25,21,0,1,0,18,15,222,21,0,2,7,7,16,25,21,0,2,0,18,15,223,21,0,1,7,7,16,25,21,2,18,0,16,21,2,21,19,21,2,18,21,2,45,19,22,0,3,11,14,21,0,1,21,2,27,21,2,10,21,0,3,8,21,0,2,17,22,0,4,22,0,5,4,2,11,14,21,0,1,15,224,21,2,10,15,225,8,21,0,2,17,22,0,6,11,14,21,0,4,31,0,6,3,2,25,21,0,2,22,0,3,11,14,21,0,1,22,0,4,11,14,15,226,21,1,6,3,2,21,2,4,0,12,21,2,11,21,1,7,8,8,22,0,5,11,14,0,23,21,0,5,16,25,21,0,1,0,12,21,2,11,0,23,8,21,2,13,21,0,2,8,9,25,21,2,8,21,0,1,7,25,21,0,1,0,12,16,0,13,0,24,17,0,5,0,78,17,14,21,0,1,21,2,27,16,22,0,3,11,14,21,0,1,21,0,3,21,2,9,0,17,8,15,227,3,2,21,2,4,21,0,3,0,13,0,25,17,8,16,25,15,228,22,0,3,11,14,0,28,21,0,3,0,24,0,6,21,0,1,17,17,0,6,0,24,17,25,21,0,2,21,2,51,21,0,1,21,2,12,21,1,13,8,7,16,25,21,0,2,0,12,16,21,2,8,0,7,7,0,24,17,22,0,3,11,14,21,0,3,0,13,0,23,17,0,5,0,82,17,14,21,0,1,0,12,16,0,13,21,0,3,17,0,5,0,83,17,14,21,0,2,21,2,27,16,22,0,4,11,14,21,0,2,21,2,33,0,24,17,22,0,5,11,21,2,29,0,8,7,0,24,17,22,0,6,11,14,21,0,1,0,12,16,21,2,8,0,7,7,31,0,3,17,22,0,7,11,14,21,0,1,0,14,16,21,2,31,21,0,7,17,22,0,8,11,21,2,29,0,8,7,0,24,17,22,0,9,11,14,21,0,1,21,2,20,16,15,229,15,230,3,2,21,2,4,0,23,21,2,33,21,2,11,31,0,7,8,21,2,78,31,0,5,19,3,2,21,2,4,21,0,4,21,2,22,0,23,17,8,8,21,0,2,17,0,15,31,0,8,17,25,21,0,1,0,18,21,2,16,7,16,21,2,29,0,8,7,0,24,17,0,5,0,85,17,14,0,24,0,7,21,1,3,17,22,0,3,11,14,21,2,5,0,7,21,0,3,19,21,2,8,0,16,7,21,1,3,0,17,16,0,18,0,7,21,2,11,21,0,3,8,7,16,0,19,21,2,5,21,2,8,0,16,7,21,0,1,19,0,12,0,23,19,0,8,0,7,19,0,6,21,2,5,19,7,16,19,22,0,4,11,14,21,0,1,0,19,0,6,7,16,21,2,12,0,16,8,22,0,5,11,14,0,23,21,0,4,16,22,0,6,11,21,0,5,16,22,0,7,11,14,31,0,3,21,0,5,16,0,17,16,0,18,15,231,7,16,25,21,0,1,0,7,21,1,3,17,0,17,16,0,18,0,6,21,2,11,21,0,1,8,7,16,25,21,0,1,0,5,21,1,4,19,21,2,6,21,2,5,19,25,21,1,4,0,8,21,0,1,17,0,6,21,0,2,21,2,64,21,0,1,17,17,22,1,4,12,25,21,0,1,0,1,21,0,2,19,25,21,0,2,0,20,21,0,1,21,2,134,21,0,2,17,8,25,21,0,4,22,0,6,11,14,21,0,1,22,0,7,22,0,8,22,0,9,4,3,11,14,21,0,5,21,2,14,21,2,23,31,0,8,19,21,2,13,15,232,21,2,9,21,1,7,8,8,16,31,0,7,21,0,2,17,22,0,10,11,14,31,0,10,31,0,9,21,2,13,15,233,8,16,25,0,23,22,0,3,11,14,21,0,1,15,234,16,22,0,4,11,14,21,0,2,21,2,18,21,2,10,21,2,18,8,21,2,7,21,2,75,7,0,15,21,2,10,21,2,18,8,3,2,21,2,4,21,2,80,8,15,235,3,3,21,2,4,31,0,4,21,2,24,0,25,17,8,21,0,1,17,25,21,0,2,22,0,3,22,0,4,4,2,11,14,15,236,21,2,11,21,0,2,8,22,0,5,11,14,15,237,22,0,6,11,14,15,238,21,2,11,0,23,8,22,0,7,11,14,21,0,1,21,2,7,21,0,4,7,0,16,0,23,19,31,0,7,3,2,21,2,4,21,1,12,21,2,9,21,2,14,8,8,16,25,21,1,6,21,0,1,16,25,21,0,1,0,12,21,2,11,21,1,4,8,0,7,0,24,19,21,2,13,15,239,8,16,14,21,1,5,0,16,0,24,0,6,21,1,3,17,22,1,3,12,17,25,21,0,2,22,0,5,11,14,21,0,4,22,0,6,11,14,21,0,1,0,18,15,240,7,16,25,21,0,2,22,0,3,11,14,21,1,9,0,16,21,0,1,17,22,0,4,11,14,21,1,5,0,18,0,16,21,2,11,21,0,1,8,7,16,22,0,5,11,14,21,0,4,0,17,16,0,18,21,2,7,21,0,5,7,0,16,0,8,21,2,11,21,0,3,8,19,7,16,22,0,6,11,14,31,0,3,0,17,16,0,18,21,2,6,7,21,0,6,17,0,18,21,2,5,7,21,1,10,0,17,16,17,0,15,16,21,2,84,0,12,7,31,0,5,17,21,2,29,0,8,7,0,24,17,0,5,0,104,17,14,21,0,6,21,2,56,16,22,0,7,11,14,21,0,7,21,2,27,16,0,17,16,0,18,21,0,6,21,1,8,0,6,7,0,23,17,21,2,35,21,0,7,17,21,2,12,0,16,8,21,2,12,0,7,8,7,16,22,0,8,11,14,31,0,8,0,18,21,2,5,7,21,1,12,17,21,2,84,0,6,7,21,0,7,0,18,31,0,6,21,2,12,0,16,8,21,2,12,0,8,8,7,21,1,12,17,17,22,1,12,12,14,31,0,7,0,18,0,6,21,2,11,21,0,4,21,2,12,0,8,8,8,7,21,1,11,17,22,1,11,12,14,31,0,4,0,8,22,1,10,13,25,21,0,4,0,16,21,0,1,17,0,16,21,0,2,17,25,21,2,35,21,2,11,21,1,7,0,7,21,1,6,17,0,17,16,0,18,0,6,21,2,11,21,1,7,8,7,16,8,22,0,3,11,14,21,1,5,0,16,0,23,17,21,0,3,16,22,0,4,11,14,21,1,5,0,18,31,0,3,21,2,84,0,12,7,21,0,4,19,21,2,29,0,8,7,9,7,16,21,2,29,0,8,7,0,24,17,0,5,0,105,17,14,21,0,4,21,2,29,0,8,7,16,22,0,5,11,0,17,16,0,15,31,0,4,17,22,0,6,11,14,21,0,6,0,18,21,2,6,7,21,0,1,17,21,1,13,31,0,6,0,18,0,6,21,2,11,0,8,21,2,11,31,0,5,8,8,7,21,0,2,17,17,25,21,2,7,21,2,75,7,21,0,1,3,2,21,2,4,21,0,4,0,7,0,24,19,21,2,10,0,8,0,21,21,2,5,8,8,8,25,21,0,1,15,241,21,0,1,21,0,4,21,0,5,3,3,7,3,2,21,2,4,21,2,5,21,0,2,9,8,25,21,1,0,0,21,21,0,1,8,25,21,0,1,0,21,21,1,0,8,25,21,1,1,21,0,2,7,22,0,3,11,14,21,0,1,21,0,3,15,242,15,243,3,3,21,2,4,21,2,7,0,29,7,0,7,0,0,19,8,16,25,21,0,1,21,1,8,16,22,0,3,11,14,21,0,1,31,0,3,21,0,2,17,25,21,0,1,21,2,1,16,25,21,0,1,21,2,32,0,24,17,0,18,21,2,93,21,2,11,21,2,7,21,0,2,7,8,7,16,25,21,0,2,0,12,16,21,2,21,0,24,17,0,5,21,1,6,17,14,21,0,2,21,2,17,16,22,0,2,12,14,21,0,2,0,18,21,2,15,7,16,21,2,29,0,8,7,0,24,17,0,5,21,1,7,17,14,21,0,2,21,2,27,16,22,0,3,11,14,21,0,1,21,2,83,16,21,2,27,21,2,12,21,2,23,8,21,2,13,15,244,8,21,0,3,17,22,0,4,11,14,15,245,22,0,5,11,14,0,23,21,2,22,16,22,0,6,11,14,0,24,22,0,7,11,14,15,246,22,0,8,11,14,0,23,22,0,9,11,14,21,0,3,0,17,16,0,18,21,0,2,21,2,12,0,16,8,15,247,21,1,4,15,248,7,31,0,8,21,2,6,19,3,2,21,2,4,21,1,3,8,21,0,4,21,2,12,0,16,8,19,7,16,22,0,10,11,14,21,0,1,21,2,20,16,21,2,5,0,20,0,15,21,2,11,21,0,4,8,15,249,3,2,21,2,4,21,0,6,0,12,16,21,2,22,0,23,17,8,8,16,25,21,0,1,21,2,16,16,0,5,0,124,17,14,21,0,1,0,17,16,25,21,0,1,0,12,16,0,12,0,24,17,0,5,0,125,17,14,21,0,1,0,18,21,1,3,7,16,21,2,29,0,18,21,2,30,21,2,11,21,2,18,8,7,7,3,0,21,2,22,16,17,0,1,21,0,1,0,18,0,23,7,16,17,25,21,0,1,0,12,16,0,13,21,1,3,17,0,5,0,127,17,14,21,0,2,0,18,21,2,16,7,16,21,2,29,0,8,7,16,0,5,0,128,17,14,21,0,1,21,2,83,16,22,0,3,11,14,21,1,3,0,17,16,0,18,21,0,2,21,2,12,0,16,8,0,7,21,0,3,21,2,12,0,16,8,19,0,6,0,24,19,7,16,22,0,4,11,14,21,0,4,0,18,0,13,21,2,11,0,23,8,7,16,21,2,29,0,8,7,16,0,5,0,129,17,14,21,0,3,21,2,35,21,1,3,0,7,21,2,11,21,2,27,8,21,0,3,17,0,17,16,0,18,0,6,21,2,11,21,1,3,8,7,16,17,22,0,5,11,21,2,29,0,8,7,0,24,17,22,0,6,11,14,0,24,0,7,21,1,3,17,15,250,16,21,2,30,21,0,6,3,1,17,0,19,0,8,7,16,21,2,60,16,22,0,7,11,14,21,0,2,21,2,5,21,2,84,15,251,7,31,0,7,19,21,2,29,0,18,0,6,7,7,9,21,2,10,0,18,0,6,7,8,31,0,4,17,0,24,21,2,12,0,12,8,0,7,0,24,19,21,2,13,21,2,8,0,17,0,15,31,0,5,19,21,2,12,0,18,0,6,7,8,7,8,31,0,6,17,0,18,21,0,1,0,15,16,21,2,12,0,16,8,7,16,25,21,0,1,0,12,16,0,13,0,24,17,0,5,0,130,17,14,21,0,1,21,1,3,21,0,2,17,25,21,0,2,0,12,16,21,2,21,0,24,17,0,5,0,131,17,14,21,0,1,21,2,83,16,21,2,27,21,2,10,0,13,8,21,0,2,17,0,5,0,132,17,14,21,0,2,21,2,27,16,22,0,3,11,14,21,0,2,0,15,16,21,2,12,0,16,8,22,0,4,11,14,21,0,1,21,0,3,21,2,22,0,23,17,21,2,13,15,252,8,0,23,17,25,21,0,2,0,12,21,1,4,17,25,21,1,3,0,6,22,1,4,13,14,21,0,1,0,6,0,24,17,25,21,0,1,21,2,84,21,2,5,0,24,3,2,21,2,4,21,2,6,8,7,21,1,4,17,21,2,29,0,8,7,0,24,17,22,0,3,11,14,21,0,3,21,2,22,0,23,17,0,5,0,138,17,14,21,1,4,21,2,27,16,0,17,16,0,18,0,8,21,2,11,21,1,4,21,2,12,0,16,8,8,7,16,21,2,29,0,6,7,0,23,17,22,0,4,11,14,21,1,3,0,16,31,0,4,17,21,2,109,16,22,0,5,11,14,0,32,21,2,22,21,0,5,17,0,5,0,139,17,14,0,12,21,2,11,21,2,24,8,0,5,0,140,19,21,2,6,21,2,5,19,22,0,6,11,14,21,0,3,0,9,21,1,7,17,31,0,6,21,2,24,21,2,25,3,3,21,2,4,21,0,5,21,2,24,0,25,17,8,16,22,0,7,11,14,21,1,3,21,2,84,21,2,5,21,0,7,3,2,21,2,4,21,2,6,8,7,21,1,4,17,22,1,3,12,14,31,0,7,0,8,31,0,3,17,31,0,5,0,12,0,29,17,21,2,13,21,2,22,21,2,11,21,1,7,8,21,2,13,15,253,8,8,16,25,21,1,8,0,17,16,0,18,21,2,6,7,21,2,11,0,1,21,2,9,21,2,22,8,8,15,254,3,2,21,2,4,21,1,7,21,2,22,0,23,17,8,21,0,1,17,25,21,2,5,21,1,5,21,0,1,0,16,21,0,2,17,19,22,1,5,12,14,21,0,1,21,2,31,21,0,2,17,25,21,0,1,14,21,1,7,0,16,21,1,8,17,21,2,5,0,24,0,6,21,1,8,17,22,1,8,12,17,25,21,0,1,21,2,111,16,21,1,3,16,0,18,21,0,1,21,2,83,16,21,2,101,16,21,2,111,16,21,2,12,21,2,35,8,7,16,25,21,1,4,21,2,32,21,1,3,17,22,0,3,11,21,2,29,0,8,7,0,24,17,22,0,4,11,14,21,0,4,0,17,16,21,2,111,31,0,3,17,21,2,12,0,18,0,6,21,2,11,0,8,21,2,11,31,0,4,8,8,21,2,8,0,16,7,21,0,1,19,7,8,25,0,18,21,0,1,21,2,12,0,16,8,7,25,21,1,9,21,1,7,21,2,131,21,0,4,17,7,22,0,5,11,14,21,0,1,21,2,84,21,0,5,7,21,2,6,21,2,9,0,18,21,0,1,21,2,12,21,0,5,8,7,8,21,2,5,21,2,9,0,18,21,2,5,31,0,5,21,0,2,19,7,8,21,1,8,3,4,21,2,4,21,2,82,21,2,10,21,2,18,8,21,2,129,21,0,4,21,2,121,0,23,17,19,21,2,123,0,23,21,2,129,21,0,4,17,21,2,122,21,1,7,17,19,21,2,110,0,25,19,21,2,29,21,2,131,21,2,11,0,25,21,2,12,21,2,124,8,8,7,9,8,21,0,2,17,25,21,0,1,21,2,83,16,21,2,35,21,0,2,0,17,16,17,22,0,3,11,14,21,0,1,21,2,33,21,0,2,17,22,0,4,11,21,2,29,21,2,124,7,0,24,17,22,0,5,11,14,21,0,5,0,17,16,21,2,111,31,0,4,17,22,0,6,11,14,21,0,1,15,255,0,20,21,2,7,21,0,3,21,2,29,21,2,124,7,0,24,17,0,17,16,0,18,21,2,5,21,2,124,31,0,5,19,21,2,131,21,0,6,19,21,2,8,21,2,35,7,21,0,1,21,2,111,16,19,7,16,21,2,111,31,0,3,17,7,8,16,25,21,0,1,21,2,83,16,21,2,32,0,24,17,22,0,3,11,14,15,256,22,0,4,11,14,21,1,5,21,2,7,21,0,1,7,21,2,111,31,0,4,19,21,2,42,21,2,12,21,2,110,8,3,2,21,2,4,21,2,5,21,2,9,21,2,39,21,2,9,21,2,133,8,8,8,31,0,3,17,25,21,0,1,21,2,103,21,2,125,7,16,21,2,29,21,1,5,7,21,0,2,17,25,15,257,21,2,7,21,0,2,7,7,25,21,2,6,21,0,1,9,25,0,23,22,0,3,11,22,0,4,11,14,21,1,8,21,2,44,15,258,7,16,14,21,0,1,3,1,22,0,5,11,14,15,259,21,2,11,21,1,7,8,22,0,6,11,14,21,0,3,21,0,6,21,1,6,17,22,0,7,11,14,21,0,4,21,2,132,16,21,0,5,31,0,6,21,2,11,21,2,168,8,3,2,21,2,4,21,2,125,21,2,11,0,23,8,8,21,1,6,17,22,0,8,11,14,21,1,8,21,2,44,21,2,7,31,0,7,31,0,8,3,2,7,0,16,0,23,21,2,12,21,2,125,8,19,0,16,21,2,119,19,7,16,25,21,1,8,0,17,16,21,2,29,21,2,5,21,2,9,21,1,6,21,1,7,16,8,7,21,0,1,17,25,21,0,1,21,2,173,21,0,2,8,21,2,162,21,0,1,8,25,21,2,5,21,2,161,21,1,5,7,21,0,2,19,15,260,21,2,161,21,0,1,7,8,25,21,2,5,15,261,21,1,5,7,21,0,1,19,21,2,161,21,0,2,7,9,25,21,0,2,21,2,162,21,0,1,8,25,21,2,5,15,262,21,0,2,7,21,0,1,19,25,21,0,1,25,21,0,1,21,2,2,21,0,4,17,25,21,0,4,21,2,2,21,0,1,17,25,21,1,5,0,17,16,0,18,0,7,21,3,11,21,0,1,21,3,27,16,0,6,0,28,17,8,21,3,8,0,16,7,21,0,1,19,7,16,25,21,0,1,21,3,43,0,12,7,21,0,2,17,0,19,0,8,7,16,21,3,29,0,6,7,0,23,17,22,0,3,11,14,21,0,2,21,3,35,21,3,11,0,17,8,21,0,3,17,21,3,29,0,8,7,0,24,17,22,0,4,11,14,31,0,3,21,3,23,21,3,11,21,1,5,8,21,3,13,21,3,7,21,0,2,21,0,1,3,2,7,0,18,0,16,7,21,3,22,19,21,3,9,15,263,8,8,16,14,21,0,4,25,21,1,4,0,6,21,3,11,21,0,1,8,21,3,10,21,2,5,8,21,1,3,17,0,12,21,3,11,0,23,8,21,3,13,21,0,1,0,6,0,24,17,21,3,9,21,1,5,8,8,16,25,21,0,1,21,3,33,0,24,17,21,3,29,0,8,7,0,24,17,22,0,3,11,0,12,0,24,17,22,0,4,11,14,21,0,1,0,15,16,22,0,1,12,14,0,24,22,0,5,11,14,0,23,22,0,6,11,14,21,0,1,0,18,0,0,21,3,9,15,264,8,7,16,14,21,0,4,0,8,0,25,17,0,6,21,0,5,17,22,0,7,11,14,15,265,22,0,8,11,14,0,23,22,0,9,11,22,0,10,11,14,15,266,22,0,11,11,14,21,0,1,0,23,0,23,15,267,3,2,21,3,4,0,18,0,12,21,3,11,21,3,24,8,7,21,3,29,0,8,7,0,24,19,8,3,2,21,3,4,21,1,3,0,12,21,0,6,17,0,8,21,0,7,0,12,0,29,17,17,8,16,22,0,12,11,14,21,0,1,31,0,8,31,0,11,3,2,21,3,4,31,0,12,8,16,25,21,0,1,0,24,21,3,12,21,3,23,8,21,3,13,15,268,8,21,0,2,17,25,21,0,1,14,21,1,9,0,17,16,0,18,21,1,4,0,8,21,2,2,17,7,16,25,21,1,6,21,3,48,21,0,1,0,15,16,21,3,12,0,16,8,21,3,12,21,3,79,0,7,0,24,19,21,3,11,21,0,2,0,15,16,21,3,12,0,16,8,8,8,7,16,22,0,3,11,14,21,0,1,15,269,15,270,3,2,21,3,4,0,15,21,3,9,21,3,27,8,21,3,22,0,30,19,21,3,10,0,8,8,8,21,0,2,17,25,21,1,6,21,1,7,0,12,21,0,1,17,21,3,13,15,271,8,16,25,21,0,1,3,1,3,0,21,3,30,3,2,21,3,4,21,3,6,21,3,14,9,8,21,1,6,17,22,1,6,12,25,21,0,1,21,2,8,21,1,6,8,25,21,0,1,15,272,0,15,21,3,9,0,18,21,0,0,7,8,21,3,29,21,3,25,7,0,23,19,0,6,0,24,19,3,2,21,3,4,21,3,14,8,16,25,15,273,22,0,3,11,14,21,3,18,21,0,3,15,274,3,2,21,3,4,21,3,5,21,3,9,21,3,29,21,3,80,7,8,8,3,2,21,3,4,21,3,5,0,16,0,23,19,21,3,14,9,8,22,0,4,11,14,21,0,2,21,0,1,3,2,21,0,4,0,23,17,22,0,5,11,14,21,1,3,0,17,16,0,18,15,275,7,16,22,0,6,11,14,31,0,6,0,18,0,16,21,3,11,0,24,8,7,21,3,18,0,18,0,16,21,3,11,0,23,8,7,19,21,3,7,21,3,75,7,3,2,21,3,4,31,0,3,0,12,21,0,5,17,8,16,25,21,0,1,21,3,20,16,22,0,1,12,14,21,0,1,0,14,16,22,0,3,11,14,21,0,1,0,15,16,22,0,4,11,21,3,27,16,22,0,5,11,14,21,1,3,0,3,21,0,5,17,22,0,6,11,14,21,1,3,0,4,21,0,6,17,22,0,7,11,14,31,0,7,21,3,12,0,16,8,21,3,8,0,16,7,21,1,4,19,22,0,8,11,14,0,23,22,0,9,11,14,15,276,21,0,8,9,22,0,10,11,14,31,0,8,21,3,12,21,3,79,8,0,5,0,100,19,22,0,11,11,14,31,0,5,0,17,16,0,18,31,0,6,21,3,12,0,16,8,21,3,12,31,0,4,21,3,12,0,16,8,21,0,10,21,3,5,15,277,31,0,10,19,3,3,21,3,4,21,3,24,21,3,11,0,25,8,8,8,7,16,0,15,31,0,3,17,25,21,0,1,21,3,27,16,0,17,16,0,18,21,0,1,21,3,12,0,16,8,21,3,12,21,3,6,0,12,21,0,1,21,0,5,16,19,21,3,13,21,0,4,8,8,7,16,25,21,0,1,0,15,21,3,9,21,3,7,21,2,12,7,0,16,21,0,2,19,21,1,6,21,0,0,21,3,11,21,0,2,0,6,0,24,17,8,8,8,0,15,0,14,19,21,1,5,3,2,21,3,4,21,2,12,21,3,27,16,21,3,21,21,0,2,17,8,16,25,21,0,1,22,2,4,12,21,3,8,0,16,7,21,2,6,17,22,2,5,12,14,0,28,22,2,3,12,25,21,1,5,22,0,3,11,14,21,0,1,21,1,6,22,1,5,13,14,31,0,3,25,21,0,4,21,0,1,21,0,2,17,25,21,0,1,22,0,3,11,14,15,278,25,21,0,1,22,0,3,11,14,15,279,25,21,0,1,21,3,30,21,0,1,21,3,27,16,0,7,21,0,2,17,0,17,21,3,9,0,18,0,24,7,8,16,17,25,21,0,1,0,18,0,6,7,21,0,2,0,18,21,0,4,21,3,12,0,8,8,7,16,17,25,21,0,1,0,24,21,3,12,0,12,8,0,7,0,24,19,21,3,13,21,1,5,21,0,2,7,21,3,11,0,17,8,8,21,1,7,17,21,1,5,21,0,2,0,8,21,1,7,17,7,22,1,6,13,14,0,24,22,1,7,12,14,21,0,1,21,3,27,16,25,21,0,2,0,8,22,1,7,13,14,21,0,2,25,21,0,1,14,0,24,22,1,9,12,25,21,1,3,0,7,21,1,4,21,3,27,16,17,0,17,16,0,18,0,6,21,3,11,21,1,3,8,21,3,8,0,16,7,21,1,4,19,7,16,22,0,3,11,21,3,30,22,1,10,13,14,31,0,3,21,3,29,0,8,7,21,1,7,17,0,12,21,3,11,0,24,8,0,7,0,24,19,21,3,13,15,280,8,16,14,21,0,1,0,15,16,21,3,12,0,16,8,22,0,4,11,14,21,1,9,21,3,5,21,3,13,15,281,8,21,0,1,17,14,21,1,6,0,15,21,1,10,17,0,18,21,0,4,7,16,25,21,0,1,0,17,16,0,18,0,7,21,3,11,21,0,1,8,21,3,8,0,16,7,21,1,3,19,7,16,25,21,0,1,0,17,16,0,18,0,8,21,3,11,21,0,2,8,7,16,25,21,0,1,0,24,0,7,21,1,3,17,21,3,22,21,0,2,17,21,3,13,21,3,103,21,0,0,21,3,11,21,0,2,0,6,0,24,17,8,7,8,16,21,2,3,21,0,2,21,1,4,16,17,25,21,2,7,0,7,21,0,1,17,0,17,16,0,18,21,2,6,0,1,16,7,16,21,3,30,22,2,6,13,14,21,2,7,25,0,28,22,0,3,11,14,0,24,0,7,21,2,7,17,22,0,4,11,14,21,0,1,0,18,15,282,7,16,25,21,1,6,0,18,21,0,1,21,3,125,16,7,16,25,21,0,2,21,3,127,16,21,3,125,0,23,17,0,5,0,153,17,14,21,0,2,21,3,127,16,0,17,16,21,3,125,0,23,17,21,3,124,21,0,2,17,25,21,3,6,21,0,1,21,0,4,19,25,21,0,1,21,3,15,16,0,5,0,156,17,14,21,0,1,21,3,120,21,1,4,17,22,1,4,12,14,21,0,1,21,3,121,21,1,3,17,22,1,3,12,25,21,0,1,0,17,16,21,3,30,21,1,5,17,0,19,21,0,2,7,16,25,21,0,1,21,0,5,16,21,0,4,21,0,2,17,25,21,0,1,21,3,178,16,25,21,0,1,21,3,178,16,25,21,0,1,21,4,29,21,2,3,7,16,22,0,3,22,0,4,4,2,11,14,31,0,3,22,2,4,12,14,31,0,4,0,8,22,1,4,13,25,21,0,1,0,13,0,24,17,0,8,22,1,5,13,14,21,0,1,0,6,22,1,6,13,25,21,3,3,0,16,21,1,7,17,15,283,21,0,1,7,16,21,1,4,0,7,0,24,17,21,4,13,15,284,8,21,1,3,17,22,0,3,11,14,21,4,5,21,2,3,3,2,21,4,4,0,13,21,4,11,21,2,3,8,8,22,0,4,11,14,0,23,0,12,21,2,3,17,0,6,21,2,3,17,0,2,0,25,17,21,4,25,16,22,0,5,11,0,17,16,0,18,21,4,5,0,6,0,24,19,0,7,31,0,5,19,0,10,0,25,19,7,16,21,4,29,15,285,7,21,2,3,0,17,16,17,25,21,0,1,0,18,21,1,10,21,4,12,0,7,8,0,7,21,4,11,21,1,9,8,3,2,0,16,21,3,2,17,7,16,0,4,21,4,11,0,3,8,16,25,21,2,3,0,8,0,25,17,0,13,21,0,1,21,4,29,21,4,24,7,16,22,1,10,12,0,7,21,0,1,21,4,29,21,4,25,7,16,22,1,9,12,17,17,25,0,25,0,9,21,0,2,17,21,4,24,16,22,0,3,11,0,6,21,0,1,17,22,0,4,11,21,3,2,16,22,0,5,11,14,21,0,1,31,0,4,3,2,0,16,21,0,5,17,21,2,3,21,0,3,0,8,0,25,17,0,7,21,0,2,17,0,8,31,0,5,17,0,6,31,0,3,17,17,25,21,0,1,14,21,2,4,21,2,9,3,2,0,18,0,17,0,18,0,8,21,4,11,21,2,6,8,7,9,7,16,22,0,3,22,0,4,4,2,11,14,31,0,4,0,18,15,286,7,16,25,21,0,2,21,4,54,16,21,4,60,16,22,0,3,11,14,21,0,1,21,4,53,21,0,2,21,4,35,21,0,3,17,17,0,18,0,24,21,4,12,0,7,8,21,4,25,0,23,19,21,4,8,0,16,7,31,0,3,19,7,16,22,0,4,11,14,0,7,21,4,11,0,24,8,0,8,21,4,11,21,2,4,21,4,12,0,7,8,8,0,7,21,4,6,19,3,2,0,16,21,3,2,17,22,0,5,11,14,21,2,9,0,17,16,0,18,0,8,21,4,11,21,2,6,8,21,4,10,21,1,3,8,31,0,5,21,4,6,19,21,4,11,31,0,4,21,4,12,0,16,8,8,7,16,25,0,24,0,6,21,0,1,17,21,2,4,16,22,2,6,12,21,2,5,16,22,2,7,12,14,21,2,6,25,21,0,1,14,0,24,0,6,22,2,3,13,14,0,23,25,21,0,0,0,23,3,2,25,21,0,2,22,0,3,11,14,21,0,1,0,18,0,15,7,16,22,0,4,11,0,16,0,23,17,21,4,27,16,22,0,5,11,14,0,28,22,0,6,11,14,15,287,21,4,12,21,1,4,8,22,0,7,11,14,15,288,25,21,0,1,21,1,5,16,22,0,3,22,0,4,4,2,11,14,31,0,3,22,1,5,12,14,31,0,4,25,0,24,0,7,21,0,1,0,6,22,1,9,13,17,25,0,24,0,7,21,0,1,17,0,17,16,0,18,0,6,21,4,11,21,0,1,0,7,21,1,9,17,8,21,1,11,21,0,2,19,7,16,14,21,0,2,25,0,23,21,4,7,21,1,3,21,0,1,7,7,16,21,2,3,16,25,0,23,21,4,7,21,0,2,21,1,3,21,0,1,8,7,16,21,2,3,16,25,21,0,1,0,17,16,21,2,5,21,0,1,7,22,2,6,13,25,21,4,7,21,0,2,0,1,16,7,21,1,4,3,2,21,4,4,0,13,21,4,11,0,23,8,8,22,1,4,12,25,21,0,1,14,21,3,6,0,16,21,1,4,0,12,21,1,3,17,0,8,21,3,7,17,0,7,0,24,17,0,6,22,1,3,13,17,25,21,0,4,21,5,12,0,16,8,21,5,10,21,0,1,8,25,21,5,7,0,23,7,0,13,21,2,3,21,5,48,21,0,1,7,16,19,25,21,0,2,22,0,3,11,0,7,16,22,0,4,11,14,0,23,22,0,5,11,22,0,6,11,22,0,7,11,14,0,29,22,0,8,11,14,21,0,1,0,24,0,12,21,2,3,17,0,7,0,24,17,21,5,13,0,18,0,8,21,5,11,21,2,3,8,7,8,16,21,5,12,0,16,8,21,5,10,21,1,3,8,22,0,9,11,14,21,0,9,0,7,0,24,19,0,23,0,24,0,25,3,4,22,0,10,11,14,0,6,15,289,3,2,0,16,21,0,3,0,13,0,30,17,17,22,0,11,11,14,15,290,22,0,12,11,14,15,291,15,292,31,0,12,3,3,21,5,4,15,293,8,22,0,13,11,14,21,0,1,0,18,21,0,1,21,5,12,15,294,8,7,16,25,21,1,3,0,18,21,0,1,21,5,12,21,2,3,8,7,16,21,4,3,16,25,21,1,4,0,18,0,16,21,5,11,21,0,1,8,7,16,25,0,24,0,6,22,1,6,13,14,21,1,6,21,1,7,21,5,11,21,5,7,21,0,0,7,8,21,5,7,21,1,3,7,3,2,21,5,4,0,13,21,5,11,21,1,5,8,8,16,22,0,3,11,14,0,23,31,0,3,16,25,21,0,1,21,1,8,0,7,0,24,17,21,6,13,21,1,9,21,6,13,15,295,8,8,0,24,0,7,21,0,1,17,17,25,21,0,2,0,6,21,1,3,17,22,1,4,12,14,21,0,1,0,6,21,1,3,17,22,1,7,12,21,2,4,16,22,1,6,12,0,6,21,1,3,17,21,2,4,16,22,1,5,12,14,21,1,7,0,13,21,4,3,17,22,1,8,12,14,21,1,6,21,1,11,16,14,21,1,7,21,1,13,21,1,4,17,25,21,0,2,0,6,0,24,17,22,1,4,12,0,12,21,1,6,17,0,8,0,25,17,0,6,22,1,8,13,14,21,0,2,25,21,0,1,0,6,0,24,17,22,1,7,12,0,12,21,1,5,17,0,6,22,1,8,13,14,21,0,1,25,21,0,1,21,1,10,21,6,4,21,1,8,8,21,0,2,17,25,21,0,1,0,16,21,1,7,21,1,13,21,1,4,17,17,25,21,0,1,14,0,25,22,2,8,12,14,21,2,4,22,2,7,12,14,21,0,1,22,2,4,12,25] - ,provide.concat([0,1,2,Infinity,-Infinity,-1,3,8,5,4,'∾','+','-','×','÷','⋆','¬','⌊','⌈','∨','∧','≠','=','>','≥','˙','√','<','⊢','⊣','≍','↑','↓','↕','⌽','⍉','/','⊔','˜','¨','⌜','˘','`','∘','○','⌾','⍟','⊘','⊸','⟜',str("+-×÷⋆√⌊⌈|¬∧∨<>≠=≤≥≡≢⊣⊢⥊∾≍↑↓↕«»⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔!˙˜˘¨⌜⁼´˝`∘○⊸⟜⌾⊘◶⎉⚇⍟⎊%"),str("´: 𝕩 must be a list"),str("´: Identity not found"),str("Mapping: Equal-rank argument shapes don\'t agree"),str("Mapping: Argument shape prefixes don\'t agree"),str("⍋𝕩: 𝕩 must have rank at least 1"),str("⍋ or ⍒: Rank of 𝕨 must be at least 1"),str("⍋ or ⍒: Rank of 𝕩 must be at least cell rank of 𝕨"),str("⍋ or ⍒: 𝕨 must be sorted"),str("p⊐𝕩 or 𝕨∊p: p must have rank at least 1"),str("p⊐n or n∊p: Rank of n must be at least cell rank of p"),str("/: Replication argument must have rank 1"),str("/: Amounts to replicate must be natural numbers"),str("⌽𝕩: 𝕩 must have rank at least 1"),str("𝕨⌽𝕩: 𝕨 must consist of integers"),str("↑𝕩: 𝕩 must have rank at least 1"),str("↓𝕩: 𝕩 must have rank at least 1"),str("𝕨⊑𝕩: Indices in 𝕨 must consist of integers"),str("𝕨⊑𝕩: Index out of range"),str("𝕨⊏𝕩: Indices in 𝕨 must be integers"),str("𝕨⊏𝕩: Indices out of range"),str("𝕨⊑𝕩: 𝕩 must be a list when 𝕨 is a number"),str("𝕨⊑𝕩: Indices in compound 𝕨 must be lists"),str("𝕨⊑𝕩: Index length in 𝕨 must match rank of 𝕩"),str("⊏𝕩: 𝕩 must have rank at least 1"),str("⊏𝕩: 𝕩 cannot have length 0"),str("𝕨⊏𝕩: 𝕨 must be an array"),str("⌾: Incompatible result elements in structural Under"),str(">𝕩: Elements of 𝕩 must have matching shapes"),str("∾𝕩: Elements of 𝕩 must all have the same rank"),str("∾𝕩: 𝕩 element rank must be at least argument rank"),str("∾𝕩: 𝕩 element shapes must be compatible"),str("∾𝕩: 𝕩 element trailing shapes must match"),str("∾𝕩: empty 𝕩 fill rank must be at least argument rank"),str("∾𝕩: 𝕩 must be an array"),str("⊢⊣˜∘○⊸⟜⊘◶"),str("=≠≢"),str("<"),str("≍"),str("↕/»«⊔"),str("⥊↑↓⌽⍉⊏⊑"),str("𝕨"),str("𝕩: 𝕨 must "),str("have rank at most 1"),str("consist of integers"),str("↑"),str("↓"),str("« or »: 𝕩 must have rank at least 1"),str("« or »: 𝕨 must not have higher rank than 𝕩"),str("« or »: Rank of 𝕨 must be at least rank of 𝕩 minus 1"),str("« or »: 𝕨 must share 𝕩\'s major cell shape"),str("↕𝕩: 𝕩 must consist of natural numbers"),str("↕𝕩: 𝕩 must be a number or list"),str("𝕨↕𝕩: 𝕨 must have rank at most 1"),str("𝕨↕𝕩: Length of 𝕨 must be at most rank of 𝕩"),str("𝕨↕𝕩: 𝕨 must consist of natural numbers"),str("𝕨↕𝕩: Window length 𝕨 must be at most axis length plus one"),str("First-axis primitive: 𝕩 must have rank at least 1"),str("Multi-axis primitive: 𝕨 must have rank at most 1"),str("Multi-axis primitive: Length of 𝕨 must be at most rank of 𝕩"),str("𝕨/𝕩: Lengths of components of 𝕨 must match 𝕩"),str("∊𝕩 or ⊐𝕩: 𝕩 must have rank at least 1"),str("∘⌊⌽↑"),str("𝕨⥊𝕩: 𝕨 must have rank at most 1"),str("𝕨⥊𝕩: 𝕨 must consist of natural numbers"),str("𝕨⥊𝕩: Can\'t compute axis length when rest of shape is empty"),str("𝕨⥊𝕩: 𝕨 must consist of natural numbers or ∘ ⌊ ⌽ ↑"),str("𝕨⥊𝕩: Shape must be exact when reshaping with ∘"),str("⊔: Grouping argument must consist of integers"),str("⊔: Grouping argument values cannot be less than ¯1"),str("⊔𝕩: 𝕩 must be a list"),str("𝕨⊔𝕩: Rank of simple 𝕨 must be at most rank of 𝕩"),str("𝕨⊔𝕩: Lengths of 𝕨 must equal to 𝕩, or one more only in a rank-1 component"),str("𝕨⊔𝕩: 𝕩 must be an array"),str("≥: No monadic form"),str("≤: No monadic form"),str("⎉ or ⚇: 𝔽 result must have rank at most 1"),str("⎉ or ⚇: 𝔽 result must have 1 to 3 elements"),str("⎉ or ⚇: 𝔽 result must consist of integers"),str("˝: 𝕩 must have rank at least 1"),str("˝: Identity does not exist"),str("𝕨∾𝕩: Rank of 𝕨 and 𝕩 must differ by at most 1"),str("𝕨∾𝕩: Cell shapes of 𝕨 and 𝕩 must match"),str("⍟: Repetition numbers in 𝕨𝔾𝕩 must be integers"),str("𝕨⊔𝕩: Compound 𝕨 must be a list"),str("𝕨⊔𝕩: Total rank of 𝕨 must be at most rank of 𝕩"),str("⍷𝕩: Rank of 𝕨 cannot exceed rank of 𝕩"),str("⊒: Rank of 𝕨 must be at least 1"),str("⊒: Rank of 𝕩 must be at least cell rank of 𝕨"),str("𝕨⍉𝕩: 𝕨 must have rank at most 1"),str("𝕨⍉𝕩: Length of 𝕨 must not exceed rank of 𝕩"),str("𝕨⍉𝕩: 𝕨 must consist of natural numbers"),str("𝕨⍉𝕩: Skipped result axis"),str("Cannot currently invert blocks"),str("Cannot invert modifier"),str("⁼: Inverse failed"),str("⁼: Inverse does not exist"),str("⁼: Inverse not found")]) - ,[[0,1,0,194],[0,0,4242,3],[0,0,4250,3],[0,0,4254,3],[2,0,4267,6],[0,0,4294,3],[0,0,4298,3],[0,0,4302,3],[1,0,4306,5],[1,0,4314,5],[2,0,4332,6],[2,0,4347,6],[2,0,4366,6],[2,0,4388,6],[2,0,4410,6],[0,0,4442,3],[0,0,4454,3],[0,0,4463,3],[0,0,4469,3],[1,0,4486,9],[0,0,4606,4],[0,0,4682,3],[0,0,4702,3],[0,0,4742,5],[0,0,4817,3],[1,1,4834,2],[2,1,4865,3],[1,1,4899,2],[0,0,4916,4],[2,1,4983,5],[0,0,5020,3],[1,1,5027,4],[1,1,5100,3],[0,0,5178,3],[0,0,5189,4],[1,0,5259,9],[0,0,5332,5],[1,1,5416,4],[1,1,5472,3],[1,0,5496,14],[1,1,5946,4],[0,0,5998,4],[0,0,6052,6],[0,0,6142,3],[0,0,6167,7],[0,0,6296,4],[0,0,6357,4],[0,0,6470,3],[0,0,6538,4],[0,0,6615,6],[0,0,6692,3],[0,0,6734,5],[0,0,6837,3],[0,0,6855,3],[0,0,6905,3],[0,0,6950,4],[2,1,7051,3],[0,0,7094,3],[2,0,7098,16],[0,0,7409,3],[0,0,7436,3],[0,0,7462,3],[0,0,7477,3],[1,0,7506,5],[2,1,7544,3],[0,0,7613,4],[0,0,7718,7],[0,0,7765,14],[0,0,7999,5],[0,0,8096,3],[0,0,8104,6],[0,0,8131,5],[0,0,8152,6],[0,1,8179,10],[1,1,8497,8],[1,0,8550,6],[1,1,8658,2],[0,0,8716,5],[0,0,8878,5],[0,0,9015,7],[0,0,9184,3],[0,0,9243,5],[0,0,9277,4],[1,0,9344,5],[2,1,9361,4],[0,0,9404,5],[0,0,9492,3],[1,0,9525,6],[0,0,9664,9],[1,0,9831,9],[0,0,9988,4],[0,0,10104,8],[0,0,10332,3],[0,0,10377,3],[0,0,10404,3],[0,0,10426,3],[0,0,10448,3],[0,0,10467,3],[1,1,10564,2],[2,0,10633,10],[2,0,10692,8],[1,0,10885,7],[0,0,10952,8],[2,0,11192,10],[0,0,11267,10],[0,0,11697,4],[0,0,11805,4],[0,0,11916,3],[0,0,11992,3],[0,0,12047,4],[0,0,12180,4],[1,1,12302,2],[2,0,12310,6],[1,1,12325,2],[0,0,12440,3],[0,0,12448,3],[0,0,12456,3],[0,0,12477,8],[0,0,12559,3],[0,0,12567,3],[0,0,12575,3],[0,0,12583,3],[0,0,12591,3],[0,0,12599,3],[0,0,12611,3],[2,0,12636,7],[0,0,12677,6],[0,0,12901,4],[0,0,13007,3],[0,0,13050,5],[0,0,13194,3],[0,0,13241,3],[0,0,13267,3],[1,0,13358,5],[0,0,13386,3],[0,0,13422,3],[0,0,13470,3],[0,0,13524,3],[0,0,13536,3],[1,1,13616,2],[0,0,13646,4],[0,0,13683,3],[0,0,13698,3],[0,0,13727,3],[0,0,13742,3],[0,0,13760,3],[0,0,13775,3],[0,0,13785,3],[2,0,13842,6],[0,0,13870,3],[1,1,13898,2],[1,1,13902,2],[0,0,13906,3],[0,0,13918,3],[0,0,13941,3],[0,0,13956,3],[0,0,13964,3],[1,0,13972,6],[1,0,14089,11],[1,0,14310,5],[0,0,14325,3],[0,0,14339,3],[0,0,14353,7],[0,0,14430,6],[0,0,14478,3],[0,0,14498,3],[0,0,14506,4],[0,0,14565,4],[0,0,14592,3],[0,0,14611,10],[0,0,14816,8],[0,0,14983,3],[1,1,15009,2],[0,0,15026,3],[0,0,15053,3],[0,0,15063,3],[2,0,15080,11],[0,0,15157,5],[0,0,15235,8],[0,0,15318,3],[0,0,15326,3],[1,0,15370,7],[0,0,15396,9],[1,0,15682,5],[0,0,15698,7],[1,0,15865,5],[2,0,15902,6],[0,0,15933,3],[0,0,15943,3],[0,0,15953,4],[0,0,15994,4],[0,0,16017,3],[0,0,16025,3],[0,0,16053,11],[0,0,16295,3],[0,0,16315,3],[0,0,16379,8],[0,0,16691,3],[0,0,16719,5],[0,0,16814,3],[0,0,16824,3],[0,0,16843,8],[0,0,17108,3],[0,0,17155,3],[0,0,17187,3],[0,0,17217,3],[0,0,17255,5],[0,0,17329,3],[1,0,17342,6],[0,0,17495,7],[0,0,17637,5],[0,0,17717,3],[0,0,17740,3],[0,0,17751,3],[0,0,17759,9],[0,0,17903,3],[0,0,17932,3],[0,0,17950,3],[0,0,17975,3],[0,0,17997,3],[0,0,18008,3],[1,1,18022,2],[1,0,18026,5],[1,0,18037,5],[0,0,18048,3],[0,0,18087,5],[0,0,18200,3],[0,0,18252,13],[0,0,18457,3],[0,0,18480,3],[0,0,18504,4],[0,0,18596,3],[0,0,18616,3],[0,0,18648,3],[0,0,18659,3],[0,0,18702,7],[0,0,18849,12],[2,0,19047,6],[0,0,19095,3],[0,0,19166,3],[0,0,19195,4],[1,0,19218,5],[0,0,19229,4],[0,0,19240,4],[0,0,19251,3],[1,0,19284,5],[0,0,19310,3],[0,0,19380,3],[0,0,19394,3],[0,0,19405,5],[0,0,19541,3],[0,0,19571,3],[0,0,19591,3],[0,0,19645,3],[0,0,19679,5],[0,0,19709,3],[0,0,19724,3],[1,0,19767,5],[0,0,19778,3],[0,0,19821,3],[2,0,19842,6],[1,1,19857,2],[1,1,19865,2],[0,0,19873,5],[0,0,19912,3],[0,0,19937,6],[0,0,20069,3],[0,0,20112,3],[0,0,20157,6],[0,0,20237,5],[0,0,20288,6],[0,0,20443,3],[0,0,20472,3],[0,0,20488,3],[0,0,20496,8],[0,0,20555,5],[0,0,20584,3],[0,0,20599,3],[1,1,20641,2],[2,1,20660,3],[0,0,20682,3],[0,0,20700,3],[0,0,20732,3],[1,0,20769,5],[0,0,20786,3],[0,0,20807,14],[0,0,20982,3],[0,0,21004,3],[0,0,21021,4],[0,0,21082,3],[0,0,21116,3],[0,0,21199,3],[0,0,21233,3],[0,0,21262,3],[0,0,21280,3],[0,0,21297,3]] + [0,73,22,0,0,11,14,15,1,22,0,1,11,14,15,2,0,21,15,3,8,22,0,2,11,14,15,4,22,0,3,11,14,15,5,22,0,4,11,14,15,6,22,0,5,11,14,15,7,22,0,6,11,14,15,8,22,0,7,11,14,15,9,22,0,8,11,14,15,10,22,0,9,11,14,15,11,22,0,10,11,14,15,12,22,0,11,11,14,21,0,4,0,13,7,22,0,12,11,14,21,0,12,0,7,0,23,19,0,21,31,0,11,8,22,0,13,11,14,0,13,0,7,0,23,19,22,0,14,11,14,0,7,0,8,21,0,12,19,0,7,21,0,2,19,0,21,0,11,8,22,0,15,11,14,0,7,0,8,0,13,19,0,7,21,0,2,19,0,21,0,7,21,0,5,21,0,15,21,0,5,0,7,8,8,8,22,0,16,11,14,0,7,21,0,1,3,2,21,0,9,0,13,21,0,7,0,24,8,8,22,0,17,11,14,0,23,0,14,0,16,0,24,19,3,2,21,0,9,0,12,21,0,13,0,24,19,8,22,0,18,11,14,15,13,22,0,19,11,14,15,14,22,0,20,11,14,15,15,22,0,21,11,14,15,16,22,0,22,11,14,31,0,22,22,0,23,11,14,21,0,1,0,20,15,17,15,18,3,2,21,0,9,21,0,1,21,0,5,0,12,8,0,12,0,23,19,8,8,22,0,24,11,14,31,0,24,22,0,25,11,14,15,19,22,0,26,11,14,15,20,22,0,27,11,14,15,21,22,0,28,11,14,0,0,0,12,0,24,19,22,0,29,11,14,0,24,0,12,21,0,7,21,0,15,8,3,2,21,0,9,0,0,0,12,0,23,19,8,22,0,30,11,14,0,24,0,12,21,0,7,21,0,15,8,0,8,0,13,21,0,7,0,24,8,19,3,2,21,0,9,0,0,0,12,0,23,19,8,22,0,31,11,14,15,22,0,15,3,2,21,0,9,21,0,29,8,22,0,32,11,14,15,23,0,21,15,24,8,22,0,33,11,14,21,0,29,0,7,0,23,19,21,0,10,21,0,13,8,22,0,34,11,14,0,14,21,0,8,21,0,21,8,22,0,35,11,14,15,25,22,0,36,11,14,15,26,22,0,37,11,14,15,27,22,0,38,11,14,21,0,38,0,33,7,22,0,39,11,14,15,28,22,0,40,11,14,15,29,22,0,41,11,14,0,34,0,24,0,35,0,24,0,36,0,23,0,37,0,23,0,38,0,23,0,39,0,23,0,40,0,26,0,41,0,27,0,42,0,24,0,43,0,23,0,44,0,24,0,45,0,23,0,46,0,24,0,47,0,23,3,28,21,0,41,21,0,3,0,24,7,0,5,0,74,19,8,15,30,9,22,0,42,11,14,15,31,22,0,43,11,14,15,32,22,0,44,11,14,15,33,22,0,45,11,14,0,13,0,7,21,0,12,19,22,0,46,11,14,0,23,0,15,0,16,0,24,19,21,0,8,0,13,0,8,0,25,19,0,7,0,23,19,15,34,3,2,21,0,9,21,0,1,21,0,5,21,0,29,8,8,8,3,2,21,0,9,21,0,1,21,0,5,0,14,8,21,0,23,0,8,7,0,23,19,21,0,13,0,24,19,8,22,0,47,11,14,15,35,22,0,48,11,14,15,36,22,0,49,11,14,21,0,46,21,0,47,21,0,4,21,0,47,7,0,7,9,3,2,21,0,9,21,0,2,21,0,5,21,0,29,8,8,15,37,3,3,21,0,9,21,0,29,21,0,6,0,6,8,8,22,0,50,11,14,15,38,22,0,51,11,14,15,39,22,0,52,11,14,15,40,22,0,53,11,14,21,0,53,21,0,50,7,0,21,21,0,51,0,24,7,8,22,0,54,11,14,31,0,53,21,0,4,21,0,50,7,7,0,21,31,0,51,0,23,7,8,22,0,55,11,14,15,41,22,0,56,11,14,15,42,22,0,57,11,14,21,0,25,21,0,7,21,0,57,8,22,0,58,11,14,21,0,34,21,0,1,0,20,15,43,8,3,2,21,0,9,0,12,21,0,13,0,24,19,8,22,0,59,11,14,15,44,21,0,10,21,0,1,0,20,15,45,8,8,22,0,60,11,14,15,46,22,0,61,11,14,15,47,22,0,62,11,14,15,48,22,0,63,11,14,15,49,22,0,64,11,14,0,90,0,91,3,2,0,92,0,93,3,2,3,2,0,18,15,50,7,16,22,0,65,22,0,66,4,2,11,14,15,51,22,0,67,11,14,21,0,34,21,0,8,15,52,8,22,0,68,11,14,31,0,68,15,53,3,2,21,0,9,21,0,2,21,0,5,0,15,21,0,5,0,18,21,0,29,7,8,8,21,0,23,0,6,7,0,24,19,21,0,13,0,24,19,8,22,0,69,11,14,31,0,67,21,0,69,3,2,21,0,9,21,0,2,21,0,5,21,0,29,8,8,22,0,70,11,14,15,54,22,0,71,11,14,15,55,22,0,72,11,14,21,0,1,0,15,0,1,0,16,21,0,7,0,24,8,3,2,21,0,9,21,0,18,21,0,13,0,24,19,8,9,3,2,21,0,9,21,0,29,8,22,0,73,11,14,15,56,22,0,74,11,14,15,57,22,0,75,11,14,15,58,22,0,76,11,14,0,24,0,12,21,0,7,21,0,3,21,0,76,7,8,3,2,21,0,9,0,0,0,12,0,29,19,8,22,0,77,11,14,15,59,22,0,78,11,14,21,0,44,0,12,7,21,0,23,0,8,7,0,23,19,22,0,79,11,14,21,0,29,21,0,6,0,12,8,0,24,3,2,21,0,1,21,0,5,21,0,29,8,0,12,3,2,0,12,21,0,6,0,12,8,0,24,3,2,0,14,21,0,6,21,0,79,8,0,24,3,2,15,60,3,5,21,0,23,15,61,7,16,22,0,80,11,14,21,0,1,21,0,29,9,0,12,21,0,6,0,12,8,0,14,21,0,6,21,0,79,8,3,3,21,0,23,15,62,7,16,22,0,81,11,14,0,24,15,63,3,2,21,0,9,21,0,29,8,22,0,82,11,14,21,0,80,0,21,21,0,82,8,22,0,83,11,14,21,0,80,0,7,0,23,19,0,21,3,0,0,14,3,2,21,0,9,21,0,29,8,8,22,0,84,11,14,15,64,22,0,85,11,14,21,0,83,21,0,5,0,5,8,21,0,2,21,0,1,19,22,0,86,11,14,0,15,21,0,5,0,1,0,20,21,0,1,8,21,0,23,21,0,86,0,20,21,0,1,8,7,3,2,21,0,9,21,0,18,21,0,13,0,24,19,8,8,22,0,87,11,14,15,65,22,0,88,11,14,21,0,29,21,0,10,21,0,19,21,0,88,15,66,8,8,22,0,89,11,14,15,67,22,0,90,11,14,15,68,22,0,91,11,14,21,0,29,0,5,0,107,19,21,0,2,15,69,31,0,88,21,0,89,21,0,91,21,0,90,3,2,21,0,9,0,18,0,12,0,12,0,23,19,7,21,0,23,0,8,7,0,23,19,8,31,0,91,3,3,21,0,9,0,12,21,0,15,0,25,19,8,8,19,22,0,92,11,14,21,0,1,21,0,1,21,0,1,21,0,23,15,70,7,9,15,71,15,72,15,73,3,6,21,0,9,21,0,2,8,22,0,93,11,14,15,74,22,0,94,11,14,15,75,22,0,95,11,14,21,0,95,0,118,21,0,17,21,0,8,0,12,8,0,7,0,23,19,15,76,3,3,7,22,0,96,11,14,31,0,95,0,119,0,12,21,0,7,0,24,8,0,7,0,23,19,15,77,3,3,7,22,0,97,11,14,15,78,22,0,98,11,14,15,79,22,0,99,11,14,15,80,22,0,100,11,14,15,81,22,0,101,11,14,15,82,22,0,102,11,14,15,83,22,0,103,11,14,15,84,22,0,104,11,14,15,85,22,0,105,11,14,21,0,1,0,20,21,0,18,0,12,0,24,19,0,7,0,23,19,21,0,105,15,86,15,87,3,2,21,0,9,21,0,2,21,0,5,0,12,8,21,0,13,0,24,19,8,8,8,22,0,106,11,14,0,4,21,0,7,21,0,85,0,23,7,8,22,0,107,11,14,15,88,22,0,108,11,14,21,0,108,21,0,1,0,19,0,6,7,0,28,19,21,0,4,21,0,25,7,21,0,4,21,0,25,21,0,7,21,0,57,8,21,0,5,21,0,54,21,0,5,21,0,107,8,8,7,19,7,22,0,109,11,14,0,31,0,17,16,21,0,37,0,135,8,22,0,110,11,14,15,89,22,0,111,11,14,0,15,0,21,21,0,32,8,22,0,112,11,14,15,90,22,0,113,11,14,15,91,22,0,114,11,14,15,92,21,0,7,21,0,34,8,22,0,115,11,14,15,93,22,0,116,11,14,21,0,45,0,9,7,22,0,117,11,14,21,0,45,0,10,7,22,0,118,11,14,21,0,4,21,0,117,21,0,8,21,0,118,8,7,0,21,0,25,21,0,117,16,21,0,8,21,0,118,8,8,22,0,119,11,14,21,0,45,15,94,0,21,21,0,17,8,7,22,0,120,11,14,21,0,45,15,95,0,21,21,0,15,8,7,22,0,121,11,14,21,0,45,15,96,0,21,0,7,21,0,5,21,0,121,21,0,5,0,7,8,8,8,7,22,0,122,11,14,21,0,45,0,8,7,0,21,21,0,25,21,0,7,21,0,54,8,8,22,0,123,11,14,21,0,45,0,8,0,7,0,6,19,7,0,21,21,0,25,21,0,7,21,0,55,8,8,22,0,124,11,14,21,0,45,0,8,0,21,21,0,14,0,7,21,0,13,19,21,0,7,0,24,8,8,7,22,0,125,11,14,21,0,45,21,0,12,0,7,0,23,19,7,0,21,21,0,13,8,22,0,126,11,14,21,0,45,0,13,0,7,0,23,19,7,0,21,31,0,89,8,22,0,127,11,14,21,0,45,0,12,0,7,0,23,19,7,0,21,21,0,18,8,22,0,128,11,14,21,0,45,0,12,7,0,21,0,12,8,22,0,129,11,14,21,0,45,21,0,12,7,0,21,21,0,3,0,24,7,0,5,0,147,19,8,22,0,130,11,14,21,0,45,0,13,7,0,21,21,0,3,0,24,7,0,5,0,148,19,8,22,0,131,11,14,21,0,45,0,6,7,22,0,132,11,14,21,0,45,0,7,7,22,0,133,11,14,21,0,133,21,0,132,0,23,19,22,0,134,11,14,21,0,2,21,0,129,21,0,129,21,0,128,21,0,83,21,0,84,3,4,19,21,0,23,21,0,132,7,9,21,0,10,15,97,8,22,0,135,11,14,15,98,22,0,136,11,14,15,99,22,0,137,11,14,15,100,22,0,138,11,14,15,101,22,0,139,11,14,15,102,22,0,140,11,14,21,0,86,0,20,21,0,112,21,0,6,21,0,19,8,15,103,3,2,21,0,9,21,0,129,21,0,126,0,23,19,21,0,6,21,0,124,8,8,8,22,0,141,11,14,15,104,22,0,142,11,14,31,0,103,0,21,21,0,102,8,22,0,143,11,14,0,24,21,0,105,31,0,62,8,0,21,21,0,61,8,22,0,144,11,14,31,0,106,0,21,21,0,57,8,22,0,145,11,14,21,0,86,0,21,21,0,1,8,0,20,21,0,99,0,21,31,0,99,21,0,7,21,0,101,8,8,8,22,0,146,11,14,21,0,86,0,21,21,0,1,8,0,20,21,0,100,0,21,31,0,100,21,0,7,31,0,101,8,8,8,22,0,147,11,14,15,105,22,0,148,11,14,31,0,96,0,21,31,0,63,8,22,0,149,11,14,31,0,97,0,21,31,0,64,8,22,0,150,11,14,31,0,116,0,21,31,0,114,8,22,0,151,11,14,21,0,56,0,23,7,0,21,31,0,109,8,22,0,152,11,14,21,0,4,31,0,56,0,24,7,7,0,21,31,0,108,21,0,1,7,8,22,0,153,11,14,21,0,139,22,0,154,11,14,21,0,34,21,0,6,15,106,8,22,0,155,11,14,21,0,54,21,0,5,21,0,54,8,21,0,25,21,0,133,21,0,1,19,21,0,4,21,0,152,7,19,0,1,0,24,19,22,0,156,11,14,15,107,0,1,0,24,19,22,0,157,11,14,15,108,22,0,158,11,14,21,0,1,0,20,15,109,8,22,0,159,11,14,15,110,22,0,160,11,14,15,111,22,0,161,11,14,15,112,22,0,162,11,14,15,113,22,0,163,11,14,15,114,22,0,164,11,14,0,23,21,0,1,15,115,21,0,5,0,24,0,16,21,0,7,21,0,3,0,23,7,21,0,133,21,0,128,19,8,31,0,38,0,48,7,9,3,2,21,0,9,0,16,21,0,7,0,24,8,21,0,129,0,32,19,8,8,9,3,2,21,0,9,0,0,21,0,131,0,29,19,8,22,0,165,11,14,15,116,21,0,6,15,117,8,22,0,166,11,14,15,118,22,0,167,11,14,15,119,21,0,1,0,16,21,0,7,0,23,8,15,120,9,21,0,3,21,0,3,0,24,7,0,5,0,166,19,7,0,16,21,0,7,0,25,8,21,0,166,0,16,21,0,7,0,23,8,19,31,0,167,0,16,21,0,7,0,25,8,15,121,21,0,8,15,122,8,0,16,21,0,7,0,23,8,19,0,16,21,0,7,0,25,8,15,123,21,0,8,15,124,8,21,0,25,21,0,7,0,23,0,29,3,2,8,19,3,6,21,0,9,21,0,2,8,0,16,21,0,7,0,24,8,19,9,22,0,168,11,14,15,125,31,0,168,21,0,3,0,24,7,0,5,0,167,19,3,3,21,0,145,0,29,0,23,0,25,3,3,17,21,0,9,0,0,8,22,0,169,11,14,31,0,141,0,21,21,0,92,8,22,0,170,11,14,0,5,21,0,7,0,168,8,22,0,171,11,14,0,5,21,0,7,0,169,8,22,0,172,11,14,21,0,3,0,24,7,0,5,0,170,19,22,0,173,11,14,15,126,22,0,174,11,14,15,127,22,0,175,11,14,15,128,22,0,176,11,14,21,0,1,0,20,0,23,31,0,105,31,0,72,8,21,0,7,21,0,34,8,0,21,31,0,71,8,8,22,0,177,11,14,0,34,21,0,4,21,0,133,7,0,21,21,0,132,8,0,35,21,0,133,0,36,21,0,4,21,0,117,7,0,21,21,0,125,21,0,174,21,0,1,8,8,0,37,21,0,117,0,38,21,0,45,0,2,7,0,49,21,0,4,21,0,118,7,0,21,21,0,4,21,0,125,7,8,0,43,21,0,4,21,0,117,7,0,21,21,0,123,21,0,174,21,0,1,8,8,0,42,21,0,2,21,0,133,0,23,19,21,0,117,21,0,4,21,0,133,7,19,0,21,21,0,124,21,0,174,21,0,1,8,8,0,39,21,0,134,0,50,0,24,21,0,5,21,0,171,8,0,21,15,129,8,0,51,21,0,1,0,52,21,0,83,21,0,5,21,0,172,8,21,0,2,21,0,1,19,0,21,21,0,1,8,0,33,15,130,0,21,0,24,21,0,5,21,0,171,8,8,0,53,15,131,0,21,15,132,8,0,54,0,24,21,0,5,21,0,171,8,0,21,21,0,149,21,0,174,0,16,21,0,7,0,28,8,8,8,0,55,0,24,21,0,5,21,0,171,8,0,21,21,0,150,21,0,174,0,16,21,0,7,0,24,8,8,8,0,56,0,24,21,0,5,21,0,171,8,0,21,21,0,143,21,0,174,21,0,84,8,8,0,57,21,0,144,21,0,7,21,0,133,8,0,21,21,0,144,8,0,58,31,0,161,0,21,31,0,60,8,0,59,0,24,21,0,5,21,0,171,8,0,21,15,133,8,0,60,31,0,176,0,21,31,0,175,8,3,42,21,0,41,21,0,173,8,22,0,178,11,14,0,34,21,0,4,21,0,133,7,0,21,0,25,21,0,8,21,0,117,8,8,0,35,21,0,132,0,21,0,24,21,0,5,21,0,171,8,8,0,36,21,0,4,21,0,117,7,0,21,21,0,119,8,0,37,21,0,125,0,21,0,24,21,0,5,21,0,171,8,8,0,38,21,0,119,0,21,0,24,21,0,5,21,0,171,8,8,0,49,0,2,21,0,117,9,0,21,0,24,21,0,5,21,0,171,8,8,0,43,21,0,4,21,0,117,7,0,21,21,0,119,8,0,42,21,0,2,21,0,133,0,23,19,21,0,117,21,0,4,21,0,133,7,19,0,21,21,0,134,21,0,5,21,0,119,8,21,0,134,9,8,0,39,21,0,3,0,23,7,21,0,133,21,0,132,19,0,21,0,24,21,0,5,21,0,171,8,8,3,18,21,0,41,21,0,173,8,22,0,179,11,14,15,134,22,0,180,11,14,0,61,21,0,179,0,62,15,135,0,63,15,136,0,64,15,137,0,65,15,138,21,0,5,15,139,8,3,10,21,0,41,21,0,3,21,0,173,7,8,22,0,181,11,14,31,0,142,22,0,182,11,14,31,0,78,22,0,183,11,14,15,140,0,66,31,0,166,0,67,15,141,0,68,15,142,0,69,21,0,3,0,24,21,0,5,21,0,171,8,7,15,143,15,144,3,2,21,0,9,21,0,131,21,0,7,0,24,8,8,3,2,21,0,9,21,0,1,21,0,5,21,0,30,8,8,0,70,15,145,0,71,15,146,15,147,21,0,1,3,2,21,0,9,21,0,2,8,21,0,2,21,0,5,21,0,165,8,19,0,72,15,148,3,14,31,0,41,21,0,3,21,0,173,7,8,7,22,0,184,11,14,31,0,43,22,0,185,11,14,31,0,140,22,0,186,11,14,31,0,164,22,0,187,11,14,21,0,70,0,21,31,0,73,8,22,0,188,11,14,15,149,22,0,189,11,14,31,0,138,22,0,190,11,14,21,0,111,0,21,21,0,32,8,22,0,191,11,14,31,0,86,0,21,21,0,1,8,0,20,21,0,33,21,0,5,21,0,127,8,8,22,0,192,11,14,31,0,160,0,21,31,0,59,8,22,0,193,11,14,31,0,157,0,21,21,0,156,8,22,0,194,11,14,31,0,155,0,21,21,0,145,21,0,7,21,0,153,8,8,22,0,195,11,14,21,0,132,21,0,133,21,0,125,21,0,117,31,0,118,31,0,119,21,0,121,21,0,122,21,0,120,21,0,134,21,0,123,21,0,124,21,0,126,21,0,127,21,0,128,21,0,129,21,0,131,21,0,130,21,0,83,21,0,84,21,0,2,21,0,1,31,0,191,21,0,170,31,0,192,21,0,149,21,0,150,21,0,143,31,0,147,21,0,146,21,0,144,31,0,193,21,0,145,21,0,54,21,0,55,21,0,177,21,0,188,21,0,152,31,0,194,21,0,153,31,0,195,21,0,151,0,5,21,0,3,21,0,4,21,0,104,21,0,85,21,0,180,31,0,187,31,0,185,31,0,186,0,19,21,0,5,21,0,6,21,0,7,21,0,8,21,0,183,0,21,31,0,189,21,0,154,31,0,190,21,0,182,0,22,3,63,15,150,16,25,21,0,1,25,21,0,2,25,21,0,1,25,21,0,1,14,21,0,4,25,21,0,1,21,1,2,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,2,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,2,21,0,2,17,17,25,21,0,1,15,151,21,0,5,0,16,21,0,1,21,0,4,21,0,2,17,17,7,21,0,2,17,25,21,0,1,15,152,21,1,1,21,0,4,3,2,0,16,21,0,1,21,0,5,21,0,2,17,17,7,21,0,2,17,25,21,0,1,3,1,0,15,3,0,17,0,1,21,0,1,17,25,21,0,2,21,1,18,16,22,0,3,11,14,21,0,1,21,1,18,16,0,6,21,0,3,17,0,17,16,0,18,21,0,2,21,1,8,0,16,8,21,1,4,21,0,1,7,0,16,21,0,3,21,1,8,0,7,8,19,3,2,21,1,9,0,13,21,1,7,31,0,3,8,8,7,16,25,21,0,2,0,17,16,0,18,21,0,1,21,1,8,0,16,8,7,16,25,21,0,2,0,7,21,0,1,21,1,18,16,17,0,17,16,0,18,21,1,3,21,0,1,7,0,16,0,6,21,1,7,21,0,2,8,19,7,16,25,21,0,1,21,1,18,16,22,0,5,11,14,21,0,4,22,0,6,11,14,21,0,1,21,1,2,0,21,15,153,8,21,0,2,17,22,0,7,11,14,21,0,5,0,17,16,0,18,21,1,3,21,0,1,7,0,16,0,7,21,1,7,0,23,0,7,21,0,5,17,8,19,15,154,9,7,16,14,21,0,7,25,21,0,1,0,14,16,21,1,21,0,23,17,22,0,3,11,21,1,23,0,8,7,0,23,17,22,0,4,11,14,21,0,4,0,17,16,0,15,31,0,3,17,0,18,21,1,3,21,0,1,0,15,16,7,0,16,0,6,19,7,21,0,2,0,18,0,8,21,1,7,31,0,4,8,7,16,17,25,21,0,2,0,18,21,0,1,21,1,8,0,16,8,7,16,25,0,24,21,0,1,3,2,25,21,0,1,25,21,0,1,22,1,26,22,1,27,4,2,12,25,21,0,1,3,1,0,1,21,0,1,17,25,21,0,2,21,0,1,3,2,25,21,0,1,3,1,25,21,1,13,0,18,0,12,0,7,0,23,19,7,21,0,1,19,0,19,0,8,7,9,21,1,23,0,6,7,9,25,21,1,3,21,1,0,0,18,21,1,36,21,0,1,7,21,1,4,0,16,7,21,0,2,19,7,16,7,0,16,15,155,19,25,15,156,0,12,21,0,1,21,1,36,21,1,0,7,16,19,25,0,25,0,9,21,0,1,21,1,18,16,17,0,17,16,0,18,0,8,21,1,7,0,25,8,7,16,22,0,3,11,14,21,0,1,21,1,25,21,0,3,17,21,0,1,21,1,25,31,0,3,0,18,0,6,21,1,7,0,23,8,7,16,17,3,2,25,21,0,2,21,1,40,16,22,0,3,22,0,4,4,2,11,14,21,0,1,3,1,21,1,19,31,0,4,17,21,1,37,31,0,3,8,25,0,24,21,0,1,16,25,21,0,1,0,12,16,0,12,0,23,17,0,5,0,75,17,14,21,0,1,21,1,3,21,0,4,7,21,1,42,9,21,1,23,21,0,4,7,3,2,21,1,9,0,23,0,21,21,1,18,21,1,13,0,24,19,8,8,21,0,2,17,25,15,157,22,0,2,11,14,15,158,22,0,3,11,14,21,0,3,21,0,1,7,21,1,4,31,0,3,21,1,4,21,0,1,7,7,7,3,2,21,1,9,0,12,21,1,6,21,1,14,8,8,31,0,2,21,0,1,7,3,2,21,1,9,0,12,21,1,6,0,12,8,8,25,15,159,21,0,1,7,22,0,2,11,14,21,0,1,21,0,2,0,20,15,160,15,161,3,2,21,1,9,21,1,29,21,1,6,21,1,14,8,8,0,21,0,18,21,0,2,7,8,8,21,0,2,0,20,21,1,44,21,0,2,7,8,3,3,21,1,9,21,1,29,21,1,6,0,6,8,8,25,21,0,1,21,1,47,21,0,2,17,25,21,0,1,0,18,21,1,13,21,1,7,0,24,8,7,21,1,23,0,8,7,0,23,19,21,1,6,0,7,8,21,0,2,17,22,0,3,11,14,21,0,1,21,0,3,0,24,3,2,15,162,3,2,21,1,9,0,24,0,12,31,0,3,17,8,21,0,2,17,25,21,0,4,22,0,5,11,14,0,24,21,1,2,21,0,2,17,22,0,6,11,14,21,0,1,22,0,7,11,14,15,163,22,0,8,11,14,31,0,8,21,0,7,0,12,0,23,17,21,1,10,21,1,3,21,0,5,7,15,164,0,21,21,1,1,8,21,0,2,19,8,16,25,21,0,1,0,14,21,1,6,21,1,48,8,21,0,2,17,22,0,3,11,14,31,0,3,21,1,23,21,1,49,21,0,1,0,15,16,21,1,8,0,16,8,21,1,8,21,1,50,21,1,7,21,0,2,0,15,16,21,1,8,0,16,8,8,8,7,7,16,22,0,4,11,14,0,24,21,1,4,31,0,4,7,16,25,21,0,1,22,0,2,11,14,21,1,50,21,1,46,21,1,3,0,24,7,0,13,21,1,50,19,0,13,3,4,21,0,1,21,1,10,0,18,15,165,7,8,16,22,0,3,11,14,15,166,0,1,0,24,19,25,21,0,1,22,0,2,11,14,21,1,13,21,1,7,0,24,8,21,1,10,15,167,8,25,21,0,2,0,12,16,21,1,4,0,7,7,0,23,17,22,0,5,11,14,21,0,5,0,13,0,24,17,0,5,0,79,17,14,21,0,1,0,12,16,0,13,21,0,5,17,0,5,0,80,17,14,21,0,1,21,1,34,16,22,0,1,12,14,21,0,2,21,1,35,0,23,17,22,0,6,11,21,1,23,0,8,7,0,23,17,22,0,7,11,14,21,0,7,21,1,49,21,0,2,0,15,16,21,1,8,0,16,8,21,1,6,21,0,4,8,7,16,22,0,8,11,14,21,0,2,21,1,18,16,0,23,0,23,21,1,8,0,7,21,1,5,0,17,8,8,0,18,0,8,21,1,7,21,0,7,8,21,1,5,0,6,21,1,7,31,0,7,8,21,1,8,21,1,3,0,24,7,0,13,31,0,8,19,8,8,7,9,21,1,23,0,8,7,0,23,19,3,2,21,1,9,21,1,13,21,1,7,0,24,8,8,16,0,5,0,81,17,14,21,0,1,0,12,16,21,1,4,0,7,7,31,0,5,17,22,0,9,11,14,21,0,1,21,1,35,21,0,9,17,22,0,10,11,14,21,0,10,21,1,48,21,0,6,17,22,0,11,11,14,31,0,11,21,1,23,21,1,49,21,0,1,0,15,16,21,1,8,0,16,8,21,1,8,21,0,4,21,1,7,21,0,2,0,15,16,21,1,8,0,16,8,8,8,7,7,16,22,0,12,11,14,21,1,3,0,24,7,0,13,31,0,12,21,1,7,0,8,21,1,7,31,0,6,21,1,23,0,8,7,0,23,17,8,8,19,22,0,13,11,14,31,0,9,0,17,16,0,18,21,0,1,0,14,16,21,1,8,0,16,8,7,16,21,1,1,21,1,23,0,8,7,0,23,19,0,17,9,21,1,8,0,15,8,16,0,18,0,8,21,1,7,31,0,10,21,1,23,0,8,7,0,23,17,8,7,16,0,18,15,168,21,1,7,21,0,2,21,1,18,16,8,7,16,0,1,0,24,17,25,21,0,1,22,0,2,11,14,21,1,23,0,8,7,0,7,0,23,19,0,19,0,8,7,21,1,23,0,6,7,9,3,2,0,16,21,0,1,17,22,0,3,11,14,15,169,0,1,0,24,19,25,21,0,1,0,12,16,0,12,0,23,17,0,5,0,84,17,14,21,0,1,21,1,18,16,22,0,3,11,14,21,0,1,21,0,3,21,1,13,0,24,17,21,1,10,15,170,8,16,0,1,0,24,17,25,21,0,1,21,1,18,16,22,0,3,11,14,21,0,1,21,1,35,0,23,17,22,0,4,11,21,1,23,0,8,7,0,23,17,22,0,5,11,14,31,0,3,0,17,16,0,18,21,1,3,21,0,1,0,15,16,7,0,16,0,8,21,1,7,21,0,5,8,21,1,8,0,6,8,19,7,31,0,5,0,17,16,0,15,31,0,4,17,17,25,21,0,1,21,1,29,16,21,1,172,16,14,21,0,1,0,12,16,21,1,13,0,24,17,25,21,0,1,0,12,16,21,1,4,0,7,7,0,23,17,22,0,3,11,14,21,0,1,0,14,16,22,0,4,11,14,21,0,4,0,16,21,0,3,17,22,0,5,11,14,31,0,4,21,1,20,31,0,3,17,22,0,6,11,14,21,0,6,21,1,23,0,8,7,0,23,17,0,17,16,0,15,31,0,6,17,0,18,21,1,3,21,0,1,0,15,16,7,0,16,0,8,21,1,7,21,0,5,8,21,1,8,0,6,8,19,7,31,0,5,0,17,16,17,25,21,0,1,0,12,16,0,13,0,23,17,0,5,0,86,17,14,21,0,1,21,1,18,16,22,0,3,11,14,21,0,1,21,1,25,21,0,3,0,17,16,0,18,0,7,21,1,7,0,23,0,7,31,0,3,17,8,7,16,17,25,21,0,2,21,1,30,16,0,5,0,87,17,14,21,0,1,21,1,18,16,22,0,3,11,14,0,24,0,12,21,0,3,17,0,6,21,0,3,17,0,9,21,0,2,17,21,1,15,16,0,8,21,0,3,17,0,7,22,0,2,13,14,21,0,1,21,1,25,21,0,3,0,17,16,0,18,21,1,1,0,13,21,0,2,0,7,21,0,3,17,19,0,8,31,0,3,19,0,7,21,1,1,19,0,6,21,0,2,19,7,16,17,25,21,0,1,0,12,16,0,13,0,23,17,0,5,0,88,17,14,21,0,1,21,1,18,16,0,6,0,23,17,0,17,16,0,18,21,0,1,21,1,8,21,1,25,21,1,7,0,17,8,8,7,16,0,1,21,1,7,0,16,21,1,7,0,24,8,8,16,25,21,0,1,0,12,16,0,13,0,23,17,0,5,0,89,17,14,21,0,1,21,1,18,16,22,0,3,11,14,21,0,3,0,6,0,23,17,0,17,16,0,18,21,0,1,21,1,8,21,1,25,21,1,7,15,171,8,8,7,16,0,1,21,1,7,0,16,21,1,7,21,0,3,8,8,16,25,21,0,1,22,0,3,22,0,4,4,2,11,14,15,172,22,0,5,11,14,21,1,1,21,1,5,21,1,30,8,0,5,31,0,3,19,21,1,2,0,6,21,0,5,0,13,21,1,7,0,24,8,7,9,31,0,5,21,1,14,7,3,2,21,1,9,0,13,21,1,7,0,24,8,8,19,25,21,0,1,0,12,16,0,12,0,23,17,0,5,0,94,17,14,21,0,2,21,1,65,21,0,1,21,1,18,16,17,21,1,4,0,16,7,21,0,1,17,25,21,0,2,0,12,16,0,12,0,23,17,0,5,0,95,17,14,21,0,1,0,14,16,22,0,3,11,21,1,18,21,1,6,0,12,8,21,0,2,17,0,5,0,96,17,14,0,24,22,0,4,11,14,21,0,2,21,1,18,16,0,17,16,0,18,31,0,3,21,1,8,0,16,8,15,173,21,0,2,21,1,8,0,16,8,19,7,16,14,21,0,1,21,1,32,16,0,16,21,0,4,17,25,21,0,2,0,18,21,0,1,21,1,8,21,1,69,8,7,16,25,21,0,1,0,12,16,0,13,0,23,17,0,5,0,97,17,14,21,0,1,21,1,18,16,21,1,13,0,24,17,0,5,0,98,17,14,21,0,1,21,1,25,0,24,21,1,13,16,17,25,21,0,2,21,1,29,16,0,5,0,99,17,14,21,0,1,21,1,25,21,1,7,0,18,21,1,66,21,1,7,21,0,1,21,1,18,16,8,7,8,21,0,2,17,25,21,0,1,21,1,26,16,22,0,3,11,14,21,0,3,0,16,0,24,17,0,24,21,1,8,0,13,8,21,1,3,31,0,3,7,21,1,21,0,23,19,0,18,21,0,0,7,9,21,1,23,0,8,7,0,23,19,3,2,21,1,9,0,13,21,1,7,0,25,8,8,16,25,21,0,1,15,174,21,1,2,21,1,74,9,21,1,10,15,175,8,3,2,21,1,9,21,1,2,21,1,5,0,0,8,0,13,0,29,19,8,21,0,2,17,25,21,0,1,25,21,0,1,21,0,5,21,1,6,21,0,4,8,21,0,2,17,22,0,6,11,14,21,1,61,21,1,23,21,1,1,21,1,29,9,21,1,10,0,15,21,1,8,0,16,8,8,7,21,0,1,19,0,24,0,14,21,1,1,21,1,23,0,8,7,0,23,19,0,17,9,21,1,8,0,15,8,9,3,2,21,1,9,21,1,29,8,9,22,0,7,11,14,15,176,22,0,8,11,14,21,1,26,0,24,0,16,21,1,7,0,25,8,0,12,21,1,3,21,0,8,7,19,3,2,21,1,9,0,16,21,1,7,0,24,8,0,12,0,31,19,8,9,22,0,9,11,14,21,0,5,21,1,94,21,0,9,17,22,0,10,11,14,0,24,21,0,8,0,28,8,22,0,11,11,14,31,0,11,31,0,10,16,0,24,21,1,76,3,2,21,1,26,21,1,25,0,23,0,29,3,2,19,3,2,21,1,9,31,0,9,8,16,22,0,12,22,0,13,4,2,11,14,21,1,1,21,1,5,21,1,77,8,0,7,0,23,19,21,1,10,15,177,8,22,0,14,11,14,21,1,1,0,20,15,178,8,22,0,15,11,14,31,0,13,31,0,14,21,0,6,17,21,1,3,21,0,1,7,21,1,8,31,0,15,8,21,1,3,21,0,5,7,21,1,169,9,15,179,9,3,2,21,1,9,21,1,77,8,16,25,21,0,1,21,1,44,21,1,80,7,21,0,2,17,0,15,16,21,1,23,0,8,7,0,23,17,25,21,0,2,0,16,0,23,17,21,0,1,3,2,21,1,9,21,0,2,0,16,0,24,17,8,25,0,24,21,0,1,3,2,21,1,9,21,0,2,8,25,21,0,1,0,15,16,0,18,21,1,82,7,16,21,1,23,21,1,16,7,0,24,17,0,6,0,23,17,25,21,0,1,21,1,34,21,1,6,21,0,4,21,1,75,21,1,44,21,0,4,7,0,21,0,18,21,0,4,7,8,8,8,21,0,2,17,25,0,1,21,1,8,21,1,1,0,20,21,1,3,3,0,7,0,15,21,1,84,21,1,6,21,0,2,8,19,8,8,21,1,87,21,1,1,0,20,21,1,2,8,21,0,1,19,3,2,21,1,9,0,15,21,1,5,21,1,18,8,21,1,13,0,24,19,8,25,21,0,1,0,15,16,0,16,0,24,17,21,1,84,16,22,0,3,11,14,21,0,1,0,15,16,0,18,21,1,84,0,24,21,1,79,3,2,21,1,9,21,1,18,21,1,6,0,12,8,8,21,0,3,19,0,5,0,101,19,7,16,14,21,0,3,21,1,23,0,8,7,0,23,17,0,17,16,0,15,31,0,3,17,0,18,21,1,4,0,16,7,7,21,0,1,0,18,21,1,32,7,16,17,25,0,28,22,0,3,11,22,0,4,11,14,3,0,22,0,5,11,14,21,0,1,22,0,6,11,14,21,0,1,0,18,21,1,18,7,16,21,1,57,16,0,18,15,180,7,16,25,21,0,1,0,15,16,22,0,3,11,21,1,18,16,22,0,4,11,14,21,0,3,0,18,21,1,84,7,16,22,0,5,11,14,21,0,5,0,16,0,24,17,21,1,18,16,22,0,6,11,14,21,0,1,0,12,16,22,0,7,11,14,21,0,5,0,18,21,1,18,0,12,21,0,6,19,7,16,21,1,23,0,8,7,0,23,17,0,5,0,102,17,14,21,0,7,21,1,12,21,0,6,17,0,5,0,103,17,14,15,181,22,0,8,11,14,21,0,1,21,1,84,16,22,0,9,11,14,0,23,22,0,10,11,14,0,24,21,1,13,16,22,0,11,11,22,0,12,11,14,21,0,7,0,17,16,21,1,85,15,182,7,21,0,9,21,1,61,16,21,0,8,0,8,7,0,23,17,21,1,61,16,17,14,21,1,85,15,183,31,0,3,0,18,0,15,7,16,7,7,22,0,13,11,14,21,0,11,21,0,13,15,184,3,2,21,1,9,31,0,6,21,1,13,21,0,7,17,8,21,0,12,17,25,21,0,2,21,1,18,16,22,0,3,11,14,21,0,1,21,1,18,16,22,0,4,11,14,21,0,3,21,1,12,21,0,4,17,0,5,0,106,17,14,31,0,4,0,17,16,0,18,21,0,1,21,1,8,0,16,8,21,1,8,0,8,21,1,7,21,0,2,21,1,8,0,16,8,8,21,1,1,3,2,21,1,9,21,1,2,0,13,31,0,3,19,8,8,7,16,25,21,0,1,21,0,2,9,25,21,0,1,22,0,3,22,0,4,22,0,5,4,3,11,14,31,0,5,31,0,4,31,0,3,19,25,21,0,1,22,0,3,22,0,4,4,2,11,14,31,0,4,31,0,3,7,25,21,0,1,22,0,3,22,0,4,22,0,5,4,3,11,14,31,0,5,31,0,4,31,0,3,8,25,21,1,3,21,1,76,7,22,0,0,11,14,15,185,22,0,1,11,14,0,0,21,1,12,0,29,19,21,1,10,21,0,1,21,1,77,7,8,22,0,2,11,14,15,186,22,0,3,11,14,15,187,22,0,4,11,14,15,188,22,0,5,11,14,0,108,21,1,1,0,109,0,24,21,0,3,0,23,8,21,0,4,9,0,110,0,23,21,0,3,0,24,8,21,0,4,9,0,111,0,23,21,0,3,0,23,8,31,0,4,9,0,112,0,23,21,0,3,0,23,8,31,0,5,9,0,113,0,23,31,0,3,0,23,8,3,12,21,1,40,16,22,0,6,22,0,7,4,2,11,14,15,189,3,1,21,1,19,31,0,7,21,1,58,21,1,7,0,18,21,1,18,7,8,21,0,6,17,17,21,1,37,31,0,6,21,1,90,16,8,22,0,8,11,14,15,190,22,0,9,11,14,15,191,21,1,8,21,1,1,0,16,0,23,19,31,0,9,21,1,2,19,21,0,2,9,21,1,3,21,1,3,21,1,76,7,7,15,192,21,1,93,0,16,21,1,7,0,24,8,19,21,1,1,0,16,0,23,19,31,0,2,9,3,4,21,1,9,21,1,1,0,16,0,24,19,21,1,5,0,29,21,1,1,0,25,3,2,21,1,9,0,13,21,1,7,0,25,8,8,3,2,21,1,9,0,13,21,1,7,0,24,8,8,8,8,8,25,21,0,1,22,0,2,22,0,3,22,0,4,4,3,11,14,0,115,21,1,19,31,0,2,17,21,1,19,0,114,17,22,0,5,11,14,0,116,22,0,6,11,14,0,117,22,0,7,11,14,15,193,25,21,0,1,21,1,17,16,22,0,5,11,21,1,13,21,1,7,21,0,2,8,21,1,10,21,0,4,8,16,14,31,0,5,0,17,16,0,18,21,0,1,0,6,21,0,2,17,21,1,8,0,6,8,7,0,18,0,24,21,1,8,21,1,13,8,21,1,10,0,27,8,7,9,0,18,0,13,21,1,7,21,0,2,8,21,1,10,0,27,8,7,3,2,21,1,9,21,0,1,21,1,13,0,24,17,8,16,25,21,0,1,14,0,6,21,1,16,0,24,19,0,17,9,0,7,21,1,16,0,24,19,0,17,9,0,18,0,6,7,21,1,1,21,1,5,21,1,13,8,19,3,2,21,1,9,21,1,13,21,1,7,0,24,8,8,25,21,0,1,0,12,16,0,13,0,23,17,0,5,0,120,17,14,21,0,2,0,12,21,1,6,0,7,8,21,0,1,17,22,0,3,11,14,21,0,3,0,13,0,24,17,0,5,0,121,17,14,21,0,3,21,1,12,0,23,17,0,5,0,122,17,14,21,0,1,21,1,35,0,23,17,22,0,4,11,14,21,0,2,21,1,84,16,21,1,21,31,0,3,0,7,0,23,17,17,21,1,79,21,0,4,17,0,5,0,123,17,14,31,0,4,21,1,23,0,8,7,0,23,17,25,21,0,1,21,1,98,21,0,2,17,22,0,3,11,14,21,0,2,0,23,21,1,18,3,2,21,1,9,21,1,1,0,12,21,1,6,0,13,8,21,0,1,19,8,16,0,8,21,0,3,17,22,0,4,11,14,21,0,1,21,1,18,16,0,8,31,0,3,17,0,17,16,0,18,21,0,2,21,1,32,16,21,1,8,0,16,8,21,1,3,21,0,1,0,15,16,7,0,16,21,0,4,21,1,8,0,7,8,19,3,2,21,1,9,0,13,21,1,7,31,0,4,8,8,7,16,0,15,21,0,1,21,1,84,16,17,25,21,0,1,21,1,98,21,0,2,17,22,0,3,11,14,21,0,1,21,1,18,16,0,8,21,0,3,17,22,0,4,11,14,21,0,2,0,23,21,1,18,3,2,21,1,9,21,1,1,0,12,21,1,6,0,13,8,21,0,1,19,8,16,0,8,31,0,3,17,22,0,5,11,14,21,0,5,0,7,21,0,4,17,22,0,6,11,14,31,0,4,0,17,16,0,18,21,1,3,21,0,1,0,15,16,7,0,16,31,0,5,21,1,8,0,6,8,19,21,1,3,21,0,2,21,1,32,16,7,0,16,21,0,6,21,1,8,0,7,8,19,3,2,21,1,9,0,13,21,1,7,31,0,6,8,8,7,16,0,15,21,0,1,21,1,84,16,17,25,21,0,1,0,12,16,0,13,0,23,17,0,5,0,120,17,14,21,0,1,21,1,35,0,23,17,21,1,1,21,1,23,0,8,7,0,23,19,0,17,9,21,1,8,0,15,8,16,0,18,21,0,1,0,1,16,7,16,25,15,194,22,0,3,11,14,15,195,22,0,4,11,14,21,0,1,21,0,3,31,0,4,3,2,21,1,9,21,1,29,8,16,25,21,0,2,0,12,16,21,1,12,0,23,17,0,5,0,126,17,14,21,0,2,21,1,32,16,22,0,2,12,21,1,18,16,22,0,3,11,14,21,0,1,21,0,3,21,1,13,0,24,17,21,1,10,21,1,1,0,20,15,196,8,8,21,0,2,17,25,21,0,1,0,28,21,1,139,21,0,4,8,21,0,2,17,25,21,0,1,22,0,3,11,14,21,1,34,21,1,8,15,197,15,198,3,2,21,1,9,21,1,2,21,1,5,21,1,83,21,1,13,21,0,2,19,8,8,8,25,21,0,2,21,1,29,21,1,10,0,15,0,16,0,24,19,8,16,22,0,2,12,14,21,0,2,21,1,31,16,0,5,0,85,17,14,21,0,2,22,0,3,11,22,0,4,11,14,21,0,1,21,1,25,21,0,1,21,1,18,16,0,8,21,0,3,17,0,17,16,0,19,21,1,4,15,199,21,1,10,15,200,8,7,7,16,17,25,21,0,1,21,1,18,21,1,6,0,12,8,21,0,2,17,0,5,0,133,17,14,21,0,1,21,1,58,21,0,2,17,25,21,0,1,0,12,16,0,13,0,23,17,0,5,0,134,17,14,21,0,1,21,1,54,16,22,0,5,11,14,21,0,1,21,1,18,16,0,17,16,0,18,0,23,21,1,1,21,0,1,0,12,21,1,13,0,23,19,21,1,10,21,1,104,21,1,13,7,8,16,21,1,25,21,0,5,17,21,1,8,0,16,8,21,1,6,21,1,84,8,0,23,21,1,8,0,7,8,19,3,2,21,1,9,21,1,13,21,1,7,0,24,8,8,7,16,21,0,4,21,0,5,17,21,1,25,31,0,5,21,1,107,16,17,0,1,0,24,17,25,21,0,2,0,12,16,21,1,12,0,23,17,0,5,0,136,17,14,21,0,2,21,1,32,16,22,0,3,11,14,21,0,3,0,18,21,1,31,0,7,0,23,19,7,16,22,0,4,11,21,1,23,0,6,7,0,24,17,22,0,5,11,14,21,0,5,21,1,12,0,23,17,0,5,0,137,17,14,21,0,1,21,1,32,16,22,0,6,11,21,1,18,16,22,0,7,11,14,21,0,3,21,1,1,21,1,23,0,8,7,0,23,19,15,201,3,2,21,1,9,31,0,5,8,16,22,0,8,11,14,21,0,6,21,0,7,0,12,21,0,8,17,0,7,0,23,17,21,1,10,21,1,1,0,20,15,202,8,8,16,0,15,21,0,3,17,25,21,0,1,0,18,21,1,30,7,16,21,1,23,0,8,7,0,23,17,0,5,0,141,17,14,21,0,1,0,18,0,13,21,1,7,0,28,8,7,16,21,1,23,0,8,7,0,23,17,0,5,0,142,17,14,0,3,22,0,5,11,14,21,0,1,21,1,2,0,21,0,24,8,21,1,10,21,1,1,15,203,21,1,18,21,1,8,21,1,4,0,7,7,8,19,8,21,0,2,17,22,0,1,12,14,21,0,1,0,4,21,0,1,21,0,5,16,22,0,6,11,17,22,0,7,11,14,0,24,22,0,8,11,14,31,0,6,0,18,0,17,21,1,5,0,18,15,204,7,8,21,0,4,9,7,16,25,21,0,1,0,12,16,0,12,0,23,17,0,5,0,143,17,14,21,1,113,21,1,1,7,22,0,3,11,14,21,0,1,21,0,3,0,1,0,24,21,1,5,0,17,8,19,0,18,15,205,7,21,1,23,0,18,0,18,21,1,19,7,7,7,3,0,21,1,13,16,21,1,13,16,19,0,1,0,18,0,24,7,3,0,21,1,8,21,1,112,8,0,1,21,1,1,19,9,19,3,2,21,1,9,21,1,83,21,1,13,0,23,19,8,16,25,21,0,2,0,12,16,22,0,3,11,14,21,0,1,0,12,16,0,13,21,0,3,17,0,5,0,144,17,14,21,0,1,21,1,84,16,22,0,4,11,21,1,20,21,0,3,17,21,1,85,0,7,7,21,0,2,21,1,84,16,17,22,0,5,11,14,21,0,5,0,24,0,16,21,1,7,0,24,8,0,12,0,23,19,3,2,21,1,9,21,0,3,0,12,0,23,17,8,16,22,0,6,11,14,31,0,5,0,18,0,12,21,1,7,0,24,8,7,21,1,23,0,8,7,0,23,19,0,23,3,2,21,1,9,21,0,6,8,16,0,5,0,145,17,14,21,0,1,21,1,8,21,1,1,0,20,21,1,2,21,1,5,21,0,1,21,1,112,16,15,206,15,207,3,2,21,1,9,21,0,1,0,12,16,0,12,21,0,3,17,8,16,8,8,8,22,0,7,11,14,21,0,2,21,1,112,16,21,1,113,21,0,7,7,31,0,6,17,0,1,3,0,31,0,7,16,17,25,21,0,1,21,1,29,16,0,5,0,146,17,14,21,0,1,21,1,115,21,1,148,3,2,21,1,9,21,0,2,21,1,83,16,0,13,0,25,17,8,21,0,2,17,25,21,0,2,21,1,117,21,0,1,17,21,1,15,16,0,8,21,0,2,17,0,7,21,0,1,17,25,21,0,2,21,0,1,3,2,0,16,21,0,1,21,1,14,21,0,2,17,17,25,21,0,2,21,0,1,3,2,0,16,21,0,1,21,1,13,21,0,2,17,17,25,21,0,1,0,21,21,0,1,0,1,0,24,21,0,2,16,19,8,25,21,0,1,21,1,129,16,21,1,130,0,23,17,0,5,0,149,17,14,21,0,1,21,1,112,16,22,0,1,12,14,21,0,1,21,1,128,16,0,29,21,1,8,21,1,131,8,21,1,123,21,1,131,21,1,7,0,23,8,19,16,0,5,0,150,17,14,21,0,1,0,18,21,1,30,7,16,21,1,23,21,1,123,7,0,23,17,0,5,0,151,17,14,21,0,1,25,21,0,1,21,1,5,21,1,136,8,21,1,1,21,1,5,21,1,126,8,21,1,85,0,16,7,21,1,128,21,1,8,21,1,4,21,1,120,21,1,132,0,23,19,21,1,133,21,1,2,19,7,8,19,0,23,0,24,3,2,0,21,0,25,3,1,8,19,25,21,0,1,21,1,137,21,0,5,7,21,0,2,17,22,0,6,11,21,1,127,0,24,17,22,0,7,11,14,21,0,4,22,0,8,11,14,15,208,22,0,9,11,14,21,0,1,21,0,9,31,0,6,7,21,0,2,17,25,21,0,1,21,1,137,21,0,5,7,21,1,85,21,1,133,21,1,8,21,1,121,8,21,1,133,21,1,122,0,24,19,3,2,21,1,9,21,1,1,21,1,131,0,24,19,8,7,21,1,129,21,1,6,21,1,33,8,19,21,0,2,17,22,0,6,11,14,15,209,22,0,7,11,14,21,1,1,21,1,126,9,21,0,7,21,1,1,0,18,21,1,126,7,9,3,3,21,1,9,21,1,129,21,1,8,21,1,130,8,21,1,132,0,23,19,21,1,125,0,24,21,1,8,21,1,127,8,19,8,22,0,7,12,14,21,0,1,21,0,7,21,0,6,0,16,21,1,7,21,1,128,21,1,4,21,1,133,7,0,23,19,8,16,17,21,1,85,21,0,4,7,21,0,2,31,0,7,31,0,6,0,16,0,24,17,17,17,21,1,127,16,25,21,0,1,21,1,129,16,21,1,131,0,23,17,0,5,0,152,17,14,21,0,4,22,0,5,11,14,15,210,22,0,6,11,14,21,0,1,31,0,6,15,211,3,2,21,1,9,0,23,0,21,21,1,128,21,1,126,0,24,19,8,8,21,0,2,17,25,21,0,1,21,1,84,21,1,6,21,1,33,8,21,0,2,17,22,0,3,11,14,21,0,3,0,18,21,1,128,7,16,22,0,4,11,21,1,23,21,1,122,7,0,23,17,22,0,5,11,14,21,0,4,21,1,133,21,0,5,17,21,1,130,0,23,17,21,1,23,21,1,123,7,0,23,17,0,5,0,154,17,14,21,0,3,21,1,85,21,1,25,21,1,7,0,23,21,1,133,21,0,5,17,0,17,16,21,1,8,21,1,132,8,8,7,21,0,5,21,1,134,21,0,4,17,17,22,0,6,11,14,21,0,6,21,1,23,21,1,79,7,16,0,5,0,155,17,14,31,0,3,21,1,85,0,23,21,1,1,0,16,0,24,19,3,2,21,1,9,21,1,2,8,7,31,0,4,21,1,129,31,0,5,17,17,21,1,23,21,1,132,7,0,24,17,22,0,7,11,14,21,0,1,21,1,112,21,1,6,21,1,19,8,21,0,2,17,21,1,112,31,0,6,0,16,0,24,17,21,1,19,31,0,7,3,1,17,17,25,21,0,4,22,0,6,11,14,0,24,15,212,0,21,21,1,3,15,213,7,8,21,0,2,17,22,0,7,11,14,21,0,1,21,0,5,21,0,2,17,22,0,8,11,14,15,214,22,0,9,11,14,21,0,1,31,0,9,15,215,3,2,21,1,9,21,0,8,21,1,31,16,8,16,25,21,0,2,21,1,129,16,21,1,129,0,23,17,0,5,0,157,17,14,21,0,2,0,18,21,1,129,7,16,22,0,3,11,21,1,23,21,1,132,7,0,24,17,22,0,4,11,14,21,0,1,21,1,129,16,21,1,131,21,0,4,17,0,5,0,158,17,14,21,0,1,21,1,84,16,21,1,20,21,0,4,17,21,1,133,21,0,2,0,18,21,1,84,7,16,21,1,92,16,17,22,0,5,11,14,21,0,5,21,0,3,21,1,129,0,23,17,21,1,145,21,0,3,17,21,1,8,21,1,131,8,21,1,123,21,1,131,21,1,7,0,24,8,19,16,21,1,23,21,1,123,7,0,23,17,0,5,0,145,17,14,0,24,3,1,21,1,19,31,0,5,17,21,1,25,21,0,3,0,19,21,1,132,7,16,21,1,146,0,24,17,17,21,1,121,31,0,3,17,22,0,6,11,14,21,0,2,0,18,21,1,112,7,16,22,0,2,12,0,18,21,1,128,7,16,21,1,4,21,1,133,7,21,0,6,17,22,0,7,11,14,21,1,3,21,0,1,7,21,1,111,21,0,1,21,1,35,31,0,4,17,21,1,8,21,1,19,8,19,22,0,8,11,14,21,0,7,21,1,23,21,1,125,7,0,23,17,3,1,21,0,8,16,21,1,8,21,1,25,8,22,0,9,11,14,21,0,2,0,16,21,1,7,0,24,8,21,1,6,21,1,113,21,0,9,7,8,21,1,85,21,1,113,21,1,1,7,7,21,1,125,31,0,7,21,1,144,16,21,1,146,0,23,17,0,19,21,1,125,7,16,21,1,144,16,19,21,1,23,0,18,0,18,21,1,132,7,7,7,9,0,18,31,0,9,7,9,3,2,21,1,9,21,1,1,21,1,5,21,1,128,8,21,1,128,0,23,19,8,31,0,6,17,0,1,21,0,2,0,18,0,24,7,16,31,0,8,16,17,25,21,0,2,21,1,129,16,22,0,3,11,14,21,0,1,21,1,129,16,21,1,131,21,0,3,17,0,5,0,159,17,14,21,0,1,21,0,3,21,1,154,21,1,143,21,1,7,21,0,2,21,1,84,16,21,1,121,21,0,1,21,1,84,16,21,1,149,21,1,7,21,1,133,8,21,0,3,17,21,1,132,0,23,17,17,8,8,16,31,0,3,21,1,154,21,1,83,8,21,0,2,17,0,1,0,24,17,25,21,0,2,21,1,129,16,21,1,4,21,1,133,7,0,23,17,22,0,3,11,14,21,0,3,21,1,131,0,24,17,0,5,0,160,17,14,21,0,1,21,1,129,16,21,1,131,31,0,3,17,0,5,0,161,17,14,21,0,1,21,1,152,21,1,7,21,0,2,8,21,1,112,21,1,5,21,1,156,8,21,1,112,21,1,84,19,21,1,8,21,1,85,21,1,33,7,8,9,21,1,6,21,1,152,8,21,0,2,17,25,21,0,2,21,1,129,16,21,1,130,0,23,17,0,5,0,162,17,14,21,0,1,21,1,84,16,21,1,128,21,1,6,21,1,131,8,21,0,2,17,0,5,0,163,17,14,21,0,2,21,1,112,16,0,18,21,1,31,7,16,21,1,23,21,1,123,7,0,23,17,0,5,0,164,17,25,21,0,1,21,1,84,16,21,1,151,21,0,2,17,0,18,21,1,23,21,1,121,7,7,16,21,1,143,16,0,18,21,1,3,21,0,1,7,21,1,70,21,1,25,21,1,7,21,0,2,8,19,7,16,25,21,0,1,21,1,158,21,0,2,17,14,21,0,2,21,1,112,16,22,0,2,12,14,21,0,2,21,1,153,16,21,1,134,16,21,1,23,21,1,132,7,0,24,17,21,1,133,21,0,1,21,1,129,16,17,22,0,3,11,14,21,0,3,21,1,126,21,0,2,17,21,1,23,21,1,123,7,0,23,17,0,5,0,165,17,14,21,0,1,21,1,159,31,0,3,21,1,143,16,21,1,1,21,1,145,21,1,4,21,1,153,21,1,5,21,1,134,8,7,19,21,0,2,17,21,1,19,21,0,2,17,17,25,21,0,1,21,1,158,21,0,2,17,14,21,0,2,21,1,112,16,22,0,2,12,14,21,0,1,21,1,129,16,22,0,3,11,14,21,0,2,21,0,3,21,1,8,21,1,126,8,21,1,123,21,1,153,19,16,21,1,23,21,1,123,7,0,23,17,21,1,171,16,14,21,0,1,21,1,159,31,0,3,21,1,143,16,21,1,1,21,1,145,21,1,4,21,1,153,21,1,5,21,1,134,8,7,19,21,0,2,17,21,1,19,21,0,2,17,21,1,107,16,17,25,21,0,1,21,1,169,16,25,21,0,5,14,21,0,1,21,0,4,21,0,2,17,25,21,0,1,21,1,169,16,21,1,1,15,216,3,2,21,1,9,0,24,21,1,1,21,1,26,21,1,5,0,23,0,16,21,1,7,21,1,3,0,25,7,21,1,133,21,1,128,19,8,21,1,84,21,1,3,21,1,163,7,19,3,2,21,1,9,0,16,21,1,7,0,24,8,21,1,129,0,31,19,8,8,9,3,2,21,1,9,21,1,84,21,1,7,21,1,3,21,1,173,7,8,21,1,123,21,1,84,19,8,8,21,0,1,17,25,21,0,1,21,1,26,16,25,21,0,1,21,1,169,16,25,21,0,2,21,1,8,21,0,1,8,0,21,21,0,2,21,0,1,9,8,25,21,0,1,22,0,3,22,0,4,22,0,5,22,0,6,4,4,11,14,21,1,165,21,1,134,9,22,0,7,11,14,31,0,6,15,217,15,218,21,1,3,21,1,173,7,3,2,21,1,9,21,1,1,21,1,5,21,0,7,8,8,3,2,21,1,9,21,1,2,21,1,5,31,0,7,8,8,31,0,4,17,25,21,0,1,21,1,26,16,25,21,0,1,21,1,178,16,25,21,0,1,21,1,181,16,25,21,0,2,21,0,1,16,25,21,0,1,21,1,184,16,25,21,0,2,21,1,23,21,0,1,7,16,25,21,1,1,21,1,83,21,1,5,21,1,172,8,21,0,1,19,21,1,2,21,1,1,19,25,21,0,1,21,0,4,21,0,2,17,22,0,6,11,14,21,0,6,21,0,5,21,0,2,17,21,1,83,21,0,1,17,21,1,172,16,14,31,0,6,25,21,0,1,21,1,83,16,21,1,129,0,25,17,21,1,171,16,14,21,0,1,0,18,21,1,129,7,16,21,1,129,0,23,17,21,1,23,21,1,123,7,0,23,17,21,1,172,16,14,21,0,1,21,1,170,16,22,0,3,11,14,21,0,3,0,18,21,1,31,7,16,21,1,23,21,1,123,7,0,23,17,21,1,172,16,14,21,0,1,21,1,85,21,1,146,7,0,28,17,21,1,170,16,21,1,127,21,0,3,17,21,1,23,21,1,123,7,0,23,17,21,1,172,16,14,21,0,3,0,3,16,22,0,4,11,14,0,23,21,1,131,21,0,4,17,21,1,23,21,1,123,7,0,23,17,21,1,172,16,14,31,0,4,21,1,134,16,21,1,145,16,22,0,5,11,14,21,0,5,21,1,85,0,28,7,16,21,1,170,21,0,1,21,1,85,21,1,128,7,16,21,1,145,16,17,21,1,25,31,0,5,21,1,170,31,0,3,17,21,1,54,16,17,25,21,0,2,21,1,129,16,21,1,129,0,23,17,21,1,171,16,14,21,0,2,0,18,21,1,31,7,16,21,1,23,21,1,123,7,0,23,17,21,1,171,16,14,21,0,2,21,1,151,16,22,0,3,11,14,21,0,1,21,1,85,21,1,128,7,21,1,6,21,1,83,8,21,0,3,17,21,1,172,16,14,21,0,1,21,1,170,21,1,6,21,1,25,21,1,7,21,1,54,8,8,31,0,3,17,25,21,0,1,21,1,29,16,21,1,172,16,14,21,0,1,21,1,129,16,21,1,129,0,24,17,21,1,172,16,14,21,0,1,21,1,112,16,0,16,0,24,17,25,21,0,2,21,1,129,21,1,6,21,1,133,8,21,0,1,17,22,0,3,11,14,21,0,3,0,23,21,1,8,21,1,131,8,21,1,123,21,1,131,21,1,7,0,24,8,19,16,21,1,172,16,14,21,0,2,0,23,21,1,128,3,2,21,1,9,21,0,3,8,16,22,0,4,11,14,21,0,1,21,1,128,16,21,1,131,21,0,4,17,21,1,172,16,14,21,0,1,21,1,177,21,1,149,21,1,7,21,0,4,8,3,2,21,1,9,31,0,3,8,16,21,1,83,21,0,2,17,21,1,172,16,14,21,0,1,21,1,150,31,0,4,17,25,21,0,1,21,1,128,16,21,1,129,0,25,17,21,1,172,16,14,21,0,1,21,1,177,16,21,1,83,21,0,2,17,21,1,172,16,14,21,0,1,21,1,177,0,23,17,25,21,0,1,21,1,128,16,21,1,129,0,23,17,21,1,172,16,14,21,0,1,21,1,177,16,25,21,0,1,21,1,129,16,21,1,129,0,23,17,21,1,171,16,14,21,0,1,0,18,21,1,31,7,16,21,1,23,21,1,123,7,0,23,17,21,1,171,16,14,21,0,1,21,1,150,21,1,7,0,23,8,21,1,131,21,1,150,21,1,7,0,28,8,19,21,1,23,21,1,123,7,0,23,19,16,21,1,172,16,14,21,0,1,0,3,16,25,21,0,1,21,1,34,21,1,6,21,0,4,21,1,75,0,18,21,0,4,7,8,8,21,0,2,17,25,21,1,1,21,1,5,21,1,83,8,21,1,126,0,24,19,21,1,172,9,21,1,2,21,1,85,21,1,162,21,0,1,7,7,19,25,21,1,1,21,1,5,21,1,83,8,21,1,126,0,24,19,21,1,172,9,21,1,2,0,24,21,1,5,21,1,171,8,0,21,21,1,180,21,1,162,21,0,1,7,7,8,19,25,21,1,1,21,1,5,21,1,129,8,21,1,126,0,24,19,21,1,172,9,21,1,2,21,1,104,21,1,162,21,0,1,7,21,1,1,21,1,7,21,1,29,21,1,5,21,1,172,8,8,9,7,19,25,21,1,85,21,1,162,21,0,1,7,7,25,21,1,1,21,1,5,21,1,129,8,21,1,126,0,24,19,21,1,172,9,21,1,2,21,1,1,21,0,1,21,1,146,19,0,21,21,1,128,21,1,126,0,23,19,21,1,10,21,1,150,21,1,7,0,23,8,21,0,1,21,1,150,21,1,7,0,28,8,19,21,1,170,21,1,177,19,8,8,19,25,21,0,1,21,1,3,15,219,7,3,2,21,1,9,21,1,129,21,1,7,21,1,3,21,1,163,7,8,8,25,21,1,162,21,0,2,7,22,0,3,11,14,21,0,3,21,1,7,21,0,1,8,0,21,31,0,3,8,21,1,162,21,0,1,7,9,25,21,0,1,21,1,183,21,1,162,21,0,2,7,8,25,21,0,1,21,1,182,21,0,2,8,21,1,174,21,0,1,21,1,133,16,21,1,182,21,0,2,8,8,25,21,0,1,21,1,133,16,21,1,182,21,0,2,8,25,21,1,162,21,0,1,7,0,21,21,1,162,21,0,2,7,8,25,21,1,162,21,0,1,7,21,1,7,21,0,2,8,25,21,0,1,0,21,21,1,173,8,25,21,1,162,21,0,2,7,21,1,162,21,0,1,7,9,0,21,21,0,1,21,1,3,0,24,21,1,5,21,1,171,8,7,15,220,3,2,21,1,9,21,1,1,21,1,5,21,1,165,8,8,21,0,2,17,8,25,21,0,1,15,221,21,0,5,21,1,188,21,0,1,21,0,4,21,0,2,17,17,7,21,0,2,17,25,21,1,126,21,1,152,21,0,1,19,21,1,188,9,22,1,27,12,14,21,0,1,21,1,28,3,2,25,21,0,1,25,21,0,1,25,0,23,0,7,21,1,5,17,22,1,5,12,14,21,0,1,0,16,21,1,5,17,25,21,1,7,21,1,6,21,0,1,17,22,1,7,12,25,21,0,1,21,2,27,16,25,21,0,1,21,2,27,16,25,21,0,2,0,14,16,22,0,5,11,14,21,0,2,0,12,16,0,17,16,21,2,23,0,8,21,2,7,21,0,1,0,14,16,21,2,8,0,16,8,0,12,21,0,5,21,2,8,0,16,8,19,8,7,0,23,17,0,5,0,76,17,14,21,0,5,21,2,23,0,8,7,0,23,17,0,17,16,0,18,21,0,1,0,15,16,21,2,8,0,16,8,21,0,4,21,0,2,0,15,16,21,2,8,0,16,8,19,7,16,0,15,31,0,5,17,25,21,0,2,0,14,16,22,0,5,11,14,21,0,2,0,12,16,22,0,6,11,14,21,0,1,0,14,16,22,0,7,11,14,21,0,6,0,17,16,21,2,23,0,8,21,2,7,21,0,7,21,2,8,0,16,8,0,12,31,0,5,21,2,8,0,16,8,19,8,7,0,23,17,0,5,0,77,17,14,21,0,6,0,7,21,0,1,0,12,16,17,0,17,16,21,2,23,0,8,21,2,7,0,6,21,2,7,31,0,6,8,21,2,4,0,16,7,21,0,7,19,8,7,0,23,17,22,0,8,11,14,21,0,2,0,15,16,22,0,9,11,14,21,0,1,0,15,16,22,0,10,11,14,21,0,8,0,17,21,2,6,0,18,21,2,3,31,0,10,7,0,16,0,6,21,2,7,0,8,21,2,7,31,0,8,8,8,19,21,0,4,21,0,9,21,2,8,0,16,8,19,7,8,31,0,9,21,2,18,16,17,0,15,16,0,15,31,0,7,17,25,21,0,1,21,2,45,21,0,4,7,21,0,2,17,25,21,0,1,0,18,15,222,21,0,2,7,7,16,25,21,0,2,0,18,15,223,21,0,1,7,7,16,25,21,2,33,0,16,21,2,12,19,21,2,33,21,2,46,19,22,0,3,11,14,21,0,1,21,2,18,21,2,6,21,0,3,8,21,0,2,17,22,0,4,22,0,5,4,2,11,14,21,0,1,15,224,21,2,6,15,225,8,21,0,2,17,22,0,6,11,14,21,0,4,31,0,6,3,2,25,21,0,2,22,0,3,11,14,21,0,1,22,0,4,11,14,15,226,21,1,6,3,2,21,2,9,0,12,21,2,7,21,1,7,8,8,22,0,5,11,14,0,24,21,0,5,16,25,21,0,1,0,12,21,2,7,0,24,8,21,2,10,21,0,2,8,9,25,21,2,4,21,0,1,7,25,21,0,1,0,12,16,0,13,0,23,17,0,5,0,78,17,14,21,0,1,21,2,18,16,22,0,3,11,14,21,0,1,21,0,3,21,2,5,0,17,8,15,227,3,2,21,2,9,21,0,3,0,13,0,25,17,8,16,25,15,228,22,0,3,11,14,0,28,21,0,3,0,23,0,6,21,0,1,17,17,0,6,0,23,17,25,21,0,2,21,2,52,21,0,1,21,2,8,21,1,13,8,7,16,25,21,0,2,0,12,16,21,2,4,0,7,7,0,23,17,22,0,3,11,14,21,0,3,0,13,0,24,17,0,5,0,82,17,14,21,0,1,0,12,16,0,13,21,0,3,17,0,5,0,83,17,14,21,0,2,21,2,18,16,22,0,4,11,14,21,0,2,21,2,35,0,23,17,22,0,5,11,21,2,23,0,8,7,0,23,17,22,0,6,11,14,21,0,1,0,12,16,21,2,4,0,7,7,31,0,3,17,22,0,7,11,14,21,0,1,0,14,16,21,2,20,21,0,7,17,22,0,8,11,21,2,23,0,8,7,0,23,17,22,0,9,11,14,21,0,1,21,2,34,16,15,229,15,230,3,2,21,2,9,0,24,21,2,35,21,2,7,31,0,7,8,21,2,79,31,0,5,19,3,2,21,2,9,21,0,4,21,2,13,0,24,17,8,8,21,0,2,17,0,15,31,0,8,17,25,21,0,1,0,18,21,2,31,7,16,21,2,23,0,8,7,0,23,17,0,5,0,85,17,14,0,23,0,7,21,1,3,17,22,0,3,11,14,21,2,1,0,7,21,0,3,19,21,2,4,0,16,7,21,1,3,0,17,16,0,18,0,7,21,2,7,21,0,3,8,7,16,0,19,21,2,1,21,2,4,0,16,7,21,0,1,19,0,12,0,24,19,0,8,0,7,19,0,6,21,2,1,19,7,16,19,22,0,4,11,14,21,0,1,0,19,0,6,7,16,21,2,8,0,16,8,22,0,5,11,14,0,24,21,0,4,16,22,0,6,11,21,0,5,16,22,0,7,11,14,31,0,3,21,0,5,16,0,17,16,0,18,15,231,7,16,25,21,0,1,0,7,21,1,3,17,0,17,16,0,18,0,6,21,2,7,21,0,1,8,7,16,25,21,0,1,0,5,21,1,4,19,21,2,2,21,2,1,19,25,21,1,4,0,8,21,0,1,17,0,6,21,0,2,21,2,65,21,0,1,17,17,22,1,4,12,25,21,0,1,0,1,21,0,2,19,25,21,0,2,0,20,21,0,1,21,2,135,21,0,2,17,8,25,21,0,4,22,0,6,11,14,21,0,1,22,0,7,22,0,8,22,0,9,4,3,11,14,21,0,5,21,2,29,21,2,14,31,0,8,19,21,2,10,15,232,21,2,5,21,1,7,8,8,16,31,0,7,21,0,2,17,22,0,10,11,14,31,0,10,31,0,9,21,2,10,15,233,8,16,25,0,24,22,0,3,11,14,21,0,1,15,234,16,22,0,4,11,14,21,0,2,21,2,33,21,2,6,21,2,33,8,21,2,3,21,2,76,7,0,15,21,2,6,21,2,33,8,3,2,21,2,9,21,2,81,8,15,235,3,3,21,2,9,31,0,4,21,2,15,0,25,17,8,21,0,1,17,25,21,0,2,22,0,3,22,0,4,4,2,11,14,15,236,21,2,7,21,0,2,8,22,0,5,11,14,15,237,22,0,6,11,14,15,238,21,2,7,0,24,8,22,0,7,11,14,21,0,1,21,2,3,21,0,4,7,0,16,0,24,19,31,0,7,3,2,21,2,9,21,1,12,21,2,5,21,2,29,8,8,16,25,21,1,6,21,0,1,16,25,21,0,1,0,12,21,2,7,21,1,4,8,0,7,0,23,19,21,2,10,15,239,8,16,14,21,1,5,0,16,0,23,0,6,21,1,3,17,22,1,3,12,17,25,21,0,2,22,0,5,11,14,21,0,4,22,0,6,11,14,21,0,1,0,18,15,240,7,16,25,21,0,2,22,0,3,11,14,21,1,9,0,16,21,0,1,17,22,0,4,11,14,21,1,5,0,18,0,16,21,2,7,21,0,1,8,7,16,22,0,5,11,14,21,0,4,0,17,16,0,18,21,2,3,21,0,5,7,0,16,0,8,21,2,7,21,0,3,8,19,7,16,22,0,6,11,14,31,0,3,0,17,16,0,18,21,2,2,7,21,0,6,17,0,18,21,2,1,7,21,1,10,0,17,16,17,0,15,16,21,2,79,31,0,5,17,0,5,0,104,17,14,21,0,6,21,2,57,16,22,0,7,11,14,21,0,7,21,2,18,16,0,17,16,0,18,21,0,6,21,1,8,0,6,7,0,24,17,21,2,25,21,0,7,17,21,2,8,0,16,8,21,2,8,0,7,8,7,16,22,0,8,11,14,31,0,8,0,18,21,2,1,7,21,1,12,17,21,2,85,0,6,7,21,0,7,0,18,31,0,6,21,2,8,0,16,8,21,2,8,0,8,8,7,21,1,12,17,17,22,1,12,12,14,31,0,7,0,18,0,6,21,2,7,21,0,4,21,2,8,0,8,8,8,7,21,1,11,17,22,1,11,12,14,31,0,4,0,8,22,1,10,13,25,21,0,4,0,16,21,0,1,17,0,16,21,0,2,17,25,21,1,5,0,16,0,24,17,21,2,21,21,1,7,17,22,0,3,11,14,21,1,5,0,18,21,2,21,21,2,7,21,1,7,8,21,2,79,21,0,3,19,7,16,21,2,23,0,8,7,0,23,17,0,5,0,105,17,14,21,0,3,21,2,23,0,8,7,16,22,0,4,11,0,17,16,0,15,31,0,3,17,22,0,5,11,14,21,0,5,0,18,21,2,2,7,21,0,1,17,21,1,13,31,0,5,0,18,0,6,21,2,7,0,8,21,2,7,31,0,4,8,8,7,21,0,2,17,17,25,21,2,3,21,2,76,7,21,0,1,3,2,21,2,9,21,0,4,0,7,0,23,19,21,2,6,0,8,0,21,21,2,1,8,8,8,25,21,0,1,15,241,21,0,1,21,0,4,21,0,5,3,3,7,3,2,21,2,9,21,2,1,21,0,2,9,8,25,21,1,0,0,21,21,0,1,8,25,21,0,1,0,21,21,1,0,8,25,21,1,1,21,0,2,7,22,0,3,11,14,21,0,1,21,0,3,15,242,15,243,3,3,21,2,9,21,2,3,0,29,7,0,7,0,0,19,8,16,25,21,0,1,21,1,8,16,22,0,3,11,14,21,0,1,31,0,3,21,0,2,17,25,21,0,1,21,2,26,16,25,21,0,1,21,2,21,0,23,17,0,18,21,2,94,21,2,7,21,2,3,21,0,2,7,8,7,16,25,21,0,2,0,12,16,21,2,12,0,23,17,0,5,21,1,6,17,14,21,0,2,21,2,32,16,22,0,2,12,14,21,0,2,0,18,21,2,30,7,16,21,2,23,0,8,7,0,23,17,0,5,21,1,7,17,14,21,0,2,21,2,18,16,22,0,3,11,14,21,0,1,21,2,84,16,21,2,18,21,2,8,21,2,14,8,21,2,10,15,244,8,21,0,3,17,22,0,4,11,14,15,245,22,0,5,11,14,0,24,21,2,13,16,22,0,6,11,14,0,23,22,0,7,11,14,15,246,22,0,8,11,14,0,24,22,0,9,11,14,21,0,3,0,17,16,0,18,21,0,2,21,2,8,0,16,8,15,247,21,1,4,15,248,7,31,0,8,21,2,2,19,3,2,21,2,9,21,1,3,8,21,0,4,21,2,8,0,16,8,19,7,16,22,0,10,11,14,21,0,1,21,2,34,16,21,2,1,0,20,0,15,21,2,7,21,0,4,8,15,249,3,2,21,2,9,21,0,6,0,12,16,21,2,13,0,24,17,8,8,16,25,21,0,1,21,2,31,16,0,5,0,124,17,14,21,0,1,0,17,16,25,21,0,1,0,12,16,0,12,0,23,17,0,5,0,125,17,14,21,0,1,0,18,21,1,3,7,16,21,2,23,0,18,21,2,19,21,2,7,21,2,33,8,7,7,3,0,21,2,13,16,17,0,1,21,0,1,0,18,0,24,7,16,17,25,21,0,1,0,12,16,0,13,21,1,3,17,0,5,0,127,17,14,21,0,2,0,18,21,2,31,7,16,21,2,23,0,8,7,16,0,5,0,128,17,14,21,0,1,21,2,84,16,22,0,3,11,14,21,1,3,0,17,16,0,18,21,0,2,21,2,8,0,16,8,0,7,21,0,3,21,2,8,0,16,8,19,0,6,0,23,19,7,16,22,0,4,11,14,21,0,4,0,18,0,13,21,2,7,0,24,8,7,16,21,2,23,0,8,7,16,0,5,0,129,17,14,21,0,3,21,2,21,21,1,3,17,22,0,5,11,21,2,23,0,8,7,0,23,17,22,0,6,11,14,0,23,0,7,21,1,3,17,15,250,16,21,2,19,21,0,6,3,1,17,0,19,0,8,7,16,21,2,61,16,22,0,7,11,14,21,0,2,21,2,1,21,2,85,15,251,7,31,0,7,19,21,2,23,0,18,0,6,7,7,9,21,2,6,0,18,0,6,7,8,31,0,4,17,0,23,21,2,8,0,12,8,0,7,0,23,19,21,2,10,21,2,4,0,17,0,15,31,0,5,19,21,2,8,0,18,0,6,7,8,7,8,31,0,6,17,0,18,21,0,1,0,15,16,21,2,8,0,16,8,7,16,25,21,0,1,0,12,16,0,13,0,23,17,0,5,0,130,17,14,21,0,1,21,1,3,21,0,2,17,25,21,0,2,0,12,16,21,2,12,0,23,17,0,5,0,131,17,14,21,0,1,21,2,84,16,21,2,18,21,2,6,0,13,8,21,0,2,17,0,5,0,132,17,14,21,0,2,21,2,18,16,22,0,3,11,14,21,0,2,0,15,16,21,2,8,0,16,8,22,0,4,11,14,21,0,1,21,0,3,21,2,13,0,24,17,21,2,10,15,252,8,0,24,17,25,21,0,2,0,12,21,1,4,17,25,21,1,3,0,6,22,1,4,13,14,21,0,1,0,6,0,23,17,25,21,0,1,21,2,85,21,2,1,0,23,3,2,21,2,9,21,2,2,8,7,21,1,4,17,21,2,23,0,8,7,0,23,17,22,0,3,11,14,21,0,3,21,2,13,0,24,17,0,5,0,138,17,14,21,1,4,21,2,18,16,0,17,16,0,18,0,8,21,2,7,21,1,4,21,2,8,0,16,8,8,7,16,21,2,23,0,6,7,0,24,17,22,0,4,11,14,21,1,3,0,16,31,0,4,17,21,2,110,16,22,0,5,11,14,0,32,21,2,13,21,0,5,17,0,5,0,139,17,14,0,12,21,2,7,21,2,15,8,0,5,0,140,19,21,2,2,21,2,1,19,22,0,6,11,14,21,0,3,0,9,21,1,7,17,31,0,6,21,2,15,21,2,16,3,3,21,2,9,21,0,5,21,2,15,0,25,17,8,16,22,0,7,11,14,21,1,3,21,2,85,21,2,1,21,0,7,3,2,21,2,9,21,2,2,8,7,21,1,4,17,22,1,3,12,14,31,0,7,0,8,31,0,3,17,31,0,5,0,12,0,29,17,21,2,10,21,2,13,21,2,7,21,1,7,8,21,2,10,15,253,8,8,16,25,21,1,8,0,17,16,0,18,21,2,2,7,21,2,7,0,1,21,2,5,21,2,13,8,8,15,254,3,2,21,2,9,21,1,7,21,2,13,0,24,17,8,21,0,1,17,25,21,2,1,21,1,5,21,0,1,0,16,21,0,2,17,19,22,1,5,12,14,21,0,1,21,2,20,21,0,2,17,25,21,0,1,14,21,1,7,0,16,21,1,8,17,21,2,1,0,23,0,6,21,1,8,17,22,1,8,12,17,25,21,0,1,21,2,112,16,21,1,3,16,0,18,21,0,1,21,2,84,16,21,2,102,16,21,2,112,16,21,2,8,21,2,25,8,7,16,25,21,1,4,21,2,21,21,1,3,17,22,0,3,11,21,2,23,0,8,7,0,23,17,22,0,4,11,14,21,0,4,0,17,16,21,2,112,31,0,3,17,21,2,8,0,18,0,6,21,2,7,0,8,21,2,7,31,0,4,8,8,21,2,4,0,16,7,21,0,1,19,7,8,25,0,18,21,0,1,21,2,8,0,16,8,7,25,21,1,9,21,1,7,21,2,132,21,0,4,17,7,22,0,5,11,14,21,0,1,21,2,85,21,0,5,7,21,2,2,21,2,5,0,18,21,0,1,21,2,8,21,0,5,8,7,8,21,2,1,21,2,5,0,18,21,2,1,31,0,5,21,0,2,19,7,8,21,1,8,3,4,21,2,9,21,2,83,21,2,6,21,2,33,8,21,2,130,21,0,4,21,2,122,0,24,17,19,21,2,124,0,24,21,2,130,21,0,4,17,21,2,123,21,1,7,17,19,21,2,111,0,25,19,21,2,23,21,2,132,21,2,7,0,25,21,2,8,21,2,125,8,8,7,9,8,21,0,2,17,25,21,0,1,21,2,84,16,21,2,25,21,0,2,0,17,16,17,22,0,3,11,14,21,0,1,21,2,35,21,0,2,17,22,0,4,11,21,2,23,21,2,125,7,0,23,17,22,0,5,11,14,21,0,5,0,17,16,21,2,112,31,0,4,17,22,0,6,11,14,21,0,1,15,255,0,20,21,2,3,21,0,3,21,2,23,21,2,125,7,0,23,17,0,17,16,0,18,21,2,1,21,2,125,31,0,5,19,21,2,132,21,0,6,19,21,2,4,21,2,25,7,21,0,1,21,2,112,16,19,7,16,21,2,112,31,0,3,17,7,8,16,25,21,0,1,21,2,84,16,21,2,21,0,23,17,22,0,3,11,14,15,256,22,0,4,11,14,21,1,5,21,2,3,21,0,1,7,21,2,112,31,0,4,19,21,2,42,21,2,8,21,2,111,8,3,2,21,2,9,21,2,1,21,2,5,21,2,39,21,2,5,21,2,134,8,8,8,31,0,3,17,25,21,0,1,21,2,104,21,2,126,7,16,21,2,23,21,1,5,7,21,0,2,17,25,15,257,21,2,3,21,0,2,7,7,25,21,2,2,21,0,1,9,25,0,24,22,0,3,11,22,0,4,11,14,21,1,8,21,2,45,15,258,7,16,14,21,0,1,3,1,22,0,5,11,14,15,259,21,2,7,21,1,7,8,22,0,6,11,14,21,0,3,21,0,6,21,1,6,17,22,0,7,11,14,21,0,4,21,2,133,16,21,0,5,31,0,6,21,2,7,21,2,169,8,3,2,21,2,9,21,2,126,21,2,7,0,24,8,8,21,1,6,17,22,0,8,11,14,21,1,8,21,2,45,21,2,3,31,0,7,31,0,8,3,2,7,0,16,0,24,21,2,8,21,2,126,8,19,0,16,21,2,120,19,7,16,25,21,1,8,0,17,16,21,2,23,21,2,1,21,2,5,21,1,6,21,1,7,16,8,7,21,0,1,17,25,21,0,1,21,2,174,21,0,2,8,21,2,163,21,0,1,8,25,21,2,1,21,2,162,21,1,5,7,21,0,2,19,15,260,21,2,162,21,0,1,7,8,25,21,2,1,15,261,21,1,5,7,21,0,1,19,21,2,162,21,0,2,7,9,25,21,0,2,21,2,163,21,0,1,8,25,21,2,1,15,262,21,0,2,7,21,0,1,19,25,21,0,1,25,21,0,1,21,2,2,21,0,4,17,25,21,0,4,21,2,2,21,0,1,17,25,21,1,5,0,17,16,0,18,0,7,21,3,7,21,0,1,21,3,18,16,0,6,0,28,17,8,21,3,4,0,16,7,21,0,1,19,7,16,25,21,0,1,21,3,44,0,12,7,21,0,2,17,0,19,0,8,7,16,21,3,23,0,6,7,0,24,17,22,0,3,11,14,21,0,2,21,3,25,21,3,7,0,17,8,21,0,3,17,21,3,23,0,8,7,0,23,17,22,0,4,11,14,31,0,3,21,3,14,21,3,7,21,1,5,8,21,3,10,21,3,3,21,0,2,21,0,1,3,2,7,0,18,0,16,7,21,3,13,19,21,3,5,15,263,8,8,16,14,21,0,4,25,21,1,4,0,6,21,3,7,21,0,1,8,21,3,6,21,2,5,8,21,1,3,17,0,12,21,3,7,0,24,8,21,3,10,21,0,1,0,6,0,23,17,21,3,5,21,1,5,8,8,16,25,21,0,1,21,3,35,0,23,17,21,3,23,0,8,7,0,23,17,22,0,3,11,0,12,0,23,17,22,0,4,11,14,21,0,1,0,15,16,22,0,1,12,14,0,23,22,0,5,11,14,0,24,22,0,6,11,14,21,0,1,0,18,0,0,21,3,5,15,264,8,7,16,14,21,0,4,0,8,0,25,17,0,6,21,0,5,17,22,0,7,11,14,15,265,22,0,8,11,14,0,24,22,0,9,11,22,0,10,11,14,15,266,22,0,11,11,14,21,0,1,0,24,0,24,15,267,3,2,21,3,9,0,18,0,12,21,3,7,21,3,15,8,7,21,3,23,0,8,7,0,23,19,8,3,2,21,3,9,21,1,3,0,12,21,0,6,17,0,8,21,0,7,0,12,0,29,17,17,8,16,22,0,12,11,14,21,0,1,31,0,8,31,0,11,3,2,21,3,9,31,0,12,8,16,25,21,0,1,0,23,21,3,8,21,3,14,8,21,3,10,15,268,8,21,0,2,17,25,21,0,1,14,21,1,9,0,17,16,0,18,21,1,4,0,8,21,2,2,17,7,16,25,21,1,6,21,3,49,21,0,1,0,15,16,21,3,8,0,16,8,21,3,8,21,3,80,0,7,0,23,19,21,3,7,21,0,2,0,15,16,21,3,8,0,16,8,8,8,7,16,22,0,3,11,14,21,0,1,15,269,15,270,3,2,21,3,9,0,15,21,3,5,21,3,18,8,21,3,13,0,30,19,21,3,6,0,8,8,8,21,0,2,17,25,21,1,6,21,1,7,0,12,21,0,1,17,21,3,10,15,271,8,16,25,21,0,1,3,1,3,0,21,3,19,3,2,21,3,9,21,3,2,21,3,29,9,8,21,1,6,17,22,1,6,12,25,21,0,1,21,2,8,21,1,6,8,25,21,0,1,15,272,0,15,21,3,5,0,18,21,0,0,7,8,21,3,23,21,3,16,7,0,24,19,0,6,0,23,19,3,2,21,3,9,21,3,29,8,16,25,15,273,22,0,3,11,14,21,3,33,21,0,3,15,274,3,2,21,3,9,21,3,1,21,3,5,21,3,23,21,3,81,7,8,8,3,2,21,3,9,21,3,1,0,16,0,24,19,21,3,29,9,8,22,0,4,11,14,21,0,2,21,0,1,3,2,21,0,4,0,24,17,22,0,5,11,14,21,1,3,0,17,16,0,18,15,275,7,16,22,0,6,11,14,31,0,6,0,18,0,16,21,3,7,0,23,8,7,21,3,33,0,18,0,16,21,3,7,0,24,8,7,19,21,3,3,21,3,76,7,3,2,21,3,9,31,0,3,0,12,21,0,5,17,8,16,25,21,0,1,21,3,34,16,22,0,1,12,14,21,0,1,0,14,16,22,0,3,11,14,21,0,1,0,15,16,22,0,4,11,21,3,18,16,22,0,5,11,14,21,1,3,0,3,21,0,5,17,22,0,6,11,14,21,1,3,0,4,21,0,6,17,22,0,7,11,14,31,0,7,21,3,8,0,16,8,21,3,4,0,16,7,21,1,4,19,22,0,8,11,14,0,24,22,0,9,11,14,15,276,21,0,8,9,22,0,10,11,14,31,0,8,21,3,8,21,3,80,8,0,5,0,100,19,22,0,11,11,14,31,0,5,0,17,16,0,18,31,0,6,21,3,8,0,16,8,21,3,8,31,0,4,21,3,8,0,16,8,21,0,10,21,3,1,15,277,31,0,10,19,3,3,21,3,9,21,3,15,21,3,7,0,25,8,8,8,7,16,0,15,31,0,3,17,25,21,0,1,21,3,18,16,0,17,16,0,18,21,0,1,21,3,8,0,16,8,21,3,8,21,3,2,0,12,21,0,1,21,0,5,16,19,21,3,10,21,0,4,8,8,7,16,25,21,0,1,0,15,21,3,5,21,3,3,21,2,12,7,0,16,21,0,2,19,21,1,6,21,0,0,21,3,7,21,0,2,0,6,0,23,17,8,8,8,0,15,0,14,19,21,1,5,3,2,21,3,9,21,2,12,21,3,18,16,21,3,12,21,0,2,17,8,16,25,21,0,1,22,2,4,12,21,3,4,0,16,7,21,2,6,17,22,2,5,12,14,0,28,22,2,3,12,25,21,1,5,22,0,3,11,14,21,0,1,21,1,6,22,1,5,13,14,31,0,3,25,21,0,4,21,0,1,21,0,2,17,25,21,0,1,22,0,3,11,14,15,278,25,21,0,1,22,0,3,11,14,15,279,25,21,0,1,21,3,19,21,0,1,21,3,18,16,0,7,21,0,2,17,0,17,21,3,5,0,18,0,23,7,8,16,17,25,21,0,1,0,18,0,6,7,21,0,2,0,18,21,0,4,21,3,8,0,8,8,7,16,17,25,21,0,1,0,23,21,3,8,0,12,8,0,7,0,23,19,21,3,10,21,1,5,21,0,2,7,21,3,7,0,17,8,8,21,1,7,17,21,1,5,21,0,2,0,8,21,1,7,17,7,22,1,6,13,14,0,23,22,1,7,12,14,21,0,1,21,3,18,16,25,21,0,2,0,8,22,1,7,13,14,21,0,2,25,21,0,1,14,0,23,22,1,9,12,25,21,1,4,21,3,21,21,1,3,17,22,0,3,11,21,3,19,22,1,10,13,14,31,0,3,21,3,23,0,8,7,21,1,7,17,0,12,21,3,7,0,23,8,0,7,0,23,19,21,3,10,15,280,8,16,14,21,0,1,0,15,16,21,3,8,0,16,8,22,0,4,11,14,21,1,9,21,3,1,21,3,10,15,281,8,21,0,1,17,14,21,1,6,0,15,21,1,10,17,0,18,21,0,4,7,16,25,21,0,1,0,17,16,0,18,0,7,21,3,7,21,0,1,8,21,3,4,0,16,7,21,1,3,19,7,16,25,21,0,1,0,17,16,0,18,0,8,21,3,7,21,0,2,8,7,16,25,21,0,1,0,23,0,7,21,1,3,17,21,3,13,21,0,2,17,21,3,10,21,3,104,21,0,0,21,3,7,21,0,2,0,6,0,23,17,8,7,8,16,21,2,3,21,0,2,21,1,4,16,17,25,21,2,7,0,7,21,0,1,17,0,17,16,0,18,21,2,6,0,1,16,7,16,21,3,19,22,2,6,13,14,21,2,7,25,0,28,22,0,3,11,14,0,23,0,7,21,2,7,17,22,0,4,11,14,21,0,1,0,18,15,282,7,16,25,21,1,6,0,18,21,0,1,21,3,126,16,7,16,25,21,0,2,21,3,128,16,21,3,126,0,24,17,0,5,0,153,17,14,21,0,2,21,3,128,16,0,17,16,21,3,126,0,24,17,21,3,125,21,0,2,17,25,21,3,2,21,0,1,21,0,4,19,25,21,0,1,21,3,30,16,0,5,0,156,17,14,21,0,1,21,3,121,21,1,4,17,22,1,4,12,14,21,0,1,21,3,122,21,1,3,17,22,1,3,12,25,21,0,1,0,17,16,21,3,19,21,1,5,17,0,19,21,0,2,7,16,25,21,0,1,21,0,5,16,21,0,4,21,0,2,17,25,21,0,1,21,3,179,16,25,21,0,1,21,3,179,16,25,21,0,1,21,4,23,21,2,3,7,16,22,0,3,22,0,4,4,2,11,14,31,0,3,22,2,4,12,14,31,0,4,0,8,22,1,4,13,25,21,0,1,0,13,0,23,17,0,8,22,1,5,13,14,21,0,1,0,6,22,1,6,13,25,21,3,3,0,16,21,1,7,17,15,283,21,0,1,7,16,21,1,4,0,7,0,23,17,21,4,10,15,284,8,21,1,3,17,22,0,3,11,14,21,4,1,21,2,3,3,2,21,4,9,0,13,21,4,7,21,2,3,8,8,22,0,4,11,14,0,24,0,12,21,2,3,17,0,6,21,2,3,17,0,2,0,25,17,21,4,16,16,22,0,5,11,0,17,16,0,18,21,4,1,0,6,0,23,19,0,7,31,0,5,19,0,10,0,25,19,7,16,21,4,23,15,285,7,21,2,3,0,17,16,17,25,21,0,1,0,18,21,1,10,21,4,8,0,7,8,0,7,21,4,7,21,1,9,8,3,2,0,16,21,3,2,17,7,16,0,4,21,4,7,0,3,8,16,25,21,2,3,0,8,0,25,17,0,13,21,0,1,21,4,23,21,4,15,7,16,22,1,10,12,0,7,21,0,1,21,4,23,21,4,16,7,16,22,1,9,12,17,17,25,0,25,0,9,21,0,2,17,21,4,15,16,22,0,3,11,0,6,21,0,1,17,22,0,4,11,21,3,2,16,22,0,5,11,14,21,0,1,31,0,4,3,2,0,16,21,0,5,17,21,2,3,21,0,3,0,8,0,25,17,0,7,21,0,2,17,0,8,31,0,5,17,0,6,31,0,3,17,17,25,21,0,1,14,21,2,4,21,2,9,3,2,0,18,0,17,0,18,0,8,21,4,7,21,2,6,8,7,9,7,16,22,0,3,22,0,4,4,2,11,14,31,0,4,0,18,15,286,7,16,25,21,0,2,21,4,55,16,21,4,61,16,22,0,3,11,14,21,0,1,21,4,54,21,0,2,21,4,25,21,0,3,17,17,0,18,0,23,21,4,8,0,7,8,21,4,16,0,24,19,21,4,4,0,16,7,31,0,3,19,7,16,22,0,4,11,14,0,7,21,4,7,0,23,8,0,8,21,4,7,21,2,4,21,4,8,0,7,8,8,0,7,21,4,2,19,3,2,0,16,21,3,2,17,22,0,5,11,14,21,2,9,0,17,16,0,18,0,8,21,4,7,21,2,6,8,21,4,6,21,1,3,8,31,0,5,21,4,2,19,21,4,7,31,0,4,21,4,8,0,16,8,8,7,16,25,0,23,0,6,21,0,1,17,21,2,4,16,22,2,6,12,21,2,5,16,22,2,7,12,14,21,2,6,25,21,0,1,14,0,23,0,6,22,2,3,13,14,0,24,25,21,0,0,0,24,3,2,25,21,0,2,22,0,3,11,14,21,0,1,0,18,0,15,7,16,22,0,4,11,0,16,0,24,17,21,4,18,16,22,0,5,11,14,0,28,22,0,6,11,14,15,287,21,4,8,21,1,4,8,22,0,7,11,14,15,288,25,21,0,1,21,1,5,16,22,0,3,22,0,4,4,2,11,14,31,0,3,22,1,5,12,14,31,0,4,25,0,23,0,7,21,0,1,0,6,22,1,9,13,17,25,0,23,0,7,21,0,1,17,0,17,16,0,18,0,6,21,4,7,21,0,1,0,7,21,1,9,17,8,21,1,11,21,0,2,19,7,16,14,21,0,2,25,0,24,21,4,3,21,1,3,21,0,1,7,7,16,21,2,3,16,25,0,24,21,4,3,21,0,2,21,1,3,21,0,1,8,7,16,21,2,3,16,25,21,0,1,0,17,16,21,2,5,21,0,1,7,22,2,6,13,25,21,4,3,21,0,2,0,1,16,7,21,1,4,3,2,21,4,9,0,13,21,4,7,0,24,8,8,22,1,4,12,25,21,0,1,14,21,3,6,0,16,21,1,4,0,12,21,1,3,17,0,8,21,3,7,17,0,7,0,23,17,0,6,22,1,3,13,17,25,21,0,4,21,5,8,0,16,8,21,5,6,21,0,1,8,25,21,5,3,0,24,7,0,13,21,2,3,21,5,49,21,0,1,7,16,19,25,21,0,2,22,0,3,11,0,7,16,22,0,4,11,14,0,24,22,0,5,11,22,0,6,11,22,0,7,11,14,0,29,22,0,8,11,14,21,0,1,0,23,0,12,21,2,3,17,0,7,0,23,17,21,5,10,0,18,0,8,21,5,7,21,2,3,8,7,8,16,21,5,8,0,16,8,21,5,6,21,1,3,8,22,0,9,11,14,21,0,9,0,7,0,23,19,0,24,0,23,0,25,3,4,22,0,10,11,14,0,6,15,289,3,2,0,16,21,0,3,0,13,0,30,17,17,22,0,11,11,14,15,290,22,0,12,11,14,15,291,15,292,31,0,12,3,3,21,5,9,15,293,8,22,0,13,11,14,21,0,1,0,18,21,0,1,21,5,8,15,294,8,7,16,25,21,1,3,0,18,21,0,1,21,5,8,21,2,3,8,7,16,21,4,3,16,25,21,1,4,0,18,0,16,21,5,7,21,0,1,8,7,16,25,0,23,0,6,22,1,6,13,14,21,1,6,21,1,7,21,5,7,21,5,3,21,0,0,7,8,21,5,3,21,1,3,7,3,2,21,5,9,0,13,21,5,7,21,1,5,8,8,16,22,0,3,11,14,0,24,31,0,3,16,25,21,0,1,21,1,8,0,7,0,23,17,21,6,10,21,1,9,21,6,10,15,295,8,8,0,23,0,7,21,0,1,17,17,25,21,0,2,0,6,21,1,3,17,22,1,4,12,14,21,0,1,0,6,21,1,3,17,22,1,7,12,21,2,4,16,22,1,6,12,0,6,21,1,3,17,21,2,4,16,22,1,5,12,14,21,1,7,0,13,21,4,3,17,22,1,8,12,14,21,1,6,21,1,11,16,14,21,1,7,21,1,13,21,1,4,17,25,21,0,2,0,6,0,23,17,22,1,4,12,0,12,21,1,6,17,0,8,0,25,17,0,6,22,1,8,13,14,21,0,2,25,21,0,1,0,6,0,23,17,22,1,7,12,0,12,21,1,5,17,0,6,22,1,8,13,14,21,0,1,25,21,0,1,21,1,10,21,6,9,21,1,8,8,21,0,2,17,25,21,0,1,0,16,21,1,7,21,1,13,21,1,4,17,17,25,21,0,1,14,0,25,22,2,8,12,14,21,2,4,22,2,7,12,14,21,0,1,22,2,4,12,25] + ,provide.concat([1,0,2,Infinity,-Infinity,-1,3,8,5,4,'∾','+','-','×','÷','⋆','¬','⌊','⌈','∨','∧','≠','=','>','≥','˙','√','<','⊢','⊣','≍','↑','↓','↕','⌽','⍉','/','⊔','˜','¨','⌜','˘','`','∘','○','⌾','⍟','⊘','⊸','⟜',str("+-×÷⋆√⌊⌈|¬∧∨<>≠=≤≥≡≢⊣⊢⥊∾≍↑↓↕«»⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔!˙˜˘¨⌜⁼´˝`∘○⊸⟜⌾⊘◶⎉⚇⍟⎊%"),str("´: Identity not found"),str("´: 𝕩 must be a list"),str("Mapping: Equal-rank argument shapes don\'t agree"),str("Mapping: Argument shape prefixes don\'t agree"),str("⍋𝕩: 𝕩 must have rank at least 1"),str("⍋ or ⍒: Rank of 𝕨 must be at least 1"),str("⍋ or ⍒: Rank of 𝕩 must be at least cell rank of 𝕨"),str("⍋ or ⍒: 𝕨 must be sorted"),str("p⊐𝕩 or 𝕨∊p: p must have rank at least 1"),str("p⊐n or n∊p: Rank of n must be at least cell rank of p"),str("/: Replication argument must have rank 1"),str("/: Amounts to replicate must be natural numbers"),str("⌽𝕩: 𝕩 must have rank at least 1"),str("𝕨⌽𝕩: 𝕨 must consist of integers"),str("↑𝕩: 𝕩 must have rank at least 1"),str("↓𝕩: 𝕩 must have rank at least 1"),str("𝕨⊑𝕩: Indices in 𝕨 must consist of integers"),str("𝕨⊑𝕩: Index out of range"),str("𝕨⊏𝕩: Indices in 𝕨 must be integers"),str("𝕨⊏𝕩: Indices out of range"),str("𝕨⊑𝕩: 𝕩 must be a list when 𝕨 is a number"),str("𝕨⊑𝕩: Indices in compound 𝕨 must be lists"),str("𝕨⊑𝕩: Index length in 𝕨 must match rank of 𝕩"),str("⊏𝕩: 𝕩 must have rank at least 1"),str("⊏𝕩: 𝕩 cannot have length 0"),str("𝕨⊏𝕩: 𝕨 must be an array"),str("⌾: Incompatible result elements in structural Under"),str(">𝕩: Elements of 𝕩 must have matching shapes"),str("∾𝕩: Elements of 𝕩 must all have the same rank"),str("∾𝕩: 𝕩 element rank must be at least argument rank"),str("∾𝕩: 𝕩 element shapes must be compatible"),str("∾𝕩: 𝕩 element trailing shapes must match"),str("∾𝕩: empty 𝕩 fill rank must be at least argument rank"),str("∾𝕩: 𝕩 must be an array"),str("⊢⊣˜∘○⊸⟜⊘◶"),str("=≠≢"),str("<"),str("≍"),str("↕/»«⊔"),str("⥊↑↓⌽⍉⊏⊑"),str("𝕨"),str("𝕩: 𝕨 must "),str("have rank at most 1"),str("consist of integers"),str("↑"),str("↓"),str("« or »: 𝕩 must have rank at least 1"),str("« or »: 𝕨 must not have higher rank than 𝕩"),str("« or »: Rank of 𝕨 must be at least rank of 𝕩 minus 1"),str("« or »: 𝕨 must share 𝕩\'s major cell shape"),str("↕𝕩: 𝕩 must consist of natural numbers"),str("↕𝕩: 𝕩 must be a number or list"),str("𝕨↕𝕩: 𝕨 must have rank at most 1"),str("𝕨↕𝕩: Length of 𝕨 must be at most rank of 𝕩"),str("𝕨↕𝕩: 𝕨 must consist of natural numbers"),str("𝕨↕𝕩: Window length 𝕨 must be at most axis length plus one"),str("First-axis primitive: 𝕩 must have rank at least 1"),str("Multi-axis primitive: 𝕨 must have rank at most 1"),str("Multi-axis primitive: Length of 𝕨 must be at most rank of 𝕩"),str("𝕨/𝕩: Lengths of components of 𝕨 must match 𝕩"),str("∊𝕩 or ⊐𝕩: 𝕩 must have rank at least 1"),str("∘⌊⌽↑"),str("𝕨⥊𝕩: 𝕨 must have rank at most 1"),str("𝕨⥊𝕩: 𝕨 must consist of natural numbers"),str("𝕨⥊𝕩: Can\'t compute axis length when rest of shape is empty"),str("𝕨⥊𝕩: 𝕨 must consist of natural numbers or ∘ ⌊ ⌽ ↑"),str("𝕨⥊𝕩: Shape must be exact when reshaping with ∘"),str("⊔: Grouping argument must consist of integers"),str("⊔: Grouping argument values cannot be less than ¯1"),str("⊔𝕩: 𝕩 must be a list"),str("𝕨⊔𝕩: Rank of simple 𝕨 must be at most rank of 𝕩"),str("𝕨⊔𝕩: Lengths of 𝕨 must equal to 𝕩, or one more only in a rank-1 component"),str("𝕨⊔𝕩: 𝕩 must be an array"),str("≥: No monadic form"),str("≤: No monadic form"),str("⎉ or ⚇: 𝔽 result must have rank at most 1"),str("⎉ or ⚇: 𝔽 result must have 1 to 3 elements"),str("⎉ or ⚇: 𝔽 result must consist of integers"),str("˝: 𝕩 must have rank at least 1"),str("˝: Identity does not exist"),str("𝕨∾𝕩: Rank of 𝕨 and 𝕩 must differ by at most 1"),str("𝕨∾𝕩: Cell shapes of 𝕨 and 𝕩 must match"),str("⍟: Repetition numbers in 𝕨𝔾𝕩 must be integers"),str("𝕨⊔𝕩: Compound 𝕨 must be a list"),str("𝕨⊔𝕩: Total rank of 𝕨 must be at most rank of 𝕩"),str("⍷𝕩: Rank of 𝕨 cannot exceed rank of 𝕩"),str("⊒: Rank of 𝕨 must be at least 1"),str("⊒: Rank of 𝕩 must be at least cell rank of 𝕨"),str("𝕨⍉𝕩: 𝕨 must have rank at most 1"),str("𝕨⍉𝕩: Length of 𝕨 must not exceed rank of 𝕩"),str("𝕨⍉𝕩: 𝕨 must consist of natural numbers"),str("𝕨⍉𝕩: Skipped result axis"),str("Cannot currently invert blocks"),str("Cannot invert modifier"),str("⁼: Inverse failed"),str("⁼: Inverse does not exist"),str("⁼: Inverse not found")]) + ,[[0,1,0,196],[0,0,4259,3],[0,0,4263,3],[0,0,4267,3],[1,0,4271,5],[1,0,4279,5],[2,0,4297,6],[2,0,4312,6],[2,0,4331,6],[2,0,4353,6],[2,0,4375,6],[2,0,4402,6],[0,0,4434,3],[0,0,4451,4],[0,0,4527,3],[0,0,4547,3],[1,0,4587,8],[0,0,4669,5],[0,0,4747,3],[0,0,4764,3],[0,0,4772,3],[0,0,4776,3],[0,0,4789,3],[0,0,4801,3],[0,0,4810,3],[1,1,4816,2],[2,1,4847,3],[1,1,4881,2],[0,0,4898,4],[2,1,4965,5],[0,0,5002,3],[1,0,5009,5],[1,1,5072,4],[1,1,5145,3],[0,0,5223,3],[0,0,5234,4],[1,0,5304,9],[0,0,5377,5],[1,1,5461,4],[1,1,5517,3],[1,0,5541,14],[1,1,5991,4],[0,0,6043,4],[0,0,6097,6],[0,0,6187,3],[0,0,6212,7],[0,0,6332,4],[0,0,6393,4],[0,0,6506,3],[0,0,6574,4],[0,0,6651,6],[0,0,6728,3],[0,0,6770,5],[0,0,6873,3],[0,0,6891,3],[0,0,6941,3],[0,0,6986,4],[2,1,7059,3],[0,0,7102,3],[2,0,7106,16],[0,0,7417,3],[0,0,7444,3],[0,0,7470,3],[0,0,7485,3],[1,0,7514,5],[2,1,7552,3],[0,0,7621,4],[0,0,7726,7],[0,0,7773,14],[0,0,8007,5],[0,0,8104,3],[0,0,8112,6],[0,0,8139,5],[0,0,8160,6],[0,1,8187,10],[1,1,8505,8],[1,0,8558,6],[1,1,8666,2],[0,0,8724,5],[0,0,8849,5],[0,0,8986,7],[0,0,9155,3],[0,0,9214,5],[0,0,9248,4],[1,0,9315,5],[2,1,9332,4],[0,0,9375,5],[0,0,9463,3],[1,0,9496,6],[0,0,9635,9],[1,0,9802,9],[0,0,9959,4],[0,0,10075,8],[0,0,10303,3],[0,0,10348,3],[0,0,10375,3],[0,0,10397,3],[0,0,10419,3],[0,0,10438,3],[1,1,10535,2],[2,0,10604,10],[2,0,10663,8],[1,0,10856,7],[0,0,10923,8],[2,0,11163,10],[0,0,11238,10],[0,0,11668,4],[0,0,11776,4],[0,0,11887,3],[0,0,11963,3],[0,0,12018,4],[0,0,12151,4],[1,1,12273,2],[2,0,12281,6],[1,1,12296,2],[0,0,12411,3],[0,0,12419,3],[0,0,12427,3],[0,0,12448,8],[0,0,12530,3],[0,0,12538,3],[0,0,12546,3],[0,0,12554,3],[0,0,12562,3],[0,0,12570,3],[0,0,12582,3],[2,0,12607,7],[0,0,12648,6],[0,0,12872,4],[0,0,12978,3],[0,0,13021,5],[0,0,13165,3],[0,0,13212,3],[0,0,13238,3],[1,0,13329,5],[0,0,13357,3],[0,0,13393,3],[0,0,13441,3],[0,0,13495,3],[0,0,13507,3],[1,1,13587,2],[0,0,13617,4],[0,0,13654,3],[0,0,13669,3],[0,0,13698,3],[0,0,13713,3],[0,0,13731,3],[0,0,13746,3],[0,0,13756,3],[2,0,13813,6],[0,0,13841,3],[1,1,13869,2],[1,1,13873,2],[0,0,13877,3],[0,0,13900,3],[0,0,13915,3],[0,0,13923,3],[1,0,13931,6],[1,0,14048,11],[1,0,14269,5],[0,0,14284,3],[0,0,14298,3],[0,0,14312,7],[0,0,14389,6],[0,0,14437,3],[0,0,14457,3],[0,0,14465,4],[0,0,14524,4],[0,0,14551,3],[0,0,14570,10],[0,0,14775,8],[0,0,14942,3],[1,1,14968,2],[0,0,14985,3],[0,0,15012,3],[0,0,15022,3],[2,0,15039,11],[0,0,15116,5],[0,0,15194,8],[0,0,15277,3],[0,0,15285,3],[1,0,15329,7],[0,0,15355,9],[1,0,15629,5],[0,0,15645,6],[1,0,15775,5],[2,0,15812,6],[0,0,15843,3],[0,0,15853,3],[0,0,15863,4],[0,0,15904,4],[0,0,15927,3],[0,0,15935,3],[0,0,15963,11],[0,0,16205,3],[0,0,16225,3],[0,0,16289,8],[0,0,16572,3],[0,0,16600,5],[0,0,16695,3],[0,0,16705,3],[0,0,16724,8],[0,0,16989,3],[0,0,17036,3],[0,0,17068,3],[0,0,17098,3],[0,0,17136,5],[0,0,17210,3],[1,0,17223,6],[0,0,17376,7],[0,0,17518,5],[0,0,17598,3],[0,0,17621,3],[0,0,17632,3],[0,0,17640,9],[0,0,17784,3],[0,0,17813,3],[0,0,17831,3],[0,0,17856,3],[0,0,17878,3],[0,0,17889,3],[1,1,17903,2],[1,0,17907,5],[1,0,17918,5],[0,0,17929,3],[0,0,17968,5],[0,0,18081,3],[0,0,18133,13],[0,0,18338,3],[0,0,18361,3],[0,0,18385,4],[0,0,18477,3],[0,0,18497,3],[0,0,18529,3],[0,0,18540,3],[0,0,18583,7],[0,0,18730,12],[2,0,18928,6],[0,0,18976,3],[0,0,19047,3],[0,0,19076,4],[1,0,19099,5],[0,0,19110,4],[0,0,19121,4],[0,0,19132,3],[1,0,19165,5],[0,0,19191,3],[0,0,19261,3],[0,0,19275,3],[0,0,19286,5],[0,0,19393,3],[0,0,19423,3],[0,0,19443,3],[0,0,19497,3],[0,0,19531,5],[0,0,19561,3],[0,0,19576,3],[1,0,19619,5],[0,0,19630,3],[0,0,19673,3],[2,0,19694,6],[1,1,19709,2],[1,1,19717,2],[0,0,19725,5],[0,0,19764,3],[0,0,19789,6],[0,0,19921,3],[0,0,19964,3],[0,0,20009,6],[0,0,20089,5],[0,0,20140,6],[0,0,20295,3],[0,0,20324,3],[0,0,20340,3],[0,0,20348,8],[0,0,20407,5],[0,0,20436,3],[0,0,20451,3],[1,1,20493,2],[2,1,20512,3],[0,0,20534,3],[0,0,20552,3],[0,0,20584,3],[1,0,20621,5],[0,0,20638,3],[0,0,20659,14],[0,0,20834,3],[0,0,20856,3],[0,0,20873,4],[0,0,20934,3],[0,0,20968,3],[0,0,21051,3],[0,0,21085,3],[0,0,21114,3],[0,0,21132,3],[0,0,21149,3]] ); let rtAssert = runtime[42] = assertFn("!"); diff --git a/src/pr.bqn b/src/pr.bqn index 29337498..df1b1ac8 100755 --- a/src/pr.bqn +++ b/src/pr.bqn @@ -24,5 +24,6 @@ GetRepls ← { gd ← "glyphs←"""∾glyphs∾"%""" rslt ← "⟨"∾"⟩"«∾","⊸∾¨glyphs # Output all primitives -src ← ∾⟨⟨gd⟩,•FLines"r.bqn",⟨"{PrimInd↩⊑𝕩⊐<⋄𝕩‿SetPrims}"∾rslt⟩⟩ +rr ← •FLines¨ "r0.bqn"‿"r1.bqn" +src ← ∾⟨⟨gd⟩,∾rr,⟨"{PrimInd↩⊑𝕩⊐<⋄𝕩‿SetPrims}"∾rslt⟩⟩ ref ⇐ ∾∾⟜(@+10)¨ E_proc¨ src diff --git a/src/r.bqn b/src/r.bqn deleted file mode 100644 index 9208a598..00000000 --- a/src/r.bqn +++ /dev/null @@ -1,862 +0,0 @@ -# BQN runtime. Requires: -# Type Fill Log GroupLen GroupOrd _fillBy_ -# !+-×÷⋆⌊=≤≢⥊⊑↕⌜`⊘ -# Filled in by runtime: glyphs and default PrimInd -Decompose ← {0‿𝕩} -PrimInd ← {𝕩} -SetPrims ← {Decompose‿PrimInd ↩ 𝕩} - -◶ ← {𝕨((𝕨𝔽𝕩)⊑𝕘){𝔽}𝕩} # LIMITED to number left operand result -⊢ ← {𝕩} -⊣ ← {𝕩}⊘{𝕨} -˙ ← {𝕩⋄𝕗} -˜ ← {𝕩𝔽𝕨⊣𝕩} -∘ ← {𝔽𝕨𝔾𝕩} -○ ← {(𝔾𝕨)𝔽𝔾𝕩} -⊸ ← {(𝔽𝕨⊣𝕩)𝔾𝕩} -⟜ ← {(𝕨⊣𝕩)𝔽𝔾𝕩} -⍟ ← {𝕨((𝕨𝔾𝕩)⊑⊢‿𝕗){𝔽}𝕩} # LIMITED to boolean right operand result - -IsArray←0=Type -Int←(1=Type)◶⟨0,⌊⊸=⟩ -Nat←(1=Type)◶⟨0,0⊸≤×⌊⊸=⟩ -Deshape←IsArray◶{𝕩Fill⟨𝕩⟩}‿⥊ -Pair ← {⟨𝕩⟩} ⊘ {⟨𝕨,𝕩⟩} -Box ← {𝕩Fill⟨⟩⥊⟨𝕩⟩} -ToArray ← Box⍟(1-IsArray) - -# LIMITED to numeric arguments for arithmetic cases -≥ ← ≤˜ -< ← Box ⊘ (1-≥) -> ← (1-≤) -⌊ ↩ ⌊ ⊘ (⊣-≥×-) -⌈ ← -∘⌊∘- ⊘ (⊣-≤×-) -| ← 0⊸≤◶-‿⊢ -≠ ← (0<=)◶⟨1⋄0⊑≢⟩ # LIMITED to monadic case - -_fold←{ - "´: 𝕩 must be a list" ! 1==𝕩 - l←≠v←𝕩 ⋄ F←𝔽 - r←𝕨 (0',0 , '≥',1 -⟩ - -_eachd←{ - _d←{ # Equal ranks - p←≢𝕨 - "Mapping: Equal-rank argument shapes don't agree" ! 1(⊑⟜p=⊑⟜(≢𝕩))⊸×´↕=𝕨 - p⥊ (⊑⟜(⥊𝕨)𝔽⊑⟜(⥊𝕩))⌜↕1×´p - } - _e←{ # 𝕨 has smaller or equal rank - p←≢𝕨 ⋄ k←=𝕨 ⋄ q←≢𝕩 - "Mapping: Argument shape prefixes don't agree" ! 1(⊑⟜p=⊑⟜q)⊸×´↕k - l←1(q⊑˜k⊸+)⊸×´↕(=𝕩)-k - a←⥊𝕨 ⋄ b←⥊𝕩 - q⥊⥊(≠a) (⊑⟜a𝔽l⊸×⊸+⊑b˙)⌜○↕ l - } - =○=◶⟨>○=◶⟨𝔽_e⋄𝔽˜_e˜⟩⋄𝔽_d⟩ -} - -_perv←{ # Pervasion - R←𝔽{𝕨𝔽_perv𝕩} - +○IsArray◶⟨ - 𝔽 - R⌜⊘(>○IsArray◶{𝕨{𝕗R𝕩}⌜𝕩}‿{𝕩{𝕩R𝕗}⌜𝕨}) _fillBy_ R - R _eachd _fillBy_ R - ⟩ -} - -# Sorting -Cmp0 ← ≥-≤ -Cmp1 ← (0<1×´≢∘⊢)◶⟨1, IsArray∘⊢◶(1-2×≤)‿{𝕨Cmp1𝕩}⟜(0⊑⥊)⟩ -CmpLen ← { - e←𝕨-○(1×´0⊸<⌜)𝕩 - 𝕨(e=0)◶⟨e,0⟩‿{ - SM←Cmp0 Pair ≥⊑Pair - c‿r←𝕨SM○≠𝕩 - l←𝕨{ - i←0+´×`𝕨=_eachd𝕩 - m←1×´i↕⊸⊏𝕨 - {k‿l←SM´𝕩⋄c↩k⋄m×↩l}∘(<⊑⌜𝕨‿𝕩˙)⍟(r⊸>)i - m - }○{(𝕩⊑˜(¯1+≠𝕩)⊸-)⌜↕r}𝕩 - ⟨c,l⟩ - }𝕩 -} -_getCellCmp ← { - Ci←𝔽⋄c←𝕨⊣0⋄l←𝕩 - Cc←{ - a←𝕨⋄b←𝕩 - S←(l⊸=)◶{S∘(1+𝕩)⍟(0⊸=)a Ci○(𝕩⊸+)b}‿c - S 0 - } - (𝕨 ⊢⊘{𝕨⍟(0⊸=)𝕏} ci˙)⍟(1=l) cc -} -Cmp ← +○IsArray◶⟨ - Cmp0 - IsArray∘⊣◶⟨Cmp1,-Cmp1˜⟩ - { - lc←𝕨CmpLen○≢𝕩 - cc ← (⊑⟜(⥊𝕨))⊸Cmp⟜(⊑⟜(⥊𝕩)) _getCellCmp´ lc - Cc˜0 - } -⟩ - -_grade ← { - gt ← 𝕗 - cmps ← {𝕏˜}⌜⍟𝕗⟨Cmp,Cmp0,Cmp≤0˙,≤⟩ - 0 Fill { - "⍋𝕩: 𝕩 must have rank at least 1" ! 1≤=𝕩 - l←≠𝕩 - (2≤l)◶⟨↕∘l,{ - m1←1=m←1×´1 Cell 𝕩 - 𝕩↩⥊𝕩 - a0←1⋄ts←0⋄{a0×↩1≤𝕩⋄ts+↩𝕩}∘Type⌜𝕩 - cs←a0+2×m1 - Merge ← { # Merge sort - le ← m {(𝕏 _getCellCmp m)≤0˙}⍟(1-m1) 𝕩{𝕏○(⊑⟜𝕗)} cs⊑cmps - B←l⊸≤◶⊢‿l - (↕l){ - i←-d←𝕨 ⋄ j←ei←ej←0 - e←3 ⋄ G←LE○(⊑⟜(m⊸×⌜⍟(1-m=1)𝕩)) ⋄ c←⟨1-G,0,1,2⟩ - s←(8≤d)⊑⟨+,{(𝕩-1){𝕩⋄e↩2⋄j↩i⋄i↩𝕩}⍟G⍟(1-e)𝕩}⟩ - N←{i↩d+𝕨⋄ej↩B d+ei↩B j↩d+𝕩⋄e↩l≤j⋄S ei⋄i R j} - R←{𝕨e◶c𝕩}◶{e+↩2×ei=i↩1+𝕨⋄𝕨}‿{e+↩ej=j↩1+𝕩⋄𝕩}‿N - {(i R j)⊑𝕩}⟜𝕩⌜𝕩 - }´(2⋆ni-1+⊢)⌜↕ni←⌈2 Log l+l=0 - } - # Counting sort for small-range ints - bl←bu←0 ⋄ Count←{GroupLen⊸GroupOrd (gt⊑⟨-⟜bl,bu⊸-⟩)⌜𝕩} - sr←((3=cs)×ts=l)◶⟨0,(1×´⌊⊸=⌜)◶0‿{((bu↩⌈´𝕩)-bl↩⌊´𝕩)≤2×l}⟩𝕩 - sr◶Merge‿Count 𝕩 - }⟩𝕩 - } -} -_binSearch ← { - B ← 𝔽 - { - R←{𝕨{a←B m←𝕩+h←⌊𝕨÷2⋄(h+a×𝕨-2×h)R a⊑𝕩‿m}⍟(>⟜1)𝕩} - 1+(𝕩+1)R ¯1 - }⍟(0⊸<) -} -_bins←{ - c←1-˜=𝕨 - "⍋ or ⍒: Rank of 𝕨 must be at least 1" ! 0≤c - "⍋ or ⍒: Rank of 𝕩 must be at least cell rank of 𝕨" ! c≤=𝕩 - 𝕩↩ToArray 𝕩 - lw←1×´sw←1 Cell 𝕨 - cw←𝔽○(⊑⟜(⥊𝕨)) _getCellCmp lw - "⍋ or ⍒: 𝕨 must be sorted" ! 0⊸<◶⟨1,1×´·(Cw≤0˙)⟜(lw⊸+)∘(lw⊸×)⌜↕∘-⟜1⟩≠𝕨 - cx←c-˜=𝕩 - sx←cx Cell 𝕩 ⋄ lc←sw CmpLen sx - cc ← (⊑⟜(⥊𝕨))⊸𝔽⟜(⊑⟜(⥊𝕩)) _getCellCmp´ lc - B←(1×´sw)⊸×⊸Cc≤0˙ - 0 Fill (≠𝕨)⊸{B⟜𝕩 _binSearch 𝕨}⌜ (1×´sx)⊸×⌜ ⥊⟜(↕1×´⊢)⊑⟜(≢𝕩)⌜↕cx -} - -⍋ ← 0 _grade ⊘ (Cmp _bins) -⍒ ← 1 _grade ⊘ (Cmp˜ _bins) - -# Searching -_search←{ # 0 for ∊˜, 1 for ⊐ - ind ← 𝕗 - red ← 𝕗⊑⟨1-×´,+´×`⟩ - 0 Fill { - c←1-˜=𝕨 - "p⊐𝕩 or 𝕨∊p: p must have rank at least 1" ! 0≤c - "p⊐n or n∊p: Rank of n must be at least cell rank of p" ! c≤=𝕩 - n←≠𝕨 ⋄ k←1×´s←1 Cell 𝕨 ⋄ cx←c-˜=𝕩 - lx←1×´sh←cx↑≢𝕩 - sh ⥊ 𝕨 (0_cr⟩ ⊣ ei!Int∘⊢ -}⌜⟨ - "𝕨⊑𝕩: Indices in 𝕨 must consist of integers"‿"𝕨⊑𝕩: Index out of range" - "𝕨⊏𝕩: Indices in 𝕨 must be integers"‿"𝕨⊏𝕩: Indices out of range" -⟩ -Pick0←{ - "𝕨⊑𝕩: 𝕩 must be a list when 𝕨 is a number" ! 1==𝕩 - 𝕩⊑˜(≠𝕩)NormIndP𝕨 -} -Pick1←{ - "𝕨⊑𝕩: Indices in compound 𝕨 must be lists" ! 1==𝕨 - "𝕨⊑𝕩: Index length in 𝕨 must match rank of 𝕩" ! 𝕨=○≠s←≢𝕩 - i←0⋄(⊑⟜𝕨{i↩(𝕩NormIndP𝕨)+𝕩×i}⊑⟜s)⌜↕≠𝕨 - i⊑Deshape𝕩 -}⟜ToArray -Pickd←(0<0+´IsArray⌜∘⥊∘⊣)◶Pick1‿{Pickd⟜𝕩⌜𝕨} -Pick←IsArray∘⊣◶Pick0‿Pickd - -FirstCell←{ - "⊏𝕩: 𝕩 must have rank at least 1" ! 1≤=𝕩 - "⊏𝕩: 𝕩 cannot have length 0" ! 0<≠𝕩 - (<0) ⊏ 𝕩 -} -SelSub←{ - "𝕨⊏𝕩: 𝕨 must be an array" ! IsArray 𝕨 - 𝕨 (≠𝕩)⊸NormIndS⌜⊸⊏ 𝕩 -} -First ← IsArray◶⟨⊢, (0<≠)◶⟨Fill,0⊸⊑⟩⥊⟩ - -IsPure ← {d←Decompose𝕩 ⋄ 2⊸≤◶⟨≤⟜0, 1×´·𝕊⌜1↓d˙⟩0⊑d} -_fillByPure_←{ - 𝕘 (3≤Type∘⊣)◶⟨{𝕨Fill𝕏},{(𝕨HomFil𝕩)_fillBy_𝕨}⍟(IsPure⊣)⟩ 𝕗 -} - -StructErr←{𝕩} -IsStructErr ← (3=Type)◶⟨0,StructErr˙⊸=⟩ -_under_←{ - val←𝕨𝔽○𝔾𝕩 - # Construct indices - Inds ← IsArray◶⟨0,⥊⟜(↕1×´⊢)≢⟩ 𝕩 ⊑⟜⥊⍟(IsArray⊢)´ Reverse - _s_ ← { - f←𝕗 - st‿d‿o←𝕩 - g←𝕨 St Inds∘{f↩f(IsArray⊣)◶⟨⟩‿∾⟨𝕩⟩}⍟(d>IsArray) 𝕘 - {f _s_ 𝕩}⍟o g - } - IsStruct ← (5=0⊸⊑)◶⟨0,s˙=2⊸⊑⟩ Decompose - sf ← isStruct StructFn 𝕘 ⋄ SR ← ¯1 _s_ 0 - root‿ind ← IsStruct◶⟨0‿StructErr,1‿3⊏Decompose⟩ SF sr - - # Traverse indices 𝕩 and values 𝕨. - # Return flat lists ⟨indices,values⟩, or structErr if 𝕨 doesn't capture 𝕩. - GetInserts←{ - count←0⋄depth←{IsArray◶⟨{𝕩⋄count+↩1⋄0},1+0⌈´𝕊⌜∘⥊⟩𝕩}𝕩 - 𝕩 (2⌊depth)◶(Pair○Pair)‿(StructConform◶⟨StructErr˙,Pair○⥊⟩)‿{ - Fail←{𝕊‿0} - # 𝕎 is parent traversal; 𝕩 is current components of ind and val - Trav←(IsArray 0⊑⊢)◶⟨Pair, StructConform´∘⊢◶Fail‿{ - Parent←𝕎 ⋄ n←≠0⊑a←⥊⌜𝕩 ⋄ j←¯1 - Child←Trav⟜{𝕩⊸⊑⌜a} - { j+↩1 ⋄ f←n⊸≤◶⟨𝕊˙⊸Child,Parent˙⟩j ⋄ F 0 } - }⟩ - next ← 0 Trav 𝕨‿𝕩 - res ← {n‿o←Next𝕩⋄next↩n⋄o}⌜ ↕count - (next=fail)◶⟨0⊸⊑⌜ Pair 1⊸⊑⌜, StructErr˙⟩ res - } 𝕨 - }⍟(1-IsStructErr∘⊢) - Struct←{ - i‿v←𝕨 - Set1←𝕨⊸{ - 𝕩↩ToArray𝕩 - s←≢𝕩⋄l←≠d←⥊𝕩 - gl←l GroupLen i ⋄ g←gl GroupOrd i - Sel←v⊑˜⊑⟜g - j←0⋄Adv←Sel{(j+↩𝕩)-1} - CM←"⌾: Incompatible result elements in structural Under"!Match⟜Sel - s⥊2⊸⌊◶⟨⊑⟜d,Adv,Adv{(𝕨CM(j-𝕩)⊸+)⌜↕𝕩-1⋄𝕨}⊢⟩⟜(⊑⟜gl)⌜↕l - } - _at_ ← {𝔽⍟((𝔾𝕩)=⊣)⟜(⊑⟜𝕩)⌜ ↕≠𝕩} - Set ← 0⊸{ (𝕨≥≠root)◶⟨≢⥊(1+𝕨)⊸𝕊_at_(𝕨⊑root˙)∘⥊, Set1⟩ 𝕩 } - IsArray∘root◶⟨0⊑v˙, Set⟩ 𝕩 - } _fillBy_ ⊢ - IsStructErr◶⟨Struct⟜(𝕩˙), {𝕏val}·Inverse𝔾˙⟩ val GetInserts ind -} - -MatchS ← 1×´=_eachd -match←{(0⊑𝕨)◶(1⊑𝕨)‿𝕩}´⟨ - ⟨=○IsArray, 0⟩ - ⟨IsArray∘⊢, =⟩ - ⟨=○= , 0⟩ - ⟨MatchS○≢ , 0⟩ - {1×´⥊𝕨 Match _eachd 𝕩} -⟩ -structConform ← {𝕎◶0‿𝕏}´⟨IsArray⊢, =○=, MatchS○≢⟩ -Depth←IsArray◶0‿{1+0⌈´Depth⌜⥊𝕩} - -≡ ← Depth ⊘ Match -≢ ↩ IsArray◶⟨⟩‿≢ ⊘ (1-Match) -¨ ← {𝕨𝔽⌜⊘(𝔽_eachd)_fillByPure_𝔽○ToArray𝕩} - -IF ← ⊢⊣!∘≡ # Intersect fill -IEF← (0<≠)◶⟨⊢_fillBy_ Fill, ⊢_fillBy_ IF´⟩∘⥊ -_fillMerge_ ← {(0<≠∘⥊)◶⟨(𝔾○≢⥊⟨⟩˙)_fillBy_⊢⟜Fill, 𝔽 ⊣_fillBy_⊢ IEF⟩} -Merge←{ - c←≢0⊑⥊𝕩 - (">𝕩: Elements of 𝕩 must have matching shapes" ! c =○≠◶0‿MatchS ≢)⌜⥊𝕩 - (Deshape⌜𝕩)⊑˜⌜c⥊↕1×´c -}_fillMerge_∾⍟IsArray - -Join1←{ - # List of lists - i←j←¯1 ⋄ e←⟨⟩ ⋄ a←𝕩 - {{e↩a⊑˜i↩𝕩⋄j↩¯1}⍟(1-i⊸=)𝕩⋄(j↩j+1)⊑e}⌜Indices≠⌜𝕩 -} -JoinM←{ - # Multidimensional - n←≠z←⥊𝕩 ⋄ s←≢⌜z ⋄ d←≠0⊑s ⋄ r←=𝕩 - "∾𝕩: Elements of 𝕩 must all have the same rank" ! 1×´(d=≠)⌜s - "∾𝕩: 𝕩 element rank must be at least argument rank" ! d≥r - _s0←{s←𝕨⋄F←𝔽⋄{o←s⋄s F↩𝕩⋄o}⌜𝕩} - sh←≢𝕩 ⋄ p←1 ⋄ i←j←<0 - (Reverse 1×_s0 Reverse sh){ - q←𝕨 - a←𝕩⊑sh - m←𝕩⊸⊑⌜s - l←(q⊸×⊑m˙)⌜↕a - "∾𝕩: 𝕩 element shapes must be compatible" ! m MatchS ⥊(↕p)⊢⌜l⊣⌜↕q - k ← Indices l - c ← -⟜(⊑⟜(k ⊏ 0+_s0 l))⌜ ↕≠k - i ↩ (i ×⟜(⊑⟜l)⌜ k) +¨ i⊢⌜c - j ↩ j ×⟜a⊸+⌜ k - p×↩a - }¨↕r - G←(⥊⌜z){𝕨⊑𝕩⊑𝕗}¨ - i (r", Mon 2 _sfn_ 1 - # "∾", Mon 2 _sfn_ 1 # Dyad combines - # "˘⎉¨⌜", - # "⚇", - ⟩ - SP ← (Join1 k)_glyphLookup_((k≠⌜⊸Rep v)∾⟨{ - NS ← 𝕎 _errIf - (Type-3˙)◶⟨NS, {m←𝕩⋄{NS(𝕗_m)˙0}}, {m←𝕩⋄{NS(𝕗_m_𝕘)˙0}}⟩ 𝕩 - }⟩) - StructPrim ← {p←SP𝕩⋄𝕨P𝕩} - - 0⊸≤◶⟨3,2⊸≤◶⊢‿2⟩∘(0⊑⊢)◶⟨ - SE ⊣ StructPrim 1⊑⊢ # 0 primitive - StructErr˙˙ # 1 block - 0⊸⊑ Recompose {𝕨˙⊸StructFn⌜1↓𝕩} # other operation - SE 1⊑⊢ # ¯1 constant - ⟩⟜{Decompose𝕩} -} - -_takeDrop←{ - ⟨gl,Noop,_inds⟩←𝕗 - pre ← "𝕨"∾gl∾"𝕩: 𝕨 must " - ernk ← "have rank at most 1" - eint ← "consist of integers" - { - ernk ! 1≥=𝕨 - 𝕨 ↩ Deshape 𝕨 - eint ! 1×´Int⌜𝕨 - r ← ≠𝕨 - s ← r {(1⌜∘↕𝕨-≠𝕩)∾𝕩}⍟(>⟜≠) ≢𝕩 - _c ← { (×⟜𝕗⌜𝕨) +⌜ 𝕩 } - i←<0 ⋄ k←1 ⋄ UIk←{ i (k×𝕨)_c↩ k ↕⊸(𝕨_c)⍟(1-=⟜1) 𝕩 ⋄ k↩1 ⋄ ≠𝕩 } - doFil←0 - sh ← (⊑⟜s Noop◶{k×↩𝕨⋄𝕨}‿(⊣ UIk {𝕩⋄doFil↩1}_inds) ⊑⟜𝕨)⌜ ↕r - (0<=i)◶(s⊸⥊)‿{ - sh ∾↩ t ← r↓s - {i 𝕩_c↩ ↕𝕩}⍟(1-1⊸=) k×´t - Sel ← ⊑⟜(⥊𝕩) - 𝕩{Sel↩0⊸≤◶⟨(Fill𝕨)˙,Sel⟩}⍟⊢doFil - Sel⌜ sh ⥊ i - }_fillBy_⊢ ToArray 𝕩 - } -} -Take ← ⟨"↑" ⋄ 1-=⟜| ⋄ { 𝔽⍟(𝕨⊸<)a←|𝕩 ⋄ (0<𝕩)◶⟨¯∞⍟(<⟜0)⌜+⟜(𝕨+𝕩)⌜, ¯∞⍟(𝕨⊸≤)⌜⟩↕a }⟩_takeDrop -Drop ← ⟨"↓" ⋄ 1-0⊸= ⋄ { 𝔽 ⋄ 0⊸<◶⟨↕0⌈+,<∘⊢+⌜·↕0⌈-⟩ }⟩_takeDrop - -ShiftCheck←{ - "« or »: 𝕩 must have rank at least 1" ! 1≤=𝕩 - d←𝕩-○=𝕨 - "« or »: 𝕨 must not have higher rank than 𝕩" ! 0≤d - "« or »: Rank of 𝕨 must be at least rank of 𝕩 minus 1" ! 1≥d - s←1 Cell 𝕩 - "« or »: 𝕨 must share 𝕩's major cell shape" ! s MatchS (1-d)↓≢𝕨 - 1×´s -} -ShiftBefore←{ - c←𝕨 ShiftCheck 𝕩 - n←c×(𝕩≤○=⊢)◶1‿≠𝕨 - (≢𝕩)⥊n⊸≤◶⟨⊑⟜(Deshape𝕨),-⟜n⊑(⥊𝕩)˙⟩⌜↕c×≠𝕩 -} -ShiftAfter←{ - c←𝕨 ShiftCheck 𝕩 - l←c×≠𝕩 - n←c×(𝕩≤○=⊢)◶1‿≠𝕨 - m←l-n - (≢𝕩)⥊m⊸≤◶⟨+⟜n⊑(⥊𝕩)˙,-⟜m⊑(Deshape𝕨)˙⟩⌜↕l -} -FC←{ # Fill cell - "« or »: 𝕩 must have rank at least 1" ! 1≤=𝕩 - (Fill 𝕩)⌜ ⥊⟜(↕1×´⊢) 1 Cell 𝕩 -} - -Range←{ - I←{"↕𝕩: 𝕩 must consist of natural numbers"!Nat𝕩⋄↕𝕩} - M←{"↕𝕩: 𝕩 must be a number or list"!1==𝕩⋄(0⌜𝕩)Fill(<⟨⟩)Pair⊸∾⌜´I⌜𝕩} - IsArray◶I‿M 𝕩 -} -Windows←{ - "𝕨↕𝕩: 𝕨 must have rank at most 1" ! 1≥=𝕨 - r←≠𝕨↩Deshape 𝕨 - 𝕨{ - "𝕨↕𝕩: Length of 𝕨 must be at most rank of 𝕩" ! r≤=𝕩 - "𝕨↕𝕩: 𝕨 must consist of natural numbers" ! ×´Nat⌜𝕨 - s←≢𝕩 - l←(1+⊑⟜s-⊑⟜𝕨)⌜↕r - "𝕨↕𝕩: Window length 𝕨 must be at most axis length plus one" ! ×´0⊸≤⌜l - k←1×´t←r↓s - str ← Reverse ×`⟨k⟩∾{(s⊑˜𝕩⊸-)⌜↕𝕩}r-1 - ⊑⟜(⥊𝕩)⌜ k +⌜⟜(t⥊↕)˜⍟(1-=⟜1) l +⌜○(+⌜´str{𝕨⊸×⌜↕𝕩}¨⊢) 𝕨 - }_fillBy_⊢⍟(0𝕩)⊑𝕨‿𝕩}) _perv -⌈ ↩ (-∘⌊∘- ⊘ {(𝕨<𝕩)⊑𝕨‿𝕩}) _perv -∧ ← ⍋⊸⊏ ⊘ (× _perv) -∨ ← ⍒⊸⊏ ⊘ ((+-×) _perv) -× ↩ (0⊸(<->) ⊘ ×) _perv -< ↩ Box ⊘ ((1-≥) _perv) -> ↩ Merge ⊘ ((1-≤) _perv) -≠ ↩ ≠ ⊘ ((1-=) _perv) -= ↩ = ⊘ (= _perv) -≥ ← ("≥: No monadic form"!0˙) ⊘ (≥ _perv) -≤ ↩ ("≤: No monadic form"!0˙) ⊘ (≤ _perv) -+ ↩ + _perv -- ↩ - _perv -¬ ← 1+- -HomFil ← {((𝕎0) Fill 𝕏)⊘𝕏}⍟(+´⟨=,≠,≡,≢⟩=⊣) - -ValidateRanks←{ - "⎉ or ⚇: 𝔽 result must have rank at most 1" ! 1≥=𝕩 - 𝕩↩⥊𝕩 - "⎉ or ⚇: 𝔽 result must have 1 to 3 elements" ! (1⊸≤∧≤⟜3)≠𝕩 - "⎉ or ⚇: 𝔽 result must consist of integers" ! 1∧´Int⌜𝕩 - 𝕩 -} -_ranks ← {⟨2⟩⊘⟨1,0⟩ ((⊣-1+|)˜⟜≠⊑¨<∘⊢) ValidateRanks∘𝔽} -_depthOp_←{ - neg←0>n←𝕨𝔾_ranks𝕩 ⋄ F←𝔽 - _d←{ - R←(𝕗+neg)_d - 𝕨(×⟜2⊸+´2 Reshape (neg∧𝕗≥0)∨(0⌈𝕗)≥Pair○≡)◶⟨R¨⋄R⟜𝕩⌜∘⊣⋄(𝕨R⊢)⌜∘⊢⋄F⟩𝕩 - } - 𝕨 n _d 𝕩 -} -_rankOp_←{ - k←𝕨(Pair○= (0≤⊢)◶⟨⌊⟜-,0⌈-⟩¨ 𝔾_ranks)𝕩 - Enc←{ - f←(↕𝕨)⊏≢𝕩 - c←1×´s←𝕨Cell𝕩⋄i←s⥊↕c - (f⥊((⥊𝕩)⊏˜i+c×⊢)⌜↕1×´f)˙_fillBy_{(<𝕩)⌜i} 𝕩 - } - Enc↩(>⟜0×1+≥⟜=)◶⟨<⊢,Enc,<⌜⊢⟩ - > ((0⊑k)Enc𝕨) 𝔽¨ ((1-˜≠)⊸⊑k)Enc𝕩 -} -_insert←{ - "˝: 𝕩 must have rank at least 1" ! 1≤=𝕩 - F←𝔽 - Id ← { - s ← 1↓≢𝕩 - JoinSh ← {"˝: Identity does not exist"!0<≠𝕨 ⋄ 𝕨×0<↕≠𝕨} - s ¬∘IsJoin∘⊢◶⟨JoinSh⥊𝕩˙, Reshape⟜Identity⟩ f - } - 𝕨 (0<≠)⊘1◶Id‿{𝕨F´<˘𝕩} 𝕩 -} - -JoinTo←∨○(1<=)◶(∾○⥊)‿{ - s←𝕨Pair○≢𝕩 - a←1⌈´k←≠⌜s - "𝕨∾𝕩: Rank of 𝕨 and 𝕩 must differ by at most 1" ! 1∧´1≥a-k - c←(k¬a)+⟜(↕a-1)⊸⊏¨s - "𝕨∾𝕩: Cell shapes of 𝕨 and 𝕩 must match" ! MatchS´c - l←0+´(a=k)⊣◶1‿(0⊑⊢)¨s - (⟨l⟩∾0⊑c)⥊𝕨∾○⥊𝕩 -} _fillBy_ IF - -_repeat_←{ - F←𝔽 ⋄ b←𝕨{𝕏⊣}˙⊘{𝕨˙{𝔽𝕏⊣}}0 - n←𝕨𝔾𝕩 - Multi←{ - l←u←0 - {"⍟: Repetition numbers in 𝕨𝔾𝕩 must be integers"!Int𝕩⋄l↩l⌊𝕩⋄u↩u⌈𝕩}_perv n - i←⟨𝕩⟩⋄P←B⊸{𝕎`i∾↕𝕩} - pos←f P u - neg←f 0⊸<◶⟨i,Inverse⊸P⟩ -l - (|⊑<⟜0⊑pos‿neg˙)_perv n - } - (Nat n)◶Multi‿{𝕩(B f)∘⊢´↕n} 𝕩 -} - -↕ ↩ Range ⊘ Windows -⌽ ← Reverse ⊘ (Rot _onAxes_ 0) -/ ← Indices ⊘ Replicate -» ← FC⊸ShiftBefore ⊘ ShiftBefore _fillBy_ (⊢⊘IF) -« ← FC⊸ShiftAfter ⊘ ShiftAfter _fillBy_ (⊢⊘IF) - -GroupM←{ - "𝕨⊔𝕩: Compound 𝕨 must be a list" ! 1==𝕨 - n←0+´r←=⌜𝕨 - "𝕨⊔𝕩: Total rank of 𝕨 must be at most rank of 𝕩" ! n≤=𝕩 - ld←(Join≢⌜𝕨)-n↑≢𝕩 - "𝕨⊔𝕩: Lengths of 𝕨 must equal to 𝕩, or one more only in a rank-1 component" ! 1∧´(0⊸≤∧≤⟜(r/1=r))ld - dr←r⌊(0»+`r)⊏ld∾⟨0⟩ - l←dr-˜≠⌜𝕨↩⥊⌜𝕨 ⋄ LS←∾⟜(n Cell 𝕩) Reshape 𝕩˙ - S←⊏⟜(LS⟨1×´l⟩) - (LS 0⌜𝕨) Fill dr (1≠≠∘⊢)◶⟨S _group○(0⊸⊑), S⌜ ·+⌜⌜´ (⌽×`1»⌽l) × ⊢_group¨⟩ 𝕨 -} - -↑ ↩ Prefixes ⊘ Take -↓ ↩ Suffixes ⊘ Drop -⊔ ← GroupInds ⊘ GroupGen -⊐ ← SelfClas ⊘ (1 _search) -∊ ← ⊢_self ⊘ (0 _search˜) -⎉ ← _rankOp_ - -Find←{ - r←=𝕨 - "⍷𝕩: Rank of 𝕨 cannot exceed rank of 𝕩" ! r≤=𝕩 - 0 Fill 𝕨 ≡⎉r ((1+r-⊸↑≢𝕩)⌊≢𝕨)⊸↕⎉r 𝕩 -}○ToArray - -OccurrenceCount ← 0 Fill ⊐˜(⊢-⊏)⍋∘⍋ -ProgressiveIndexOf ← 0 Fill { - c←1-˜=𝕨 - "⊒: Rank of 𝕨 must be at least 1" ! 0≤c - "⊒: Rank of 𝕩 must be at least cell rank of 𝕨" ! c≤=𝕩 - 𝕨⊐○(Pair¨⟜(≢⥊OccurrenceCount∘⥊) 𝕨⊸⊐)𝕩 -} - -ReorderChk←{ - "𝕨⍉𝕩: 𝕨 must have rank at most 1" ! 1≥=𝕨 - "𝕨⍉𝕩: Length of 𝕨 must not exceed rank of 𝕩" ! 𝕨≤○≠≢𝕩 - "𝕨⍉𝕩: 𝕨 must consist of natural numbers" ! 1∧´Nat⌜⥊𝕨 -} -ReorderAxesSub←{ - (𝕨⊸⊏Pick𝕩˙)⌜↕⌊´⌜𝕨⊔≢𝕩 -} _fillBy_ ⊢ -ReorderAxes←{ - 𝕨 ReorderChk 𝕩 - 𝕨↩⥊𝕨 - r←(=𝕩)-0+´¬∊𝕨 - "𝕨⍉𝕩: Skipped result axis" ! 1∧´𝕨∾¯1»¨𝕩 - g←GroupLen j - IX 1∧´g≤1 - o←/¬g - (⍋j∾o)⊏(/≠¨𝕩)∾¯1¨o -} -GroupInv ← { - IA 1==𝕨 - IA 1∧´Nat⌜𝕨 - i←⊔𝕨 - IX i≡○(≠¨)𝕩 - i ⍋⊸⊏○∾ 𝕩 -} -⊏ ↩ FirstCell ⊘ (ToArray⊸(SelSub _onAxes_ 1)) _fillBy_ ⊢ -PrimInverse ← INF _lookup_ ⟨ - '+', +⊘(-˜) - '-', - - '×', ⊢_invChk_×⊘(÷˜) - '÷', ÷ - '⋆', Log _perv - '√', ט⊘(⋆˜) - '∧', ⊢_invChk_∧⊘(÷˜) - '∨', ⊢_invChk_∨⊘(-˜÷1-⊣) - '¬', ¬ - '<', {IX IsArray𝕩⋄IX 0==𝕩⋄0⊑⥊𝕩}⊘(IA∘0) - '⊢', ⊢ - '⊣', ⊢⊘(⊢⊣IX∘≡) - '∾', IA∘0 ⊘ {d←𝕩-○=𝕨⋄IX(0⊸≤∧≤⟜1)d⋄l←d◶1‿≠𝕨⋄IX l≤≠𝕩⋄IX 𝕨≡d◶⟨⊏,l⊸↑⟩𝕩⋄l↓𝕩} - '≍', {IX 1=≠𝕩⋄⊏𝕩} ⊘ {IX 2=≠𝕩⋄IX 𝕨≡⊏𝕩⋄1⊏𝕩} - '↑', ¯1⊸⊑_invChk_↑ ⊘ (IA∘0) - '↓', 0⊸⊑_invChk_↓ ⊘ (IA∘0) - '↕', ≢_invChk_↕ ⊘ (IA∘0) # Should trace edge and invChk - '⌽', ⌽ ⊘ (-⊸⌽) - '⍉', TransposeInv ⊘ ReorderAxesInv - '/', {IA 1==𝕩⋄IA 1∧´Nat⌜𝕩⋄IX(1∧´¯1⊸↓≤1⊸↓)𝕩⋄GroupLen𝕩}⊘(IA∘0) - '⊔', GroupIndsInv ⊘ GroupInv -⟩ -SwapInverse ← INF _lookup_ ⟨ - '+', ÷⟜2⊘(-˜) - '-', IA∘0⊘+ - '×', √⊘(÷˜) - '÷', IA∘0⊘× - '⋆', IA∘0⊘√ - '√', IA∘0⊘(÷Log) - '∧', √⊘(÷˜) - '∨', (¬√∘¬)⊘(-˜÷1-⊣) - '¬', IA∘0⊘(+-1˙) -⟩ -⌜ ↩ {𝕨𝔽⌜_fillByPure_𝔽○ToArray𝕩} -Mod1Inverse ← INF˙ _lookup_ ⟨ - '˜', SwapInverse - '¨', {𝕏⁼¨ ⊣·IX 0<≡∘⊢} - '⌜', {𝕏⁼⌜⊘(IA∘0) ⊣·IX 0<≡∘⊢} - '˘', {(IX∘IsArray⊸⊢𝕏⁼)˘ ⊣·IX 0<=∘⊢} - '`', {(⊏∾¯1⊸↓𝕏1⊸↓)⍟(1<≠)⊘(»𝕏⊢)⊣·IX 0<=∘⊢}∘{𝕏⁼¨} -⟩ -⍟ ↩ _repeat_ -⌾ ← _under_ -Mod2Inverse ← INF˙ _lookup_ ⟨ - '∘', AtopInverse - '○', {Fi←𝕎⁼⋄𝕏⁼ Fi⊘(𝕏⊸Fi)} - '⌾', {𝕎⁼⌾𝕏} # Need to verify for computation Under - '⍟', Int∘⊢◶⟨IA∘0˙,0⊸≤◶{𝕎⍟(-𝕩)_invChk_(𝕎⍟𝕩)}‿{𝕎⍟(-𝕩)}⟩ - '⊘', {(𝕎⁼)⊘(𝕏⁼)} - '⊸', IsConstant∘⊣ ⊣◶{INF⊘𝕏}‿⊢ {𝕎⊸(𝕏⁼)} - '⟜', {(𝕨IsConstant∘⊢◶⟨IA∘0˙,{𝕩𝕎{SwapInverse𝕗}⊢}⟩𝕩)⊘(𝕏⁼𝕎⁼)} -⟩ { inv˙⊸=◶⟨𝔽,{𝕏_inv_𝕎}˙⟩ } - -˝ ← _insert -⁼ ↩ _undo -⊑ ↩ First ⊘ Pick -◶ ↩ {𝕨((𝕨𝔽𝕩)⊑𝕘){𝔽}𝕩} # Same definition, new Pick -⚇ ← _depthOp_ -⥊ ↩ Deshape ⊘ Reshape -≍ ← >∘Pair _fillBy_ (⊢⊘IF) -⍉ ← Transpose ⊘ ReorderAxes -⊒ ← OccurrenceCount⊘ ProgressiveIndexOf -⍷ ← ∊⊸/ ⊘ Find diff --git a/src/r0.bqn b/src/r0.bqn new file mode 100644 index 00000000..2dc08d62 --- /dev/null +++ b/src/r0.bqn @@ -0,0 +1,47 @@ +# BQN runtime part 0. Requires: +# Fill _fillBy_ +# +-×⌊=≤≢⥊⊑↕⌜ +# Provides: +# ⌊⌈|<>≠≥⊢⊣∾↑↓⊏˙˜´∘○⊸⟜◶⍟ +# ^^^^^^^ ^^^^ ^ ^^ are limited, suitable for r1 + +⊢ ← {𝕩} +⊣ ← {𝕩}⊘{𝕨} +˙ ← {𝕩⋄𝕗} +˜ ← {𝕩𝔽𝕨⊣𝕩} +∘ ← {𝔽𝕨𝔾𝕩} +○ ← {(𝔾𝕨)𝔽𝔾𝕩} +⊸ ← {(𝔽𝕨⊣𝕩)𝔾𝕩} +⟜ ← {(𝕨⊣𝕩)𝔽𝔾𝕩} +◶ ← {𝕨((𝕨𝔽𝕩)⊑𝕘){𝔽}𝕩} # LIMITED to number left operand result +⍟ ← {𝕨((𝕨𝔾𝕩)⊑⊢‿𝕗){𝔽}𝕩} # LIMITED to boolean right operand result + +Box ← {𝕩Fill⟨⟩⥊⟨𝕩⟩} +# LIMITED to numeric arguments for arithmetic cases +≥ ← ≤˜ +< ← Box ⊘ (1-≥) +> ← (1-≤) +⌊ ↩ ⌊ ⊘ (⊣-≥×-) +⌈ ← -∘⌊∘- ⊘ (⊣-≤×-) +| ← 0⊸≤◶-‿⊢ +≠ ← (0<=)◶⟨1⋄0⊑≢⟩ # LIMITED to monadic case + +∾ ← {k←≠𝕨⋄k⊸≤◶⟨⊑⟜𝕨⋄-⟜k⊑𝕩˜⟩⌜↕k+≠𝕩} # LIMITED to two list arguments +↑ ← {⊑⟜𝕩⌜↕𝕨} # LIMITED to number 𝕨 and list 𝕩 +↓ ← {(𝕨⊸+⊑𝕩˙)⌜↕(≠𝕩)-𝕨} # LIMITED to number 𝕨 and list 𝕩 + +_fold0←{ + l←≠𝕩 ⋄ F←𝔽 + r←𝕨 {l↩l-1⋄l⊑𝕩}⊘⊣ 𝕩 + ({r↩𝕩 F r}(l-1)⊸-⊑𝕩˙)⌜↕l + r +} +´ ← _fold0 # LIMITED to nonempty list 𝕩, or 𝕨 and list 𝕩 + +GetCells←(1==∘⊢)◶{ + c←1×´s←1↓≢𝕩 + (c⊸×⌜𝕨)(+⊑(⥊𝕩)˙)⌜s⥊↕c +}‿{ + ⊑⟜𝕩⌜𝕨 +} _fillBy_ ⊢ +⊏ ← GetCells # LIMITED to depth-1 natural number left argument diff --git a/src/r1.bqn b/src/r1.bqn new file mode 100644 index 00000000..7944f2b6 --- /dev/null +++ b/src/r1.bqn @@ -0,0 +1,828 @@ +# BQN runtime part 1. Requires: +# Type Fill Log GroupLen GroupOrd _fillBy_ +# +-×÷⋆⌊⌈|<>=≠≤≥≢⊢⊣⥊∾↑↓↕⊏⊑!⌜˙˜´`∘○⊸⟜◶⊘⍟ +# Filled in by runtime: glyphs and default PrimInd +# Provides: all BQN primitives + +Decompose ← {0‿𝕩} +PrimInd ← {𝕩} +SetPrims ← {Decompose‿PrimInd ↩ 𝕩} + +IsArray ← 0=Type +Int ← (1=Type)◶⟨0,⌊⊸=⟩ +Nat ← (1=Type)◶⟨0,0⊸≤×⌊⊸=⟩ +Deshape ← IsArray◶{𝕩Fill⟨𝕩⟩}‿⥊ +Pair ← {⟨𝕩⟩} ⊘ {⟨𝕨,𝕩⟩} +ToArray ← <⍟(1-IsArray) +Cell ← ↓⟜≢ + +_qSearch ← {+´·×`𝕗(1-=)⌜<} +_glyphLookup_ ← { + {PrimInd𝕩} ⊑ ((𝕘⊑˜𝕗_qSearch)⌜glyphs)˙ +} +_isGlyph ← { (glyphs _qSearch 𝕗) = {PrimInd𝕩} } +IsJoin ← '∾'_isGlyph + +Split2 ← { s←2⊸×⌜↕(≠𝕩)÷2 ⋄ ⟨s⊏𝕩,(1⊸+⌜s)⊏𝕩⟩ } +_lookup_ ← { + k‿v←Split2 𝕘 ⋄ k _glyphLookup_ (v∾⟨𝕗⟩) +} +Identity ← {𝕏0} ("´: Identity not found"!0˙) _lookup_ ⟨ + '+',0 , '-',0 + '×',1 , '÷',1 + '⋆',1 , '¬',1 + '⌊',∞ , '⌈',¯∞ + '∨',0 , '∧',1 + '≠',0 , '=',1 + '>',0 , '≥',1 +⟩ + +_fold←{ + "´: 𝕩 must be a list" ! 1==𝕩 + 𝕨 (0<≠)⊘1◶⟨Identity 𝕗˙, 𝔽´⟩ 𝕩 +} + +_eachd←{ + _d←{ # Equal ranks + p←≢𝕨 + "Mapping: Equal-rank argument shapes don't agree" ! 1(⊑⟜p=⊑⟜(≢𝕩))⊸×´↕=𝕨 + p⥊ (⊑⟜(⥊𝕨)𝔽⊑⟜(⥊𝕩))⌜↕1×´p + } + _e←{ # 𝕨 has smaller or equal rank + p←≢𝕨 ⋄ k←=𝕨 ⋄ q←≢𝕩 + "Mapping: Argument shape prefixes don't agree" ! 1(⊑⟜p=⊑⟜q)⊸×´↕k + l←1(q⊑˜k⊸+)⊸×´↕(=𝕩)-k + a←⥊𝕨 ⋄ b←⥊𝕩 + q⥊⥊(≠a) (⊑⟜a𝔽l⊸×⊸+⊑b˙)⌜○↕ l + } + =○=◶⟨>○=◶⟨𝔽_e⋄𝔽˜_e˜⟩⋄𝔽_d⟩ +} + +_perv←{ # Pervasion + R←𝔽{𝕨𝔽_perv𝕩} + +○IsArray◶⟨ + 𝔽 + R⌜⊘(>○IsArray◶{𝕨{𝕗R𝕩}⌜𝕩}‿{𝕩{𝕩R𝕗}⌜𝕨}) _fillBy_ R + R _eachd _fillBy_ R + ⟩ +} + +# Sorting +Cmp0 ← ≥-≤ +Cmp1 ← (0<1×´≢∘⊢)◶⟨1, IsArray∘⊢◶(1-2×≤)‿{𝕨Cmp1𝕩}⟜(0⊑⥊)⟩ +CmpLen ← { + e←𝕨-○(1×´0⊸<⌜)𝕩 + 𝕨(e=0)◶⟨e,0⟩‿{ + SM←Cmp0 Pair ≥⊑Pair + c‿r←𝕨SM○≠𝕩 + l←𝕨{ + i←0+´×`𝕨=_eachd𝕩 + m←1×´i↕⊸⊏𝕨 + {k‿l←SM´𝕩⋄c↩k⋄m×↩l}∘(<⊑⌜𝕨‿𝕩˙)⍟(r⊸>)i + m + }○{(𝕩⊑˜(¯1+≠𝕩)⊸-)⌜↕r}𝕩 + ⟨c,l⟩ + }𝕩 +} +_getCellCmp ← { + Ci←𝔽⋄c←𝕨⊣0⋄l←𝕩 + Cc←{ + a←𝕨⋄b←𝕩 + S←(l⊸=)◶{S∘(1+𝕩)⍟(0⊸=)a Ci○(𝕩⊸+)b}‿c + S 0 + } + (𝕨 ⊢⊘{𝕨⍟(0⊸=)𝕏} ci˙)⍟(1=l) cc +} +Cmp ← +○IsArray◶⟨ + Cmp0 + IsArray∘⊣◶⟨Cmp1,-Cmp1˜⟩ + { + lc←𝕨CmpLen○≢𝕩 + cc ← (⊑⟜(⥊𝕨))⊸Cmp⟜(⊑⟜(⥊𝕩)) _getCellCmp´ lc + Cc˜0 + } +⟩ + +_grade ← { + gt ← 𝕗 + cmps ← {𝕏˜}⌜⍟𝕗⟨Cmp,Cmp0,Cmp≤0˙,≤⟩ + 0 Fill { + "⍋𝕩: 𝕩 must have rank at least 1" ! 1≤=𝕩 + l←≠𝕩 + (2≤l)◶⟨↕∘l,{ + m1←1=m←1×´1 Cell 𝕩 + 𝕩↩⥊𝕩 + a0←1⋄ts←0⋄{a0×↩1≤𝕩⋄ts+↩𝕩}∘Type⌜𝕩 + cs←a0+2×m1 + Merge ← { # Merge sort + le ← m {(𝕏 _getCellCmp m)≤0˙}⍟(1-m1) 𝕩{𝕏○(⊑⟜𝕗)} cs⊑cmps + B←l⊸≤◶⊢‿l + (↕l){ + i←-d←𝕨 ⋄ j←ei←ej←0 + e←3 ⋄ G←LE○(⊑⟜(m⊸×⌜⍟(1-m=1)𝕩)) ⋄ c←⟨1-G,0,1,2⟩ + s←(8≤d)⊑⟨+,{(𝕩-1){𝕩⋄e↩2⋄j↩i⋄i↩𝕩}⍟G⍟(1-e)𝕩}⟩ + N←{i↩d+𝕨⋄ej↩B d+ei↩B j↩d+𝕩⋄e↩l≤j⋄S ei⋄i R j} + R←{𝕨e◶c𝕩}◶{e+↩2×ei=i↩1+𝕨⋄𝕨}‿{e+↩ej=j↩1+𝕩⋄𝕩}‿N + {(i R j)⊑𝕩}⟜𝕩⌜𝕩 + }´(2⋆ni-1+⊢)⌜↕ni←⌈2 Log l+l=0 + } + # Counting sort for small-range ints + bl←bu←0 ⋄ Count←{GroupLen⊸GroupOrd (gt⊑⟨-⟜bl,bu⊸-⟩)⌜𝕩} + sr←((3=cs)×ts=l)◶⟨0,(1×´⌊⊸=⌜)◶0‿{((bu↩⌈´𝕩)-bl↩⌊´𝕩)≤2×l}⟩𝕩 + sr◶Merge‿Count 𝕩 + }⟩𝕩 + } +} +_binSearch ← { + B ← 𝔽 + { + R←{𝕨{a←B m←𝕩+h←⌊𝕨÷2⋄(h+a×𝕨-2×h)R a⊑𝕩‿m}⍟(>⟜1)𝕩} + 1+(𝕩+1)R ¯1 + }⍟(0⊸<) +} +_bins←{ + c←1-˜=𝕨 + "⍋ or ⍒: Rank of 𝕨 must be at least 1" ! 0≤c + "⍋ or ⍒: Rank of 𝕩 must be at least cell rank of 𝕨" ! c≤=𝕩 + 𝕩↩ToArray 𝕩 + lw←1×´sw←1 Cell 𝕨 + cw←𝔽○(⊑⟜(⥊𝕨)) _getCellCmp lw + "⍋ or ⍒: 𝕨 must be sorted" ! 0⊸<◶⟨1,1×´·(Cw≤0˙)⟜(lw⊸+)∘(lw⊸×)⌜↕∘-⟜1⟩≠𝕨 + cx←c-˜=𝕩 + sx←cx Cell 𝕩 ⋄ lc←sw CmpLen sx + cc ← (⊑⟜(⥊𝕨))⊸𝔽⟜(⊑⟜(⥊𝕩)) _getCellCmp´ lc + B←(1×´sw)⊸×⊸Cc≤0˙ + 0 Fill (≠𝕨)⊸{B⟜𝕩 _binSearch 𝕨}⌜ (1×´sx)⊸×⌜ ⥊⟜(↕1×´⊢)⊑⟜(≢𝕩)⌜↕cx +} + +⍋ ← 0 _grade ⊘ (Cmp _bins) +⍒ ← 1 _grade ⊘ (Cmp˜ _bins) + +# Searching +_search←{ # 0 for ∊˜, 1 for ⊐ + ind ← 𝕗 + red ← 𝕗⊑⟨1-×´,+´×`⟩ + 0 Fill { + c←1-˜=𝕨 + "p⊐𝕩 or 𝕨∊p: p must have rank at least 1" ! 0≤c + "p⊐n or n∊p: Rank of n must be at least cell rank of p" ! c≤=𝕩 + n←≠𝕨 ⋄ k←1×´s←1 Cell 𝕨 ⋄ cx←c-˜=𝕩 + lx←1×´sh←cx↑≢𝕩 + sh ⥊ 𝕨 (0_cr⟩ ⊣ ei!Int∘⊢ +}⌜⟨ + "𝕨⊑𝕩: Indices in 𝕨 must consist of integers"‿"𝕨⊑𝕩: Index out of range" + "𝕨⊏𝕩: Indices in 𝕨 must be integers"‿"𝕨⊏𝕩: Indices out of range" +⟩ +Pick0←{ + "𝕨⊑𝕩: 𝕩 must be a list when 𝕨 is a number" ! 1==𝕩 + 𝕩⊑˜(≠𝕩)NormIndP𝕨 +} +Pick1←{ + "𝕨⊑𝕩: Indices in compound 𝕨 must be lists" ! 1==𝕨 + "𝕨⊑𝕩: Index length in 𝕨 must match rank of 𝕩" ! 𝕨=○≠s←≢𝕩 + i←0⋄(⊑⟜𝕨{i↩(𝕩NormIndP𝕨)+𝕩×i}⊑⟜s)⌜↕≠𝕨 + i⊑Deshape𝕩 +}⟜ToArray +Pickd←(0<0+´IsArray⌜∘⥊∘⊣)◶Pick1‿{Pickd⟜𝕩⌜𝕨} +Pick←IsArray∘⊣◶Pick0‿Pickd + +FirstCell←{ + "⊏𝕩: 𝕩 must have rank at least 1" ! 1≤=𝕩 + "⊏𝕩: 𝕩 cannot have length 0" ! 0<≠𝕩 + (<0) ⊏ 𝕩 +} +SelSub←{ + "𝕨⊏𝕩: 𝕨 must be an array" ! IsArray 𝕨 + 𝕨 (≠𝕩)⊸NormIndS⌜⊸⊏ 𝕩 +} +First ← IsArray◶⟨⊢, (0<≠)◶⟨Fill,0⊸⊑⟩⥊⟩ + +IsPure ← {d←Decompose𝕩 ⋄ 2⊸≤◶⟨≤⟜0, 1×´·𝕊⌜1↓d˙⟩0⊑d} +_fillByPure_←{ + 𝕘 (3≤Type∘⊣)◶⟨{𝕨Fill𝕏},{(𝕨HomFil𝕩)_fillBy_𝕨}⍟(IsPure⊣)⟩ 𝕗 +} + +StructErr←{𝕩} +IsStructErr ← (3=Type)◶⟨0,StructErr˙⊸=⟩ +_under_←{ + val←𝕨𝔽○𝔾𝕩 + # Construct indices + Inds ← IsArray◶⟨0,⥊⟜(↕1×´⊢)≢⟩ 𝕩 ⊑⟜⥊⍟(IsArray⊢)´ Reverse + _s_ ← { + f←𝕗 + st‿d‿o←𝕩 + g←𝕨 St Inds∘{f↩f(IsArray⊣)◶⟨⟩‿∾⟨𝕩⟩}⍟(d>IsArray) 𝕘 + {f _s_ 𝕩}⍟o g + } + IsStruct ← (5=0⊸⊑)◶⟨0,s˙=2⊸⊑⟩ Decompose + sf ← isStruct StructFn 𝕘 ⋄ SR ← ¯1 _s_ 0 + root‿ind ← IsStruct◶⟨0‿StructErr,1‿3⊏Decompose⟩ SF sr + + # Traverse indices 𝕩 and values 𝕨. + # Return flat lists ⟨indices,values⟩, or structErr if 𝕨 doesn't capture 𝕩. + GetInserts←{ + count←0⋄depth←{IsArray◶⟨{𝕩⋄count+↩1⋄0},1+0⌈´𝕊⌜∘⥊⟩𝕩}𝕩 + 𝕩 (2⌊depth)◶(Pair○Pair)‿(StructConform◶⟨StructErr˙,Pair○⥊⟩)‿{ + Fail←{𝕊‿0} + # 𝕎 is parent traversal; 𝕩 is current components of ind and val + Trav←(IsArray 0⊑⊢)◶⟨Pair, StructConform´∘⊢◶Fail‿{ + Parent←𝕎 ⋄ n←≠0⊑a←⥊⌜𝕩 ⋄ j←¯1 + Child←Trav⟜{𝕩⊸⊑⌜a} + { j+↩1 ⋄ f←n⊸≤◶⟨𝕊˙⊸Child,Parent˙⟩j ⋄ F 0 } + }⟩ + next ← 0 Trav 𝕨‿𝕩 + res ← {n‿o←Next𝕩⋄next↩n⋄o}⌜ ↕count + (next=fail)◶⟨0⊸⊑⌜ Pair 1⊸⊑⌜, StructErr˙⟩ res + } 𝕨 + }⍟(1-IsStructErr∘⊢) + Struct←{ + i‿v←𝕨 + Set1←𝕨⊸{ + 𝕩↩ToArray𝕩 + s←≢𝕩⋄l←≠d←⥊𝕩 + gl←l GroupLen i ⋄ g←gl GroupOrd i + Sel←v⊑˜⊑⟜g + j←0⋄Adv←Sel{(j+↩𝕩)-1} + CM←"⌾: Incompatible result elements in structural Under"!Match⟜Sel + s⥊2⊸⌊◶⟨⊑⟜d,Adv,Adv{(𝕨CM(j-𝕩)⊸+)⌜↕𝕩-1⋄𝕨}⊢⟩⟜(⊑⟜gl)⌜↕l + } + _at_ ← {𝔽⍟((𝔾𝕩)=⊣)⟜(⊑⟜𝕩)⌜ ↕≠𝕩} + Set ← 0⊸{ (𝕨≥≠root)◶⟨≢⥊(1+𝕨)⊸𝕊_at_(𝕨⊑root˙)∘⥊, Set1⟩ 𝕩 } + IsArray∘root◶⟨0⊑v˙, Set⟩ 𝕩 + } _fillBy_ ⊢ + IsStructErr◶⟨Struct⟜(𝕩˙), {𝕏val}·Inverse𝔾˙⟩ val GetInserts ind +} + +MatchS ← 1×´=_eachd +match←{(0⊑𝕨)◶(1⊑𝕨)‿𝕩}´⟨ + ⟨=○IsArray, 0⟩ + ⟨IsArray∘⊢, =⟩ + ⟨=○= , 0⟩ + ⟨MatchS○≢ , 0⟩ + {1×´⥊𝕨 Match _eachd 𝕩} +⟩ +structConform ← {𝕎◶0‿𝕏}´⟨IsArray⊢, =○=, MatchS○≢⟩ +Depth←IsArray◶0‿{1+0⌈´Depth⌜⥊𝕩} + +≡ ← Depth ⊘ Match +≢ ↩ IsArray◶⟨⟩‿≢ ⊘ (1-Match) +¨ ← {𝕨𝔽⌜⊘(𝔽_eachd)_fillByPure_𝔽○ToArray𝕩} + +IF ← ⊢⊣!∘≡ # Intersect fill +IEF← (0<≠)◶⟨⊢_fillBy_ Fill, ⊢_fillBy_ IF´⟩∘⥊ +_fillMerge_ ← {(0<≠∘⥊)◶⟨(𝔾○≢⥊⟨⟩˙)_fillBy_⊢⟜Fill, 𝔽 ⊣_fillBy_⊢ IEF⟩} +Merge←{ + c←≢0⊑⥊𝕩 + (">𝕩: Elements of 𝕩 must have matching shapes" ! c =○≠◶0‿MatchS ≢)⌜⥊𝕩 + (Deshape⌜𝕩)⊑˜⌜c⥊↕1×´c +}_fillMerge_∾⍟IsArray + +Join1←{ + # List of lists + i←j←¯1 ⋄ e←⟨⟩ ⋄ a←𝕩 + {{e↩a⊑˜i↩𝕩⋄j↩¯1}⍟(1-i⊸=)𝕩⋄(j↩j+1)⊑e}⌜Indices≠⌜𝕩 +} +JoinM←{ + # Multidimensional + n←≠z←⥊𝕩 ⋄ s←≢⌜z ⋄ d←≠0⊑s ⋄ r←=𝕩 + "∾𝕩: Elements of 𝕩 must all have the same rank" ! 1×´(d=≠)⌜s + "∾𝕩: 𝕩 element rank must be at least argument rank" ! d≥r + _s0←{s←𝕨⋄F←𝔽⋄{o←s⋄s F↩𝕩⋄o}⌜𝕩} + sh←≢𝕩 ⋄ p←1 ⋄ i←j←<0 + (Reverse 1×_s0 Reverse sh){ + q←𝕨 + a←𝕩⊑sh + m←𝕩⊸⊑⌜s + l←(q⊸×⊑m˙)⌜↕a + "∾𝕩: 𝕩 element shapes must be compatible" ! m MatchS ⥊(↕p)⊢⌜l⊣⌜↕q + k ← Indices l + c ← -⟜(⊑⟜(k ⊏ 0+_s0 l))⌜ ↕≠k + i ↩ (i ×⟜(⊑⟜l)⌜ k) +¨ i⊢⌜c + j ↩ j ×⟜a⊸+⌜ k + p×↩a + }¨↕r + G←(⥊⌜z){𝕨⊑𝕩⊑𝕗}¨ + i (r", Mon 2 _sfn_ 1 + # "∾", Mon 2 _sfn_ 1 # Dyad combines + # "˘⎉¨⌜", + # "⚇", + ⟩ + SP ← (Join1 k)_glyphLookup_((k≠⌜⊸Rep v)∾⟨{ + NS ← 𝕎 _errIf + (Type-3˙)◶⟨NS, {m←𝕩⋄{NS(𝕗_m)˙0}}, {m←𝕩⋄{NS(𝕗_m_𝕘)˙0}}⟩ 𝕩 + }⟩) + StructPrim ← {p←SP𝕩⋄𝕨P𝕩} + + 0⊸≤◶⟨3,2⊸≤◶⊢‿2⟩∘(0⊑⊢)◶⟨ + SE ⊣ StructPrim 1⊑⊢ # 0 primitive + StructErr˙˙ # 1 block + 0⊸⊑ Recompose {𝕨˙⊸StructFn⌜1↓𝕩} # other operation + SE 1⊑⊢ # ¯1 constant + ⟩⟜{Decompose𝕩} +} + +_takeDrop←{ + ⟨gl,Noop,_inds⟩←𝕗 + pre ← "𝕨"∾gl∾"𝕩: 𝕨 must " + ernk ← "have rank at most 1" + eint ← "consist of integers" + { + ernk ! 1≥=𝕨 + 𝕨 ↩ Deshape 𝕨 + eint ! 1×´Int⌜𝕨 + r ← ≠𝕨 + s ← r {(1⌜∘↕𝕨-≠𝕩)∾𝕩}⍟(>⟜≠) ≢𝕩 + _c ← { (×⟜𝕗⌜𝕨) +⌜ 𝕩 } + i←<0 ⋄ k←1 ⋄ UIk←{ i (k×𝕨)_c↩ k ↕⊸(𝕨_c)⍟(1-=⟜1) 𝕩 ⋄ k↩1 ⋄ ≠𝕩 } + doFil←0 + sh ← (⊑⟜s Noop◶{k×↩𝕨⋄𝕨}‿(⊣ UIk {𝕩⋄doFil↩1}_inds) ⊑⟜𝕨)⌜ ↕r + (0<=i)◶(s⊸⥊)‿{ + sh ∾↩ t ← r↓s + {i 𝕩_c↩ ↕𝕩}⍟(1-1⊸=) k×´t + Sel ← ⊑⟜(⥊𝕩) + 𝕩{Sel↩0⊸≤◶⟨(Fill𝕨)˙,Sel⟩}⍟⊢doFil + Sel⌜ sh ⥊ i + }_fillBy_⊢ ToArray 𝕩 + } +} +Take ← ⟨"↑" ⋄ 1-=⟜| ⋄ { 𝔽⍟(𝕨⊸<)a←|𝕩 ⋄ (0<𝕩)◶⟨¯∞⍟(<⟜0)⌜+⟜(𝕨+𝕩)⌜, ¯∞⍟(𝕨⊸≤)⌜⟩↕a }⟩_takeDrop +Drop ← ⟨"↓" ⋄ 1-0⊸= ⋄ { 𝔽 ⋄ 0⊸<◶⟨↕0⌈+,<∘⊢+⌜·↕0⌈-⟩ }⟩_takeDrop + +ShiftCheck←{ + "« or »: 𝕩 must have rank at least 1" ! 1≤=𝕩 + d←𝕩-○=𝕨 + "« or »: 𝕨 must not have higher rank than 𝕩" ! 0≤d + "« or »: Rank of 𝕨 must be at least rank of 𝕩 minus 1" ! 1≥d + s←1 Cell 𝕩 + "« or »: 𝕨 must share 𝕩's major cell shape" ! s MatchS (1-d)↓≢𝕨 + 1×´s +} +ShiftBefore←{ + c←𝕨 ShiftCheck 𝕩 + n←c×(𝕩≤○=⊢)◶1‿≠𝕨 + (≢𝕩)⥊n⊸≤◶⟨⊑⟜(Deshape𝕨),-⟜n⊑(⥊𝕩)˙⟩⌜↕c×≠𝕩 +} +ShiftAfter←{ + c←𝕨 ShiftCheck 𝕩 + l←c×≠𝕩 + n←c×(𝕩≤○=⊢)◶1‿≠𝕨 + m←l-n + (≢𝕩)⥊m⊸≤◶⟨+⟜n⊑(⥊𝕩)˙,-⟜m⊑(Deshape𝕨)˙⟩⌜↕l +} +FC←{ # Fill cell + "« or »: 𝕩 must have rank at least 1" ! 1≤=𝕩 + (Fill 𝕩)⌜ ⥊⟜(↕1×´⊢) 1 Cell 𝕩 +} + +Range←{ + I←{"↕𝕩: 𝕩 must consist of natural numbers"!Nat𝕩⋄↕𝕩} + M←{"↕𝕩: 𝕩 must be a number or list"!1==𝕩⋄(0⌜𝕩)Fill(<⟨⟩)Pair⊸∾⌜´I⌜𝕩} + IsArray◶I‿M 𝕩 +} +Windows←{ + "𝕨↕𝕩: 𝕨 must have rank at most 1" ! 1≥=𝕨 + r←≠𝕨↩Deshape 𝕨 + 𝕨{ + "𝕨↕𝕩: Length of 𝕨 must be at most rank of 𝕩" ! r≤=𝕩 + "𝕨↕𝕩: 𝕨 must consist of natural numbers" ! ×´Nat⌜𝕨 + s←≢𝕩 + l←(1+⊑⟜s-⊑⟜𝕨)⌜↕r + "𝕨↕𝕩: Window length 𝕨 must be at most axis length plus one" ! ×´0⊸≤⌜l + k←1×´t←r↓s + str ← Reverse ×`⟨k⟩∾{(s⊑˜𝕩⊸-)⌜↕𝕩}r-1 + ⊑⟜(⥊𝕩)⌜ k +⌜⟜(t⥊↕)˜⍟(1-=⟜1) l +⌜○(+⌜´str{𝕨⊸×⌜↕𝕩}¨⊢) 𝕨 + }_fillBy_⊢⍟(0𝕩)⊑𝕨‿𝕩}) _perv +⌈ ↩ (-∘⌊∘- ⊘ {(𝕨<𝕩)⊑𝕨‿𝕩}) _perv +∧ ← ⍋⊸⊏ ⊘ (× _perv) +∨ ← ⍒⊸⊏ ⊘ ((+-×) _perv) +× ↩ (0⊸(<->) ⊘ ×) _perv +< ↩ < ⊘ ((1-≥) _perv) +> ↩ Merge ⊘ ((1-≤) _perv) +≠ ↩ ≠ ⊘ ((1-=) _perv) += ↩ = ⊘ (= _perv) +≥ ← ("≥: No monadic form"!0˙) ⊘ (≥ _perv) +≤ ↩ ("≤: No monadic form"!0˙) ⊘ (≤ _perv) ++ ↩ + _perv +- ↩ - _perv +¬ ← 1+- +HomFil ← {((𝕎0) Fill 𝕏)⊘𝕏}⍟(+´⟨=,≠,≡,≢⟩=⊣) + +ValidateRanks←{ + "⎉ or ⚇: 𝔽 result must have rank at most 1" ! 1≥=𝕩 + 𝕩↩⥊𝕩 + "⎉ or ⚇: 𝔽 result must have 1 to 3 elements" ! (1⊸≤∧≤⟜3)≠𝕩 + "⎉ or ⚇: 𝔽 result must consist of integers" ! 1∧´Int⌜𝕩 + 𝕩 +} +_ranks ← {⟨2⟩⊘⟨1,0⟩ ((⊣-1+|)˜⟜≠⊑¨<∘⊢) ValidateRanks∘𝔽} +_depthOp_←{ + neg←0>n←𝕨𝔾_ranks𝕩 ⋄ F←𝔽 + _d←{ + R←(𝕗+neg)_d + 𝕨(×⟜2⊸+´2 Reshape (neg∧𝕗≥0)∨(0⌈𝕗)≥Pair○≡)◶⟨R¨⋄R⟜𝕩⌜∘⊣⋄(𝕨R⊢)⌜∘⊢⋄F⟩𝕩 + } + 𝕨 n _d 𝕩 +} +_rankOp_←{ + k←𝕨(Pair○= (0≤⊢)◶⟨⌊⟜-,0⌈-⟩¨ 𝔾_ranks)𝕩 + Enc←{ + f←(↕𝕨)⊏≢𝕩 + c←1×´s←𝕨Cell𝕩⋄i←s⥊↕c + (f⥊((⥊𝕩)⊏˜i+c×⊢)⌜↕1×´f)˙_fillBy_{(<𝕩)⌜i} 𝕩 + } + Enc↩(>⟜0×1+≥⟜=)◶⟨<⊢,Enc,<⌜⊢⟩ + > ((0⊑k)Enc𝕨) 𝔽¨ ((1-˜≠)⊸⊑k)Enc𝕩 +} +_insert←{ + "˝: 𝕩 must have rank at least 1" ! 1≤=𝕩 + F←𝔽 + Id ← { + s ← 1↓≢𝕩 + JoinSh ← {"˝: Identity does not exist"!0<≠𝕨 ⋄ 𝕨×0<↕≠𝕨} + s ¬∘IsJoin∘⊢◶⟨JoinSh⥊𝕩˙, Reshape⟜Identity⟩ f + } + 𝕨 (0<≠)⊘1◶Id‿{𝕨F´<˘𝕩} 𝕩 +} + +JoinTo←∨○(1<=)◶(∾○⥊)‿{ + s←𝕨Pair○≢𝕩 + a←1⌈´k←≠⌜s + "𝕨∾𝕩: Rank of 𝕨 and 𝕩 must differ by at most 1" ! 1∧´1≥a-k + c←(k¬a)+⟜(↕a-1)⊸⊏¨s + "𝕨∾𝕩: Cell shapes of 𝕨 and 𝕩 must match" ! MatchS´c + l←0+´(a=k)⊣◶1‿(0⊑⊢)¨s + (⟨l⟩∾0⊑c)⥊𝕨∾○⥊𝕩 +} _fillBy_ IF + +_repeat_←{ + F←𝔽 ⋄ b←𝕨{𝕏⊣}˙⊘{𝕨˙{𝔽𝕏⊣}}0 + n←𝕨𝔾𝕩 + Multi←{ + l←u←0 + {"⍟: Repetition numbers in 𝕨𝔾𝕩 must be integers"!Int𝕩⋄l↩l⌊𝕩⋄u↩u⌈𝕩}_perv n + i←⟨𝕩⟩⋄P←B⊸{𝕎`i∾↕𝕩} + pos←f P u + neg←f 0⊸<◶⟨i,Inverse⊸P⟩ -l + (|⊑<⟜0⊑pos‿neg˙)_perv n + } + (Nat n)◶Multi‿{𝕩(B f)∘⊢´↕n} 𝕩 +} + +↕ ↩ Range ⊘ Windows +⌽ ← Reverse ⊘ (Rot _onAxes_ 0) +/ ← Indices ⊘ Replicate +» ← FC⊸ShiftBefore ⊘ ShiftBefore _fillBy_ (⊢⊘IF) +« ← FC⊸ShiftAfter ⊘ ShiftAfter _fillBy_ (⊢⊘IF) + +GroupM←{ + "𝕨⊔𝕩: Compound 𝕨 must be a list" ! 1==𝕨 + n←0+´r←=⌜𝕨 + "𝕨⊔𝕩: Total rank of 𝕨 must be at most rank of 𝕩" ! n≤=𝕩 + ld←(Join≢⌜𝕨)-n↑≢𝕩 + "𝕨⊔𝕩: Lengths of 𝕨 must equal to 𝕩, or one more only in a rank-1 component" ! 1∧´(0⊸≤∧≤⟜(r/1=r))ld + dr←r⌊(0»+`r)⊏ld∾⟨0⟩ + l←dr-˜≠⌜𝕨↩⥊⌜𝕨 ⋄ LS←∾⟜(n Cell 𝕩) Reshape 𝕩˙ + S←⊏⟜(LS⟨1×´l⟩) + (LS 0⌜𝕨) Fill dr (1≠≠∘⊢)◶⟨S _group○(0⊸⊑), S⌜ ·+⌜⌜´ (⌽×`1»⌽l) × ⊢_group¨⟩ 𝕨 +} + +↑ ↩ Prefixes ⊘ Take +↓ ↩ Suffixes ⊘ Drop +⊔ ← GroupInds ⊘ GroupGen +⊐ ← SelfClas ⊘ (1 _search) +∊ ← ⊢_self ⊘ (0 _search˜) +⎉ ← _rankOp_ + +Find←{ + r←=𝕨 + "⍷𝕩: Rank of 𝕨 cannot exceed rank of 𝕩" ! r≤=𝕩 + 0 Fill 𝕨 ≡⎉r ((1+r-⊸↑≢𝕩)⌊≢𝕨)⊸↕⎉r 𝕩 +}○ToArray + +OccurrenceCount ← 0 Fill ⊐˜(⊢-⊏)⍋∘⍋ +ProgressiveIndexOf ← 0 Fill { + c←1-˜=𝕨 + "⊒: Rank of 𝕨 must be at least 1" ! 0≤c + "⊒: Rank of 𝕩 must be at least cell rank of 𝕨" ! c≤=𝕩 + 𝕨⊐○(Pair¨⟜(≢⥊OccurrenceCount∘⥊) 𝕨⊸⊐)𝕩 +} + +ReorderChk←{ + "𝕨⍉𝕩: 𝕨 must have rank at most 1" ! 1≥=𝕨 + "𝕨⍉𝕩: Length of 𝕨 must not exceed rank of 𝕩" ! 𝕨≤○≠≢𝕩 + "𝕨⍉𝕩: 𝕨 must consist of natural numbers" ! 1∧´Nat⌜⥊𝕨 +} +ReorderAxesSub←{ + (𝕨⊸⊏Pick𝕩˙)⌜↕⌊´⌜𝕨⊔≢𝕩 +} _fillBy_ ⊢ +ReorderAxes←{ + 𝕨 ReorderChk 𝕩 + 𝕨↩⥊𝕨 + r←(=𝕩)-0+´¬∊𝕨 + "𝕨⍉𝕩: Skipped result axis" ! 1∧´𝕨∾¯1»¨𝕩 + g←GroupLen j + IX 1∧´g≤1 + o←/¬g + (⍋j∾o)⊏(/≠¨𝕩)∾¯1¨o +} +GroupInv ← { + IA 1==𝕨 + IA 1∧´Nat⌜𝕨 + i←⊔𝕨 + IX i≡○(≠¨)𝕩 + i ⍋⊸⊏○∾ 𝕩 +} +⊏ ↩ FirstCell ⊘ (ToArray⊸(SelSub _onAxes_ 1)) _fillBy_ ⊢ +PrimInverse ← INF _lookup_ ⟨ + '+', +⊘(-˜) + '-', - + '×', ⊢_invChk_×⊘(÷˜) + '÷', ÷ + '⋆', Log _perv + '√', ט⊘(⋆˜) + '∧', ⊢_invChk_∧⊘(÷˜) + '∨', ⊢_invChk_∨⊘(-˜÷1-⊣) + '¬', ¬ + '<', {IX IsArray𝕩⋄IX 0==𝕩⋄0⊑⥊𝕩}⊘(IA∘0) + '⊢', ⊢ + '⊣', ⊢⊘(⊢⊣IX∘≡) + '∾', IA∘0 ⊘ {d←𝕩-○=𝕨⋄IX(0⊸≤∧≤⟜1)d⋄l←d◶1‿≠𝕨⋄IX l≤≠𝕩⋄IX 𝕨≡d◶⟨⊏,l⊸↑⟩𝕩⋄l↓𝕩} + '≍', {IX 1=≠𝕩⋄⊏𝕩} ⊘ {IX 2=≠𝕩⋄IX 𝕨≡⊏𝕩⋄1⊏𝕩} + '↑', ¯1⊸⊑_invChk_↑ ⊘ (IA∘0) + '↓', 0⊸⊑_invChk_↓ ⊘ (IA∘0) + '↕', ≢_invChk_↕ ⊘ (IA∘0) # Should trace edge and invChk + '⌽', ⌽ ⊘ (-⊸⌽) + '⍉', TransposeInv ⊘ ReorderAxesInv + '/', {IA 1==𝕩⋄IA 1∧´Nat⌜𝕩⋄IX(1∧´¯1⊸↓≤1⊸↓)𝕩⋄GroupLen𝕩}⊘(IA∘0) + '⊔', GroupIndsInv ⊘ GroupInv +⟩ +SwapInverse ← INF _lookup_ ⟨ + '+', ÷⟜2⊘(-˜) + '-', IA∘0⊘+ + '×', √⊘(÷˜) + '÷', IA∘0⊘× + '⋆', IA∘0⊘√ + '√', IA∘0⊘(÷Log) + '∧', √⊘(÷˜) + '∨', (¬√∘¬)⊘(-˜÷1-⊣) + '¬', IA∘0⊘(+-1˙) +⟩ +⌜ ↩ {𝕨𝔽⌜_fillByPure_𝔽○ToArray𝕩} +Mod1Inverse ← INF˙ _lookup_ ⟨ + '˜', SwapInverse + '¨', {𝕏⁼¨ ⊣·IX 0<≡∘⊢} + '⌜', {𝕏⁼⌜⊘(IA∘0) ⊣·IX 0<≡∘⊢} + '˘', {(IX∘IsArray⊸⊢𝕏⁼)˘ ⊣·IX 0<=∘⊢} + '`', {(⊏∾¯1⊸↓𝕏1⊸↓)⍟(1<≠)⊘(»𝕏⊢)⊣·IX 0<=∘⊢}∘{𝕏⁼¨} +⟩ +⍟ ↩ _repeat_ +⌾ ← _under_ +Mod2Inverse ← INF˙ _lookup_ ⟨ + '∘', AtopInverse + '○', {Fi←𝕎⁼⋄𝕏⁼ Fi⊘(𝕏⊸Fi)} + '⌾', {𝕎⁼⌾𝕏} # Need to verify for computation Under + '⍟', Int∘⊢◶⟨IA∘0˙,0⊸≤◶{𝕎⍟(-𝕩)_invChk_(𝕎⍟𝕩)}‿{𝕎⍟(-𝕩)}⟩ + '⊘', {(𝕎⁼)⊘(𝕏⁼)} + '⊸', IsConstant∘⊣ ⊣◶{INF⊘𝕏}‿⊢ {𝕎⊸(𝕏⁼)} + '⟜', {(𝕨IsConstant∘⊢◶⟨IA∘0˙,{𝕩𝕎{SwapInverse𝕗}⊢}⟩𝕩)⊘(𝕏⁼𝕎⁼)} +⟩ { inv˙⊸=◶⟨𝔽,{𝕏_inv_𝕎}˙⟩ } + +´ ← _fold +˝ ← _insert +⁼ ↩ _undo +⊑ ↩ First ⊘ Pick +◶ ↩ {𝕨((𝕨𝔽𝕩)⊑𝕘){𝔽}𝕩} # Same definition, new Pick +⚇ ← _depthOp_ +⥊ ↩ Deshape ⊘ Reshape +≍ ← >∘Pair _fillBy_ (⊢⊘IF) +⍉ ← Transpose ⊘ ReorderAxes +⊒ ← OccurrenceCount⊘ ProgressiveIndexOf +⍷ ← ∊⊸/ ⊘ Find -- cgit v1.2.3