Introduction: Using Words in Geometron

This tutorial is the fourth in a series on the language I'm calling Geometron. This language is based entirely on Geometric art: the actions are geometry, the input is art symbols, and the goal of all outputs is art. It is based on the assumption that "computers" are really art engines and that the language to control them should be written accordingly.

The previous tutorials, which are assumed for this one are:

  1. https://www.instructables.com/id/Geometron-Hello-W...
  2. https://www.instructables.com/id/Edit-Geometron-Gl...
  3. https://www.instructables.com/id/Geometron-Shape-T...

The purpose of this tutorial is to learn how to use words in Geometron. They are handled two different ways and we'll work with both of them here.

Step 1: Get a Copy of Geometron Language If You Don't Have It Already

<!--If you don't already have it, copy/paste the following into an html file and save it to your desktop as editGeometron.html or something similar. You need a text editor for this, and the default one on your computer will work fine for that. That will be Notepad on a PC and textEdit on a mac. This file is the sum total of the Geometron language, which I wrote and am releasing into Public Domain with no restrictions whatsoever. Note that because this paragraph in an html comment you can copy/paste this whole step with command-A(mac) or control-A(PC) -->

<!DOCTYPE HTML>
<html>
<head>
<title>Geometron Hypercube Editor</title>
<script id = "bytecodeScript">
/*
040:0333
041:0333,0336,0336,0332,0332,0332,0330,0336,0331,0336,0341,0330,0330,0330,0337,0337,0337,0342,0336,0336,0336,0331,0331,0331,0331,0331,0337,0337,0333,0337,0337
042:0333,0330,0336,0332,0336,0332,0331,0342,0333,0342,0333,0330,0337,0337,0331
043:0333,0336,0336,0332,0332,0332,0333,0336,0332,0337,0337,0337,0342,0336,0336,0333,0337,0337,0342,0336,0336,0332,0332,0336,0332,0330,0330,0330,0335,0337,0337,0337,0342,0336,0336,0336,0332,0332,0337,0337,0337,0342,0336,0336,0336,0332,0332,0332,0337,0337,0337,0330,0334,0331
044:0333,0336,0330,0332,0336,0330,0350,0335,0335,0334,0350,0343,0334,0334,0343,0334,0334,0343,0334,0334,0343,0334,0334,0343,0334,0334,0330,0330,0343,0335,0335,0343,0335,0335,0334,0334,0334,0334,0334,0334,0343,0334,0334,0343,0334,0334,0343,0334,0334,0343,0335,0335,0335,0335,0335,0335,0335,0335,0351,0351,0330,0335,0335,0333,0333,0337,0337,0336,0332,0337,0342,0336,0333,0337
045:0333,0336,0332,0332,0350,0335,0337,0310,0337,0342,0336,0313,0334,0351,0336,0336,0330,0330,0330,0333,0341,0331,0331,0331,0333,0333,0330,0341,0333,0331,0337,0337
046:0333,0336,0332,0330,0336,0330,0341,0331,0334,0350,0334,0342,0334,0330,0343,0335,0335,0343,0334,0334,0334,0334,0334,0334,0351,0333,0350,0334,0342,0335,0335,0335,0335,0342,0334,0334,0336,0342,0334,0351,0331,0331,0333,0333,0337,0337,0337
047:0333,0336,0330,0332,0336,0330,0342,0333,0333,0331,0331,0331,0337,0337
050:0333,0336,0330,0334,0331,0331,0337,0337,0350,0350,0350,0343,0350,0334,0334,0343,0335,0335,0335,0335,0335,0343,0334,0334,0334,0351,0351,0351,0351,0336,0330,0335,0336,0332,0331,0337
051:0333,0336,0330,0335,0337,0331,0331,0337,0350,0350,0350,0343,0350,0334,0334,0343,0335,0335,0335,0335,0343,0334,0334,0351,0351,0351,0351,0330,0335,0335,0335,0336,0336,0331,0336,0333,0337,0337
052:0333,0336,0332,0330,0352,0342,0335,0335,0342,0335,0335,0342,0335,0335,0342,0335,0335,0342,0335,0335,0342,0335,0335,0353,0331,0333,0337
053:0333,0336,0330,0332,0336,0342,0335,0342,0335,0342,0335,0342,0335,0331,0331,0333,0333,0337,0337
054:0333,0336,0332,0336,0334,0350,0334,0342,0335,0351,0335,0333,0337,0337
055:0333,0336,0330,0332,0335,0336,0342,0331,0342,0333,0333,0330,0330,0330,0334,0337,0337
056:0333,0336,0332,0336,0336,0341,0333,0333,0333,0337,0337,0337
057:0333,0332,0350,0335,0310,0337,0342,0336,0313,0334,0351,0333
060:0313,0304,0336,0336,0330,0333,0330,0330,0343,0331,0331,0334,0334,0343,0332,0334,0334,0337,0342,0332,0342,0336,0331,0337,0337,0350,0350,0335,0350,0350,0335,0350,0334,0311,0337,0310,0336,0342,0337,0311,0336,0335,0351,0334,0351,0351,0334,0304,0333,0336,0336,0332,0337,0337
061:0304,0313,0335,0336,0342,0336,0330,0334,0337,0337,0342,0330,0334,0350,0334,0336,0336,0310,0337,0342,0336,0313,0335,0351,0335,0337,0331,0331,0333,0336,0336,0332,0337,0337,0337
062:0304,0313,0335,0336,0342,0336,0330,0334,0330,0330,0330,0343,0331,0331,0331,0332,0337,0337,0306,0350,0335,0342,0334,0304,0333,0336,0336,0332,0337,0337
063:0313,0304,0336,0336,0330,0333,0335,0343,0332,0332,0343,0334,0350,0343,0331,0331,0335,0335,0335,0335,0343,0330,0334,0334,0334,0334,0304,0333,0336,0333,0337,0337,0337
064:0333,0336,0332,0337,0342,0336,0330,0334,0342,0330,0335,0350,0335,0342,0334,0351,0331,0337,0336,0333,0336,0333,0337,0337
065:0313,0304,0336,0336,0330,0333,0335,0343,0335,0335,0350,0334,0350,0334,0343,0334,0351,0351,0331,0331,0331,0334,0342,0335,0335,0342,0330,0334,0342,0330,0342,0330,0334,0342,0330,0333,0333,0334,0333,0336,0333,0337,0337,0337
066:0304,0313,0336,0336,0332,0337,0337,0333,0336,0336,0332,0332,0330,0341,0332,0350,0350,0335,0337,0337,0342,0336,0336,0334,0351,0351,0333,0333,0333,0331,0336,0332,0337,0337,0337
067:0336,0332,0336,0336,0333,0337,0337,0337,0333,0336,0332,0350,0350,0335,0337,0342,0330,0334,0334,0334,0334,0334,0336,0342,0351,0351,0335,0350,0350,0335,0337,0331,0334,0351,0351,0336,0333,0337
070:0304,0313,0336,0336,0336,0332,0332,0337,0337,0337,0333,0336,0332,0336,0330,0341,0330,0330,0341,0333,0333,0331,0331,0331,0336,0332,0337,0337,0337
071:0304,0313,0336,0336,0332,0337,0337,0333,0336,0336,0332,0337,0337,0342,0336,0330,0336,0330,0332,0341,0333,0333,0330,0337,0337,0331
072:0333,0336,0332,0330,0336,0336,0336,0341,0331,0331,0331,0331,0331,0331,0331,0341,0333,0333,0333,0333,0331,0337,0337,0337,0337
073:0333,0336,0332,0330,0336,0336,0336,0341,0331,0331,0331,0331,0334,0334,0337,0337,0350,0335,0342,0335,0351,0335,0331,0333,0337,0337
074:0333,0336,0330,0332,0350,0335,0342,0335,0335,0342,0335,0351,0330,0335,0335,0333,0337
075:0333,0336,0336,0332,0330,0334,0337,0342,0336,0333,0337,0342,0336,0332,0332,0335,0333,0337,0337
076:0333,0336,0330,0332,0350,0334,0342,0334,0334,0342,0335,0335,0335,0351,0331,0333,0337,
077:0333,0336,0336,0332,0332,0330,0336,0331,0341,0330,0330,0342,0330,0330,0330,0343,0335,0335,0350,0334,0343,0335,0351,0330,0342,0335,0335,0337,0331,0331,0331,0336,0330,0333,0333,0333,0337,0337,0337
0100:0333,0336,0332,0330,0336,0336,0341,0337,0343,0334,0343,0334,0334,0336,0330,0342,0331,0337,0350,0335,0335,0343,0351,0330,0330,0335,0335,0333,0333,0337,0337
0101:0304,0313,0311,0305,0350,0350,0335,0342,0351,0335,0336,0333,0334,0334,0337,0342,0336,0336,0330,0334,0334,0342,0335,0335,0331,0350,0335,0337,0337,0304,0313,0336,0336,0336,0333,0337,0337,0337
0102:0304,0313,0336,0336,0336,0333,0337,0337,0337,0342,0330,0335,0336,0336,0342,0333,0333,0342,0332,0330,0343,0333,0333,0343,0333,0331,0342,0334,0337,0333,0336,0336,0333,0337,0337,0337,0304,0313
0103:0333,0336,0330,0332,0334,0343,0335,0335,0350,0334,0334,0343,0335,0335,0335,0335,0343,0351,0330,0335,0335,0333,0337,0304,0313
0104:0333,0332,0342,0336,0330,0350,0335,0343,0335,0335,0343,0335,0351,0330,0335,0335,0336,0333,0337,0333,0337,0304,0313
0105:0304,0313,0333,0336,0332,0336,0332,0332,0337,0337,0342,0335,0336,0342,0332,0336,0342,0337,0332,0342,0336,0331,0334,0337,0337,0333,0331,0304,0313
0106:0304,0313,0333,0336,0332,0336,0332,0332,0337,0337,0342,0335,0336,0332,0336,0342,0337,0332,0342,0336,0331,0334,0337,0337,0333,0331,0304,0313
0107:0304,0313,0333,0336,0330,0332,0334,0343,0335,0335,0350,0334,0334,0343,0335,0335,0335,0335,0343,0351,0330,0335,0335,0333,0337,0336,0336,0332,0336,0333,0337,0342,0330,0334,0342,0335,0331,0333,0337,0337,0304,0313
0110:0304,0313,0333,0336,0336,0332,0332,0337,0337,0342,0336,0332,0337,0342,0336,0330,0335,0342,0330,0334,0331,0336,0333,0337,0337,0304,0313
0111:0304,0313,0333,0336,0336,0332,0332,0334,0337,0342,0336,0330,0335,0337,0337,0342,0330,0336,0336,0334,0342,0335,0335,0342,0330,0330,0334,0337,0337,0331
0112:0304,0313,0333,0336,0330,0332,0342,0330,0335,0336,0342,0334,0334,0342,0334,0330,0330,0342,0330,0333,0343,0335,0335,0333,0331,0333,0336,0333,0337,0337,0337
0113:0304,0313,0333,0336,0332,0332,0337,0342,0336,0330,0350,0335,0310,0337,0342,0336,0313,0335,0335,0310,0337,0342,0336,0313,0335,0351,0330,0335,0335,0333,0337,0304,0313,0336,0336,0336,0333,0337,0337,0337
0114:0333,0336,0332,0336,0332,0337,0337,0342,0336,0335,0342,0330,0336,0330,0334,0337,0337
0115:0304,0310,0342,0330,0335,0306,0335,0311,0336,0342,0330,0334,0334,0342,0330,0334,0334,0334,0334,0350,0335,0337,0342,0330,0304,0335,0335,0313,0336,0336,0336,0333,0337,0337,0337
0116:0342,0330,0335,0306,0335,0313,0337,0312,0336,0342,0330,0334,0334,0350,0334,0337,0313,0336,0304,0342,0336,0336,0336,0333,0337,0337,0337
0117:0333,0336,0330,0332,0341,0331,0333,0337
0120:0333,0332,0336,0336,0333,0337,0337,0342,0336,0330,0336,0330,0333,0341,0333,0333,0330,0337,0337,0331
0121:0333,0336,0330,0332,0341,0335,0335,0336,0330,0332,0350,0334,0337,0342,0334,0351,0334,0333,0331,0336,0330,0337,0337
0122:0304,0313,0336,0336,0336,0333,0337,0337,0337,0342,0330,0335,0336,0336,0342,0333,0333,0342,0332,0330,0343,0333,0335,0337,0306,0350,0334,0337,0312,0336,0342,0337,0313,0336,0335,0330,0304,0334,0334,0333,0336,0336,0336,0332,0337,0337,0337,0337
0123:0313,0304,0336,0336,0332,0337,0337,0336,0330,0333,0336,0330,0343,0334,0350,0334,0343,0332,0332,0334,0334,0334,0334,0343,0335,0335,0335,0351,0343,0335,0335,0333,0331,0333,0337,0337
0124:0333,0336,0332,0337,0342,0330,0336,0335,0342,0331,0342,0330,0330,0334,0337,0331
0125:0333,0336,0336,0330,0332,0337,0342,0330,0336,0342,0331,0331,0332,0332,0342,0330,0342,0330,0342,0331,0331,0333,0335,0335,0343,0330,0335,0335,0337,0333,0337
0126:0333,0336,0332,0350,0350,0335,0337,0342,0334,0334,0342,0335,0335,0334,0351,0351,0336,0333,0337
0127:0336,0336,0336,0333,0333,0337,0337,0337,0304,0313,0350,0350,0350,0334,0342,0335,0335,0336,0342,0330,0304,0335,0350,0350,0335,0335,0335,0342,0330,0304,0334,0350,0334,0350,0334,0337,0342,0334,0350,0335,0304,0336,0336,0333,0336,0333,0337,0337,0337
0130:0313,0306,0350,0337,0312,0336,0335,0342,0334,0304,0337,0313,0336,0330,0335,0306,0335,0337,0312,0336,0342,0330,0334,0304,0334,0337,0313,0336,0336,0336,0336,0333,0337,0337,0337
0131:0304,0313,0336,0336,0336,0332,0337,0337,0337,0336,0333,0342,0330,0306,0350,0334,0337,0312,0336,0342,0335,0335,0342,0337,0313,0336,0334,0304,0331,0333,0337,0336,0336,0336,0332,0337,0337,0337
0132:0304,0335,0312,0336,0342,0337,0332,0336,0342,0337,0333,0306,0336,0334,0313,0337,0342,0335,0304,0336,0330,0334,0312,0337,0313,0336,0336,0336,0333,0337,0337,0337
0133:0333,0336,0336,0332,0332,0337,0337,0342,0330,0335,0336,0336,0342,0337,0337,0333,0336,0336,0342,0330,0330,0334,0337,0337
0134:0333,0336,0336,0332,0337,0337,0350,0350,0334,0342,0335,0351,0351,0336,0336,0333,0337,0337
0135:0333,0336,0336,0332,0337,0337,0342,0336,0336,0334,0342,0333,0333,0333,0333,0342,0335,0333,0337,0337,0331
0136:0333,0330,0336,0332,0334,0334,0350,0335,0342,0334,0334,0342,0334,0351,0334,0333,0337,0331
0137:0333,0334,0336,0336,0330,0337,0342,0336,0331,0335,0337,0337
0140:0333,0336,0332,0330,0336,0330,0350,0334,0342,0335,0351,0330,0333,0333,0337,0337,0331
0141:0304,0313,0336,0336,0336,0332,0332,0337,0337,0337,0333,0336,0332,0336,0330,0341,0333,0342,0331,0342,0330,0330,0332,0333,0333,0331,0331,0337,0337,0336,0336,0336,0332,0337,0337,0337,0313,0304
0142:0304,0313,0336,0336,0332,0337,0337,0333,0336,0336,0332,0332,0332,0337,0337,0342,0336,0336,0330,0333,0341,0333,0333,0331,0337,0337,0336,0336,0336,0332,0337,0337,0337,0304,0313
0143:0304,0313,0336,0336,0332,0337,0337,0333,0336,0332,0336,0330,0350,0343,0334,0334,0343,0334,0334,0343,0334,0334,0330,0330,0334,0334,0351,0331,0336,0332,0337,0337,0337
0144:0333,0336,0336,0332,0332,0337,0337,0342,0336,0336,0330,0332,0341,0333,0333,0331,0337,0337
0145:0304,0313,0336,0336,0332,0337,0337,0333,0336,0336,0332,0330,0332,0343,0334,0334,0350,0335,0343,0334,0343,0335,0335,0342,0351,0335,0335,0342,0333,0330,0330,0334,0336,0332,0337,0337,0337
0146:0304,0313,0336,0336,0332,0337,0337,,0333,0336,0336,0332,0332,0337,0342,0330,0336,0336,0342,0330,0333,0343,0332,0331,0331,0335,0337,0336,0342,0334,0334,0342,0335,0331,0331,0331,0333,0333,0333,0333,0337,0337,0337,0304,0313,0336,0336,0336,0332,0337,0337,0337
0147:0304,0313,0336,0336,0336,0332,0332,0337,0337,0337,0333,0336,0332,0336,0330,0341,0333,0342,0331,0342,0331,0342,0331,0342,0332,0335,0335,0343,0331,0331,0332,0332,0334,0334,0337,0337,0336,0336,0336,0332,0337,0337,0337
0150:0304,0313,0342,0336,0330,0333,0336,0331,0332,0343,0333,0334,0334,0342,0330,0334,0334,0336,0333,0337,0337,0337
0151:0333,0336,0336,0332,0332,0332,0342,0330,0336,0342,0330,0330,0330,0336,0341,0331,0331,0331,0331,0331,0331,0331,0331,0331,0331,0337,0333,0333,0337,0337,0337
0152:0333,0336,0336,0332,0332,0332,0342,0331,0342,0332,0335,0335,0343,0332,0331,0331,0331,0336,0336,0341,0330,0330,0330,0330,0330,0330,0330,0330,0335,0335,0337,0333,0333,0337,0337,0337
0153:0304,0313,0336,0336,0332,0337,0337,0333,0336,0336,0332,0332,0332,0337,0342,0330,0336,0342,0331,0350,0335,0342,0335,0335,0310,0337,0342,0336,0313,0334,0351,0334,0331,0333,0336,0333,0337,,0337,0337,0304,0313
0154:0304,0313,0336,0336,0336,0332,0337,0337,0337,0333,0336,0336,0332,0332,0332,0336,0336,0350,0335,0342,0334,0337,0337,0337,0342,0330,0336,0342,0330,0334,0334,0334,0336,0342,0335,0351,0335,0337,0331,0331,0331,0333,0337,0337
0155:0304,0313,0333,0336,0332,0336,0332,0336,0332,0332,0337,0337,0342,0336,0333,0330,0336,0332,0343,0333,0333,0343,0332,0331,0342,0331,0342,0337,0333,0342,0333,0337,0337
0156:0304,0313,0333,0336,0332,0336,0332,0336,0332,0332,0337,0337,0342,0336,0333,0330,0336,0332,0343,0333,0331,0331,0337,0342,0333,0337,0337
0157:0304,0313,0333,0336,0332,0336,0332,0330,0341,0333,0333,0331,0337,0337
0160:0304,0313,0336,0336,0332,0337,0337,,0333,0336,0332,0336,0332,0342,0335,0335,0337,0342,0336,0331,0332,0341,0333,0334,0334,0342,0331,0333,0333,0333,0337,0337
0161:0304,0313,0333,0336,0332,0336,0330,0332,0341,0333,0342,0331,0331,0337,0342,0336,0333,0334,0334,0336,0333,0343,0335,0335,0330,0330,0333,0337,0337,0337
0162:0333,0336,0332,0336,0332,0337,0342,0330,0336,0336,0342,0350,0335,0350,0337,0337,0335,0342,0335,0351,0351,0330,0334,0331,0336,0336,0333,0337,0337,0337
0163:0304,0313,0336,0336,0332,0337,0337,0333,0336,0336,0332,0332,0330,0336,0330,0350,0343,0334,0334,0343,0334,0350,0334,0343,0334,0351,0330,0330,0343,0334,0334,0343,0334,0334,0335,0343,0334,0351,0331,0333,0333,0337,0337,0337
0164:0304,0313,0333,0336,0332,0342,0330,0336,0342,0334,0342,0335,0335,0342,0333,0333,0336,0330,0335,0343,0335,0335,0333,0333,0333,0337,0337,0337
0165:0304,0313,0336,0336,0330,0342,0333,0334,0334,0343,0332,0334,0334,0342,0334,0334,0342,0330,0335,0335,0336,0333,0337,0337,0337
0166:0304,0313,0336,0336,0332,0337,0337,0333,0336,0332,0350,0350,0334,0342,0335,0335,0342,0334,0351,0351,0333,0337,0336,0336,0336,0332,0337,0337,0337
0167:0336,0336,0336,0333,0337,0337,0337,0313,0304,0336,0336,0336,0333,0337,0350,0350,0334,0337,0342,0335,0335,0336,0342,0330,0335,0335,0335,0335,0335,0335,0342,0330,0334,0334,0334,0334,0334,0334,0337,0342,0334,0304,0336,0333,0336,0333,0337,0337,0337
0170:0304,0313,0336,0306,0350,0335,0342,0351,0336,0333,0334,0337,0342,0350,0335,0304,0336,0336,0333,0337,0337,0337
0171:0304,0313,0336,0336,0332,0337,0337,0333,0336,0332,0336,0350,0335,0337,0350,0334,0342,0334,0334,0342,0334,0334,0334,0334,0334,0334,0342,0334,0351,0351,0335,0335,0333,0337,0336,0336,0336,0332,0337,0337,0337
0172:0304,0313,0336,0350,0335,0310,0337,0342,0330,0334,0334,0334,0336,0342,0334,0337,0330,0334,0334,0334,0336,0342,0330,0334,0334,0304,0313,0337,0336,0336,0336,0333,0337,0337,0337
0173:0333,0336,0330,0332,0336,0336,0330,0334,0350,0334,0342,0335,0335,0335,0342,0330,0335,0342,0334,0331,0331,0331,0334,0342,0335,0331,0342,0335,0335,0335,0342,0335,0351,0335,0335,0331,0331,0333,0333,0337,0337,0337
0174:0333,0336,0332,0337,0342,0330,0336,0336,0342,0337,0337,0331,0336,0336,0331,0342,0330,0333,0337,0337
0175:0333,0336,0336,0332,0332,0330,0330,0336,0330,0342,0330,0350,0334,0342,0335,0331,0335,0335,0335,0342,0335,0330,0330,0334,0334,0334,0342,0335,0335,0335,0342,0330,0335,0342,0334,0351,0330,0330,0335,0335,0333,0333,0333,0337,0337,0337
0176:0333,0336,0330,0332,0330,0336,0331,0350,0334,0342,0335,0335,0342,0334,0351,0332,0350,0335,0342,0334,0351,0333,0333,0333,0331,0331,0331,0337,0337
01300:0333,0200,0336,0330,0332,0340,0350,0335,0336,0330,0342,0331,0331,0331,0342,0330,0330,0335,0335,0331,0331,0342,0330,0330,0330,0342,0331,0334,0334,0334,0351,0331,0331,0333,0333,0337,0337
01304:0333,0200,0336,0330,0332,0341,0342,0335,0342,0335,0342,0335,0342,0350,0335,0351,0336,0336,0330,0330,0341,0331,0331,0335,0330,0330,0341,0331,0331,0335,0330,0330,0341,0331,0331,0335,0330,0330,0341,0331,0331,0350,0334,0351,0337,0337,0330,0335,0335,0333,0337
01305:0333,0200,0336,0330,0332,0305,0342,0335,0342,0335,0342,0335,0342,0335,0342,0335,0341,0350,0335,0351,0336,0330,0336,0336,0341,0337,0337,0331,0335,0330,0336,0336,0341,0337,0337,0331,0335,0330,0336,0336,0341,0337,0337,0331,0335,0330,0336,0336,0341,0337,0337,0331,0335,0330,0336,0336,0341,0337,0337,0331,0350,0335,0304,0337,0331,0333,0337
01306:0333,0200,0336,0330,0332,0306,0342,0335,0342,0335,0342,0335,0342,0335,0342,0335,0341,0350,0335,0351,0336,0330,0336,0336,0341,0337,0337,0331,0335,0330,0336,0336,0341,0337,0337,0331,0335,0330,0336,0336,0341,0337,0337,0331,0335,0330,0336,0336,0341,0337,0337,0331,0335,0330,0336,0336,0341,0337,0337,0331,0350,0335,0335,0335,0337,0342,0334,0336,0330,0336,0336,0341,0337,0337,0331,0304,0335,0337,0331,0333,0337
01310:0333,0200,0336,0332,0350,0335,0310,0337,0342,0330,0334,0334,0342,0330,0334,0334,0342,0330,0334,0334,0342,0330,0334,0334,0334,0351,0336,0313,0333,0337
01311:0335,0305,0342,0334,0311,0337,0342,0336,0335,0330,0334,0350,0334,0337,0342,0334,0334,0304,0336,0313,0335,0200,0334,0305,0350,0335,0342,0330,0335,0335,0335,0311,0336,0342,0330,0334,0334,0334,0336,0342,0335,0335,0335,0337,0331,0334,0334,0334,0337,0331,0334,0313,0304,0335
01312:0333,0200,0352,0334,0342,0330,0334,0334,0334,0334,0342,0334,0312,0337,0313,0336,0342,0330,0334,0334,0334,0334,0336,0342,0334,0334,0304,0312,0336,0313,0337,0333,0337
01313:0333,0200,0336,0336,0332,0332,0330,0342,0334,0342,0330,0335,0342,0330,0335,0342,0330,0342,0330,0335,0342,0330,0335,0342,0335,0331,0333,0337,0337
01314:0333,0200,0314,0336,0332,0332,0330,0200,0333,0200,0333,0200,0331,0337,0313
01315:0333,0313,0200,0336,0330,0332,0341,0335,0342,0334,0334,0342,0334,0334,0330,0334,0331,0337
01316:0333,0200,0336,0336,0330,0332,0332,0332,0336,0341,0330,0330,0330,0330,0341,0333,0333,0331,0331,0341,0333,0333,0330,0330,0341,0331,0331,0331,0331,0341,0333,0333,0331,0331,0337,0337,0337,
01317:0333,0200,0336,0336,0330,0332,0336,0330,0333,0337,0342,0336,0330,0334,0337,0337,0342,0330,0336,0342,0330,0335,0336,0342,0331,0342,0332,0330,0337,0337,0333,0333,0331,0337
01320:0333,0200,0336,0336,0330,0332,0337,0320,0204,0336,0333,0331,0337,0337,
01321:0333,0200,0336,0336,0330,0332,0337,0321,0204,0336,0333,0331,0337,0337,
01322:0333,0200,0336,0336,0330,0332,0337,0322,0204,0336,0333,0331,0337,0337,
01323:0333,0200,0336,0336,0330,0332,0337,0323,0204,0336,0333,0331,0337,0337,
01324:0333,0200,0336,0336,0330,0332,0337,0324,0204,0336,0333,0331,0337,0337,
01325:0333,0200,0336,0336,0330,0332,0337,0325,0204,0336,0333,0331,0337,0337,
01326:0333,0200,0336,0336,0330,0332,0337,0326,0204,0336,0333,0331,0337,0337,
01327:0333,0200,0336,0336,0330,0332,0337,0327,0204,0336,0333,0331,0337,0337,
01330:0333,0200,0313,0336,0336,0330,0332,0336,0332,0337,0342,0334,0342,0330,0335,0342,0330,0334,0336,0342,0330,0335,0350,0335,0337,0310,0337,0342,0330,0335,0335,0342,0330,0335,0335,0335,0336,0313,0336,0342,0330,0351,0335,0331,0331,0331,0331,0333,0333,0333,0337,0337,0337
01331:0333,0200,0335,0335,0333,0331,0313,0336,0336,0330,0332,0336,0332,0337,0342,0334,0342,0330,0335,0342,0330,0334,0336,0342,0330,0335,0350,0335,0337,0310,0337,0342,0330,0335,0335,0342,0330,0335,0335,0335,0336,0313,0336,0342,0330,0351,0335,0331,0331,0331,0331,0333,0333,0333,0337,0337,0337,0332,0335,0335,0331
01332:0333,0200,0334,0333,0313,0336,0336,0330,0332,0336,0332,0337,0342,0334,0342,0330,0335,0342,0330,0334,0336,0342,0330,0335,0350,0335,0337,0310,0337,0342,0330,0335,0335,0342,0330,0335,0335,0335,0336,0313,0336,0342,0330,0351,0335,0331,0331,0331,0331,0333,0333,0333,0337,0337,0337,0335,0331
01333:0333,0200,0335,0331,0313,0336,0336,0330,0332,0336,0332,0337,0342,0334,0342,0330,0335,0342,0330,0334,0336,0342,0330,0335,0350,0335,0337,0310,0337,0342,0330,0335,0335,0342,0330,0335,0335,0335,0336,0313,0336,0342,0330,0351,0335,0331,0331,0331,0331,0333,0333,0333,0337,0337,0337,0330,0334
01334:0333,0200,0336,0330,0332,0336,0350,0343,0334,0334,0343,0334,0334,0343,0334,0342,0335,0330,0336,0330,0334,0334,0334,0337,0342,0334,0351,0336,0331,0337,0337,0333,0337
01335:0333,0200,0336,0330,0332,0336,0350,0343,0334,0334,0343,0334,0334,0343,0334,0334,0334,0342,0334,0330,0336,0330,0335,0335,0335,0337,0342,0336,0335,0331,0351,0337,0337,0332,0335,0335,0337,0331
01336:0333,0200,0336,0330,0334,0336,0330,0337,0342,0336,0331,0335,0337,0331,0337
01337:0333,0200,0336,0330,0332,0336,0342,0334,0342,0334,0342,0334,0342,0330,0330,0334,0337,0331,0337
01340:0333,0200,0336,0330,0332,0340,0333,0331,0337
01341:0333,0200,0336,0330,0332,0341,0340,0333,0331,0337
01342:0333,0200,0336,0330,0332,0334,0336,0342,0330,0340,0331,0335,0335,0342,0330,0340,0333,0333,0330,0334,0337,0337
01343:0333,0200,0336,0330,0332,0350,0343,0335,0342,0334,0334,0342,0335,0340,0351,0331,0333,0337
01344:0304,0313,0333,0200,0336,0332,0344,0333,0337
01345:0304,0313,0333,0200,0336,0332,0345,0333,0337
01346:0304,0313,0333,0200,0336,0332,0346,0333,0337
01347:0304,0313,0333,0200,0336,0332,0336,0330,0330,0347,0331,0331,0337,0333,0337,
01350:0333,0200,0336,0330,0332,0350,0335,0342,0335,0335,0342,0334,0336,0336,0342,0330,0330,0342,0331,0331,0351,0337,0337,0334,0333,0331,0337
01351:0333,0200,0336,0332,0330,0350,0335,0336,0336,0342,0330,0330,0342,0330,0330,0342,0331,0331,0331,0331,0335,0337,0337,0342,0335,0342,0334,0351,0333,0330,0334,0337
01352:0333,0200,0336,0330,0332,0335,0350,0352,0334,0334,0334,0342,0335,0335,0336,0336,0342,0330,0330,0342,0331,0331,0335,0335,0342,0330,0330,0342,0331,0331,0335,0335,0337,0337,0342,0335,0335,0335,0351,0353,0330,0334,0334,0333,0337
01353:0333,0200,0336,0330,0332,0335,0350,0352,0334,0342,0335,0335,0342,0335,0335,0336,0336,0342,0330,0330,0342,0331,0331,0334,0334,0334,0334,0334,0334,0342,0330,0330,0342,0331,0331,0335,0335,0335,0351,0353,0337,0337,0333,0330,0334,0337
01362:0333,0200,0336,0336,0330,0332,0332,0332,0340,0342,0330,0342,0330,0335,0342,0330,0342,0330,0350,0334,0334,0334,0342,0334,0334,0335,0334,0342,0334,0304,0330,0330,0330,0334,0334,0333,0337,0337,
01363:0304,0313,0333,0200,0336,0332,0330,0336,0330,0332,0335,0342,0330,0342,0330,0335,0342,0330,0342,0330,0334,0350,0334,0342,0334,0334,0342,0340,0335,0304,0331,0333,0337,0337
01365:0313,0304,0333,0200,0336,0330,0332,0336,0331,0332,0337,0350,0350,0334,0342,0335,0335,0342,0334,0304,0333,0350,0350,0334,0342,0335,0335,0342,0334,0304,0336,0333,0331,0337,0337
01200:0333,0200,0336,0336,0330,0332,0337,0200,0336,0331,0333,0337,0337
01201:0304,0313,0333,0200,0336,0336,0330,0330,0332,0332,0332,0335,0336,0337,0337,0342,0330,0335,0350,0335,0336,0336,0342,0335,0335,0342,0335,0304,0337,0331,0331,0333,0337,0337
01020:0304,0333,0200,0336,0330,0332,0336,0336,0332,0337,0200,0333,0333,0200,0332,0332,0336,0330,0335,0337,0342,0330,0350,0335,0335,0351,0333,0350,0336,0334,0342,0334,0334,0342,0337,0335,0351,0333,0336,0333,0331,0337,0337,0331,0337,0304,0336,0330,0330,0336,0330,0334,0331,0337,0337
01021:0304,0333,0200,0336,0330,0332,0336,0336,0332,0337,0200,0333,0333,0200,0332,0332,0336,0330,0335,0337,0342,0330,0350,0335,0335,0335,0336,0342,0335,0335,0342,0337,0335,0351,0333,0336,0333,0331,0337,0337,0331,0337,0304
01022:0333,0200,0336,0336,0330,0330,0332,0332,0332,0336,0336,0333,0337,0337,0336,0330,0336,0333,0337,0337,0200,0333,0200,0333,0200,0331,0331,0332,0332,0200,0333,0200,0333,0200,0336,0333,0331,0337,0337,0332,0330,0336,0336,0331,0337,0342,0330,0335,0350,0335,0336,0342,0335,0335,0342,0337,0335,0335,0335,0351,0331,0331,0331,0333,0333,0336,0330,0337,0337,0337
01023:0333,0200,0336,0336,0330,0330,0332,0332,0332,0336,0336,0333,0337,0337,0336,0330,0336,0333,0337,0337,0200,0333,0200,0333,0200,0331,0331,0332,0332,0200,0333,0200,0333,0200,0336,0333,0331,0337,0337,0332,0330,0336,0336,0331,0337,0335,0335,0331,0342,0330,0335,0350,0335,0336,0342,0335,0335,0342,0337,0335,0335,0335,0351,0331,0331,0331,0333,0333,0336,0330,0337,0337,0337,0335,0335,0331,0333
01024:0333,0200,0336,0336,0330,0332,0337,0200,0336,0336,0330,0332,0337,0200,0336,0336,0330,0332,0337,0200,0333,0333,0333,0331,0331,0331,0336,0331,0333,0337,0337,0337,0337
01025:0333,0200,0336,0336,0330,0332,0337,0336,0336,0330,0332,0337,0200,0336,0336,0330,0332,0337,0200,0333,0333,0333,0331,0331,0331,0336,0331,0333,0337,0337,0337,0337
01026:0333,0200,0336,0330,0332,0336,0336,0333,0331,0337,0200,0306,0335,0342,0332,0342,0330,0335,0335,0342,0335,0335,0335,0335,0331,0334,0304,0332,0306,0335,0342,0330,0350,0335,0342,0334,0331,0335,0304,0334,0331,0332,0335,0336,0332,0337,0342,0330,0350,0335,0335,0335,0336,0342,0335,0335,0342,0335,0304,0331,0331,0331,0331,0333,0333,0333,0333,0333,0337,0337,0337
01027:0333,0200,0336,0330,0332,0336,0336,0333,0331,0337,0332,0200,0306,0335,0342,0332,0342,0330,0335,0335,0342,0335,0335,0335,0335,0331,0334,0304,0332,0306,0335,0342,0330,0350,0335,0342,0334,0331,0335,0304,0334,0331,0333,0333,0330,0335,0342,0330,0350,0335,0335,0335,0336,0342,0335,0335,0342,0335,0304,0331,0331,0331,0331,0331,0333,0337,0337,0337
01010:0333,0200,0350,0334,0310,0337,0342,0336,0332,0335,0335,0337,0342,0336,0333,0334,0351,0313
01030:0333,0200,0336,0332,0337,0350,0350,0350,0342,0335,0342,0335,0342,0335,0342,0335,0342,0335,0342,0334,0334,0334,0334,0334,0334,0342,0334,0342,0334,0342,0334,0342,0334,0334,0342,0335,0335,0335,0335,0335,0335,0335,0335,0335,0335,0335,0335,0342,0334,0334,0334,0334,0334,0334,0304,0343,0336,0333,0337
01031:0333,0200,0336,0330,0332,0336,0332,0331,0123,0126,0107,0330,0330,0332,0332,0330,0335,0335,0336,0330,0332,0337,0201,0335,0350,0335,0336,0342,0335,0335,0342,0334,0304,0333,0333,0333,0333,0331,0331,0331,0331,0331,0332,0336,0333,0336,0332,0337,0337,0337,0337,0337,
0400:0300
0200:0304,0342,0330,0334,0342,0330,0334,0342,0330,0334,0342,0330,0334
0201:0342,0330,
01201:0304,0313,0333,0200,0336,0336,0330,0330,0332,0332,0332,0335,0336,0337,0337,0342,0330,0335,0350,0335,0336,0336,0342,0335,0335,0342,0335,0304,0337,0331,0331,0333,0337,0337
01344:0333,0200,0336,0330,0332,0336,0332,0340,0335,0337,0342,0330,0340,0334,0332,0336,0331,0332,0331,0337,0337,0202,
0202:0304,0313,0350,0335,0336,0336,0342,0333,0342,0333,0342,0333,0342,0333,0334,0304,0337,0337,
01345:0202,0200,0350,0334,0343,0335,0304,
01346:0202,0200,0350,0334,0332,0335,0335,0343,0333,0335,0304,0334,
01202:0202,0200,
01203:0304,0313,0202,0332,0333,0200,0336,0336,0330,0330,0332,0332,0332,0335,0336,0337,0337,0342,0330,0335,0350,0335,0336,0336,0342,0335,0335,0342,0335,0304,0337,0331,0331,0333,0337,0337,
0203:0344,0330
0204:0362,0203,0334,0203,0334,0203,0334,0203,0334,0363
01204:0202,0200,0336,0336,0330,0332,0337,0200,0336,0331,0333,0337,0337,
01365:0313,0304,0333,0200,0336,0330,0332,0336,0331,0332,0337,0350,0350,0334,0342,0335,0335,0342,0334,0304,0333,0350,0350,0334,0342,0335,0335,0342,0334,0304,0336,0333,0331,0337,0337
01205:0202,0200,0336,0336,0330,0332,0332,0332,0330,0205,0331,0331,0332,0337,0337,0333,
0205:0362,0203,0335,0203,0203,0335,0203,0335,0203,0203,0335,0363,0336,0330,0333,0336,0331,0332,0337,0365,0336,0332,0331,0337,0337,
0206:0336,0332,0337,0362,0203,0334,0336,0203,0335,0350,0335,0337,0310,0337,0203,0335,0335,0203,0335,0304,0335,0336,0313,0336,0203,0334,0337,0203,0363,0335,0335,0336,0332,0337,
01206:0202,0200,0336,0332,0206,0333,0337,
01366:0333,0200,0336,0336,0332,0332,0332,0330,0335,0337,0366,0340,0342,0330,0332,0335,0335,0367,0335,0336,0333,0330,0337,0337,0331
01367:0333,0200,0336,0336,0332,0332,0332,0330,0335,0337,0366,0330,0332,0335,0335,0367,0335,0336,0340,0334,0337,0342,0336,0333,0330,0337,0337,0331,0335,0331,0336,0332,0337,
0500:0150,0164,0164,0160,0163,072,057,057,0151,056,0151,0155,0147,0165,0162,056,0143,0157,0155,057,0162,0143,060,0157,0153,0147,0130,056,0152,0160,0147,
0501:0150,0164,0164,0160,0163,072,057,057,0151,056,0151,0155,0147,0165,0162,056,0143,0157,0155,057,0116,060,0130,0113,065,0117,0124,056,0152,0160,0147,
0502:0150,0164,0164,0160,0163,072,057,057,0151,056,0151,0155,0147,0165,0162,056,0143,0157,0155,057,0107,0150,0121,0131,066,067,0167,056,0152,0160,0147,
0503:0150,0164,0164,0160,0163,072,057,057,0151,056,0151,0155,0147,0165,0162,056,0143,0157,0155,057,0144,067,0144,0166,0115,0125,0130,056,0152,0160,0147,
0504:0150,0164,0164,0160,0163,072,057,057,0151,056,0151,0155,0147,0165,0162,056,0143,0157,0155,057,071,0111,066,0152,0102,0156,0154,056,0152,0160,0147,
0505:0150,0164,0164,0160,0163,072,057,057,0151,056,0151,0155,0147,0165,0162,056,0143,0157,0155,057,0153,0122,0141,0172,0157,0120,0111,056,0152,0160,0147,
0506:0150,0164,0164,0160,0163,072,057,057,0151,056,0151,0155,0147,0165,0162,056,0143,0157,0155,057,0113,060,0112,0153,0103,0143,071,056,0152,0160,0147,
0507:0150,0164,0164,0160,0163,072,057,057,0151,056,0151,0155,0147,0165,0162,056,0143,0157,0155,057,0164,0124,0103,070,0132,0115,0141,056,0152,0160,0147,
0510:0150,0164,0164,0160,0163,072,057,057,0151,056,0151,0155,0147,0165,0162,056,0143,0157,0155,057,0153,0122,0141,0172,0157,0120,0111,056,0152,0160,0147,
01370:0333,0200,0336,0336,0332,0332,0336,0330,0337,0337,0342,0330,0336,0342,0331,0335,0342,0330,0336,0342,0330,0334,0342,0330,0337,0342,0330,0337,0336,0336,0342,0330,0334,0342,0330,0342,0330,0342,0330,0335,0331,0331,0331,0331,0331,0333,0333,0335,0335,0342,0330,0334,0350,0334,0342,0334,0334,0342,0335,0351,0332,0332,0330,0330,0330,0333,0335,0306,0342,0336,0331,0337,0337,0342,0330,0334,0334,0342,0330,0334,0334,0342,0330,0334,0334,0304,0334,0333,0333,0336,0336,0332,0337,0337,0337,0331,0337
01371:0333,0200,0336,0336,0332,0332,0336,0330,0337,0337,0342,0330,0336,0342,0331,0335,0342,0330,0336,0342,0330,0334,0342,0330,0337,0342,0330,0337,0336,0336,0342,0330,0334,0342,0330,0342,0330,0342,0330,0335,0331,0331,0332,0332,0335,0342,0330,0334,0334,0350,0335,0342,0334,0334,0342,0335,0335,0335,0351,0333,0336,0331,0331,0331,0333,0335,0337,0337,0306,0342,0330,0334,0334,0342,0330,0334,0334,0342,0330,0334,0334,0304,0330,0330,0336,0336,0331,0334,0337,0337,0337,0331,0336,0336,0336,0330,0337,0337,0337,0337
01372:0333,0200,0336,0336,0332,0332,0336,0330,0337,0337,0342,0330,0336,0342,0331,0335,0342,0330,0336,0342,0330,0334,0342,0330,0337,0342,0330,0337,0336,0336,0342,0330,0334,0342,0330,0342,0330,0342,0330,0335,0331,0331,0331,0331,0331,0333,0333,0335,0335,0342,0330,0334,0350,0334,0342,0334,0334,0342,0335,0351,0332,0332,0330,0330,0330,0336,0331,0333,0337,0337,0342,0330,0335,0342,0330,0335,0342,0330,0335,0342,0330,0335,0333,0333,0336,0336,0332,0337,0337,0337,0331,0336,0336,0336,0330,0337,0337,0337,0337
01373:0333,0200,0336,0336,0332,0332,0336,0330,0337,0337,0342,0330,0336,0342,0331,0335,0342,0330,0336,0342,0330,0334,0342,0330,0337,0342,0330,0337,0336,0336,0342,0330,0334,0342,0330,0342,0330,0342,0330,0335,0331,0331,0332,0332,0335,0342,0330,0334,0334,0350,0335,0342,0334,0334,0342,0335,0335,0335,0351,0333,0331,0331,0336,0330,0333,0337,0337,0342,0330,0335,0342,0330,0335,0342,0330,0335,0342,0330,0335,0333,0333,0331,0331,0336,0336,0330,0332,0337,0337,0337,0337
01374:0333,0200,0336,0336,0332,0332,0336,0330,0337,0337,0342,0330,0336,0342,0331,0335,0342,0330,0336,0342,0330,0334,0342,0330,0337,0342,0330,0337,0336,0336,0342,0330,0334,0342,0330,0342,0330,0342,0330,0335,0331,0331,0331,0331,0331,0333,0333,0335,0335,0342,0330,0334,0350,0334,0342,0334,0334,0342,0335,0351,0332,0332,0330,0330,0330,0333,0335,0305,0342,0330,0334,0342,0330,0334,0342,0330,0334,0342,0330,0334,0342,0330,0334,0304,0334,0333,0333,0333,0331,0331,0331,0331,0337,0337,0337
01375:0333,0200,0336,0336,0332,0332,0336,0330,0337,0337,0342,0330,0336,0342,0331,0335,0342,0330,0336,0342,0330,0334,0342,0330,0337,0342,0330,0337,0336,0336,0342,0330,0334,0342,0330,0342,0330,0342,0330,0335,0331,0331,0332,0332,0335,0342,0330,0334,0334,0350,0335,0342,0334,0334,0342,0335,0335,0335,0351,0333,0331,0331,0333,0330,0335,0305,0342,0330,0334,0342,0330,0334,0342,0330,0334,0342,0330,0334,0342,0330,0334,0304,0330,0330,0330,0334,0331,0331,0331,0331,0337,0337,0337
01376:0333,0200,0336,0336,0332,0332,0336,0330,0337,0337,0342,0330,0336,0342,0331,0335,0342,0330,0336,0342,0330,0334,0342,0330,0337,0342,0330,0337,0336,0336,0342,0330,0334,0342,0330,0342,0330,0342,0330,0335,0331,0331,0331,0331,0331,0333,0333,0335,0335,0342,0330,0334,0350,0334,0342,0334,0334,0342,0335,0351,0332,0332,0330,0330,0330,0335,0330,0306,0342,0330,0334,0342,0330,0334,0342,0330,0334,0342,0330,0334,0342,0330,0334,0342,0330,0334,0304,0330,0330,0330,0334,0337,0337,0331,0337
01377:0333,0200,0336,0336,0332,0332,0336,0330,0337,0337,0342,0330,0336,0342,0331,0335,0342,0330,0336,0342,0330,0334,0342,0330,0337,0342,0330,0337,0336,0336,0342,0330,0334,0342,0330,0342,0330,0342,0330,0335,0331,0331,0332,0332,0335,0342,0330,0334,0334,0350,0335,0342,0334,0334,0342,0335,0335,0335,0351,0333,0331,0333,0335,0306,0342,0330,0334,0342,0330,0334,0342,0330,0334,0342,0330,0334,0342,0330,0334,0342,0330,0334,0304,0333,0330,0330,0330,0334,0331,0331,0331,0337,0337,0337
0600:0122,0157,0157,0164,040,0115,0141,0147,0151,0143,040,0133,060,060,055,060,063,067,0135,
0601:0106,0157,0156,0164,040,0133,060,064,060,055,060,061,067,066,0135,
0602:0123,0150,0141,0160,0145,0163,040,0133,060,062,060,060,055,060,062,067,067,0135,
0603:0107,0145,0157,0155,0145,0164,0162,0171,040,0101,0143,0164,0151,0157,0156,0163,040,0133,060,063,060,060,055,060,063,067,067,0135,
0604:0111,0155,0141,0147,0145,0163,040,0133,060,065,060,060,055,060,065,067,067,0135,
0605:0127,0157,0162,0144,0163,040,0133,060,066,060,060,055,060,066,067,067,0135,
0606:0115,0141,0164,0150,040,0133,060,067,060,060,055,060,067,067,067,0135,
0274:0333,0331,0362,0203,0334,0203,0334,0203,0334,0203,0334,0363,0330,0332,
0250:0305,0311,0336,0362,0203,0335,0350,0335,0337,0203,0305,0335,0335,0203,0363,0335,0350,0335,0305,
0251:0305,0311,0336,0362,0203,0334,0350,0334,0337,0203,0305,0334,0334,0203,0363,0334,0350,0334,0305,
0252:0305,0311,0337,0362,0203,0335,0335,0203,0335,0350,0335,0336,0203,0363,0335,0335,0335,0305,
0253:0305,0311,0337,0362,0203,0334,0334,0203,0334,0350,0334,0336,0203,0363,0334,0334,0334,0305,
0254:0305,0311,0335,0362,0203,0335,0335,0336,0203,0335,0203,0363,0335,0337,
0255:0311,0305,0334,0362,0203,0334,0334,0336,0203,0334,0203,0363,0334,0337,
0256:0305,0311,0335,0362,0203,0335,0335,0337,0203,0335,0335,0336,0203,0363,
0257:0305,0311,0334,0362,0203,0334,0334,0337,0203,0334,0334,0336,0203,0363,
0260:0311,0305,0333,0350,0334,0337,0362,0203,0305,0334,0334,0336,0203,0334,0203,0363,0334,0334,0334,0330,0335,0335,0350,0334,0305,
0261:0311,0305,0332,0350,0335,0305,0337,0362,0203,0335,0335,0336,0203,0335,0203,0363,0331,0350,0335,0335,0335,0305,0336,0331,0337,
01250:0333,0200,0336,0332,0330,0250,0304,0313,0331,0333,0337,
01251:0333,0200,0336,0332,0330,0251,0304,0313,0331,0333,0337,
01252:0333,0200,0336,0332,0330,0252,0304,0313,0331,0333,0337,
01253:0333,0200,0336,0332,0330,0253,0304,0313,0331,0333,0337,
01254:0333,0200,0336,0332,0330,0254,0304,0313,0331,0333,0337,
01255:0333,0200,0336,0332,0330,0255,0304,0313,0331,0333,0337,
01256:0333,0200,0336,0332,0330,0256,0304,0313,0331,0333,0337,
01257:0333,0200,0336,0332,0330,0257,0304,0313,0331,0333,0337,
01260:0333,0200,0336,0332,0330,0260,0304,0313,0331,0333,0337,
01261:0333,0200,0336,0332,0330,0261,0304,0313,0331,0333,0337,
0176:0330,0336,0336,0336,0331,0331,0333,0333,0341,0331,0331,0331,0331,0331,0331,0333,0333,0333,0333,0337,0337,0337,
045:0336,0333,0330,0336,0332,0330,0335,0335,0366,0335,0332,0332,0331,0367,0335,0335,0366,0335,0335,0334,0332,0331,0331,0334,0336,0331,0337,0367,0336,0335,0335,0366,0332,0332,0334,0333,0337,0336,0334,0334,0367,0337,0335,0335,0201,0336,0342,0335,0335,0331,0331,0333,0333,0333,0333,0337,0337,0337,
*/
</script>
<!--
<script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
-->
<!--<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>-->
<script>

  	inPath = false;//move to true after path started, back to false after path ended
	explodeIndex = 0;
	explodeLimit = 100000;
	currentTable = []; 
	for(var index = 0;index < 01777;index ++){
		currentTable.push("");
	}  
	var inputbytecode = document.getElementById("bytecodeScript").text;
	
	var bytecodearray = inputbytecode.split("\n");

	for(var index = 0;index < bytecodearray.length;index++){
		if(bytecodearray[index].includes(":")){
			var localBytecode = bytecodearray[index].split(":");
			var localAddress = parseInt(localBytecode[0],8);
			currentTable[localAddress] = localBytecode[1];
		}
	}
	
	for(var index = 040;index < 0177;index++){
		currentTable[index + 01000] = currentTable[index];
	}

	myFont = "Futura";
	currentWord = "Word";
	currentSVG = "";
	currentAddress = 0401;
	currentGlyph = currentTable[currentAddress];
	currentGlyphArray = currentGlyph.split(",");
	cursorPosition = currentGlyphArray.length;
	phi = 0.5*(Math.sqrt(5) + 1);
	unit = 100;
	scaleFactor = 2;
	side = unit;
	thetaStep = Math.PI/2;
	theta0 = -Math.PI/2; 
	theta = theta0;

	x0 = 200;
	y0 = 200;
	x = x0;
	y = y0;

	cursor = {
		x:x,
		y:y,
		theta:theta,
		thetaStep:thetaStep,
		side:side,
		glyph:"0362,0344,0363,0336,0330,0340,0331,0337,0337,0330,0340,0331,0336,0334,0362,0344,0363,0335,0335,0362,0344,0363"
	}


