├── .gitignore ├── utils ├── placeholder │ ├── fonts │ │ ├── src │ │ │ ├── 30.pbm │ │ │ ├── 31.pbm │ │ │ ├── 32.pbm │ │ │ ├── 33.pbm │ │ │ ├── 34.pbm │ │ │ ├── 35.pbm │ │ │ ├── 36.pbm │ │ │ ├── 37.pbm │ │ │ ├── 38.pbm │ │ │ ├── 39.pbm │ │ │ ├── 41.pbm │ │ │ ├── 42.pbm │ │ │ ├── 43.pbm │ │ │ ├── 44.pbm │ │ │ ├── 45.pbm │ │ │ └── 46.pbm │ │ ├── 5x7hex.pbm │ │ ├── 10x10hex.pbm │ │ ├── README.md │ │ └── createFont.sh │ ├── README.md │ └── placeholder.php ├── hex2pbm │ ├── README.md │ └── hex2pbm.php ├── fontscale-wrapper │ ├── README.md │ ├── fontscale-wrapper.php │ └── svg2pbm.php ├── montage │ ├── README.md │ └── montage-sort.php ├── composer.json ├── preview │ └── previewgen.php ├── pbm2bdf │ └── pbm2bdf.php └── composer.lock ├── preview.png ├── .travis.yml ├── README.md ├── definitions ├── thermalsans17.csv └── thermalsans24.csv ├── configure └── LICENSE /.gitignore: -------------------------------------------------------------------------------- 1 | utils/vendor/ 2 | build/ outp/ 3 | -------------------------------------------------------------------------------- /utils/placeholder/fonts/src/30.pbm: -------------------------------------------------------------------------------- 1 | P4 2 | 8 16 3 | $BFJRbB$ -------------------------------------------------------------------------------- /utils/placeholder/fonts/src/31.pbm: -------------------------------------------------------------------------------- 1 | P4 2 | 8 16 3 | (> -------------------------------------------------------------------------------- /utils/placeholder/fonts/src/32.pbm: -------------------------------------------------------------------------------- 1 | P4 2 | 8 16 3 | 8 -------------------------------------------------------------------------------- /utils/placeholder/fonts/src/41.pbm: -------------------------------------------------------------------------------- 1 | P4 2 | 8 16 3 | $$BB~BBBB -------------------------------------------------------------------------------- /utils/placeholder/fonts/src/42.pbm: -------------------------------------------------------------------------------- 1 | P4 2 | 8 16 3 | |BBB|BBBB| -------------------------------------------------------------------------------- /utils/placeholder/fonts/src/43.pbm: -------------------------------------------------------------------------------- 1 | P4 2 | 8 16 3 | with the GNU Font Embedding Exception.\" 44 | FONT_VERSION \"10.0.07\" 45 | FONT_TYPE \"Bitmap\" 46 | FOUNDRY \"GNU\" 47 | FAMILY_NAME \"Thermal Sans Mono\" 48 | WEIGHT_NAME \"Medium\" 49 | SLANT \"R\" 50 | SETWIDTH_NAME \"Normal\" 51 | ADD_STYLE_NAME \"Sans Serif\" 52 | PIXEL_SIZE ${height} 53 | POINT_SIZE ${height}0 54 | RESOLUTION_X 72 55 | RESOLUTION_Y 72 56 | SPACING \"C\" 57 | AVERAGE_WIDTH ${width}0 58 | CHARSET_REGISTRY \"ISO10646\" 59 | CHARSET_ENCODING \"1\" 60 | UNDERLINE_POSITION -2 61 | UNDERLINE_THICKNESS 1 62 | CAP_HEIGHT $height 63 | X_HEIGHT $height 64 | FONT_ASCENT $height 65 | FONT_DESCENT 0 66 | DEFAULT_CHAR 65533 67 | ENDPROPERTIES 68 | CHARS $glyphCount\n"); 69 | 70 | // Iterate all code points we expect, in batches of 256 71 | for($i = 0 ; $i <= 65535; $i++ ) { 72 | $thisCodePoint = str_pad(strtoupper(dechex($i)), 4, "0", STR_PAD_LEFT); 73 | if(!isset($codePoint[$thisCodePoint])) { 74 | continue; 75 | } 76 | // Print each glyph 77 | $glyphBitmapFile = $codePoint[$thisCodePoint]; 78 | $img = Image::fromFile($glyphBitmapFile); 79 | echo "U+$thisCodePoint:\n"; 80 | echo $img -> toString(); 81 | // Extract binary data in hex-encoded format. 82 | $glyphWidth = $img -> getWidth(); 83 | $glyphHeight = $img -> getHeight(); 84 | $glyphDataBin = $img -> getRasterData(); 85 | $bytesPerLine = intdiv($glyphWidth + 7, 8); 86 | $glyphDataHex = strtoupper(bin2hex($glyphDataBin)); 87 | $glyphDataHexLines = implode("\n", str_split($glyphDataHex, $bytesPerLine * 2)); 88 | 89 | fwrite($f, "STARTCHAR U+$thisCodePoint 90 | ENCODING $i 91 | SWIDTH 500 0 92 | DWIDTH $width 0 93 | BBX $glyphWidth $glyphHeight 0 0 94 | BITMAP 95 | $glyphDataHexLines 96 | ENDCHAR\n"); 97 | } 98 | 99 | // End font 100 | fwrite($f, "ENDFONT\n"); 101 | fclose($f); 102 | 103 | -------------------------------------------------------------------------------- /utils/composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "bb459dad44f545eaeac08c4dce69281b", 8 | "packages": [ 9 | { 10 | "name": "mike42/gfx-php", 11 | "version": "dev-master", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/mike42/gfx-php.git", 15 | "reference": "3ac1be905612f3e2f05f32de2aca154e52f69bca" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/mike42/gfx-php/zipball/3ac1be905612f3e2f05f32de2aca154e52f69bca", 20 | "reference": "3ac1be905612f3e2f05f32de2aca154e52f69bca", 21 | "shasum": "" 22 | }, 23 | "require-dev": { 24 | "phpunit/phpunit": "^6.5", 25 | "squizlabs/php_codesniffer": "^3.2" 26 | }, 27 | "type": "library", 28 | "autoload": { 29 | "psr-4": { 30 | "Mike42\\": "src/Mike42" 31 | } 32 | }, 33 | "notification-url": "https://packagist.org/downloads/", 34 | "license": [ 35 | "LGPL-2.1-or-later" 36 | ], 37 | "authors": [ 38 | { 39 | "name": "Michael Billington", 40 | "email": "michael.billington@gmail.com" 41 | } 42 | ], 43 | "description": "The pure PHP graphics library", 44 | "homepage": "https://github.com/mike42/gfx-php", 45 | "time": "2018-06-10T13:23:10+00:00" 46 | } 47 | ], 48 | "packages-dev": [ 49 | { 50 | "name": "squizlabs/php_codesniffer", 51 | "version": "3.3.0", 52 | "source": { 53 | "type": "git", 54 | "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", 55 | "reference": "d86873af43b4aa9d1f39a3601cc0cfcf02b25266" 56 | }, 57 | "dist": { 58 | "type": "zip", 59 | "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/d86873af43b4aa9d1f39a3601cc0cfcf02b25266", 60 | "reference": "d86873af43b4aa9d1f39a3601cc0cfcf02b25266", 61 | "shasum": "" 62 | }, 63 | "require": { 64 | "ext-simplexml": "*", 65 | "ext-tokenizer": "*", 66 | "ext-xmlwriter": "*", 67 | "php": ">=5.4.0" 68 | }, 69 | "require-dev": { 70 | "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" 71 | }, 72 | "bin": [ 73 | "bin/phpcs", 74 | "bin/phpcbf" 75 | ], 76 | "type": "library", 77 | "extra": { 78 | "branch-alias": { 79 | "dev-master": "3.x-dev" 80 | } 81 | }, 82 | "notification-url": "https://packagist.org/downloads/", 83 | "license": [ 84 | "BSD-3-Clause" 85 | ], 86 | "authors": [ 87 | { 88 | "name": "Greg Sherwood", 89 | "role": "lead" 90 | } 91 | ], 92 | "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", 93 | "homepage": "http://www.squizlabs.com/php-codesniffer", 94 | "keywords": [ 95 | "phpcs", 96 | "standards" 97 | ], 98 | "time": "2018-06-06T23:58:19+00:00" 99 | } 100 | ], 101 | "aliases": [], 102 | "minimum-stability": "stable", 103 | "stability-flags": { 104 | "mike42/gfx-php": 20 105 | }, 106 | "prefer-stable": false, 107 | "prefer-lowest": false, 108 | "platform": [], 109 | "platform-dev": [] 110 | } 111 | -------------------------------------------------------------------------------- /definitions/thermalsans17.csv: -------------------------------------------------------------------------------- 1 | codePoint,method,traceArgs,rasterSrcArgs,rasterDestArgs 2 | 0000,placeholder,,, 3 | 0001,placeholder,,, 4 | 0002,placeholder,,, 5 | 0003,placeholder,,, 6 | 0004,placeholder,,, 7 | 0005,placeholder,,, 8 | 0006,placeholder,,, 9 | 0007,placeholder,,, 10 | 0008,placeholder,,, 11 | 0009,placeholder,,, 12 | 000A,placeholder,,, 13 | 000B,placeholder,,, 14 | 000C,placeholder,,, 15 | 000D,placeholder,,, 16 | 000E,placeholder,,, 17 | 000F,placeholder,,, 18 | 0010,placeholder,,, 19 | 0011,placeholder,,, 20 | 0012,placeholder,,, 21 | 0013,placeholder,,, 22 | 0014,placeholder,,, 23 | 0015,placeholder,,, 24 | 0016,placeholder,,, 25 | 0017,placeholder,,, 26 | 0018,placeholder,,, 27 | 0019,placeholder,,, 28 | 001A,placeholder,,, 29 | 001B,placeholder,,, 30 | 001C,placeholder,,, 31 | 001D,placeholder,,, 32 | 001E,placeholder,,, 33 | 001F,placeholder,,, 34 | 0020,scale,,, 35 | 0021,placeholder,,, 36 | 0022,placeholder,,, 37 | 0023,placeholder,,, 38 | 0024,placeholder,,, 39 | 0025,placeholder,,, 40 | 0026,placeholder,,, 41 | 0027,placeholder,,, 42 | 0028,placeholder,,, 43 | 0029,placeholder,,, 44 | 002A,placeholder,,, 45 | 002B,placeholder,,, 46 | 002C,placeholder,,, 47 | 002D,placeholder,,, 48 | 002E,placeholder,,, 49 | 002F,placeholder,,, 50 | 0030,trace,,detect,6x17+0+0 51 | 0031,trace,,detect,6x17+0+0 52 | 0032,trace,,detect,6x17+0+0 53 | 0033,trace,,detect,6x17+0+0 54 | 0034,trace,,detect,6x17+0+0 55 | 0035,trace,,detect,6x17+0+0 56 | 0036,trace,,detect,6x17+0+0 57 | 0037,trace,,detect,6x17+0+0 58 | 0038,trace,,detect,6x17+0+0 59 | 0039,trace,,detect,6x17+0+0 60 | 003A,placeholder,,, 61 | 003B,placeholder,,, 62 | 003C,placeholder,,, 63 | 003D,placeholder,,, 64 | 003E,placeholder,,, 65 | 003F,placeholder,,, 66 | 0040,trace,,detect,6x17+0+0 67 | 0041,trace,,detect,6x17+0+0 68 | 0042,trace,,detect,6x17+0+0 69 | 0043,trace,,detect,6x17+0+0 70 | 0044,trace,,detect,6x17+0+0 71 | 0045,trace,,detect,6x17+0+0 72 | 0046,trace,,detect,6x17+0+0 73 | 0047,trace,,detect,6x17+0+0 74 | 0048,trace,,detect,6x17+0+0 75 | 0049,trace,,detect,6x17+0+0 76 | 004A,trace,,detect,6x17+0+0 77 | 004B,trace,,detect,6x17+0+0 78 | 004C,trace,,detect,6x17+0+0 79 | 004D,trace,,detect,6x17+0+0 80 | 004E,trace,,detect,6x17+0+0 81 | 004F,trace,,detect,6x17+0+0 82 | 0050,trace,,detect,6x17+0+0 83 | 0051,trace,,detect,6x17+0+0 84 | 0052,trace,,detect,6x17+0+0 85 | 0053,trace,,detect,6x17+0+0 86 | 0054,trace,,detect,6x17+0+0 87 | 0055,trace,,detect,6x17+0+0 88 | 0056,trace,,detect,6x17+0+0 89 | 0057,trace,,detect,6x17+0+0 90 | 0058,trace,,detect,6x17+0+0 91 | 0059,trace,,detect,6x17+0+0 92 | 005A,trace,,detect,6x17+0+0 93 | 005B,placeholder,,, 94 | 005C,placeholder,,, 95 | 005D,placeholder,,, 96 | 005E,placeholder,,, 97 | 005F,placeholder,,, 98 | 0060,placeholder,,, 99 | 0061,placeholder,,, 100 | 0062,placeholder,,, 101 | 0063,placeholder,,, 102 | 0064,placeholder,,, 103 | 0065,placeholder,,, 104 | 0066,placeholder,,, 105 | 0067,placeholder,,, 106 | 0068,placeholder,,, 107 | 0069,placeholder,,, 108 | 006A,placeholder,,, 109 | 006B,placeholder,,, 110 | 006C,placeholder,,, 111 | 006D,placeholder,,, 112 | 006E,placeholder,,, 113 | 006F,placeholder,,, 114 | 0070,placeholder,,, 115 | 0071,placeholder,,, 116 | 0072,placeholder,,, 117 | 0073,placeholder,,, 118 | 0074,placeholder,,, 119 | 0075,placeholder,,, 120 | 0076,placeholder,,, 121 | 0077,placeholder,,, 122 | 0078,placeholder,,, 123 | 0079,placeholder,,, 124 | 007A,placeholder,,, 125 | 007B,placeholder,,, 126 | 007C,placeholder,,, 127 | 007D,placeholder,,, 128 | 007E,placeholder,,, 129 | 007F,placeholder,,, 130 | 0080,placeholder,,, 131 | 0081,placeholder,,, 132 | 0082,placeholder,,, 133 | 0083,placeholder,,, 134 | 0084,placeholder,,, 135 | 0085,placeholder,,, 136 | 0086,placeholder,,, 137 | 0087,placeholder,,, 138 | 0088,placeholder,,, 139 | 0089,placeholder,,, 140 | 008A,placeholder,,, 141 | 008B,placeholder,,, 142 | 008C,placeholder,,, 143 | 008D,placeholder,,, 144 | 008E,placeholder,,, 145 | 008F,placeholder,,, 146 | 0090,placeholder,,, 147 | 0091,placeholder,,, 148 | 0092,placeholder,,, 149 | 0093,placeholder,,, 150 | 0094,placeholder,,, 151 | 0095,placeholder,,, 152 | 0096,placeholder,,, 153 | 0097,placeholder,,, 154 | 0098,placeholder,,, 155 | 0099,placeholder,,, 156 | 009A,placeholder,,, 157 | 009B,placeholder,,, 158 | 009C,placeholder,,, 159 | 009D,placeholder,,, 160 | 009E,placeholder,,, 161 | 009F,placeholder,,, 162 | 00A0,placeholder,,, 163 | 00A1,placeholder,,, 164 | 00A2,placeholder,,, 165 | 00A3,placeholder,,, 166 | 00A4,placeholder,,, 167 | 00A5,placeholder,,, 168 | 00A6,placeholder,,, 169 | 00A7,placeholder,,, 170 | 00A8,placeholder,,, 171 | 00A9,placeholder,,, 172 | 00AA,placeholder,,, 173 | 00AB,placeholder,,, 174 | 00AC,placeholder,,, 175 | 00AD,placeholder,,, 176 | 00AE,placeholder,,, 177 | 00AF,placeholder,,, 178 | 00B0,placeholder,,, 179 | 00B1,placeholder,,, 180 | 00B2,placeholder,,, 181 | 00B3,placeholder,,, 182 | 00B4,placeholder,,, 183 | 00B5,placeholder,,, 184 | 00B6,placeholder,,, 185 | 00B7,placeholder,,, 186 | 00B8,placeholder,,, 187 | 00B9,placeholder,,, 188 | 00BA,placeholder,,, 189 | 00BB,placeholder,,, 190 | 00BC,placeholder,,, 191 | 00BD,placeholder,,, 192 | 00BE,placeholder,,, 193 | 00BF,placeholder,,, 194 | 00C0,placeholder,,, 195 | 00C1,placeholder,,, 196 | 00C2,placeholder,,, 197 | 00C3,placeholder,,, 198 | 00C4,placeholder,,, 199 | 00C5,placeholder,,, 200 | 00C6,placeholder,,, 201 | 00C7,placeholder,,, 202 | 00C8,placeholder,,, 203 | 00C9,placeholder,,, 204 | 00CA,placeholder,,, 205 | 00CB,placeholder,,, 206 | 00CC,placeholder,,, 207 | 00CD,placeholder,,, 208 | 00CE,placeholder,,, 209 | 00CF,placeholder,,, 210 | 00D0,placeholder,,, 211 | 00D1,placeholder,,, 212 | 00D2,placeholder,,, 213 | 00D3,placeholder,,, 214 | 00D4,placeholder,,, 215 | 00D5,placeholder,,, 216 | 00D6,placeholder,,, 217 | 00D7,placeholder,,, 218 | 00D8,placeholder,,, 219 | 00D9,placeholder,,, 220 | 00DA,placeholder,,, 221 | 00DB,placeholder,,, 222 | 00DC,placeholder,,, 223 | 00DD,placeholder,,, 224 | 00DE,placeholder,,, 225 | 00DF,placeholder,,, 226 | 00E0,placeholder,,, 227 | 00E1,placeholder,,, 228 | 00E2,placeholder,,, 229 | 00E3,placeholder,,, 230 | 00E4,placeholder,,, 231 | 00E5,placeholder,,, 232 | 00E6,placeholder,,, 233 | 00E7,placeholder,,, 234 | 00E8,placeholder,,, 235 | 00E9,placeholder,,, 236 | 00EA,placeholder,,, 237 | 00EB,placeholder,,, 238 | 00EC,placeholder,,, 239 | 00ED,placeholder,,, 240 | 00EE,placeholder,,, 241 | 00EF,placeholder,,, 242 | 00F0,placeholder,,, 243 | 00F1,placeholder,,, 244 | 00F2,placeholder,,, 245 | 00F3,placeholder,,, 246 | 00F4,placeholder,,, 247 | 00F5,placeholder,,, 248 | 00F6,placeholder,,, 249 | 00F7,placeholder,,, 250 | 00F8,placeholder,,, 251 | 00F9,placeholder,,, 252 | 00FA,placeholder,,, 253 | 00FB,placeholder,,, 254 | 00FC,placeholder,,, 255 | 00FD,placeholder,,, 256 | 00FE,placeholder,,, 257 | 00FF,placeholder,,, 258 | -------------------------------------------------------------------------------- /configure: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | import csv 3 | 4 | BASE_MAKEFILE = """ 5 | .SECONDARY: 6 | """ 7 | BASE_RULES = """ 8 | SMALL_GLYPHS=$(PLACEHOLDERS_SMALL) $(SCALED_SMALL) $(TRACE_SMALL) 9 | 10 | LARGE_GLPYHS=$(PLACEHOLDERS_LARGE) $(SCALED_LARGE) $(TRACE_LARGE) 11 | 12 | default: outp/thermal-sans-mono-17/thermal-sans-mono-17.png \\ 13 | outp/thermal-sans-mono-24/thermal-sans-mono-24.png \\ 14 | outp/thermal-sans-mono-17/thermal-sans-mono-17.pcf \\ 15 | outp/thermal-sans-mono-24/thermal-sans-mono-24.pcf 16 | 17 | # Generate montages of glyphs 18 | outp/thermal-sans-mono-17/thermal-sans-mono-17.png: $(SMALL_GLYPHS) 19 | mkdir -p $(@D) 20 | mkdir -p build/montage/17px 21 | @echo $^ > build/montage/17px/inputs-unsorted.txt 22 | php ./utils/montage/montage-sort.php \ 23 | build/montage/17px/inputs-unsorted.txt \ 24 | build/montage/17px/montage-command-list.txt 18x17+0+0 25 | parallel < build/montage/17px/montage-command-list.txt 26 | convert build/montage/17px/**.pbm -append $@ 27 | 28 | outp/thermal-sans-mono-24/thermal-sans-mono-24.png: $(LARGE_GLPYHS) 29 | mkdir -p $(@D) 30 | mkdir -p build/montage/24px 31 | @echo $^ > build/montage/24px/inputs-unsorted.txt 32 | php ./utils/montage/montage-sort.php \ 33 | build/montage/24px/inputs-unsorted.txt \ 34 | build/montage/24px/montage-command-list.txt 24x24+0+0 35 | parallel < build/montage/24px/montage-command-list.txt 36 | convert build/montage/24px/**.pbm -append $@ 37 | 38 | outp/thermal-sans-mono-24/thermal-sans-mono-24.bdf: $(LARGE_GLPYHS) 39 | mkdir -p $(@D) 40 | mkdir -p build/bdf/24px 41 | @echo $^ > build/bdf/24px/inputs-unsorted.txt 42 | php ./utils/pbm2bdf/pbm2bdf.php \ 43 | build/bdf/24px/inputs-unsorted.txt 24 $@ 44 | 45 | outp/thermal-sans-mono-17/thermal-sans-mono-17.bdf: $(SMALL_GLYPHS) 46 | mkdir -p $(@D) 47 | mkdir -p build/bdf/17px 48 | @echo $^ > build/bdf/17px/inputs-unsorted.txt 49 | php ./utils/pbm2bdf/pbm2bdf.php \ 50 | build/bdf/17px/inputs-unsorted.txt 17 $@ 51 | 52 | # Wrap scaling program 53 | build/trace/24px/%.bold.pbm: build/scale/16px/%.pbm definitions/thermalsans24.csv 54 | mkdir -p $(@D) 55 | if [ "$$(identify -format '%w' $<)" -eq "8" ]; then \ 56 | php ./utils/fontscale-wrapper/fontscale-wrapper.php $(basename $(@F)) $@ $^ $(UNIFONT_PATH) 12x24 20; \ 57 | else \ 58 | php ./utils/fontscale-wrapper/fontscale-wrapper.php $(basename $(@F)) $@ $^ $(UNIFONT_PATH) 24x24 20; \ 59 | fi 60 | 61 | build/trace/17px/%.bold.pbm: build/scale/16px/%.pbm definitions/thermalsans17.csv 62 | mkdir -p $(@D) 63 | if [ "$$(identify -format '%w' $<)" -eq "8" ]; then \ 64 | php ./utils/fontscale-wrapper/fontscale-wrapper.php $(basename $(@F)) $@ $^ $(UNIFONT_PATH) 9x17 20; \ 65 | else \ 66 | php ./utils/fontscale-wrapper/fontscale-wrapper.php $(basename $(@F)) $@ $^ $(UNIFONT_PATH) 18x17 20; \ 67 | fi 68 | 69 | # Generate raw scaled glyphs 70 | build/scale/24px/%.pbm: build/scale/16px/%.pbm 71 | mkdir -p $(@D) 72 | if [ "$$(identify -format '%w' $<)" -eq "8" ]; then \ 73 | convert $< -resize 12x24 $@; \ 74 | else \ 75 | convert $< -resize 24x24 $@; \ 76 | fi 77 | 78 | build/scale/17px/%.pbm: build/scale/16px/%.pbm 79 | mkdir -p $(@D) 80 | if [ "$$(identify -format '%w' $<)" -eq "8" ]; then \ 81 | convert $< -resize 9x17 $@; \ 82 | else \ 83 | convert $< -resize 18x17 $@; \ 84 | fi 85 | 86 | # Actual Unifont extraction 87 | build/scale/16px/%.pbm: 88 | mkdir -p $(@D) 89 | php ./utils/hex2pbm/hex2pbm.php $(UNIFONT_PATH) $(basename $(@F)) $@ 90 | 91 | # Generate placeholder glpyhs 92 | build/placeholder/24px/%.pbm: 93 | mkdir -p $(@D) 94 | php ./utils/placeholder/placeholder.php $(basename $(@F)) large $@ 95 | 96 | build/placeholder/17px/%.pbm: 97 | mkdir -p $(@D) 98 | php ./utils/placeholder/placeholder.php $(basename $(@F)) small $@ 99 | 100 | # Conversion 101 | %.pcf: %.bdf 102 | bdftopcf -o $@ $< 103 | 104 | #%.gz: % 105 | # gzip $< > $@ 106 | 107 | clean: 108 | rm -Rf build/ outp/ 109 | """ 110 | 111 | placeholderSmallTargets = [] 112 | placeholderLargeTargets = [] 113 | scaleSmallTargets = [] 114 | scaleLargeTargets = [] 115 | traceSmallTargets = [] 116 | traceLargeTargets = [] 117 | 118 | def dirInfo(prefix, codePoint, suffix): 119 | prefix.append(codePoint[0]) 120 | prefix.append(codePoint[1]) 121 | dirname = "/".join(prefix) 122 | fn = codePoint + suffix 123 | return { 124 | 'dirname': dirname, 125 | 'path': dirname + "/" + fn 126 | } 127 | 128 | def registerPlaceholder(height, codePoint, method, args): 129 | path = dirInfo(["build", "placeholder", height + "px"], codePoint, ".pbm") 130 | if(height == '17'): 131 | placeholderSmallTargets.append(path['path']) 132 | elif height == '24': 133 | placeholderLargeTargets.append(path['path']) 134 | 135 | def registerScale(height, codePoint, method, args): 136 | path = dirInfo(["build", "scale", height + "px"], codePoint, ".pbm") 137 | if(height == '17'): 138 | scaleSmallTargets.append(path['path']) 139 | elif height == '24': 140 | scaleLargeTargets.append(path['path']) 141 | 142 | def registerTrace(height, codePoint, method, args): 143 | if(height == '17'): 144 | # TODO allow use of bold or regular based on individual glyph. 145 | path = dirInfo(["build", "trace", height + "px"], codePoint, ".bold.pbm") 146 | traceSmallTargets.append(path['path']) 147 | elif height == '24': 148 | path = dirInfo(["build", "trace", height + "px"], codePoint, ".bold.pbm") 149 | traceLargeTargets.append(path['path']) 150 | 151 | def registerGlyph(height, codePoint, method, args): 152 | if(method == "placeholder"): 153 | registerPlaceholder(height, codePoint, method, args) 154 | elif(method == "scale"): 155 | registerScale(height, codePoint, method, args) 156 | elif(method == "trace"): 157 | registerTrace(height, codePoint, method, args) 158 | else: 159 | raise Exception("Unknown method '" + method + "' for codePoint " + codePoint + " at height " + height + "px") 160 | 161 | print("Reading glyph definitions ..") 162 | for height in ['17', '24']: 163 | fn = 'definitions/thermalsans' + height + '.csv' 164 | print(" " + fn) 165 | with open(fn, newline='') as csvfile: 166 | rdr = csv.DictReader(csvfile, delimiter=',', quotechar='\"') 167 | for row in rdr: 168 | registerGlyph(height, row['codePoint'], row['method'], { 169 | 'trace': row['traceArgs'], 170 | 'rasterSrc': row['rasterSrcArgs'], 171 | 'rasterDest': row['rasterDestArgs'] 172 | }); 173 | print("Outputting Makefile ..") 174 | 175 | with open('Makefile', 'w') as makefile: 176 | makefile.write(BASE_MAKEFILE) 177 | makefile.write("UNIFONT_PATH=/usr/share/unifont/unifont.hex\n") 178 | makefile.write("PLACEHOLDERS_SMALL=" + " ".join(placeholderSmallTargets) + "\n") 179 | makefile.write("PLACEHOLDERS_LARGE=" + " ".join(placeholderLargeTargets) + "\n") 180 | makefile.write("SCALED_SMALL=" + " ".join(scaleSmallTargets) + "\n") 181 | makefile.write("SCALED_LARGE=" + " ".join(scaleLargeTargets) + "\n") 182 | makefile.write("TRACE_SMALL=" + " ".join(traceSmallTargets) + "\n") 183 | makefile.write("TRACE_LARGE=" + " ".join(traceLargeTargets) + "\n") 184 | makefile.write(BASE_RULES) 185 | -------------------------------------------------------------------------------- /utils/fontscale-wrapper/svg2pbm.php: -------------------------------------------------------------------------------- 1 | x = $x; 9 | $this -> y = $y; 10 | } 11 | 12 | public function getX() { 13 | return $this -> x; 14 | } 15 | 16 | public function getY() { 17 | return $this -> y; 18 | } 19 | 20 | public function map(Geometry $src, Geometry $dst) { 21 | $newX = $this -> transformVal($this -> x - $src -> getOffsetX(), $src -> getWidth(), $dst -> getWidth()) + $dst -> getOffsetX(); 22 | $newY = $this -> transformVal($this -> y - $src -> getOffsetY(), $src -> getHeight(), $dst -> getHeight()) + $dst -> getOffsetY(); 23 | return new Point($newX, $newY); 24 | } 25 | 26 | private function transformVal(float $val, float $oldSize, float $newSize) { 27 | // Linear interpolation: 0 => 0, (oldWidth - 1) => (newWidth - 1). 28 | return (float)($val * ($newSize - 1) / ($oldSize - 1)); 29 | } 30 | 31 | public function toString() { 32 | $fmt = "% 6.2f"; 33 | return "(" . sprintf($fmt, $this -> x) . ", " . sprintf($fmt, $this -> y) . ")"; 34 | } 35 | } 36 | 37 | class Geometry { 38 | protected $width; 39 | protected $height; 40 | protected $offsetX; 41 | protected $offsetY; 42 | 43 | public function __construct(float $width, float $height, float $offsetX = null, float $offsetY = null) { 44 | $this -> width = $width; 45 | $this -> height = $height; 46 | $this -> offsetX = $offsetX === null ? 0 : $offsetX; 47 | $this -> offsetY = $offsetY === null ? 0 : $offsetY; 48 | } 49 | 50 | public function getWidth() { 51 | return $this -> width; 52 | } 53 | 54 | public function getHeight() { 55 | return $this -> height; 56 | } 57 | 58 | public function getOffsetX() { 59 | return $this -> offsetX; 60 | } 61 | 62 | public function getOffsetY() { 63 | return $this -> offsetY; 64 | } 65 | 66 | public static function fromString($str) { 67 | $parts = preg_split("/[x\\+]/", $str); 68 | $width = (float)$parts[0]; 69 | $height = (float)$parts[1]; 70 | if(count($parts) > 2) { 71 | $offsetX = (float)$parts[2]; 72 | $offsetY = (float)$parts[3]; 73 | } else { 74 | $offsetX = (float)0; 75 | $offsetY = (float)0; 76 | } 77 | return new Geometry($width, $height, $offsetX, $offsetY); 78 | } 79 | 80 | public function mul(float $val) { 81 | $this -> width *= $val; 82 | $this -> height *= $val; 83 | $this -> offsetX *= $val; 84 | $this -> offsetY *= $val; 85 | } 86 | 87 | public function toString() { 88 | return $this -> width . "x" . $this -> height . "+" . $this -> offsetX . "+" . $this -> offsetY; 89 | } 90 | } 91 | 92 | /* 93 | * Grep an SVG that was outputted for debugging purposes, then render a bold 94 | * version of the glyph (which fontscale-utils is not very good at). 95 | */ 96 | if(count($argv) != 9) { 97 | die("Usage: " . $argv[0] . " in.svg stroke-width out-large.png out-large.pbm out.pbm dimensions inpGeo outpGeo\n"); 98 | } 99 | $in = $argv[1]; 100 | $strokeWidth = (int)$argv[2]; 101 | $outLargePng = $argv[3]; 102 | $outLargePbm = $argv[4]; 103 | $outSmallPbm = $argv[5]; 104 | $dimensions = $argv[6]; 105 | $inpGeo = $argv[7]; 106 | $outpGeo = $argv[8]; 107 | 108 | // Extract lines, dimensions 109 | $inpWidth = `xmllint $in --xpath 'string(/*/@width)'`; 110 | $inpHeight = `xmllint $in --xpath 'string(/*/@height)'`; 111 | $data = `xmllint $in -format | grep line | cut -d' ' -f4-7 | tr -d '"'`; 112 | $linedefs = explode("\n", trim($data)); 113 | $lines = []; 114 | foreach($linedefs as $linedef) { 115 | $linedefParts = explode(" ", $linedef); 116 | $line = []; 117 | foreach($linedefParts as $part) { 118 | $partPart = explode("=", $part); 119 | $key = $partPart[0]; 120 | $val = $partPart[1]; 121 | $line[$key] = (float)$val; 122 | } 123 | $lines[] = $line; 124 | } 125 | 126 | // Determine basic geometry we are aiming for. Note that the debug SVG is scaled up 10x. 127 | $inputGeometry = new Geometry((float)$inpWidth, (float)$inpHeight); 128 | $outputGeometry = Geometry::fromString($dimensions); 129 | $outputGeometry -> mul((float)10); 130 | $width = $outputGeometry -> getWidth(); 131 | $height = $outputGeometry -> getHeight(); 132 | // SOURCE region geometry 133 | if($inpGeo == "detect" && count($lines) > 0) { 134 | // Source geometry based on glyph size. There is some strange maths here to 135 | // account for the lines in the SVG being in the middle of each 10px box. 136 | $maxX = (float)-9999; 137 | $maxY = (float)-9999; 138 | $minX = (float)99999; 139 | $minY = (float)99999; 140 | foreach($lines as $line) { 141 | $maxX = max($maxX, $line['x1'], $line['x2']); 142 | $minX = min($minX, $line['x1'], $line['x2']); 143 | $maxY = max($maxY, $line['y1'], $line['y2']); 144 | $minY = min($minY, $line['y1'], $line['y2']); 145 | } 146 | $internalWidth = ($maxX - $minX) + 10; 147 | $internalHeight = ($maxY - $minY) + 10; 148 | $srcGeometry = new Geometry((float)$internalWidth, (float)$internalHeight, (float)($minX - 5), (float)($minY - 5)); 149 | } else if($inpGeo != "full") { 150 | // Custom source geometry 151 | $srcGeometry = Geometry::fromString($inpGeo); 152 | $srcGeometry -> mul(10); 153 | } else { 154 | // Full input as source geometry 155 | $srcGeometry = $inputGeometry; 156 | } 157 | // DEST region geometry 158 | if($outpGeo == "full") { 159 | $destGeometry = $outputGeometry; 160 | } else { 161 | $destGeometry = Geometry::fromString($outpGeo); 162 | $destGeometry -> mul(10); 163 | } 164 | // Quick status update 165 | echo "Mapping lines from canvas " . $inputGeometry -> toString() . " to canvas " . $outputGeometry -> toString() ."\n"; 166 | echo " Source region: " . $srcGeometry -> toString() . "\n"; 167 | echo " Dest region: " . $destGeometry -> toString() . "\n"; 168 | 169 | // map lines to new size 170 | $mappedLines = []; 171 | foreach($lines as $line) { 172 | $from = new Point($line['x1'], $line['y1']); 173 | $fromMapped = $from -> map($srcGeometry, $destGeometry); 174 | $to = new Point($line['x2'], $line['y2']); 175 | $toMapped = $to -> map($srcGeometry, $destGeometry); 176 | echo "Mapped line " . $from -> toString() . "->" . $to -> toString() . " to " . $fromMapped -> toString() . "->" . $toMapped -> toString() . "\n"; 177 | $mappedLines[] = [ 178 | 'x1' => $fromMapped -> getX(), 179 | 'x2' => $toMapped -> getX(), 180 | 'y1' => $fromMapped -> getY(), 181 | 'y2' => $toMapped -> getY() 182 | ]; 183 | } 184 | 185 | // Making a new raster. 186 | $img = new Imagick(); 187 | $img -> newImage($width, $height, new ImagickPixel('white')); 188 | 189 | $draw = new ImagickDraw(); 190 | $draw->setFillColor('#f00'); 191 | $draw->setStrokeColor('#000'); 192 | $draw->setStrokeWidth($strokeWidth); 193 | $hit = []; 194 | 195 | foreach($mappedLines as $line) { 196 | $draw->line($line['x1'], $line['y1'], $line['x2'], $line['y2']); 197 | if(!isset($hit[$line['x1']])) { 198 | $hit[$line['x1']] = []; 199 | } 200 | if(!isset($hit[$line['x1']][$line['y1']])) { 201 | $hit[$line['x1']][$line['y1']] = 0; 202 | } 203 | $hit[$line['x1']][$line['y1']]++; 204 | 205 | } 206 | 207 | $draw->setStrokeWidth(0); 208 | $draw->setStrokeOpacity(0); 209 | $r = $strokeWidth / 2; 210 | foreach($mappedLines as $line) { 211 | $draw->circle ($line['x1'], $line['y1'], $line['x1'], $line['y1'] + $r); 212 | $draw->circle ($line['x2'], $line['y2'], $line['x2'], $line['y2'] + $r); 213 | } 214 | 215 | //foreach($hit as $x => $xHit) { 216 | // foreach($xHit as $y => $count) { 217 | // // Can set to 1 to only draw circles on joined lines. 218 | // if($count > 0) { 219 | // $draw->circle ($x, $y + 1, $x, $y + $r); 220 | // } 221 | // } 222 | //} 223 | 224 | $img->drawImage($draw); 225 | 226 | // Picture of lines and joins for debugging.. 227 | $img->setImageFormat('png'); 228 | $img->writeImage($outLargePng); 229 | 230 | // Pure black and white, output in high res again 231 | $max = $img->getQuantumRange(); 232 | $max = $max["quantumRangeLong"]; 233 | $img->thresholdImage(0.9 * $max); 234 | $img->setImageFormat('pbm'); 235 | $img->writeImage($outLargePbm); 236 | 237 | // Scale down and return 238 | $target = (int)$height / 10; 239 | $cmd = "convert $outLargePbm $outLargePbm.ppm; convert $outLargePbm.ppm -resize x$target $outSmallPbm.ppm; convert $outSmallPbm.ppm $outSmallPbm"; 240 | system($cmd, $retval); 241 | exit($retval); 242 | 243 | -------------------------------------------------------------------------------- /utils/placeholder/placeholder.php: -------------------------------------------------------------------------------- 1 | data, 'self::invertByte'); 17 | } 18 | 19 | public function clear() { 20 | array_walk($this -> data, 'self::clearByte'); 21 | } 22 | 23 | protected static function invertByte(&$item, $key) { 24 | $item = ~ $item; 25 | } 26 | 27 | protected static function clearByte(&$item, $key) { 28 | $item = 0; 29 | } 30 | 31 | public function getWidth() { 32 | return $this -> width; 33 | } 34 | 35 | public function getHeight() { 36 | return $this -> height; 37 | } 38 | 39 | 40 | public function setPixel(int $x, int $y, $value) { 41 | if($x < 0 || $x >= $this -> width) { 42 | return; 43 | } 44 | if($y < 0 || $y >= $this -> height) { 45 | return; 46 | } 47 | $byte = $y * $this -> bytesPerRow + intdiv($x, 8); 48 | $bit = $x % 8; 49 | if($value === 0) { 50 | // Clear 51 | $this -> data[$byte] &= ~(1 << (7 - $bit)); 52 | } else { 53 | // Set 54 | $this -> data[$byte] |= (1 << (7 - $bit)); 55 | } 56 | } 57 | 58 | public function getPixel(int $x, int $y) { 59 | if($x < 0 || $x >= $this -> width) { 60 | return 0; 61 | } 62 | if($y < 0 || $y >= $this -> height) { 63 | return 0; 64 | } 65 | $byte = $y * $this -> bytesPerRow + intdiv($x, 8); 66 | $bit = $x % 8; 67 | return ($this -> data[$byte] >> (7 - $bit)) & 0x01; 68 | } 69 | 70 | protected function __construct($width, $height, array $data) { 71 | $this -> width = $width; 72 | $this -> height = $height; 73 | $this -> data = $data; 74 | $this -> bytesPerRow = intdiv($width + 7, 8); 75 | } 76 | 77 | public function write($filename) { 78 | $dimensions = $this -> width . " " . $this -> height; 79 | $data = pack("C*", ... $this -> data); 80 | $contents = "P4\n$dimensions\n$data"; 81 | file_put_contents($filename, $contents); 82 | } 83 | 84 | public static function create($width, $height) { 85 | $bytesPerRow = intdiv($width + 7, 8); 86 | $expectedBytes = $bytesPerRow * $height; 87 | $dataValues = array_values(array_fill(0, $expectedBytes, 0)); 88 | return new pbmImage($width, $height, $dataValues); 89 | } 90 | 91 | public static function fromFile($url) { 92 | $im_data = file_get_contents($url); 93 | // Read header line 94 | $im_hdr_line = substr($im_data, 0, 3); 95 | if($im_hdr_line !== "P4\n") { 96 | throw new Exception("Format not supported. Expected P4 bitmap in $url."); 97 | } 98 | // Skip comments 99 | $line_end = self::skipComments($im_data, 2); 100 | // Read image size 101 | $next_line_end = strpos($im_data, "\n", $line_end + 1); 102 | if($next_line_end === false) { 103 | throw new Exception("Unexpected end of file in $url, probably corrupt."); 104 | } 105 | $size_line = substr($im_data, $line_end + 1, ($next_line_end - $line_end) - 1); 106 | $sizes = explode(" " , $size_line); 107 | if(count($sizes) != 2 || !is_numeric($sizes[0]) || !is_numeric($sizes[1])) { 108 | throw new Exception("Image size is bogus, file probably corrupt."); 109 | } 110 | $width = $sizes[0]; 111 | $height = $sizes[1]; 112 | $line_end = $next_line_end; 113 | // Skip comments again 114 | $line_end = self::skipComments($im_data, $line_end); 115 | // Extract data.. 116 | $bytesPerRow = intdiv($width + 7, 8); 117 | $expectedBytes = $bytesPerRow * $height; 118 | $data = substr($im_data, $line_end + 1); 119 | $actualBytes = strlen($data); 120 | if($expectedBytes != $actualBytes) { 121 | throw new Exception("Expected $expectedBytes data, but got $actualBytes, file probably corrupt."); 122 | } 123 | $dataUnpacked = unpack("C*", $data); 124 | $dataValues = array_values($dataUnpacked); 125 | return new pbmImage($width, $height, $dataValues); 126 | } 127 | 128 | private static function skipComments($im_data, $line_end) { 129 | while($line_end !== false && substr($im_data, $line_end + 1, 1) == "#") { 130 | $line_end = strpos($im_data, "\n", $line_end + 1); 131 | } 132 | if($line_end === false) { 133 | throw new Exception("Unexpected end of file in $url, probably corrupt."); 134 | } 135 | return $line_end; 136 | } 137 | 138 | public function toString() { 139 | $out = ""; 140 | for($y = 0; $y < $this -> getHeight(); $y += 2) { 141 | for($x = 0; $x < $this -> getWidth(); $x++) { 142 | $upper = $this -> getPixel($x, $y) == 1; 143 | $lower = $this -> getPixel($x, $y + 1) == 1; 144 | if($upper && $lower) { 145 | $char = "█"; 146 | } else if($upper) { 147 | $char = "▀"; 148 | } else if ($lower) { 149 | $char = "▄"; 150 | } else { 151 | $char = " "; 152 | } 153 | $out .= $char; 154 | } 155 | $out .= "\n"; 156 | } 157 | return $out; 158 | } 159 | 160 | public function rect($startX, $startY, $width, $height, $filled = false, $outline = 1, $fill = 1) { 161 | $this -> horizontalLine($startY, $startX, $startX + $width - 1, $outline); 162 | $this -> horizontalLine($startY + $height - 1, $startX, $startX + $width - 1, $outline); 163 | $this -> verticalLine($startX, $startY, $startY + $height - 1, $outline); 164 | $this -> verticalLine($startX + $width - 1, $startY, $startY + $height - 1, $outline); 165 | if($filled) { 166 | // Fill center of the rectangle 167 | for($y = $startY + 1; $y < $startY + $height - 1; $y++) { 168 | for($x = $startX + 1; $x < $startX + $width - 1; $x++) { 169 | $this -> setPixel($x, $y, $fill); 170 | } 171 | } 172 | } 173 | } 174 | 175 | protected function horizontalLine($y, $startX, $endX, $outline) { 176 | for($x = $startX; $x <= $endX; $x++) { 177 | $this -> setPixel($x, $y, $outline); 178 | } 179 | } 180 | 181 | protected function verticalLine($x, $startY, $endY, $outline) { 182 | for($y = $startY; $y <= $endY; $y++) { 183 | $this -> setPixel($x, $y, $outline); 184 | } 185 | } 186 | 187 | public function subImage($startX, $startY, $width, $height) { 188 | $ret = self::create($width, $height); 189 | $ret -> compose($this, $startX, $startY, 0, 0, $width, $height); 190 | return $ret; 191 | } 192 | 193 | public function compose(pbmImage $source, $startX, $startY, $destStartX, $destStartY, $width, $height) { 194 | for($y = 0; $y < $height; $y++) { 195 | $srcY = $y + $startY; 196 | $destY = $y + $destStartY; 197 | for($x = 0; $x < $width; $x++) { 198 | $srcX = $x + $startX; 199 | $destX = $x + $destStartX; 200 | $this -> setPixel($destX, $destY, $source -> getPixel($srcX, $srcY)); 201 | } 202 | } 203 | } 204 | } 205 | 206 | if(count($argv) != 4) { 207 | die("Usage: " . $argv[0] . " ABCD { small | large } ABCD.pbm\n"); 208 | } 209 | 210 | // Inputs 211 | $codePoint = str_split($argv[1]); 212 | $renderLarge = $argv[2] == "large"; 213 | $outFile = $argv[3]; 214 | if(count($codePoint) != 4) { 215 | die("Code point must be 4 digits"); 216 | } 217 | 218 | 219 | if($renderLarge) { 220 | $font = pbmImage::fromFile(dirname(__FILE__). "/fonts/10x10hex.pbm"); 221 | $charWidth = 10; 222 | $charHeight = 10; 223 | } else { 224 | $font = pbmImage::fromFile(dirname(__FILE__). "/fonts/5x7hex.pbm"); 225 | $charWidth = 5; 226 | $charHeight = 7; 227 | } 228 | 229 | // Calculate chars 230 | $chars = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"]; 231 | $subImages = []; 232 | for($i = 0; $i < count($codePoint); $i++) { 233 | $id = array_search($codePoint[$i], $chars); 234 | if($id === false) { 235 | die("Don't know how to encode " . $codePoint[$i]); 236 | } 237 | $subImages[] = $font -> subImage($id * $charWidth, 0, $charWidth, $charHeight); 238 | } 239 | 240 | // Place them all in a box 241 | if($renderLarge) { 242 | $out = pbmImage::create(24, 24); 243 | $out -> rect(0, 0, 24, 24); 244 | $out -> rect(3, 0, 18, 24, true, 0, 0); 245 | $out -> compose($subImages[0], 0, 0, 2, 1, $charWidth, $charHeight); 246 | $out -> compose($subImages[1], 0, 0, 12, 1, $charWidth, $charHeight); 247 | $out -> compose($subImages[2], 0, 0, 2, 13, $charWidth, $charHeight); 248 | $out -> compose($subImages[3], 0, 0, 12, 13, $charWidth, $charHeight); 249 | } else { 250 | $out = pbmImage::create(18, 17); 251 | $out -> rect(0, 0, 18, 17); 252 | $out -> rect(3, 0, 12, 17, true, 0, 0); 253 | $out -> compose($subImages[0], 0, 0, 4, 1, $charWidth, $charHeight); 254 | $out -> compose($subImages[1], 0, 0, 10, 1, $charWidth, $charHeight); 255 | $out -> compose($subImages[2], 0, 0, 4, 9, $charWidth, $charHeight); 256 | $out -> compose($subImages[3], 0, 0, 10, 9, $charWidth, $charHeight); 257 | } 258 | 259 | #Good for debugging ;) 260 | #echo $out -> toString(); 261 | $out -> write($outFile); 262 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Lesser General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS 281 | 282 | How to Apply These Terms to Your New Programs 283 | 284 | If you develop a new program, and you want it to be of the greatest 285 | possible use to the public, the best way to achieve this is to make it 286 | free software which everyone can redistribute and change under these terms. 287 | 288 | To do so, attach the following notices to the program. It is safest 289 | to attach them to the start of each source file to most effectively 290 | convey the exclusion of warranty; and each file should have at least 291 | the "copyright" line and a pointer to where the full notice is found. 292 | 293 | 294 | Copyright (C) 295 | 296 | This program is free software; you can redistribute it and/or modify 297 | it under the terms of the GNU General Public License as published by 298 | the Free Software Foundation; either version 2 of the License, or 299 | (at your option) any later version. 300 | 301 | This program is distributed in the hope that it will be useful, 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 304 | GNU General Public License for more details. 305 | 306 | You should have received a copy of the GNU General Public License along 307 | with this program; if not, write to the Free Software Foundation, Inc., 308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 309 | 310 | Also add information on how to contact you by electronic and paper mail. 311 | 312 | If the program is interactive, make it output a short notice like this 313 | when it starts in an interactive mode: 314 | 315 | Gnomovision version 69, Copyright (C) year name of author 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 317 | This is free software, and you are welcome to redistribute it 318 | under certain conditions; type `show c' for details. 319 | 320 | The hypothetical commands `show w' and `show c' should show the appropriate 321 | parts of the General Public License. Of course, the commands you use may 322 | be called something other than `show w' and `show c'; they could even be 323 | mouse-clicks or menu items--whatever suits your program. 324 | 325 | You should also get your employer (if you work as a programmer) or your 326 | school, if any, to sign a "copyright disclaimer" for the program, if 327 | necessary. Here is a sample; alter the names: 328 | 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 331 | 332 | , 1 April 1989 333 | Ty Coon, President of Vice 334 | 335 | This General Public License does not permit incorporating your program into 336 | proprietary programs. If your program is a subroutine library, you may 337 | consider it more useful to permit linking proprietary applications with the 338 | library. If this is what you want to do, use the GNU Lesser General 339 | Public License instead of this License. 340 | -------------------------------------------------------------------------------- /definitions/thermalsans24.csv: -------------------------------------------------------------------------------- 1 | codePoint,method,traceArgs,rasterSrcArgs,rasterDestArgs 2 | 0000,placeholder,,, 3 | 0001,placeholder,,, 4 | 0002,placeholder,,, 5 | 0003,placeholder,,, 6 | 0004,placeholder,,, 7 | 0005,placeholder,,, 8 | 0006,placeholder,,, 9 | 0007,placeholder,,, 10 | 0008,placeholder,,, 11 | 0009,placeholder,,, 12 | 000A,placeholder,,, 13 | 000B,placeholder,,, 14 | 000C,placeholder,,, 15 | 000D,placeholder,,, 16 | 000E,placeholder,,, 17 | 000F,placeholder,,, 18 | 0010,placeholder,,, 19 | 0011,placeholder,,, 20 | 0012,placeholder,,, 21 | 0013,placeholder,,, 22 | 0014,placeholder,,, 23 | 0015,placeholder,,, 24 | 0016,placeholder,,, 25 | 0017,placeholder,,, 26 | 0018,placeholder,,, 27 | 0019,placeholder,,, 28 | 001A,placeholder,,, 29 | 001B,placeholder,,, 30 | 001C,placeholder,,, 31 | 001D,placeholder,,, 32 | 001E,placeholder,,, 33 | 001F,placeholder,,, 34 | 0020,scale,,, 35 | 0021,trace,,detect,4x20+3+1 36 | 0022,trace,,detect,7x6+2+0 37 | 0023,trace,,detect,10x19+0+2 38 | 0024,trace,,detect,10x22+0+1 39 | 0025,trace,,detect,10x20+0+1 40 | 0026,trace,,detect,10x19+0+2 41 | 0027,trace,,detect,2x6+4+0 42 | 0028,trace,,detect,6x24+2+0 43 | 0029,trace,,detect,6x24+2+0 44 | 002A,trace,,detect,10x15+0+3 45 | 002B,trace,,detect,10x14+0+5 46 | 002C,trace,,detect,4x7+3+17 47 | 002D,trace,,detect,8x2+1+11 48 | 002E,trace,,detect,3x4+4+17 49 | 002F,trace,,detect,10x24+0+0 50 | 0030,trace,,detect,10x20+0+1 51 | 0031,trace,,detect,10x20+0+1 52 | 0032,trace,,detect,10x20+0+1 53 | 0033,trace,,detect,10x20+0+1 54 | 0034,trace,,detect,10x20+0+1 55 | 0035,trace,,detect,10x20+0+1 56 | 0036,trace,,detect,10x20+0+1 57 | 0037,trace,,detect,10x20+0+1 58 | 0038,trace,,detect,10x20+0+1 59 | 0039,trace,,detect,10x20+0+1 60 | 003A,trace,,detect,3x14+4+7 61 | 003B,trace,,detect,4x17+3+7 62 | 003C,trace,,detect,9x15+0+4 63 | 003D,trace,,detect,10x8+0+8 64 | 003E,trace,,detect,9x15+1+4 65 | 003F,trace,,detect,10x20+0+1 66 | 0040,trace,,detect,10x20+0+1 67 | 0041,trace,,detect,10x20+0+1 68 | 0042,trace,,detect,10x20+0+1 69 | 0043,trace,,detect,10x20+0+1 70 | 0044,trace,,detect,10x20+0+1 71 | 0045,trace,,detect,10x20+0+1 72 | 0046,trace,,detect,10x20+0+1 73 | 0047,trace,,detect,10x20+0+1 74 | 0048,trace,,detect,10x20+0+1 75 | 0049,trace,,detect,10x20+0+1 76 | 004A,trace,,detect,10x20+0+1 77 | 004B,trace,,detect,10x20+0+1 78 | 004C,trace,,detect,10x20+0+1 79 | 004D,trace,,detect,10x20+0+1 80 | 004E,trace,,detect,10x20+0+1 81 | 004F,trace,,detect,10x20+0+1 82 | 0050,trace,,detect,10x20+0+1 83 | 0051,trace,,detect,10x20+0+1 84 | 0052,trace,,detect,10x20+0+1 85 | 0053,trace,,detect,10x20+0+1 86 | 0054,trace,,detect,10x20+0+1 87 | 0055,trace,,detect,10x20+0+1 88 | 0056,trace,,detect,10x20+0+1 89 | 0057,trace,,detect,10x20+0+1 90 | 0058,trace,,detect,10x20+0+1 91 | 0059,trace,,detect,10x20+0+1 92 | 005A,trace,,detect,10x20+0+1 93 | 005B,trace,,detect,6x23+3+0 94 | 005C,trace,,detect,10x24+0+0 95 | 005D,trace,,detect,6x23+1+0 96 | 005E,trace,,detect,9x5+1+0 97 | 005F,trace,,detect,12x2+0+22 98 | 0060,trace,,detect,6x3+2+0 99 | 0061,trace,,detect,10x15+0+6 100 | 0062,trace,,detect,10x21+0+0 101 | 0063,trace,,detect,10x15+0+6 102 | 0064,trace,,detect,10x21+0+0 103 | 0065,trace,,detect,10x15+0+6 104 | 0066,trace,,detect,9x21+0+0 105 | 0067,trace,,detect,10x18+0+6 106 | 0068,trace,,detect,10x21+0+0 107 | 0069,trace,,detect,5x20+2+1 108 | 006A,trace,,detect,6x23+1+1 109 | 006B,trace,,detect,10x21+0+0 110 | 006C,trace,,detect,5x21+2+0 111 | 006D,trace,,detect,10x15+0+6 112 | 006E,trace,,detect,10x15+0+6 113 | 006F,trace,,detect,10x15+0+6 114 | 0070,trace,,detect,10x18+0+6 115 | 0071,trace,,detect,10x18+0+6 116 | 0072,trace,,detect,8x15+2+6 117 | 0073,trace,,detect,10x15+0+6 118 | 0074,trace,,detect,9x20+0+1 119 | 0075,trace,,detect,10x15+0+6 120 | 0076,trace,,detect,10x15+0+6 121 | 0077,trace,,detect,10x15+0+6 122 | 0078,trace,,detect,10x15+0+6 123 | 0079,trace,,detect,10x18+0+6 124 | 007A,trace,,detect,9x15+0+6 125 | 007B,trace,,detect,8x24+1+0 126 | 007C,trace,,detect,2x24+4+0 127 | 007D,trace,,detect,8x24+1+0 128 | 007E,trace,,detect,10x3+0+0 129 | 007F,placeholder,,, 130 | 0080,placeholder,,, 131 | 0081,placeholder,,, 132 | 0082,placeholder,,, 133 | 0083,placeholder,,, 134 | 0084,placeholder,,, 135 | 0085,placeholder,,, 136 | 0086,placeholder,,, 137 | 0087,placeholder,,, 138 | 0088,placeholder,,, 139 | 0089,placeholder,,, 140 | 008A,placeholder,,, 141 | 008B,placeholder,,, 142 | 008C,placeholder,,, 143 | 008D,placeholder,,, 144 | 008E,placeholder,,, 145 | 008F,placeholder,,, 146 | 0090,placeholder,,, 147 | 0091,placeholder,,, 148 | 0092,placeholder,,, 149 | 0093,placeholder,,, 150 | 0094,placeholder,,, 151 | 0095,placeholder,,, 152 | 0096,placeholder,,, 153 | 0097,placeholder,,, 154 | 0098,placeholder,,, 155 | 0099,placeholder,,, 156 | 009A,placeholder,,, 157 | 009B,placeholder,,, 158 | 009C,placeholder,,, 159 | 009D,placeholder,,, 160 | 009E,placeholder,,, 161 | 009F,placeholder,,, 162 | 00A0,scale,,, 163 | 00A1,trace,,detect,4x20+3+4 164 | 00A2,trace,,detect,10x22+0+2 165 | 00A3,trace,,detect,10x20+0+1 166 | 00A4,trace,,detect,10x14+0+5 167 | 00A5,trace,,detect,10x20+0+1 168 | 00A6,trace,,detect,2x24+4+0 169 | 00A7,trace,,detect,9x23+1+0 170 | 00A8,trace,,detect,8x2+1+0 171 | 00A9,trace,,detect,10x15+0+0 172 | 00AA,trace,,detect,9x15+1+1 173 | 00AB,trace,,detect,9x14+0+6 174 | 00AC,trace,,detect,10x6+0+9 175 | 00AD,trace,,detect,8x2+1+11 176 | 00AE,trace,,detect,10x15+0+0 177 | 00AF,trace,,detect,12x2+0+0 178 | 00B0,trace,,detect,6x5+2+0 179 | 00B1,trace,,detect,10x19+0+1 180 | 00B2,trace,,detect,8x11+0+0 181 | 00B3,trace,,detect,8x11+0+0 182 | 00B4,trace,,detect,6x3+3+0 183 | 00B5,trace,,detect,10x18+0+6 184 | 00B6,trace,,detect,10x22+0+1 185 | 00B7,trace,,detect,4x4+3+10 186 | 00B8,trace,,detect,5x4+1+20 187 | 00B9,trace,,detect,5x11+1+0 188 | 00BA,trace,,detect,8x15+1+1 189 | 00BB,trace,,detect,9x14+1+6 190 | 00BC,trace,,detect,10x24+0+0 191 | 00BD,trace,,detect,10x24+0+0 192 | 00BE,trace,,detect,10x24+0+0 193 | 00BF,trace,,detect,10x20+0+4 194 | 00C0,trace,,detect,10x21+0+0 195 | 00C1,trace,,detect,10x21+0+0 196 | 00C2,trace,,detect,10x21+0+0 197 | 00C3,trace,,detect,10x21+0+0 198 | 00C4,trace,,detect,10x21+0+0 199 | 00C5,trace,,detect,10x21+0+0 200 | 00C6,trace,,detect,10x20+0+1 201 | 00C7,trace,,detect,10x23+0+1 202 | 00C8,trace,,detect,9x21+1+0 203 | 00C9,trace,,detect,9x21+1+0 204 | 00CA,trace,,detect,9x21+1+0 205 | 00CB,trace,,detect,9x21+1+0 206 | 00CC,trace,,detect,8x21+1+0 207 | 00CD,trace,,detect,8x21+1+0 208 | 00CE,trace,,detect,8x21+1+0 209 | 00CF,trace,,detect,8x21+1+0 210 | 00D0,trace,,detect,10x20+0+1 211 | 00D1,trace,,detect,10x21+0+0 212 | 00D2,trace,,detect,10x21+0+0 213 | 00D3,trace,,detect,10x21+0+0 214 | 00D4,trace,,detect,10x21+0+0 215 | 00D5,trace,,detect,10x21+0+0 216 | 00D6,trace,,detect,10x21+0+0 217 | 00D7,trace,,detect,10x10+0+7 218 | 00D8,trace,,detect,10x20+0+1 219 | 00D9,trace,,detect,10x21+0+0 220 | 00DA,trace,,detect,10x21+0+0 221 | 00DB,trace,,detect,10x21+0+0 222 | 00DC,trace,,detect,10x21+0+0 223 | 00DD,trace,,detect,10x21+0+0 224 | 00DE,trace,,detect,10x20+0+1 225 | 00DF,trace,,detect,10x20+0+1 226 | 00E0,trace,,detect,10x20+0+1 227 | 00E1,trace,,detect,10x20+0+1 228 | 00E2,trace,,detect,10x20+0+1 229 | 00E3,trace,,detect,10x20+0+1 230 | 00E4,trace,,detect,10x19+0+2 231 | 00E5,trace,,detect,10x21+0+0 232 | 00E6,trace,,detect,10x15+0+6 233 | 00E7,trace,,detect,10x18+0+6 234 | 00E8,trace,,detect,10x20+0+1 235 | 00E9,trace,,detect,10x20+0+1 236 | 00EA,trace,,detect,10x21+0+0 237 | 00EB,trace,,detect,10x19+0+2 238 | 00EC,trace,,detect,6x20+2+1 239 | 00ED,trace,,detect,7x20+2+1 240 | 00EE,trace,,detect,8x20+2+1 241 | 00EF,trace,,detect,8x19+1+2 242 | 00F0,trace,,detect,10x20+0+1 243 | 00F1,trace,,detect,10x20+0+1 244 | 00F2,trace,,detect,10x20+0+1 245 | 00F3,trace,,detect,10x20+0+1 246 | 00F4,trace,,detect,10x21+0+0 247 | 00F5,trace,,detect,10x20+0+1 248 | 00F6,trace,,detect,10x19+0+2 249 | 00F7,trace,,detect,10x16+0+4 250 | 00F8,trace,,detect,10x15+0+6 251 | 00F9,trace,,detect,10x20+0+1 252 | 00FA,trace,,detect,10x20+0+1 253 | 00FB,trace,,detect,10x21+0+0 254 | 00FC,trace,,detect,10x19+0+2 255 | 00FD,trace,,detect,10x23+0+1 256 | 00FE,trace,,detect,10x23+0+1 257 | 00FF,trace,,detect,10x22+0+2 258 | 0100,trace,,detect,10x21+0+0 259 | 0101,trace,,detect,10x19+0+2 260 | 0102,trace,,detect,10x21+0+0 261 | 0103,trace,,detect,10x20+0+1 262 | 0104,trace,,detect,10x23+0+1 263 | 0105,trace,,detect,10x18+0+6 264 | 0106,trace,,detect,10x21+0+0 265 | 0107,trace,,detect,10x20+0+1 266 | 010C,trace,,detect,10x21+0+0 267 | 010D,trace,,detect,10x20+0+1 268 | 010E,trace,,detect,9x21+1+0 269 | 010F,trace,,detect,10x21+0+0 270 | 0110,trace,,detect,10x20+0+1 271 | 0111,trace,,detect,10x21+0+0 272 | 0112,trace,,detect,9x21+1+0 273 | 0113,trace,,detect,10x19+0+2 274 | 0116,trace,,detect,9x21+1+0 275 | 0117,trace,,detect,10x19+0+2 276 | 0118,trace,,detect,9x23+1+1 277 | 0119,trace,,detect,10x18+0+6 278 | 011A,trace,,detect,9x21+1+0 279 | 011B,trace,,detect,10x20+0+1 280 | 011E,trace,,detect,10x21+0+0 281 | 011F,trace,,detect,10x23+0+1 282 | 0122,trace,,detect,10x23+0+1 283 | 0123,trace,,detect,10x24+0+0 284 | 012A,trace,,detect,8x21+1+0 285 | 012B,trace,,detect,8x19+1+2 286 | 012E,trace,,detect,8x23+1+1 287 | 012F,trace,,detect,7x23+2+1 288 | 0130,trace,,detect,8x21+1+0 289 | 0131,trace,,detect,5x15+2+6 290 | 0136,trace,,detect,10x23+0+1 291 | 0137,trace,,detect,10x24+0+0 292 | 0139,trace,,detect,9x21+1+0 293 | 013A,trace,,detect,7x21+2+0 294 | 013B,trace,,detect,9x23+1+1 295 | 013C,trace,,detect,6x24+2+0 296 | 013D,trace,,detect,10x21+0+0 297 | 013E,trace,,detect,7x21+2+0 298 | 0141,trace,,detect,10x20+0+1 299 | 0142,trace,,detect,8x21+2+0 300 | 0143,trace,,detect,9x21+1+0 301 | 0144,trace,,detect,10x20+0+1 302 | 0145,trace,,detect,9x23+1+1 303 | 0146,trace,,detect,10x18+0+6 304 | 0147,trace,,detect,9x21+1+0 305 | 0148,trace,,detect,10x20+0+1 306 | 014C,trace,,detect,10x21+0+0 307 | 014D,trace,,detect,10x19+0+2 308 | 0150,trace,,detect,10x21+0+0 309 | 0151,trace,,detect,10x20+0+1 310 | 0152,trace,,detect,10x20+0+1 311 | 0153,trace,,detect,10x15+0+6 312 | 0154,trace,,detect,10x21+0+0 313 | 0155,trace,,detect,8x20+2+1 314 | 0156,trace,,detect,10x23+0+1 315 | 0157,trace,,detect,10x18+0+6 316 | 0158,trace,,detect,10x21+0+0 317 | 0159,trace,,detect,9x20+1+1 318 | 015A,trace,,detect,10x21+0+0 319 | 015B,trace,,detect,10x20+0+1 320 | 015E,trace,,detect,10x23+0+1 321 | 015F,trace,,detect,10x18+0+6 322 | 0160,trace,,detect,10x21+0+0 323 | 0161,trace,,detect,10x20+0+1 324 | 0162,trace,,detect,10x23+0+1 325 | 0163,trace,,detect,9x23+0+1 326 | 0164,trace,,detect,10x21+0+0 327 | 0165,trace,,detect,9x21+0+0 328 | 016A,trace,,detect,10x21+0+0 329 | 016B,trace,,detect,10x19+0+2 330 | 016E,trace,,detect,10x21+0+0 331 | 016F,trace,,detect,10x20+0+1 332 | 0170,trace,,detect,10x21+0+0 333 | 0171,trace,,detect,10x20+0+1 334 | 0172,trace,,detect,10x23+0+1 335 | 0173,trace,,detect,10x18+0+6 336 | 0178,trace,,detect,10x21+0+0 337 | 0179,trace,,detect,9x21+0+0 338 | 017A,trace,,detect,9x20+0+1 339 | 017B,trace,,detect,9x21+0+0 340 | 017C,trace,,detect,9x19+0+2 341 | 017D,trace,,detect,9x21+0+0 342 | 017E,trace,,detect,9x20+0+1 343 | 0192,trace,,detect,8x24+1+0 344 | 01A0,trace,,detect,11x21+0+0 345 | 01A1,trace,,detect,11x19+0+2 346 | 01AF,trace,,detect,11x21+0+0 347 | 01B0,trace,,detect,11x19+0+2 348 | 02C6,trace,,detect,9x5+1+0 349 | 02C7,trace,,detect,8x4+1+0 350 | 02D8,trace,,detect,7x3+2+0 351 | 02D9,trace,,detect,3x2+4+1 352 | 02DB,trace,,detect,5x5+3+19 353 | 02DC,trace,,detect,10x3+0+1 354 | 02DD,trace,,detect,8x3+1+0 355 | 0300,trace,,detect,6x3+2+0 356 | 0301,trace,,detect,6x3+3+0 357 | 0303,trace,,detect,10x3+0+0 358 | 0309,trace,,detect,6x6+2+0 359 | 0323,trace,,detect,3x2+4+22 360 | 037A,trace,,detect,5x5+4+19 361 | 0384,trace,,detect,6x3+3+0 362 | 0385,trace,,detect,10x3+0+1 363 | 0386,trace,,detect,10x21+0+0 364 | 0388,trace,,detect,10x21+0+0 365 | 0389,trace,,detect,10x21+0+0 366 | 038A,trace,,detect,9x21+0+0 367 | 038C,trace,,detect,10x21+0+0 368 | 038E,trace,,detect,11x21+0+0 369 | 038F,trace,,detect,10x21+0+0 370 | 0390,trace,,detect,10x20+0+1 371 | 0391,trace,,detect,10x20+0+1 372 | 0392,trace,,detect,10x20+0+1 373 | 0393,trace,,detect,9x20+1+1 374 | 0394,trace,,detect,10x20+0+1 375 | 0395,trace,,detect,9x20+1+1 376 | 0396,trace,,detect,9x20+0+1 377 | 0397,trace,,detect,10x20+0+1 378 | 0398,trace,,detect,10x20+0+1 379 | 0399,trace,,detect,8x20+1+1 380 | 039A,trace,,detect,10x20+0+1 381 | 039B,trace,,detect,10x20+0+1 382 | 039C,trace,,detect,10x20+0+1 383 | 039D,trace,,detect,10x20+0+1 384 | 039E,trace,,detect,10x20+0+1 385 | 039F,trace,,detect,10x20+0+1 386 | 03A0,trace,,detect,10x20+0+1 387 | 03A1,trace,,detect,10x20+0+1 388 | 03A3,trace,,detect,10x20+0+1 389 | 03A4,trace,,detect,10x20+0+1 390 | 03A5,trace,,detect,10x20+0+1 391 | 03A6,trace,,detect,10x20+0+1 392 | 03A7,trace,,detect,10x20+0+1 393 | 03A8,trace,,detect,10x20+0+1 394 | 03A9,trace,,detect,10x20+0+1 395 | 03AA,trace,,detect,8x21+1+0 396 | 03AB,trace,,detect,10x20+0+1 397 | 03AC,trace,,detect,10x20+0+1 398 | 03AD,trace,,detect,10x20+0+1 399 | 03AE,trace,,detect,10x23+0+1 400 | 03AF,trace,,detect,7x20+2+1 401 | 03B0,trace,,detect,10x20+0+1 402 | 03B1,trace,,detect,10x15+0+6 403 | 03B2,trace,,detect,10x23+0+1 404 | 03B3,trace,,detect,10x18+0+6 405 | 03B4,trace,,detect,10x20+0+1 406 | 03B5,trace,,detect,10x15+0+6 407 | 03B6,trace,,detect,10x23+0+1 408 | 03B7,trace,,detect,10x18+0+6 409 | 03B8,trace,,detect,9x20+1+1 410 | 03B9,trace,,detect,6x15+3+6 411 | 03BA,trace,,detect,10x15+0+6 412 | 03BB,trace,,detect,10x20+0+1 413 | 03BC,trace,,detect,10x18+0+6 414 | 03BD,trace,,detect,10x15+0+6 415 | 03BE,trace,,detect,10x23+0+1 416 | 03BF,trace,,detect,10x15+0+6 417 | 03C0,trace,,detect,10x15+0+6 418 | 03C1,trace,,detect,9x18+1+6 419 | 03C2,trace,,detect,10x18+0+6 420 | 03C3,trace,,detect,10x15+0+6 421 | 03C4,trace,,detect,10x15+0+6 422 | 03C5,trace,,detect,10x15+0+6 423 | 03C6,trace,,detect,10x23+0+1 424 | 03C7,trace,,detect,10x18+0+6 425 | 03C8,trace,,detect,10x21+0+3 426 | 03C9,trace,,detect,10x15+0+6 427 | 03CA,trace,,detect,8x19+1+2 428 | 03CB,trace,,detect,10x19+0+2 429 | 03CC,trace,,detect,10x20+0+1 430 | 03CD,trace,,detect,10x20+0+1 431 | 03CE,trace,,detect,10x20+0+1 432 | 0401,trace,,detect,9x21+1+0 433 | 0402,trace,,detect,10x20+0+1 434 | 0403,trace,,detect,9x21+1+0 435 | 0404,trace,,detect,10x20+0+1 436 | 0405,trace,,detect,10x20+0+1 437 | 0406,trace,,detect,8x20+1+1 438 | 0407,trace,,detect,8x21+1+0 439 | 0408,trace,,detect,9x20+0+1 440 | 0409,trace,,detect,10x20+0+1 441 | 040A,trace,,detect,10x20+0+1 442 | 040B,trace,,detect,10x20+0+1 443 | 040C,trace,,detect,10x21+0+0 444 | 040E,trace,,detect,10x21+0+0 445 | 040F,trace,,detect,10x23+0+1 446 | 0410,trace,,detect,10x20+0+1 447 | 0411,trace,,detect,10x20+0+1 448 | 0412,trace,,detect,10x20+0+1 449 | 0413,trace,,detect,9x20+1+1 450 | 0414,trace,,detect,10x23+0+1 451 | 0415,trace,,detect,9x20+1+1 452 | 0416,trace,,detect,10x20+0+1 453 | 0417,trace,,detect,10x20+0+1 454 | 0418,trace,,detect,9x20+1+1 455 | 0419,trace,,detect,9x21+1+0 456 | 041A,trace,,detect,10x20+0+1 457 | 041B,trace,,detect,10x20+0+1 458 | 041C,trace,,detect,10x20+0+1 459 | 041D,trace,,detect,10x20+0+1 460 | 041E,trace,,detect,10x20+0+1 461 | 041F,trace,,detect,10x20+0+1 462 | 0420,trace,,detect,10x20+0+1 463 | 0421,trace,,detect,10x20+0+1 464 | 0422,trace,,detect,10x20+0+1 465 | 0423,trace,,detect,10x20+0+1 466 | 0424,trace,,detect,10x20+0+1 467 | 0425,trace,,detect,10x20+0+1 468 | 0426,trace,,detect,10x23+0+1 469 | 0427,trace,,detect,10x20+0+1 470 | 0428,trace,,detect,10x20+0+1 471 | 0429,trace,,detect,10x23+0+1 472 | 042A,trace,,detect,10x20+0+1 473 | 042B,trace,,detect,10x20+0+1 474 | 042C,trace,,detect,10x20+0+1 475 | 042D,trace,,detect,10x20+0+1 476 | 042E,trace,,detect,10x20+0+1 477 | 042F,trace,,detect,10x20+0+1 478 | 0430,trace,,detect,10x15+0+6 479 | 0431,trace,,detect,10x21+0+0 480 | 0432,trace,,detect,10x15+0+6 481 | 0433,trace,,detect,8x15+1+6 482 | 0434,trace,,detect,10x18+0+6 483 | 0435,trace,,detect,10x15+0+6 484 | 0436,trace,,detect,10x15+0+6 485 | 0437,trace,,detect,10x15+0+6 486 | 0438,trace,,detect,9x15+1+6 487 | 0439,trace,,detect,9x20+1+1 488 | 043A,trace,,detect,10x15+0+6 489 | 043B,trace,,detect,10x15+0+6 490 | 043C,trace,,detect,10x15+0+6 491 | 043D,trace,,detect,10x15+0+6 492 | 043E,trace,,detect,10x15+0+6 493 | 043F,trace,,detect,10x15+0+6 494 | 0440,trace,,detect,10x18+0+6 495 | 0441,trace,,detect,10x15+0+6 496 | 0442,trace,,detect,10x15+0+6 497 | 0443,trace,,detect,10x18+0+6 498 | 0444,trace,,detect,10x23+0+1 499 | 0445,trace,,detect,10x15+0+6 500 | 0446,trace,,detect,10x18+0+6 501 | 0447,trace,,detect,10x15+0+6 502 | 0448,trace,,detect,10x15+0+6 503 | 0449,trace,,detect,10x18+0+6 504 | 044A,trace,,detect,10x15+0+6 505 | 044B,trace,,detect,10x15+0+6 506 | 044C,trace,,detect,10x15+0+6 507 | 044D,trace,,detect,10x15+0+6 508 | 044E,trace,,detect,10x15+0+6 509 | 044F,trace,,detect,10x15+0+6 510 | 0451,trace,,detect,10x19+0+2 511 | 0452,trace,,detect,10x24+0+0 512 | 0453,trace,,detect,8x20+1+1 513 | 0454,trace,,detect,10x15+0+6 514 | 0455,trace,,detect,10x15+0+6 515 | 0456,trace,,detect,5x20+2+1 516 | 0457,trace,,detect,8x19+1+2 517 | 0458,trace,,detect,6x23+1+1 518 | 0459,trace,,detect,10x15+0+6 519 | 045A,trace,,detect,10x15+0+6 520 | 045B,trace,,detect,10x21+0+0 521 | 045C,trace,,detect,10x19+0+2 522 | 045E,trace,,detect,10x23+0+1 523 | 045F,trace,,detect,10x18+0+6 524 | 0490,trace,,detect,9x21+1+0 525 | 0491,trace,,detect,8x17+1+4 526 | 0492,trace,,detect,10x20+0+1 527 | 0493,trace,,detect,9x15+1+6 528 | 049A,trace,,detect,10x23+0+1 529 | 049B,trace,,detect,10x18+0+6 530 | 04A2,trace,,detect,10x23+0+1 531 | 04A3,trace,,detect,10x18+0+6 532 | 04AE,trace,,detect,10x20+0+1 533 | 04AF,trace,,detect,10x18+0+6 534 | 04B0,trace,,detect,10x20+0+1 535 | 04B1,trace,,detect,10x18+0+6 536 | 04BA,trace,,detect,10x20+0+1 537 | 04BB,trace,,detect,10x21+0+0 538 | 04D8,trace,,detect,10x20+0+1 539 | 04D9,trace,,detect,10x15+0+6 540 | 04E8,trace,,detect,10x20+0+1 541 | 04E9,trace,,detect,10x15+0+6 542 | 05B0,trace,,detect,2x3+4+21 543 | 05B1,trace,,detect,10x3+0+21 544 | 05B2,trace,,detect,10x3+0+21 545 | 05B3,trace,,detect,10x3+0+21 546 | 05B4,trace,,detect,2x2+4+22 547 | 05B5,trace,,detect,6x2+2+22 548 | 05B6,trace,,detect,6x3+2+21 549 | 05B7,trace,,detect,6x2+2+22 550 | 05B8,trace,,detect,6x3+2+21 551 | 05B9,trace,,detect,2x2+4+0 552 | 05BB,trace,,detect,8x3+1+21 553 | 05BC,trace,,detect,2x2+4+10 554 | 05BD,trace,,detect,2x3+3+21 555 | 05BE,trace,,detect,8x2+1+1 556 | 05BF,trace,,detect,6x2+2+0 557 | 05C0,trace,,detect,2x21+4+0 558 | 05C1,trace,,detect,2x2+9+0 559 | 05C2,trace,,detect,2x2+0+0 560 | 05C3,trace,,detect,3x20+3+1 561 | 05D0,trace,,detect,10x20+0+1 562 | 05D1,trace,,detect,10x20+0+1 563 | 05D2,trace,,detect,7x20+1+1 564 | 05D3,trace,,detect,10x20+0+1 565 | 05D4,trace,,detect,10x20+0+1 566 | 05D5,trace,,detect,6x20+1+1 567 | 05D6,trace,,detect,8x20+1+1 568 | 05D7,trace,,detect,10x20+0+1 569 | 05D8,trace,,detect,10x20+0+1 570 | 05D9,trace,,detect,6x10+2+1 571 | 05DA,trace,,detect,10x23+0+1 572 | 05DB,trace,,detect,10x20+0+1 573 | 05DC,trace,,detect,10x21+0+0 574 | 05DD,trace,,detect,10x20+0+1 575 | 05DE,trace,,detect,10x20+0+1 576 | 05DF,trace,,detect,6x23+2+1 577 | 05E0,trace,,detect,6x20+2+1 578 | 05E1,trace,,detect,10x20+0+1 579 | 05E2,trace,,detect,10x20+0+1 580 | 05E3,trace,,detect,10x23+0+1 581 | 05E4,trace,,detect,10x20+0+1 582 | 05E5,trace,,detect,10x23+0+1 583 | 05E6,trace,,detect,10x20+0+1 584 | 05E7,trace,,detect,9x23+1+1 585 | 05E8,trace,,detect,9x20+0+1 586 | 05E9,trace,,detect,10x20+0+1 587 | 05EA,trace,,detect,10x20+0+1 588 | 05F0,trace,,detect,10x20+0+1 589 | 05F1,trace,,detect,10x20+0+1 590 | 05F2,trace,,detect,10x11+0+1 591 | 05F3,trace,,detect,5x7+3+1 592 | 05F4,trace,,detect,10x7+0+1 593 | 060C,trace,,detect,4x8+5+8 594 | 061B,trace,,detect,4x14+4+2 595 | 061F,trace,,detect,8x16+2+1 596 | 0621,trace,,detect,5x8+4+6 597 | 0622,trace,,detect,8x17+2+0 598 | 0623,trace,,detect,5x17+2+0 599 | 0624,trace,,detect,9x19+3+3 600 | 0625,trace,,detect,6x20+1+2 601 | 0626,trace,,detect,11x18+1+4 602 | 0627,trace,,detect,2x15+5+2 603 | 0628,trace,,detect,11x12+1+8 604 | 0629,trace,,detect,7x11+5+5 605 | 062A,trace,,detect,11x11+1+5 606 | 062B,trace,,detect,11x14+1+2 607 | 062C,trace,,detect,10x12+2+12 608 | 062D,trace,,detect,10x12+2+12 609 | 062E,trace,,detect,10x16+2+8 610 | 062F,trace,,detect,8x10+4+6 611 | 0630,trace,,detect,8x14+4+2 612 | 0631,trace,,detect,9x12+3+10 613 | 0632,trace,,detect,9x16+3+6 614 | 0633,trace,,detect,12x15+0+9 615 | 0634,trace,,detect,12x21+0+3 616 | 0635,trace,,detect,12x16+0+8 617 | 0636,trace,,detect,12x20+0+4 618 | 0637,trace,,detect,12x14+0+2 619 | 0638,trace,,detect,12x14+0+2 620 | 0639,trace,,detect,10x18+2+6 621 | 063A,trace,,detect,10x22+2+2 622 | 0640,trace,,detect,12x3+0+13 623 | 0641,trace,,detect,11x14+1+2 624 | 0642,trace,,detect,10x17+2+6 625 | 0643,trace,,detect,10x14+2+2 626 | 0644,trace,,detect,10x20+2+2 627 | 0645,trace,,detect,9x15+3+9 628 | 0646,trace,,detect,11x15+1+6 629 | 0647,trace,,detect,11x11+0+5 630 | 0648,trace,,detect,9x13+3+9 631 | 0649,trace,,detect,10x13+1+6 632 | 064A,trace,,detect,10x17+1+6 633 | 064B,trace,,detect,5x6+7+0 634 | 064C,trace,,detect,8x5+4+0 635 | 064D,trace,,detect,5x6+7+18 636 | 064E,trace,,detect,5x3+7+0 637 | 064F,trace,,detect,6x5+6+0 638 | 0650,trace,,detect,5x3+7+18 639 | 0651,trace,,detect,8x4+4+0 640 | 0652,trace,,detect,5x5+7+0 641 | 0660,trace,,detect,5x6+4+6 642 | 0661,trace,,detect,4x14+4+2 643 | 0662,trace,,detect,8x14+2+2 644 | 0663,trace,,detect,9x14+2+2 645 | 0664,trace,,detect,6x14+3+2 646 | 0665,trace,,detect,8x11+2+5 647 | 0666,trace,,detect,9x14+1+2 648 | 0667,trace,,detect,10x14+1+2 649 | 0668,trace,,detect,10x14+1+2 650 | 0669,trace,,detect,9x14+2+2 651 | 0679,trace,,detect,11x14+1+2 652 | 067E,trace,,detect,11x14+1+8 653 | 0686,trace,,detect,10x12+2+12 654 | 0688,trace,,detect,8x16+4+0 655 | 0691,trace,,detect,9x20+3+2 656 | 0698,trace,,detect,9x19+3+3 657 | 06A9,trace,,detect,11x14+1+2 658 | 06AF,trace,,detect,12x15+0+1 659 | 06BA,trace,,detect,11x12+1+9 660 | 06BE,trace,,detect,11x11+0+5 661 | 06C1,trace,,detect,9x7+3+11 662 | 06D2,trace,,detect,11x11+1+10 663 | 200C,trace,,detect,11x11+0+0 664 | 200D,trace,,detect,11x11+0+0 665 | 200E,trace,,detect,11x11+0+0 666 | 200F,trace,,detect,11x11+0+0 667 | 2013,trace,,detect,9x2+1+11 668 | 2014,trace,,detect,11x2+0+11 669 | 2015,trace,,detect,12x2+0+11 670 | 2017,trace,,detect,12x3+0+21 671 | 2018,trace,,detect,4x6+3+0 672 | 2019,trace,,detect,4x6+3+0 673 | 201A,trace,,detect,4x6+3+18 674 | 201C,trace,,detect,9x6+1+0 675 | 201D,trace,,detect,9x6+0+0 676 | 201E,trace,,detect,9x6+0+18 677 | 2020,trace,,detect,8x22+1+1 678 | 2021,trace,,detect,8x21+1+1 679 | 2022,trace,,detect,6x6+2+9 680 | 2026,trace,,detect,10x3+0+18 681 | 2030,trace,,detect,10x20+0+1 682 | 2039,trace,,detect,5x14+2+6 683 | 203A,trace,,detect,5x14+3+6 684 | 207F,trace,,detect,8x11+0+0 685 | 20A7,trace,,detect,10x20+0+1 686 | 20AA,trace,,detect,10x17+0+4 687 | 20AB,trace,,detect,10x24+0+0 688 | 20AC,trace,,detect,10x16+0+4 689 | 20AF,trace,,detect,10x23+0+1 690 | 2116,trace,,detect,10x20+0+1 691 | 2122,trace,,detect,10x8+0+1 692 | 2219,trace,,detect,5x5+2+9 693 | 221A,trace,,detect,10x24+0+0 694 | 221E,trace,,detect,10x13+0+5 695 | 2229,trace,,detect,10x20+0+1 696 | 2248,trace,,detect,10x10+0+7 697 | 2261,trace,,detect,9x14+1+5 698 | 2264,trace,,detect,10x17+0+3 699 | 2265,trace,,detect,10x17+0+3 700 | 2310,trace,,detect,10x6+0+9 701 | 2320,trace,,detect,6x24+4+0 702 | 2321,trace,,detect,6x24+0+0 703 | 2500,trace,,detect,12x2+0+11 704 | 2502,trace,,detect,2x24+5+0 705 | 250C,trace,,detect,7x13+5+11 706 | 2510,trace,,detect,7x13+0+11 707 | 2514,trace,,detect,7x13+5+0 708 | 2518,trace,,detect,7x13+0+0 709 | 251C,trace,,detect,7x24+5+0 710 | 2524,trace,,detect,7x24+0+0 711 | 252C,trace,,detect,12x13+0+11 712 | 2534,trace,,detect,12x13+0+0 713 | 253C,trace,,detect,12x24+0+0 714 | 2550,trace,,detect,12x6+0+9 715 | 2551,trace,,detect,6x24+3+0 716 | 2552,trace,,detect,7x15+5+9 717 | 2553,trace,,detect,9x13+3+11 718 | 2554,trace,,detect,9x15+3+9 719 | 2555,trace,,detect,7x15+0+9 720 | 2556,trace,,detect,9x13+0+11 721 | 2557,trace,,detect,9x15+0+9 722 | 2558,trace,,detect,7x15+5+0 723 | 2559,trace,,detect,9x13+3+0 724 | 255A,trace,,detect,9x15+3+0 725 | 255B,trace,,detect,7x15+0+0 726 | 255C,trace,,detect,9x13+0+0 727 | 255D,trace,,detect,9x15+0+0 728 | 255E,trace,,detect,7x24+5+0 729 | 255F,trace,,detect,9x24+3+0 730 | 2560,trace,,detect,9x24+3+0 731 | 2561,trace,,detect,7x24+0+0 732 | 2562,trace,,detect,9x24+0+0 733 | 2563,trace,,detect,9x24+0+0 734 | 2564,trace,,detect,12x15+0+9 735 | 2565,trace,,detect,12x13+0+11 736 | 2566,trace,,detect,12x15+0+9 737 | 2567,trace,,detect,12x15+0+0 738 | 2568,trace,,detect,12x13+0+0 739 | 2569,trace,,detect,12x15+0+0 740 | 256A,trace,,detect,12x24+0+0 741 | 256B,trace,,detect,12x24+0+0 742 | 256C,trace,,detect,12x24+0+0 743 | 2580,trace,,detect,12x12+0+0 744 | 2584,trace,,detect,12x12+0+12 745 | 2588,trace,,detect,12x24+0+0 746 | 258C,trace,,detect,6x24+0+0 747 | 2590,trace,,detect,6x24+6+0 748 | 2591,trace,,detect,12x22+0+0 749 | 2592,trace,,detect,12x23+0+0 750 | 2593,trace,,detect,12x23+0+0 751 | 25A0,trace,,detect,8x16+1+4 752 | FE7D,trace,,detect,12x16+0+0 753 | FE80,trace,,detect,5x8+4+6 754 | FE81,trace,,detect,8x17+2+0 755 | FE82,trace,,detect,10x16+2+0 756 | FE83,trace,,detect,5x17+2+0 757 | FE84,trace,,detect,10x16+2+0 758 | FE85,trace,,detect,9x19+3+3 759 | FE8B,trace,,detect,12x13+0+3 760 | FE8D,trace,,detect,2x15+5+2 761 | FE8E,trace,,detect,7x14+5+2 762 | FE8F,trace,,detect,11x12+1+8 763 | FE91,trace,,detect,12x11+0+9 764 | FE93,trace,,detect,7x11+5+5 765 | FE95,trace,,detect,11x11+1+5 766 | FE97,trace,,detect,12x11+0+5 767 | FE99,trace,,detect,11x14+1+2 768 | FE9B,trace,,detect,12x14+0+2 769 | FE9D,trace,,detect,10x12+2+12 770 | FE9F,trace,,detect,12x12+0+8 771 | FEA1,trace,,detect,10x12+2+12 772 | FEA3,trace,,detect,12x8+0+8 773 | FEA5,trace,,detect,10x16+2+8 774 | FEA7,trace,,detect,12x12+0+4 775 | FEA9,trace,,detect,8x10+4+6 776 | FEAB,trace,,detect,8x14+4+2 777 | FEAD,trace,,detect,9x12+3+10 778 | FEAF,trace,,detect,9x16+3+6 779 | FEB1,trace,,detect,12x15+0+9 780 | FEB3,trace,,detect,12x7+0+9 781 | FEB5,trace,,detect,12x21+0+3 782 | FEB7,trace,,detect,12x13+0+3 783 | FEB9,trace,,detect,12x16+0+8 784 | FEBB,trace,,detect,12x10+0+8 785 | FEBD,trace,,detect,12x20+0+4 786 | FEBF,trace,,detect,12x14+0+4 787 | FEC1,trace,,detect,12x14+0+2 788 | FEC5,trace,,detect,12x14+0+2 789 | FEC9,trace,,detect,10x18+2+6 790 | FECA,trace,,detect,10x15+2+9 791 | FECB,trace,,detect,11x8+0+8 792 | FECC,trace,,detect,12x8+0+8 793 | FECD,trace,,detect,10x22+2+2 794 | FECE,trace,,detect,10x19+2+5 795 | FECF,trace,,detect,11x12+0+4 796 | FED0,trace,,detect,12x12+0+4 797 | FED1,trace,,detect,11x14+1+2 798 | FED3,trace,,detect,12x14+0+2 799 | FED5,trace,,detect,10x17+2+6 800 | FED7,trace,,detect,12x14+0+2 801 | FED9,trace,,detect,10x14+2+2 802 | FEDB,trace,,detect,12x14+0+2 803 | FEDD,trace,,detect,10x20+2+2 804 | FEDF,trace,,detect,12x14+0+2 805 | FEE1,trace,,detect,9x15+3+9 806 | FEE3,trace,,detect,12x7+0+10 807 | FEE5,trace,,detect,11x15+1+6 808 | FEE7,trace,,detect,12x11+0+5 809 | FEE9,trace,,detect,7x8+5+8 810 | FEEB,trace,,detect,11x11+0+5 811 | FEEC,trace,,detect,12x13+0+8 812 | FEED,trace,,detect,9x13+3+9 813 | FEEF,trace,,detect,10x13+1+6 814 | FEF0,trace,,detect,11x12+1+10 815 | FEF1,trace,,detect,10x17+1+6 816 | FEF2,trace,,detect,11x15+1+9 817 | FEF3,trace,,detect,12x11+0+9 818 | FEF5,trace,,detect,11x16+0+0 819 | FEF6,trace,,detect,12x16+0+0 820 | FEF7,trace,,detect,10x16+1+0 821 | FEF8,trace,,detect,11x16+1+0 822 | FEFB,trace,,detect,9x14+2+2 823 | FEFC,trace,,detect,11x14+1+2 824 | FF61,trace,,detect,7x7+1+14 825 | FF62,trace,,detect,7x17+2+0 826 | FF63,trace,,detect,7x17+1+5 827 | FF64,trace,,detect,5x7+2+14 828 | FF65,trace,,detect,3x4+3+10 829 | FF66,trace,,detect,9x20+1+1 830 | FF67,trace,,detect,10x15+0+6 831 | FF68,trace,,detect,9x16+0+5 832 | FF69,trace,,detect,10x16+0+5 833 | FF6A,trace,,detect,10x13+0+7 834 | FF6B,trace,,detect,10x16+0+5 835 | FF6C,trace,,detect,10x16+0+5 836 | FF6D,trace,,detect,10x13+0+7 837 | FF6E,trace,,detect,8x14+1+6 838 | FF6F,trace,,detect,9x15+1+6 839 | FF70,trace,,detect,10x2+0+10 840 | FF71,trace,,detect,10x20+0+1 841 | FF72,trace,,detect,9x21+0+0 842 | FF73,trace,,detect,10x21+0+0 843 | FF74,trace,,detect,10x17+0+3 844 | FF75,trace,,detect,10x21+0+0 845 | FF76,trace,,detect,10x21+0+0 846 | FF77,trace,,detect,10x21+0+0 847 | FF78,trace,,detect,10x21+0+0 848 | FF79,trace,,detect,10x21+0+0 849 | FF7A,trace,,detect,8x17+1+3 850 | FF7B,trace,,detect,11x21+0+0 851 | FF7C,trace,,detect,10x20+0+1 852 | FF7D,trace,,detect,10x20+0+1 853 | FF7E,trace,,detect,10x21+0+0 854 | FF7F,trace,,detect,10x20+0+1 855 | FF80,trace,,detect,10x21+0+0 856 | FF81,trace,,detect,10x21+0+0 857 | FF82,trace,,detect,9x19+1+2 858 | FF83,trace,,detect,10x20+0+1 859 | FF84,trace,,detect,7x20+3+1 860 | FF85,trace,,detect,10x21+0+0 861 | FF86,trace,,detect,9x17+1+3 862 | FF87,trace,,detect,10x19+0+2 863 | FF88,trace,,detect,10x21+0+0 864 | FF89,trace,,detect,8x20+0+1 865 | FF8A,trace,,detect,10x19+0+1 866 | FF8B,trace,,detect,8x20+1+1 867 | FF8C,trace,,detect,9x19+1+2 868 | FF8D,trace,,detect,10x17+0+3 869 | FF8E,trace,,detect,10x21+0+0 870 | FF8F,trace,,detect,10x18+0+2 871 | FF90,trace,,detect,9x19+0+2 872 | FF91,trace,,detect,10x20+0+1 873 | FF92,trace,,detect,10x20+0+1 874 | FF93,trace,,detect,9x20+0+1 875 | FF94,trace,,detect,10x21+0+0 876 | FF95,trace,,detect,10x17+0+3 877 | FF96,trace,,detect,8x19+1+2 878 | FF97,trace,,detect,9x20+1+1 879 | FF98,trace,,detect,8x20+1+1 880 | FF99,trace,,detect,10x20+0+1 881 | FF9A,trace,,detect,9x20+1+1 882 | FF9B,trace,,detect,9x18+1+2 883 | FF9C,trace,,detect,9x20+1+1 884 | FF9D,trace,,detect,10x20+0+1 885 | FF9E,trace,,detect,8x6+0+0 886 | FF9F,trace,,detect,6x5+2+0 887 | --------------------------------------------------------------------------------