</script>
</head>
<body>
<div class = "atom" id = "masterRoot"></div>
<div id = "glyphTableEditor" class = "atom" style = "display:block">	
	<canvas style = "display:none;" id = "invisibleCanvas"></canvas>
	<div class = "atom"  style = "width:450px;height:450px;padding:40px 0px 0px 40px">
		<canvas width = "400" height = "400" id = "plotCanvas" style = "border:solid"></canvas>
	</div>
	<div id = "wordPanel" class = "atom" onchange = "updateWordOption();">
		string:<input id = "wordInput" onchange = "updateWordInput();"></input>
		<select id = "wordSelect">
		</select>
		bytecode:<input id = "wordCode"></input>
	</div>
	<div id = "spellDiv">
		<canvas width = "3000" height = "30" id = "spellCanvas" style = "border:solid;float:left;"></canvas>
		<input size = "6" id = "addr" style = "float:left;" onchange = "updateAddr();"></input>
		<input style = "float:left;" size = "428" id = "glyphBytecode" onchange = "updateGlyph()"></input>
	</div>
	<div class = "atom" style = "width:610px;height:auto" id = "controlPad">
		<div style = "width:95px;height:100px;float:left" id = "directionPad"></div>
		<div style = "width:210px;height:30px;float:left" id = "anglePad"></div>
		<div style = "width:180px;height:30px;float:left" id = "scalePad"></div>
		<div style = "width:125px;height:100px;float:right;" id = "rootPad"></div>
		<div style = "width:384px;height:100px;float:left" id = "drawPad"></div>
		<input style = "float:left;margin:0px" size = "80" id = "drawGlyphGlyph" onchange = "updateDrawGlyphs();"></input>
	</div>
	<p>
	<div class = "atom">
		<textarea id = "mainTextArea"  cols = "84" rows = "12">
		</textarea>
	</div>
</div>


<script>

var newSelect = document.getElementById("wordSelect");
for(var index = 0600;index < 0700;index++){
	var newOption = document.createElement("OPTION");
	newOption.text = "0" + index.toString(8);
	newSelect.appendChild(newOption);
}

currentNode = document.getElementById("directionPad");
//buildPanel([0334,0330,0335,0332,0300,0333,0336,0331,0337]);
buildPanel("0334,0330,0335,0332,0300,0333,0336,0331,0337");

currentNode = document.getElementById("anglePad");
buildPanel("0304,0305,0306,0350,0351,0352,0353");

currentNode = document.getElementById("scalePad");
buildPanel("0310,0311,0312,0313,0314,0316");

currentNode = document.getElementById("rootPad");
buildPanel("020,010,021,022,023,024,025,026,027,031");


currentNode = document.getElementById("drawPad");
drawGlyphsGlyph = "0200,0201,0340,0341,0342,0343,0362,0203,0363";
document.getElementById("drawGlyphGlyph").value = drawGlyphsGlyph;
buildPanel(drawGlyphsGlyph);

ctx = document.getElementById("plotCanvas").getContext("2d");
currentGlyph = currentTable[currentAddress];
redraw();

currentNode = document.getElementById("masterRoot");
appendGlyphButton(030);

function buildPanel(glyphsGlyph){
	var glyphsGlyphArray = glyphsGlyph.split(",");
	var buttonArray = [];
	for(var index = 0;index < glyphsGlyphArray.length;index++){
		buttonArray.push(parseInt(glyphsGlyphArray[index],8));
	}
	for(var index = 0;index < buttonArray.length;index++){
		appendGlyphButton(buttonArray[index]);
	}
}

function updateWordOption(){
	wordAddress = parseInt(document.getElementById("wordSelect").value,8);
	document.getElementById("wordInput").value = byteCode2string(currentTable[wordAddress]);
}

function updateWordInput(){
	wordAddress = parseInt(document.getElementById("wordSelect").value,8);
	currentTable[wordAddress] = string2byteCode(document.getElementById("wordInput").value);
	document.getElementById("wordCode").value = string2byteCode(document.getElementById("wordInput").value);
}

function updateAddr(){
	currentAddress = parseInt(document.getElementById("addr").value,8);
	currentGlyph = currentTable[currentAddress];
	currentGlyphArray = currentGlyph.split(",");
	cursorPosition = currentGlyphArray.length;
	redraw();
}

function updateGlyph(){
	currentGlyph = document.getElementById("glyphBytecode").value;
	currentGlyph = commaCleaner(currentGlyph);
	currentTable[currentAddress] = currentGlyph;
	currentGlyphArray = currentGlyph.split(",");
	cursorPosition = currentGlyphArray.length;
	redraw();	
}

function updateDrawGlyphs(){
	currentNode = document.getElementById("drawPad");
	while (currentNode.hasChildNodes()) {
		currentNode.removeChild(currentNode.childNodes[0]);
	}
	drawGlyphsGlyph = document.getElementById("drawGlyphGlyph").value;
	buildPanel(drawGlyphsGlyph);
}

function roctalChar(localAddress){
	drawGlyph("0313,0336,0336,0336,0274,0333,0331,0274,0333,0331,0337,");
	for(var bitIndex = 8;bitIndex >= 0;bitIndex--){
		if(((localAddress>>bitIndex)&1)==1){
			doTheThing(0274);// data square
		}
		doTheThing(0333);
		if((bitIndex == 6)||(bitIndex == 3)){
			drawGlyph("0331,0332,0332,0332");
		}
	}
	drawGlyph("0331,0337,0337,0200,0330");
	
	drawGlyph("0332,0336,0336,0331,0331,");
	currentWord = ((localAddress >> 6)&7).toString();	
	drawGlyph("0365,0331,");
	currentWord = ((localAddress >> 3)&7).toString();	
	drawGlyph("0365,0331,");
	currentWord = ((localAddress)&7).toString();	
	drawGlyph("0365,0331,");
	drawGlyph("0330,0337,0337,0330,0333,");	
}

function redraw(){
	x0 = 200;
	y0 = 200;
	unit = 100;
	//draw the glyph:
	ctx = document.getElementById("plotCanvas").getContext("2d");
	//draw current glyph:
	doTheThing(0300);
//	ctx.fillStyle = "#808080"
	ctx.clearRect(0,0,400,400);
	doTheThing(0300);

	drawGlyph(currentGlyph);
	//draw the cursor:
	ctx = document.getElementById("invisibleCanvas").getContext("2d");
	getCursor();
	ctx = document.getElementById("plotCanvas").getContext("2d");
	drawGlyph(cursor.glyph);

	//spell:
	ctx = document.getElementById("spellCanvas").getContext("2d");
	ctx.clearRect(0,0,3000,40);
	unit = 20;
	x0 = 5;
	y0 = 25;
	doTheThing(0300);
	spellGlyph(currentGlyph);
	
	document.getElementById("addr").value = "0" + currentAddress.toString(8);
	document.getElementById("glyphBytecode").value = currentGlyph;
	explodeIndex = 0;	
}


function appendGlyphButton(localCommand){
	glyphButtonSize = 30;
	var newCanvas = document.createElement("CANVAS");		
	newCanvas.width = glyphButtonSize;
	newCanvas.height = glyphButtonSize;
	newCanvas.className = "glyphButtons";
	ctx = newCanvas.getContext("2d");
	ctx.fillStyle="white";
	ctx.fillRect(5, 5, glyphButtonSize-10, glyphButtonSize-10);
	ctx.fillStyle="black";
	doTheThing(0300);			
	x = 5;
	y = glyphButtonSize-5;
	side = glyphButtonSize-10;
	doTheThing(localCommand + 01000);
	if(localCommand < 040){
		newCanvas.onclick = function(){
			localRoot(localCommand);
		}	
	}
	if(localCommand >= 040){
		newCanvas.onclick = function(){
			cursorAction(localCommand);	
			redraw();	
		}
	}
	currentNode.appendChild(newCanvas);
}


function cursorAction(localCommand){
	currentGlyphArray = currentGlyph.split(",");
	if(cursorPosition > currentGlyphArray.length){
		cursorPosition = currentGlyphArray.length;
	}
	currentGlyph = "";
	doTheThing(0300);
	
	for(var index = 0;index < cursorPosition;index++){
		currentGlyph += currentGlyphArray[index] + ",";	
		var localAction = parseInt(currentGlyphArray[index],8);
		if( !((localAction >= 0340) && (localAction < 0344)) ){
			doTheThing(localAction);
		}
	}
	if(localCommand != undefined){
		if( !((localCommand >= 0340) && (localCommand < 0344)) ){
			doTheThing(localCommand);
		}
	}
	cursor.x = x;
	cursor.y = y;
	cursor.theta = theta;
	cursor.thetaStep = thetaStep;
	cursor.side = side;
	if(localCommand != undefined){
		currentGlyph += "0" + localCommand.toString(8) + ",";
	}	
	for(var index = cursorPosition;index < currentGlyphArray.length;index++){
		currentGlyph += currentGlyphArray[index] + ",";		
	}
	cursorPosition++;	
	currentGlyph = commaCleaner(currentGlyph);
}

function getCursor(){

	currentGlyphArray = currentGlyph.split(",");
	var foo = "";
	doTheThing(0300);
	for(var index = 0;index < cursorPosition;index++){
		foo += currentGlyphArray[index] + ",";	
		var localAction = parseInt(currentGlyphArray[index],8);
		doTheThing(localAction);
	}
	cursor.x = x;
	cursor.y = y;
	cursor.theta = theta;
	cursor.thetaStep = thetaStep;
	cursor.side = side;

}

function commaCleaner(dirtyGlyph){ //remove extra commas from glyph
	var dirtyArray = dirtyGlyph.split(",");
	var cleanGlyph = "";
	for(var index = 0;index < dirtyArray.length;index++){
		if(dirtyArray[index] != ""){
			cleanGlyph += dirtyArray[index] + ",";
		}
	}
	return cleanGlyph;
}

function drawGlyph(localString){
	var tempArray = localString.split(',');
	for(var index = 0;index < tempArray.length;index++){
		if(explodeIndex < explodeLimit){
			doTheThing(parseInt(tempArray[index],8));
		}
	}
}

function spellGlyph(localString){
	var tempArray = localString.split(',');
	for(var index = 0;index < tempArray.length;index++){
		    ctx.lineWidth = 2;
	      ctx.strokeStyle="black";

		doTheThing(parseInt(tempArray[index],8) + 01000);
		if(index == cursorPosition-1){
			drawGlyph("0336,0333,0336,0330,0341,0331,0337,0333,0337");
		}
	}
}

function byteCode2string(localByteCode){
	var localString = "";
	var stringArray = localByteCode.split(",");
	for(var index = 0;index < stringArray.length;index++){
		var myCharCode = String.fromCharCode(parseInt(stringArray[index],8));
		if(parseInt(stringArray[index],8) >= 040 && parseInt(stringArray[index],8) < 0177 ){
			localString += myCharCode;
		}
		if(parseInt(stringArray[index],8) == 012){//newline
			localString += myCharCode;
		}
		if(parseInt(stringArray[index],8) == 011){//vertical tab
			localString += myCharCode;
		}
		
	}
	return localString;
}

function string2byteCode(localString){
	var localByteCode = "";
	for(var stringIndex = 0;stringIndex < localString.length;stringIndex++){
		var tempCharCode = localString.charCodeAt(stringIndex);
		if(tempCharCode != 0){
			localByteCode += "0";
			localByteCode += tempCharCode.toString(8);
			localByteCode += ",";
		}
	}
	return localByteCode;
}
function doTheThing(localCommand){
 	 explodeIndex++;
 	 if(explodeIndex > explodeLimit){
		explodeIndex = 0;
 	 }
     if(localCommand >= 0600 && localCommand < 0700){
    	//get the glyph, turn it into ascii, make it the Word:
    	if(currentTable[localCommand] != undefined){
    	 	currentWord = byteCode2string(currentTable[localCommand]);
    	}	
    }
     if((localCommand > 02000)&&(localCommand < 03000)){
    	roctalChar(localCommand - 02000);
    }
    if(localCommand >= 0040 && localCommand <= 0277){//shapes and fonts
		 drawGlyph(currentTable[localCommand]);    	    
    }
    if(localCommand >= 0400 && localCommand <= 0477){//manuscript glyphs
		 drawGlyph(currentTable[localCommand]);    	    
    }
    if(localCommand >= 01000 && localCommand <= 01377){//symbol glyphs
		 drawGlyph(currentTable[localCommand]);    	    
    }
 
    if(localCommand == 0300){
      x = x0;
      y = y0;
      theta = theta0;
      side = unit;
      thetaStep = Math.PI/2;
      scaleFactor = 2;
      ctx.lineWidth = 2;
      ctx.strokeStyle="black";
      ctx.fillStyle="black";
    }
    if(localCommand == 0304){
      thetaStep = Math.PI/2;
    }
    if(localCommand == 0305){
      thetaStep = 2*Math.PI/5;
    }
    if(localCommand == 0306){
      thetaStep = Math.PI/3;
    }    
    if(localCommand == 0310){
       scaleFactor = Math.sqrt(2); 
    }
    if(localCommand == 0311){
       scaleFactor = phi; //"golden" ratio 
    }
    if(localCommand == 0312){
       scaleFactor = Math.sqrt(3); 
    }
    if(localCommand == 0313){
      scaleFactor = 2;  //2x
    }
    if(localCommand == 0314){
      scaleFactor = 3;  //3x
    }
    if(localCommand == 0315){
      scaleFactor = 3.14159;  //pi*
    }    
    if(localCommand == 0316){
      scaleFactor = 5;  //5*
    }        
    if(localCommand == 0317){
       side = unit; 
    }
    if(localCommand == 0320){
		ctx.strokeStyle="black";
    	ctx.lineWidth = 2;    	
    	ctx.fillStyle = "black";
    }
    if(localCommand == 0321){
		ctx.strokeStyle = "yellow";
    	ctx.lineWidth = 2;    	
    	ctx.fillStyle = "yellow";
    }
    if(localCommand == 0322){
		ctx.strokeStyle="orange";
    	ctx.lineWidth = 2;
    	ctx.fillStyle = "orange";    
    }
    if(localCommand == 0323){
		ctx.strokeStyle="white";
    	ctx.lineWidth = 2;
    	ctx.fillStyle = "white";    
    }
    if(localCommand == 0324){
		ctx.strokeStyle="red";
    	ctx.lineWidth = 2;
    	ctx.fillStyle = "red";    
    }
    if(localCommand == 0325){
		ctx.strokeStyle="green";
    	ctx.lineWidth = 2;
    	ctx.fillStyle = "green";    
    }
    if(localCommand == 0326){
		ctx.strokeStyle="purple";
    	ctx.lineWidth = 2;
    	ctx.fillStyle = "purple";    
    }
    if(localCommand == 0327){
		ctx.strokeStyle="blue";
    	ctx.lineWidth = 2;
    	ctx.fillStyle = "blue";    
    }
    if(localCommand == 0330){
      x += side*Math.cos(theta);   
      y += side*Math.sin(theta); 
    }
    if(localCommand == 0331){
      x -= side*Math.cos(theta);   
      y -= side*Math.sin(theta); 
    }
    if(localCommand == 0332){
      x += side*Math.cos(theta - thetaStep);
      y += side*Math.sin(theta - thetaStep);
    }
    if(localCommand == 0333){
      x += side*Math.cos(theta + thetaStep);
      y += side*Math.sin(theta + thetaStep);
    }
    if(localCommand == 0334){
      theta -= thetaStep; // CCW
    }
    if(localCommand == 0335){
      theta += thetaStep; // CW
    }
    if(localCommand == 0336){
      side /= scaleFactor; // -
    }
    if(localCommand == 0337){
      side *= scaleFactor; // +
    }
    if(localCommand == 0340){  //point
		ctx.beginPath();
		ctx.arc(x, y, 3, 0, 2 * Math.PI);
		ctx.fill();	
		ctx.closePath();
		currentSVG += "<circle cx=\"";
		currentSVG += Math.round(x).toString();
		currentSVG += "\" cy = \"";
		currentSVG += Math.round(y).toString();
		currentSVG += "\" r = \"3\" stroke = \"black\" stroke-width = \"2\" ";
		currentSVG += "fill = \"black\" />\n";		
    }
    if(localCommand == 0341){  //circle
		ctx.beginPath();
		ctx.arc(x, y, side, 0, 2 * Math.PI);
		ctx.closePath();
		ctx.stroke();
		currentSVG += "    <circle cx=\"";
		currentSVG += Math.round(x).toString();
		currentSVG += "\" cy = \"";
		currentSVG += Math.round(y).toString();
		currentSVG += "\" r = \"" + side.toString() + "\" stroke = \"black\" stroke-width = \"2\" ";
		currentSVG += "fill = \"none\" />\n";		

    }
    if(localCommand == 0342){   //line
    	ctx.beginPath();
    	ctx.moveTo(x,y);
		ctx.lineTo(x + side*Math.cos(theta),y + side*Math.sin(theta));
		ctx.stroke();		
   		ctx.closePath();
   		
   		var x2 = Math.round(x + side*Math.cos(theta));
   		var y2 = Math.round(y + side*Math.sin(theta));
   		currentSVG += "    <line x1=\""+Math.round(x).toString()+"\" y1=\""+Math.round(y).toString()+"\" x2=\""+x2.toString()+"\" y2=\""+y2.toString()+"\" style=\"stroke:black;stroke-width:2\" />\n"

    }
    if(localCommand == 0343){
    	ctx.beginPath();
		ctx.arc(x, y, side, theta - thetaStep,theta + thetaStep);
		ctx.stroke();
		ctx.closePath();
		localString = "";
		localString += "  <path d=\"";	
		localString += "M";
		var localInt = x + side*Math.cos(theta - thetaStep);
		localString += localInt.toString();
		localString += " ";
		localInt = y + side*Math.sin(theta - thetaStep);
		localString += localInt.toString();
		currentSVG += localString;
		localString = "           A" + side.toString() + " " + side.toString() + " 0 0 1 ";
		localInt = x + side*Math.cos(theta + thetaStep);
		localString += localInt.toString() + " ";
		localInt = y + side*Math.sin(theta + thetaStep);
		localString += localInt.toString() + "\" fill = \"none\" stroke = \"black\" stroke-width = \"2\" />\n";
		currentSVG += localString;

    }
    if(localCommand == 0344){   //part of a poly line or path 
		ctx.lineTo(x + side*Math.cos(theta),y + side*Math.sin(theta));
		ctx.stroke();		

   		var x2 = Math.round(x + side*Math.cos(theta));
   		var y2 = Math.round(y + side*Math.sin(theta));
   		currentSVG += "L" + x2 + " " + y2 + " ";

    }
    if(localCommand == 0345){  //arc
		ctx.arc(x, y, side, theta - thetaStep,theta + thetaStep);
		ctx.stroke();
    }
    if(localCommand == 0346){  //arc, reverse direction
		ctx.arc(x, y, side, theta + thetaStep,theta - thetaStep,true);
		ctx.stroke();
    }
    if(localCommand == 0347){  //filled circle
		ctx.beginPath();
		ctx.arc(x, y, side, 0, 2 * Math.PI);
		ctx.closePath();
		ctx.stroke();
		ctx.fill();
		currentSVG += "    <circle cx=\"";
		currentSVG += Math.round(x).toString();
		currentSVG += "\" cy = \"";
		currentSVG += Math.round(y).toString();
		currentSVG += "\" r = \"" + side.toString() + "\" stroke = \"black\" stroke-width = \"2\" ";
		currentSVG += "fill = \"black\" />\n";		

	}


    if(localCommand == 0350){
      thetaStep /= 2;  //angle/2
    }
    if(localCommand == 0351){
      thetaStep *= 2;  //2angle
    }
    if(localCommand == 0352){
      thetaStep /= 3; //angle/3
    }
    if(localCommand == 0353){
      thetaStep *= 3; //3angle
    }

    if(localCommand == 0362){
	   ctx.beginPath();
	   ctx.moveTo(x,y);
	   currentSVG += "	<path d = \"M";
	   currentSVG += Math.round(x).toString() + " ";
	   currentSVG += Math.round(y).toString() + " ";

//	   currentSVG += "  <polyline points=\"";		

    }
    if(localCommand == 0363){
	   ctx.closePath();
	   ctx.stroke();		
	   ctx.fill();		
	   currentSVG += "Z\""+ " stroke = \"black\" stroke-width = \"2\" fill = \"none\" "+"/>";
	   
	   
    }

    if(localCommand == 0365){
        ctx.font=side.toString(8) + "px " + myFont;
		ctx.fillText(currentWord,x,y);
		currentSVG += "    <text x=\"";
		currentSVG += Math.round(x).toString();
		currentSVG += "\" y = \"";
		currentSVG += Math.round(y).toString();
		currentSVG += "\" fill = \"black\""; 
		currentSVG += " font-size = \"";
		currentSVG += side + "px\"";
		currentSVG += " font-family = \"futura\"";
		currentSVG += ">";
		currentSVG += currentWord;
		currentSVG += "</text>\n";	
    }
	if(localCommand == 0366){
		ctx.beginPath();
		ctx.moveTo(Math.round(x),Math.round(y));
		cpx1 = Math.round(x + side*Math.cos(theta));
		cpy1 = Math.round(y + side*Math.sin(theta));
		currentSVG += "<path    d = \"M";
		currentSVG += (Math.round(x)).toString() + ",";
		currentSVG += (Math.round(y)).toString() + " C";
		currentSVG += cpx1.toString() + "," + cpy1.toString() + " ";
		
//<path  d="M100,200 C150,150 200,150 250,200" />
	}
	if(localCommand == 0367){
		x2 = Math.round(x);
		y2 = Math.round(y);
		cpx2 = Math.round(x + side*Math.cos(theta));
		cpy2 = Math.round(y + side*Math.sin(theta));
		ctx.bezierCurveTo(cpx1,cpy1,cpx2,cpy2,x2,y2);
		ctx.stroke();
		currentSVG += cpx2.toString() + "," + cpy2.toString() + " ";
		currentSVG += x2.toString() + "," + y2.toString() + "\" fill = \"none\" stroke-width = \"2\" stroke = \"black\" />";		
	}
// stroke = "black" stroke-width = "2"
}

function localRoot(localCommand){//010 octal  = 8 decimal = delete as per ASCII spec
//	localCommand = parseInt(localCommand,8);

	if(localCommand == 010){
		currentGlyphArray = currentGlyph.split(",");
		
		firstHalf = "";
		secondHalf = "";	
		for(var index = 0;index < cursorPosition - 1;index++){
			firstHalf += currentGlyphArray[index] + ",";
		}
		for(var index = cursorPosition;index < currentGlyphArray.length;index++){
			secondHalf += currentGlyphArray[index] + ",";
		}				
		currentGlyph = firstHalf + secondHalf;
		if(cursorPosition > 0){
			cursorPosition--;
		}
		currentGlyph = commaCleaner(currentGlyph);

		redraw();
	}

	if(localCommand == 0020){//cursor forward
		cursorPosition--;
		if(cursorPosition < 0){
			cursorPosition = currentGlyphArray.length;			
		}

		redraw();
	}
	if(localCommand == 0021){//cursor back
		cursorPosition++;
		if(cursorPosition > currentGlyphArray.length ){
			cursorPosition = 0;
		}
		redraw();
	}	
	if(localCommand == 0022){//move to previous glyph in table
		currentGlyph = document.getElementById("glyphBytecode").value;
		currentGlyph = commaCleaner(currentGlyph);
		currentTable[currentAddress] = currentGlyph;
		currentAddress--;
		currentGlyph = currentTable[currentAddress];
		currentGlyphArray = currentGlyph.split(",");
		cursorPosition = currentGlyphArray.length;
		redraw();
	}
	if(localCommand == 0023){//move to next glyph in table
		currentGlyph = document.getElementById("glyphBytecode").value;
		currentGlyph = commaCleaner(currentGlyph);
		currentTable[currentAddress] = currentGlyph;
		currentAddress++;
		currentGlyph = currentTable[currentAddress];
		currentGlyphArray = currentGlyph.split(",");
		cursorPosition = currentGlyphArray.length;
		redraw();

	}	
	if(localCommand == 0024){//from action to symbol
		if(currentAddress < 01000 && currentAddress > 0){
			currentAddress += 01000;
			currentGlyph = currentTable[currentAddress];

		}
		currentGlyphArray = currentGlyph.split(",");
		cursorPosition = currentGlyphArray.length;
		redraw();

	}	
	if(localCommand == 0025){//from symbol to action
		if(currentAddress > 01000 && currentAddress < 02000){
			currentAddress -= 01000;
			currentGlyph = currentTable[currentAddress];
		}
		currentGlyphArray = currentGlyph.split(",");
		cursorPosition = currentGlyphArray.length;
		redraw();
	}
	
	if(localCommand == 0026){//import full geometron hypercube
		var localString = document.getElementById("mainTextArea").value;
		var inputStack = localString.split("\n");
		for(var index = 0;index < inputStack.length;index++){
			var stackLine = inputStack[index].split(":");
			var localAddress = parseInt(stackLine[0],8);
			var localGlyph = stackLine[1];
			currentTable[localAddress] = localGlyph;
		}
		currentGlyph = currentTable[currentAddress];
		currentGlyphArray = currentGlyph.split(",");
		cursorPosition = currentGlyphArray.length;
		redraw();

	}
	if(localCommand == 0027){//export full geometron hypercube
		var localString = "";
		for(var index = 0;index < currentTable.length;index++){
			localString += "0" + index.toString(8) + ":" + currentTable[index] + "\n";
		}
		document.getElementById("mainTextArea").value = localString;
	}
	if(localCommand == 030){
		if(document.getElementById("glyphTableEditor").style.display != "none"){
			document.getElementById("glyphTableEditor").style.display = "none";
		}else{
			document.getElementById("glyphTableEditor").style.display = "block";
		}
	}
	if(localCommand == 031){//export SVG
		currentSVG = "";
		x0 = 200;
		y0 = 200;
		unit = 100;
		ctx = document.getElementById("invisibleCanvas").getContext("2d");
		doTheThing(0300);		
		drawGlyph(currentGlyph);

		var localString= "<svg width=\"400\" height=\"400\" viewbox = \"0 0 400 400\"  xmlns=\"http://www.w3.org/2000/svg\" style = \"border:solid;\">\n";		
		localString += currentSVG;
		localString += "</svg>";
		document.getElementById("mainTextArea").value = localString;
	}

}

</script>

<style>
html {
	height: 100%;
	background: black;
}

.atom{
	width: auto;
	height: auto;
	border-style: solid;
	border-width: 6px;
	border-color: purple;
	border-radius: 25px;
	padding: 10px 10px 10px 10px;
	margin: 10px 10px 10px 10px;
	background: white;	
	font-size: 16px;
	font-family: "Century Schoolbook";
	text-align: left;
	float:left;
}
#spellDiv{
	width: 600px;
	height: auto;
	border-style: solid;
	border-width: 6px;
	border-color: purple;
	border-radius: 25px;
	padding: 15px 15px 15px 15px;
	margin: 10px 10px 10px 10px;
	background: white;	
	float:left;
	overflow: scroll;
}

#plotCanvas{
	border-style: solid;
	border-width: 1px;
	border-color: black;
	border-radius: 5px;

}
.glyphButtons{
    border-style: solid;
    border-width: 0px;
    border-color: black;
    background: white;	
}
.glyphButtons:hover{
    background: gray;	

}
.glyphButtons:active{
    background: yellow;	
}
#glyphTableEditor{
	background: gray;	
}

td{
	padding: 15px 15px 15px 15px;
	margin: 10px 10px 10px 10px;

}
</style>
</center>
</body>
</html>	

Step 2: Add "word" Command to Command Table

Add the following byte code command to the command window as shown: "0365". Do not forget the leading zero, that is needed to make sure this is in octal (base 8). After you hit "enter" the button for "word" should appear as shown, a "W" with a missing middle. This symbol glyph lives at 01365 and if you're feeling adventurous you could go back to the tutorial on editing the shape table and make a better symbol than the one I have here. When you have that button in your command table, go to the next step.

Step 3: Make a Word

Now hit "-" a couple times to shrink your cursor, then hit the "word" button and you should see the word "word" appear in a Futura font. The choice of font is made in the code, which you can change if you know JavaScript(more on that in a future tutorial). The word "word" is also selected in the initialization code using the global string variable currentWord(ignore this statement if you're not into code things).

Step 4: Edit Word Table

Geometron is two things: a geometric language and a way of organizing information. In the system of information organization, the range from 0600 to 0677 are reserved for words. These words are all in printable 7 bit ASCII, a set of numbers/codes from 040(space) to 0176(tilde). I have also included an ASCII table here generated with another Geometron Hypercube instance which will be documented soon. Note that there are also some action glyphs in this table, before 040. This is because all those kinds of actions, like "move to next glyph", are in what's called the "Root Magic Table" in the Geometron Hypercube, which is the various actions in the range from 0000 to 037 of the overall address space. This is an extension of ASCII that is in the spirit of the original standard in which this part of the table included actions like ringing the bell of a machine or terminating transmission on a teletype. As in the original ASCII, octal 010 or 8 decimal(and hex) is delete, which lives in the Root Magic table as it should. This may not make much sense yet, but I'm putting it in for completeness.

Anyway, what you want to do in this step is edit the word table as shown here: use the selector to select the addresses 0600 and 0601 one by one, then type words into the word field, hit enter and go to the next one. You can go back and forth and select different words to see how the word editing works.

Step 5: Print Words

Now manually add the byte commands "0600" and "0601" before a pair of word writing actions. Or you can start over with a clean slate and just enter the following glyph code:

0336,0336,0600,0365,0601,0365

if you do this you should see the first two words in your word table stacked directly on top of each other as shown.

Step 6: Edit Word Placement

Now, using the methods for editing a glyph from the second Geometron tutorial, add some movements and possibly "-" or "+" between the words. Note that if you try to rotate, the words are still all oriented the same way. This is a limitation of this type of text, which we'll break out of using internal Geometron code next.

Step 7: Use Internal Geometron Text Code

Now, as promised, we'll make text a second way. Type some text in whatever the current word address is, and hit return. You should see some byte code appear to the right of what you typed that is a sequence of numbers in the range from 040-0176. Put your cursor in that window and use control-a(pc) or command-a(mac) to highlight then copy all these byte codes. Then paste them in the window where the main byte code actions go as shown and you'll see some letters using the internal Geometron font. I made this font, and I know very little about typography and did this in a hurry, it's just a proof of principle. But it shows that Geometron can be totally self-contained and describe letters using only its simple geometric functions. This will be important later for physical implementations, where Geometron commands will translate into machine motions. Note that this whole font exists in the html file you have, with no external resources used at all.

Step 8: Mess With Rotations Etc.

Edit the glyph and try using weird angles, halving angles, restoring symmetry to fourfold, and seeing what you can do with interesting text patterns. If you want a small size change, you can combine two, for instance you can set scale to square root of three, shrink, then to the Golden Ratio and expand, to get a pretty small change.

Comments

About This Instructable

81views

1favorite

Bio: I'm an applied physicist by training(phd Yale 2006, BA Berkeley 1998, math and physics), and have done physics research in the federal government ... More »
More by lafelabs:Bezier Paths in GeometronUsing Words in GeometronGeometron Shape Table Edit
Add instructable to: