diff --git a/README.md b/README.md index 09bc018..22b25a7 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,6 @@ # x86_microcode Microcode resources for various x86 CPUs + +## /v20 + +Microcode for the NEC V20 and V30 CPUs. diff --git a/v20/README.md b/v20/README.md new file mode 100644 index 0000000..0f58b3b --- /dev/null +++ b/v20/README.md @@ -0,0 +1,178 @@ +# The NEC V20 & V30 Microcode + +The NEC V20 Die + +NEC used unified microcode for both the NEC V20 and V30, which differ only in their metal layer interconnects. + +The only difference between the microcode for either version of CPU is in the microcode routine that handles hardware +interrupts. Like the 8088, the V20 needs a special routine to only issue one INTA request to the 8259 as otherwise its +BIU logic will split two INTA cycles into four. + +## Word Format + +There are some differences between the actual microcode word format the published legend, which has its origin in +court documents from the NEC vs Intel lawsuit. The microcode is logically split into two parts, 17 bits that encode +source and destination operands, and 12 bits that encode executive instructions. + +The source/destination field has two formats, one that encodes two source/destination pairs, and one that encodes an +immediate constant value. + +![word_format](./images/v20_word_format.png) + +## Files + +#### v20_microcode.xlsx + +The current working decode spreadsheet of the V20 microcode. Some field values are still undetermined. + +#### v20_microcode_01.txt + +The extracted bits from the V20's microcode ROM in ASCII format, an array of 258x116 bits. + +Note that there are two more columns than you may expect. Column 128 (exactly halfway through the ROM) does not appear +to be decoded. Columns 118 & 119 contain the hardware interrupt routine for the V20 and V30, respectively. The column +not used by the specific CPU is disabled. + +These bits are also available as a PNG and PBM image, as follows: + +![microcode_bits](./images/microcode_rom.png) + +#### /images/microcode_rom.png +#### /images/microcode_rom.pbm + +#### /images/microcode_crop_01.jpg + +This is a half-resolution crop of the microcode ROM region. This image file was used with MaskRomTool to define the ROM +bit positions. + +#### /images/microcode_crop_01.jpg.json + +MaskRomTool's saved project file for the image above. If you load the image with this JSON in the same directory in +MaskRomTool the project should be restored and you could attempt your own extraction. + +#### /images/microcode_bit_check.jpg + +This is a grid-aligned image of the microcode ROM bits showing the logical bit extraction overlayed - a 1 bit being a +bright square and a 0 being a dark square. This image was used for manual verification of the extraction accuracy. + +Spot any errors? Please open an issue if you do! + +#### /images/activation_pla_01.jpg + +This is a half-resolution crop of the microcode activation PLA, or what Intel calls a matching decoder PLA. + +#### /images/activation_pla_01.jpg.json + +MaskRomTool's saved project file for the image above. If you load the image with this JSON in the same directory in +MaskRomTool the project should be restored and you could attempt your own extraction. + +### v20_activation_pla.txt + +The extracted gates from the V20's microcode activation PLA in ASCII format, an array of 257x26 bits. +The PLA encodes logic, not just bits - the way to interpret this image is as pairs of two pixels, vertically, that +encode the following logic. + +| | | Meaning | +|---|---|------------| +| 0 | 0 | Don't Care | +| 1 | 0 | Match 1 | +| 0 | 1 | Match 0 | +| 1 | 1 | Impossible | + +Lines + +The extracted bits from the activation PLA are also encoded as two image files, as specfied below. + +![activation_pla_bits](./images/activation_pla_01.png) + +#### /images/activation_pla_01.png +#### /images/activation_pla_01.pbm + + +### /scripts/bit_classifier.py + +A python script that uses the PyTorch framework to either train or run a convolutional neural network (CNN) to classify +input images as either 1's or 0's. The CNN trained by this script was used to extract the bits from the die photos. + +The versions of pytorch used with this script were: +| package | version | +|------------|-------------| +|Python | 3.10.5| +|torch | 2.8.0+cu126| +|torchvision | 0.23.0+cu126| + +### /models/microcode/model.pt + +The trained PyTorch model used to extract the microcode bits. It was trained on an input size of 42x42. + +### /models/activation_pla/model.pt + +The trained PyTorch model used to extract the activation PLA bits. It was trained on an input size of 64x64. + +### /scripts/extract_bits.py + +This script takes the JSON file output by MaskRomTool and extracts square PNG files representing the area around each +indicated bit position, and will save the resulting images into a ZIP file to avoid thrashing your filesystem. + +The resulting ZIP can be fed to the model via bit_classifier.py to reproduce the classification process, if you wish. + +## Additional PLAS + +Zoomed in views of the indicated PLAs: + +![pla_locations](./images/pla_locations.jpg) + +### /images/pla_1.jpg +### /images/pla_2.jpg +### /images/pla_3.jpg +### /images/pla_4.jpg +### /images/pla_5.jpg + +### /v20_pla3.txt + +The decoded PLA3 which is the V20's equivalent of the 8088's "Group Decode ROM". + +The first two bits are a sort of opcode type field - + +| bits | meaning | +|------|--------------------------| +| 00 | 8080 instruction | +| 01 | normal instruction | +| 10 | not present | +| 11 | extended NEC instruction | + +The next 9 bits are provisionally identified as follows: + +| bit | meaning | +|-----|---------| +| 0 | force byte operand | +| 1 | W bit is valid | +| 2 | one-byte non-microcoded instruction or prefix | +| 3 | uses AX or AL register | +| 4 | segment register operand | +| 5 | has modrm - this appears to only be valid for the 8088/80186 instructions | +| 6 | doesn't read EA operand | +| 7 | D bit is valid | +| 8 | set for all opcodes > 7F | + +The final five bytes appear to identify individual instructions within their class. +For non-microcoded instructions there are exactly 16 variants: + +|bits| meaning| +|----|--------| +| 0000 | Segment override | +| 0001 | 0F | +| 0010 | STD | +| 0011 | CLD | +| 0100 | STI / EI | +| 0101 | CLI / DI | +| 0110 | STC | +| 0111 | CLC | +| 1000 | REPC | +| 1001 | REPNC | +| 1010 | CMC | +| 1011 | HLT | +| 1100 | REPZ | +| 1101 | REPNZ | +| 1110 | F1 LOCK ALIAS(?) | +| 1111 | LOCK | \ No newline at end of file diff --git a/v20/images/activation_pla_01.jpg b/v20/images/activation_pla_01.jpg new file mode 100644 index 0000000..ea262ca Binary files /dev/null and b/v20/images/activation_pla_01.jpg differ diff --git a/v20/images/activation_pla_01.jpg.json b/v20/images/activation_pla_01.jpg.json new file mode 100644 index 0000000..2f47fe3 --- /dev/null +++ b/v20/images/activation_pla_01.jpg.json @@ -0,0 +1,2013 @@ +{ + "00about": "Export from MaskROMTool by Travis Goodspeed", + "00github": "http://github.com/travisgoodspeed/maskromtool/", + "00imagefilename": "D:/newdev/my_projects/marty_docs/CPUs/CPU_V20/activation_pla_01.jpg", + "00version": "2025.03.30", + "bitfixes": [ + ], + "cols": [ + { + "linetype": 1, + "x1": 119.52125422495982, + "x2": 119.52125422495982, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 168.02263275103047, + "x2": 168.02263275103047, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 214.7918191868843, + "x2": 214.7918191868843, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 265.0253898031718, + "x2": 265.0253898031718, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 311.7945762390256, + "x2": 311.7945762390256, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 360.29595476509627, + "x2": 360.29595476509627, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 407.0651412009501, + "x2": 407.0651412009501, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 455.5665197270207, + "x2": 455.5665197270207, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 566.4268135008965, + "x2": 566.4268135008965, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 614.9281920269672, + "x2": 614.9281920269672, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 663.4295705530378, + "x2": 663.4295705530378, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 710.1987569888917, + "x2": 710.1987569888917, + "y1": 1550.3119207440438, + "y2": 169.75482484124723 + }, + { + "linetype": 1, + "x1": 760.4323276051791, + "x2": 760.4323276051791, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 808.9337061312498, + "x2": 808.9337061312498, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 853.9707004768868, + "x2": 853.9707004768868, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 902.4720790029575, + "x2": 902.4720790029575, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 950.9734575290281, + "x2": 950.9734575290281, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 997.742643964882, + "x2": 997.742643964882, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 1046.2440224909526, + "x2": 1046.2440224909526, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 1094.7454010170231, + "x2": 1094.7454010170231, + "y1": 1550.3119207440438, + "y2": 169.75482484124723 + }, + { + "linetype": 1, + "x1": 1143.246779543094, + "x2": 1143.246779543094, + "y1": 1550.3119207440438, + "y2": 169.75482484124723 + }, + { + "linetype": 1, + "x1": 1191.7481580691644, + "x2": 1191.7481580691644, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 1238.5173445050184, + "x2": 1238.5173445050184, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 1287.018723031089, + "x2": 1287.018723031089, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 1397.8790168049647, + "x2": 1397.8790168049647, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 1446.3803953310355, + "x2": 1446.3803953310355, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 1494.881773857106, + "x2": 1494.881773857106, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 1543.3831523831766, + "x2": 1543.3831523831766, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 1593.6167229994642, + "x2": 1593.6167229994642, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 1638.653717345101, + "x2": 1638.653717345101, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 1687.1550958711719, + "x2": 1687.1550958711719, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 1735.6564743972424, + "x2": 1735.6564743972424, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 1784.1578529233132, + "x2": 1784.1578529233132, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 1829.19484726895, + "x2": 1829.19484726895, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 1879.4284178852376, + "x2": 1879.4284178852376, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 1927.9297964113082, + "x2": 1927.9297964113082, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 1974.6989828471621, + "x2": 1974.6989828471621, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 2024.9325534634495, + "x2": 2024.9325534634495, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 2069.9695478090866, + "x2": 2069.9695478090866, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 2120.203118425374, + "x2": 2120.203118425374, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 2232.7956042894666, + "x2": 2232.7956042894666, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 2279.5647907253206, + "x2": 2279.5647907253206, + "y1": 1550.3119207440438, + "y2": 169.75482484124723 + }, + { + "linetype": 1, + "x1": 2326.3339771611745, + "x2": 2326.3339771611745, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 2374.835355687245, + "x2": 2374.835355687245, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 2425.0689263035324, + "x2": 2425.0689263035324, + "y1": 1550.3119207440438, + "y2": 169.75482484124723 + }, + { + "linetype": 1, + "x1": 2471.8381127393864, + "x2": 2471.8381127393864, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 2518.6072991752403, + "x2": 2518.6072991752403, + "y1": 1550.3119207440438, + "y2": 169.75482484124723 + }, + { + "linetype": 1, + "x1": 2568.8408697915274, + "x2": 2568.8408697915274, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 2615.6100562273814, + "x2": 2615.6100562273814, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 2664.111434753452, + "x2": 2664.111434753452, + "y1": 1550.3119207440438, + "y2": 169.75482484124723 + }, + { + "linetype": 1, + "x1": 2710.8806211893057, + "x2": 2710.8806211893057, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 2759.3819997153764, + "x2": 2759.3819997153764, + "y1": 1550.3119207440438, + "y2": 169.75482484124723 + }, + { + "linetype": 1, + "x1": 2806.1511861512304, + "x2": 2806.1511861512304, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 2854.652564677301, + "x2": 2854.652564677301, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 2904.8861352935883, + "x2": 2904.8861352935883, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 2951.655321729442, + "x2": 2951.655321729442, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 3064.247807593535, + "x2": 3064.247807593535, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 3111.0169940293886, + "x2": 3111.0169940293886, + "y1": 1550.3119207440438, + "y2": 169.75482484124723 + }, + { + "linetype": 1, + "x1": 3159.5183725554593, + "x2": 3159.5183725554593, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 3208.01975108153, + "x2": 3208.01975108153, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 3253.0567454271672, + "x2": 3253.0567454271672, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 3303.2903160434544, + "x2": 3303.2903160434544, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 3353.523886659742, + "x2": 3353.523886659742, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 3398.560881005379, + "x2": 3398.560881005379, + "y1": 1550.3119207440438, + "y2": 169.75482484124723 + }, + { + "linetype": 1, + "x1": 3447.06225953145, + "x2": 3447.06225953145, + "y1": 1550.3119207440438, + "y2": 169.75482484124723 + }, + { + "linetype": 1, + "x1": 3495.56363805752, + "x2": 3495.56363805752, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 3542.332824493374, + "x2": 3542.332824493374, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 3590.834203019445, + "x2": 3590.834203019445, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 3639.3355815455157, + "x2": 3639.3355815455157, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 3687.836960071586, + "x2": 3687.836960071586, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 3736.3383385976567, + "x2": 3736.3383385976567, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 3783.1075250335107, + "x2": 3783.1075250335107, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 3895.700010897603, + "x2": 3895.700010897603, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 3944.201389423674, + "x2": 3944.201389423674, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 3990.970575859528, + "x2": 3990.970575859528, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 4039.471954385598, + "x2": 4039.471954385598, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 4089.7055250018857, + "x2": 4089.7055250018857, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 4136.47471143774, + "x2": 4136.47471143774, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 4183.243897873594, + "x2": 4183.243897873594, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 4231.745276399664, + "x2": 4231.745276399664, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 4280.246654925735, + "x2": 4280.246654925735, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 4328.748033451805, + "x2": 4328.748033451805, + "y1": 1555.5084970146943, + "y2": 174.95140111189767 + }, + { + "linetype": 1, + "x1": 4375.517219887659, + "x2": 4375.517219887659, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 4422.286406323513, + "x2": 4422.286406323513, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 4472.5199769398005, + "x2": 4472.5199769398005, + "y1": 1555.5084970146943, + "y2": 174.95140111189767 + }, + { + "linetype": 1, + "x1": 4522.753547556088, + "x2": 4522.753547556088, + "y1": 1550.3119207440438, + "y2": 169.75482484124723 + }, + { + "linetype": 1, + "x1": 4567.790541901725, + "x2": 4567.790541901725, + "y1": 1550.3119207440438, + "y2": 169.75482484124723 + }, + { + "linetype": 1, + "x1": 4616.291920427796, + "x2": 4616.291920427796, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 4730.616598382105, + "x2": 4730.616598382105, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 4777.385784817959, + "x2": 4777.385784817959, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 4825.887163344029, + "x2": 4825.887163344029, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 4874.3885418701, + "x2": 4874.3885418701, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 4921.157728305954, + "x2": 4921.157728305954, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 4969.659106832025, + "x2": 4969.659106832025, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 5018.160485358096, + "x2": 5018.160485358096, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 5064.929671793949, + "x2": 5064.929671793949, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 5115.163242410236, + "x2": 5115.163242410236, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 5160.200236755873, + "x2": 5160.200236755873, + "y1": 1548.579728653827, + "y2": 168.02263275103041 + }, + { + "linetype": 1, + "x1": 5208.701615281944, + "x2": 5208.701615281944, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 5257.202993808015, + "x2": 5257.202993808015, + "y1": 1550.3119207440438, + "y2": 169.75482484124723 + }, + { + "linetype": 1, + "x1": 5305.704372334086, + "x2": 5305.704372334086, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 5354.2057508601565, + "x2": 5354.2057508601565, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 5400.9749372960105, + "x2": 5400.9749372960105, + "y1": 1550.3119207440438, + "y2": 169.75482484124723 + }, + { + "linetype": 1, + "x1": 5449.47631582208, + "x2": 5449.47631582208, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 5562.068801686173, + "x2": 5562.068801686173, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 5608.837988122027, + "x2": 5608.837988122027, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 5657.339366648098, + "x2": 5657.339366648098, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 5705.840745174169, + "x2": 5705.840745174169, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 5754.342123700239, + "x2": 5754.342123700239, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 5799.379118045876, + "x2": 5799.379118045876, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 5847.880496571946, + "x2": 5847.880496571946, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 5896.381875098017, + "x2": 5896.381875098017, + "y1": 1555.5084970146943, + "y2": 174.95140111189767 + }, + { + "linetype": 1, + "x1": 5946.615445714305, + "x2": 5946.615445714305, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 5995.1168242403755, + "x2": 5995.1168242403755, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 6041.8860106762295, + "x2": 6041.8860106762295, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 6090.3873892023, + "x2": 6090.3873892023, + "y1": 1555.5084970146943, + "y2": 174.95140111189767 + }, + { + "linetype": 1, + "x1": 6137.156575638154, + "x2": 6137.156575638154, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 6183.925762074007, + "x2": 6183.925762074007, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 6235.891524780512, + "x2": 6235.891524780512, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 6282.660711216366, + "x2": 6282.660711216366, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 6390.056620809808, + "x2": 6390.056620809808, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 6442.022383516312, + "x2": 6442.022383516312, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 6490.523762042383, + "x2": 6490.523762042383, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 6537.292948478236, + "x2": 6537.292948478236, + "y1": 1548.579728653827, + "y2": 168.02263275103041 + }, + { + "linetype": 1, + "x1": 6585.794327004307, + "x2": 6585.794327004307, + "y1": 1550.3119207440438, + "y2": 169.75482484124723 + }, + { + "linetype": 1, + "x1": 6632.563513440161, + "x2": 6632.563513440161, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 6682.7970840564485, + "x2": 6682.7970840564485, + "y1": 1553.7763049244775, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 6729.5662704923025, + "x2": 6729.5662704923025, + "y1": 1552.0441128342607, + "y2": 171.48701693146404 + }, + { + "linetype": 1, + "x1": 7562.750665886588, + "x2": 7561.018473796371, + "y1": 1553.7763049244775, + "y2": 180.1479773825481 + }, + { + "linetype": 1, + "x1": 7611.2520444126585, + "x2": 7609.519852322442, + "y1": 1550.3119207440438, + "y2": 176.68359320211448 + }, + { + "linetype": 1, + "x1": 7658.021230848512, + "x2": 7656.289038758295, + "y1": 1553.7763049244775, + "y2": 180.1479773825481 + }, + { + "linetype": 1, + "x1": 7708.254801464799, + "x2": 7706.522609374582, + "y1": 1552.0441128342607, + "y2": 178.4157852923313 + }, + { + "linetype": 1, + "x1": 7756.75617999087, + "x2": 7755.023987900653, + "y1": 1550.3119207440438, + "y2": 176.68359320211448 + }, + { + "linetype": 1, + "x1": 7803.525366426724, + "x2": 7801.793174336507, + "y1": 1548.579728653827, + "y2": 174.95140111189767 + }, + { + "linetype": 1, + "x1": 7852.026744952795, + "x2": 7850.294552862578, + "y1": 1553.7763049244775, + "y2": 180.1479773825481 + }, + { + "linetype": 1, + "x1": 7902.260315569082, + "x2": 7900.528123478865, + "y1": 1555.5084970146943, + "y2": 181.88016947276492 + }, + { + "linetype": 1, + "x1": 7949.029502004936, + "x2": 7947.297309914719, + "y1": 1552.0441128342607, + "y2": 178.4157852923313 + }, + { + "linetype": 1, + "x1": 8058.1576036885945, + "x2": 8056.425411598378, + "y1": 1550.3119207440438, + "y2": 176.68359320211448 + }, + { + "linetype": 1, + "x1": 8106.658982214665, + "x2": 8104.926790124448, + "y1": 1552.0441128342607, + "y2": 178.4157852923313 + }, + { + "linetype": 1, + "x1": 8155.160360740736, + "x2": 8153.428168650519, + "y1": 1553.7763049244775, + "y2": 180.1479773825481 + }, + { + "linetype": 1, + "x1": 8203.661739266807, + "x2": 8201.92954717659, + "y1": 1552.0441128342607, + "y2": 178.4157852923313 + }, + { + "linetype": 1, + "x1": 8250.43092570266, + "x2": 8248.698733612444, + "y1": 1550.3119207440438, + "y2": 176.68359320211448 + }, + { + "linetype": 1, + "x1": 8300.664496318948, + "x2": 8298.932304228732, + "y1": 1550.3119207440438, + "y2": 176.68359320211448 + }, + { + "linetype": 1, + "x1": 8347.433682754801, + "x2": 8345.701490664585, + "y1": 1550.3119207440438, + "y2": 176.68359320211448 + }, + { + "linetype": 1, + "x1": 8395.935061280872, + "x2": 8394.202869190656, + "y1": 1550.3119207440438, + "y2": 176.68359320211448 + }, + { + "linetype": 1, + "x1": 8442.704247716727, + "x2": 8440.97205562651, + "y1": 1555.5084970146943, + "y2": 181.88016947276492 + }, + { + "linetype": 1, + "x1": 8491.205626242798, + "x2": 8489.47343415258, + "y1": 1553.7763049244775, + "y2": 180.1479773825481 + }, + { + "linetype": 1, + "x1": 8537.97481267865, + "x2": 8536.242620588433, + "y1": 1553.7763049244775, + "y2": 180.1479773825481 + }, + { + "linetype": 1, + "x1": 8588.20838329494, + "x2": 8586.476191204722, + "y1": 1552.0441128342607, + "y2": 178.4157852923313 + }, + { + "linetype": 1, + "x1": 8634.977569730792, + "x2": 8633.245377640575, + "y1": 1552.0441128342607, + "y2": 178.4157852923313 + }, + { + "linetype": 1, + "x1": 8683.478948256863, + "x2": 8681.746756166645, + "y1": 1552.0441128342607, + "y2": 178.4157852923313 + }, + { + "linetype": 1, + "x1": 8728.5159426025, + "x2": 8726.783750512284, + "y1": 1552.0441128342607, + "y2": 178.4157852923313 + }, + { + "linetype": 1, + "x1": 8780.481705309005, + "x2": 8778.749513218787, + "y1": 1552.0441128342607, + "y2": 178.4157852923313 + }, + { + "linetype": 1, + "x1": 8891.34199908288, + "x2": 8889.609806992663, + "y1": 1552.0441128342607, + "y2": 178.4157852923313 + }, + { + "linetype": 1, + "x1": 8938.111185518734, + "x2": 8936.378993428516, + "y1": 1550.3119207440438, + "y2": 176.68359320211448 + }, + { + "linetype": 1, + "x1": 8988.34475613502, + "x2": 8986.612564044804, + "y1": 1550.3119207440438, + "y2": 176.68359320211448 + }, + { + "linetype": 1, + "x1": 9036.846134661091, + "x2": 9035.113942570875, + "y1": 1548.579728653827, + "y2": 174.95140111189767 + }, + { + "linetype": 1, + "x1": 9085.347513187162, + "x2": 9083.615321096946, + "y1": 1550.3119207440438, + "y2": 176.68359320211448 + }, + { + "linetype": 1, + "x1": 9130.384507532799, + "x2": 9128.652315442581, + "y1": 1548.579728653827, + "y2": 174.95140111189767 + }, + { + "linetype": 1, + "x1": 9178.88588605887, + "x2": 9177.153693968652, + "y1": 1550.3119207440438, + "y2": 176.68359320211448 + }, + { + "linetype": 1, + "x1": 9227.38726458494, + "x2": 9225.655072494723, + "y1": 1552.0441128342607, + "y2": 178.4157852923313 + }, + { + "linetype": 1, + "x1": 9275.888643111011, + "x2": 9274.156451020794, + "y1": 1552.0441128342607, + "y2": 178.4157852923313 + }, + { + "linetype": 1, + "x1": 9324.390021637082, + "x2": 9322.657829546864, + "y1": 1548.579728653827, + "y2": 174.95140111189767 + }, + { + "linetype": 1, + "x1": 9371.159208072935, + "x2": 9369.427015982717, + "y1": 1550.3119207440438, + "y2": 176.68359320211448 + }, + { + "linetype": 1, + "x1": 9421.392778689224, + "x2": 9419.660586599006, + "y1": 1552.0441128342607, + "y2": 178.4157852923313 + }, + { + "linetype": 1, + "x1": 9468.161965125077, + "x2": 9466.429773034859, + "y1": 1552.0441128342607, + "y2": 178.4157852923313 + }, + { + "linetype": 1, + "x1": 9514.931151560932, + "x2": 9513.198959470716, + "y1": 1552.0441128342607, + "y2": 178.4157852923313 + }, + { + "linetype": 1, + "x1": 9565.164722177218, + "x2": 9563.432530087, + "y1": 1553.7763049244775, + "y2": 180.1479773825481 + }, + { + "linetype": 1, + "x1": 9613.666100703289, + "x2": 9611.933908613071, + "y1": 1555.5084970146943, + "y2": 181.88016947276492 + }, + { + "linetype": 1, + "x1": 9726.258586567381, + "x2": 9724.526394477165, + "y1": 1550.3119207440438, + "y2": 176.68359320211448 + }, + { + "linetype": 1, + "x1": 9773.027773003236, + "x2": 9771.295580913018, + "y1": 1550.3119207440438, + "y2": 176.68359320211448 + }, + { + "linetype": 1, + "x1": 9821.529151529307, + "x2": 9819.796959439089, + "y1": 1550.3119207440438, + "y2": 176.68359320211448 + }, + { + "linetype": 1, + "x1": 9870.030530055377, + "x2": 9868.29833796516, + "y1": 1550.3119207440438, + "y2": 176.68359320211448 + }, + { + "linetype": 1, + "x1": 9916.79971649123, + "x2": 9915.067524401013, + "y1": 1550.3119207440438, + "y2": 176.68359320211448 + }, + { + "linetype": 1, + "x1": 9965.301095017301, + "x2": 9963.568902927083, + "y1": 1552.0441128342607, + "y2": 178.4157852923313 + }, + { + "linetype": 1, + "x1": 10012.070281453156, + "x2": 10010.33808936294, + "y1": 1552.0441128342607, + "y2": 178.4157852923313 + }, + { + "linetype": 1, + "x1": 10057.107275798793, + "x2": 10055.375083708575, + "y1": 1550.3119207440438, + "y2": 176.68359320211448 + }, + { + "linetype": 1, + "x1": 10107.34084641508, + "x2": 10105.608654324864, + "y1": 1548.579728653827, + "y2": 174.95140111189767 + }, + { + "linetype": 1, + "x1": 10155.84222494115, + "x2": 10154.110032850935, + "y1": 1552.0441128342607, + "y2": 178.4157852923313 + }, + { + "linetype": 1, + "x1": 10206.075795557437, + "x2": 10204.34360346722, + "y1": 1553.7763049244775, + "y2": 180.1479773825481 + }, + { + "linetype": 1, + "x1": 10251.112789903074, + "x2": 10249.380597812858, + "y1": 1550.3119207440438, + "y2": 176.68359320211448 + }, + { + "linetype": 1, + "x1": 10303.078552609579, + "x2": 10301.346360519361, + "y1": 1548.579728653827, + "y2": 174.95140111189767 + }, + { + "linetype": 1, + "x1": 10348.115546955216, + "x2": 10346.383354865, + "y1": 1552.0441128342607, + "y2": 178.4157852923313 + }, + { + "linetype": 1, + "x1": 10396.616925481287, + "x2": 10394.88473339107, + "y1": 1552.0441128342607, + "y2": 178.4157852923313 + }, + { + "linetype": 1, + "x1": 10445.118304007357, + "x2": 10443.386111917142, + "y1": 1552.0441128342607, + "y2": 178.4157852923313 + }, + { + "linetype": 1, + "x1": 10561.175174051883, + "x2": 10559.442981961667, + "y1": 1548.579728653827, + "y2": 174.95140111189767 + }, + { + "linetype": 1, + "x1": 10606.789565760926, + "x2": 10603.902578943898, + "y1": 1550.311920744044, + "y2": 177.5496892472229 + }, + { + "linetype": 1, + "x1": 10652.981354833375, + "x2": 10650.094368016347, + "y1": 1548.86842733553, + "y2": 176.1061958387088 + }, + { + "linetype": 1, + "x1": 10702.060130722852, + "x2": 10699.173143905824, + "y1": 1548.86842733553, + "y2": 176.1061958387088 + }, + { + "linetype": 1, + "x1": 10748.251919795299, + "x2": 10745.364932978271, + "y1": 1550.311920744044, + "y2": 177.5496892472229 + }, + { + "linetype": 1, + "x1": 10795.88720227626, + "x2": 10793.000215459233, + "y1": 1548.86842733553, + "y2": 176.1061958387088 + }, + { + "linetype": 1, + "x1": 10844.965978165737, + "x2": 10842.07899134871, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 10892.6012606467, + "x2": 10889.714273829672, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 10943.12352994469, + "x2": 10940.236543127663, + "y1": 1548.86842733553, + "y2": 176.1061958387088 + }, + { + "linetype": 1, + "x1": 10987.871825608625, + "x2": 10984.984838791597, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 11035.507108089587, + "x2": 11032.62012127256, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 11086.029377387576, + "x2": 11083.142390570549, + "y1": 1548.86842733553, + "y2": 176.1061958387088 + }, + { + "linetype": 1, + "x1": 11133.664659868538, + "x2": 11130.77767305151, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 11182.743435758015, + "x2": 11179.856448940987, + "y1": 1545.981440518502, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 11228.935224830464, + "x2": 11226.048238013436, + "y1": 1548.86842733553, + "y2": 176.1061958387088 + }, + { + "linetype": 1, + "x1": 11276.570507311426, + "x2": 11273.683520494398, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 11387.719499767005, + "x2": 11384.832512949977, + "y1": 1550.311920744044, + "y2": 177.5496892472229 + }, + { + "linetype": 1, + "x1": 11436.798275656482, + "x2": 11433.911288839454, + "y1": 1548.86842733553, + "y2": 176.1061958387088 + }, + { + "linetype": 1, + "x1": 11485.877051545956, + "x2": 11482.990064728929, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 11534.955827435433, + "x2": 11532.068840618405, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 11582.591109916395, + "x2": 11579.704123099367, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 11630.226392397359, + "x2": 11627.339405580331, + "y1": 1548.86842733553, + "y2": 176.1061958387088 + }, + { + "linetype": 1, + "x1": 11679.305168286834, + "x2": 11676.418181469806, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 11725.496957359283, + "x2": 11722.609970542255, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 11773.132239840244, + "x2": 11770.245253023217, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 11822.211015729721, + "x2": 11819.324028912693, + "y1": 1545.981440518502, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 11869.846298210683, + "x2": 11866.959311393655, + "y1": 1548.86842733553, + "y2": 176.1061958387088 + }, + { + "linetype": 1, + "x1": 11914.594593874617, + "x2": 11911.70760705759, + "y1": 1548.86842733553, + "y2": 176.1061958387088 + }, + { + "linetype": 1, + "x1": 11963.673369764094, + "x2": 11960.786382947066, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 12012.75214565357, + "x2": 12009.865158836543, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 12061.830921543045, + "x2": 12058.943934726018, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 12109.46620402401, + "x2": 12106.579217206981, + "y1": 1545.981440518502, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 12220.615196479586, + "x2": 12217.728209662559, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 12272.58095918609, + "x2": 12269.693972369063, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 12318.77274825854, + "x2": 12315.885761441512, + "y1": 1548.86842733553, + "y2": 176.1061958387088 + }, + { + "linetype": 1, + "x1": 12363.521043922474, + "x2": 12360.634057105446, + "y1": 1548.86842733553, + "y2": 176.1061958387088 + }, + { + "linetype": 1, + "x1": 12411.156326403436, + "x2": 12408.269339586408, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 12461.678595701425, + "x2": 12458.791608884398, + "y1": 1545.981440518502, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 12509.313878182389, + "x2": 12506.426891365361, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 12556.949160663351, + "x2": 12554.062173846323, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 12603.140949735798, + "x2": 12600.25396291877, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 12655.106712442303, + "x2": 12652.219725625275, + "y1": 1550.311920744044, + "y2": 177.5496892472229 + }, + { + "linetype": 1, + "x1": 12698.411514697724, + "x2": 12695.524527880696, + "y1": 1544.537947109988, + "y2": 171.77571561316677 + }, + { + "linetype": 1, + "x1": 12748.933783995713, + "x2": 12746.046797178686, + "y1": 1550.311920744044, + "y2": 177.5496892472229 + }, + { + "linetype": 1, + "x1": 12798.01255988519, + "x2": 12795.125573068162, + "y1": 1548.86842733553, + "y2": 176.1061958387088 + }, + { + "linetype": 1, + "x1": 12844.204348957637, + "x2": 12841.31736214061, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 12893.283124847114, + "x2": 12890.396138030086, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 12942.36190073659, + "x2": 12939.474913919563, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 13054.954386600682, + "x2": 13052.067399783655, + "y1": 1548.86842733553, + "y2": 176.1061958387088 + }, + { + "linetype": 1, + "x1": 13102.589669081646, + "x2": 13099.702682264618, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 13148.781458154093, + "x2": 13145.894471337066, + "y1": 1548.86842733553, + "y2": 176.1061958387088 + }, + { + "linetype": 1, + "x1": 13197.86023404357, + "x2": 13194.973247226542, + "y1": 1548.86842733553, + "y2": 176.1061958387088 + }, + { + "linetype": 1, + "x1": 13245.495516524532, + "x2": 13242.608529707504, + "y1": 1545.981440518502, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 13293.130799005494, + "x2": 13290.243812188466, + "y1": 1548.86842733553, + "y2": 176.1061958387088 + }, + { + "linetype": 1, + "x1": 13340.766081486456, + "x2": 13337.879094669428, + "y1": 1548.86842733553, + "y2": 176.1061958387088 + }, + { + "linetype": 1, + "x1": 13388.40136396742, + "x2": 13385.514377150392, + "y1": 1548.86842733553, + "y2": 176.1061958387088 + }, + { + "linetype": 1, + "x1": 13437.480139856894, + "x2": 13434.593153039867, + "y1": 1548.86842733553, + "y2": 176.1061958387088 + }, + { + "linetype": 1, + "x1": 13485.115422337858, + "x2": 13482.22843552083, + "y1": 1548.86842733553, + "y2": 176.1061958387088 + }, + { + "linetype": 1, + "x1": 13532.75070481882, + "x2": 13529.863718001792, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 13583.27297411681, + "x2": 13580.385987299782, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 13629.464763189259, + "x2": 13626.57777637223, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 13678.543539078735, + "x2": 13675.656552261707, + "y1": 1545.981440518502, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 13724.735328151182, + "x2": 13721.848341334155, + "y1": 1545.981440518502, + "y2": 173.21920902168085 + }, + { + "linetype": 1, + "x1": 13775.257597449172, + "x2": 13772.370610632144, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 13884.963096496238, + "x2": 13882.07610967921, + "y1": 1548.86842733553, + "y2": 176.1061958387088 + }, + { + "linetype": 1, + "x1": 13932.5983789772, + "x2": 13929.711392160172, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 13981.677154866677, + "x2": 13978.790168049649, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 14029.312437347638, + "x2": 14026.42545053061, + "y1": 1544.537947109988, + "y2": 171.77571561316677 + }, + { + "linetype": 1, + "x1": 14078.391213237115, + "x2": 14075.504226420087, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 14126.026495718077, + "x2": 14123.13950890105, + "y1": 1544.537947109988, + "y2": 171.77571561316677 + }, + { + "linetype": 1, + "x1": 14173.661778199039, + "x2": 14170.774791382011, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + }, + { + "linetype": 1, + "x1": 14222.740554088516, + "x2": 14219.853567271488, + "y1": 1547.424933927016, + "y2": 174.6627024301947 + } + ], + "rows": [ + { + "linetype": 0, + "x1": 14274.995015476721, + "x2": 50.23357061628667, + "y1": 209.59524291623387, + "y2": 213.0596270966675 + }, + { + "linetype": 0, + "x1": 14274.995015476721, + "x2": 50.23357061628667, + "y1": 265.0253898031718, + "y2": 268.4897739836054 + }, + { + "linetype": 0, + "x1": 14274.995015476721, + "x2": 50.23357061628667, + "y1": 313.52676832924243, + "y2": 316.99115250967606 + }, + { + "linetype": 0, + "x1": 14276.727207566939, + "x2": 51.96576270650439, + "y1": 368.9569152161803, + "y2": 372.4212993966139 + }, + { + "linetype": 0, + "x1": 14274.995015476721, + "x2": 50.23357061628667, + "y1": 417.45829374225093, + "y2": 420.92267792268456 + }, + { + "linetype": 0, + "x1": 14271.530631296288, + "x2": 46.769186435853044, + "y1": 474.62063271940565, + "y2": 478.0850168998393 + }, + { + "linetype": 0, + "x1": 14274.995015476721, + "x2": 50.23357061628667, + "y1": 523.1220112454763, + "y2": 526.5863954259099 + }, + { + "linetype": 0, + "x1": 14276.727207566939, + "x2": 51.96576270650439, + "y1": 578.5521581324142, + "y2": 582.0165423128478 + }, + { + "linetype": 0, + "x1": 14273.262823386505, + "x2": 48.501378526070766, + "y1": 625.321344568268, + "y2": 628.7857287487017 + }, + { + "linetype": 0, + "x1": 14271.530631296288, + "x2": 46.769186435853044, + "y1": 680.7514914552058, + "y2": 684.2158756356395 + }, + { + "linetype": 0, + "x1": 14273.262823386505, + "x2": 48.501378526070766, + "y1": 729.2528699812765, + "y2": 732.7172541617101 + }, + { + "linetype": 0, + "x1": 14273.262823386505, + "x2": 48.501378526070766, + "y1": 784.6830168682144, + "y2": 788.147401048648 + }, + { + "linetype": 0, + "x1": 14274.995015476721, + "x2": 50.23357061628667, + "y1": 834.9165874845019, + "y2": 838.3809716649355 + }, + { + "linetype": 0, + "x1": 14278.459399657155, + "x2": 53.697954796720296, + "y1": 890.3467343714398, + "y2": 893.8111185518734 + }, + { + "linetype": 0, + "x1": 14273.262823386505, + "x2": 48.501378526070766, + "y1": 937.1159208072936, + "y2": 940.5803049877272 + }, + { + "linetype": 0, + "x1": 14273.262823386505, + "x2": 48.501378526070766, + "y1": 994.2782597844483, + "y2": 997.742643964882 + }, + { + "linetype": 0, + "x1": 14274.995015476721, + "x2": 50.23357061628667, + "y1": 1041.0474462203022, + "y2": 1044.5118304007358 + }, + { + "linetype": 0, + "x1": 14276.727207566939, + "x2": 51.96576270650439, + "y1": 1096.47759310724, + "y2": 1099.9419772876736 + }, + { + "linetype": 0, + "x1": 14274.995015476721, + "x2": 50.23357061628667, + "y1": 1146.7111637235275, + "y2": 1150.1755479039612 + }, + { + "linetype": 0, + "x1": 14276.727207566939, + "x2": 51.96576270650439, + "y1": 1203.8735027006821, + "y2": 1207.3378868811158 + }, + { + "linetype": 0, + "x1": 14274.995015476721, + "x2": 50.23357061628667, + "y1": 1250.642689136536, + "y2": 1254.1070733169697 + }, + { + "linetype": 0, + "x1": 14274.995015476721, + "x2": 50.23357061628667, + "y1": 1306.0728360234739, + "y2": 1309.5372202039075 + }, + { + "linetype": 0, + "x1": 14274.995015476721, + "x2": 50.23357061628667, + "y1": 1351.109830369111, + "y2": 1354.5742145495446 + }, + { + "linetype": 0, + "x1": 14276.727207566939, + "x2": 51.96576270650439, + "y1": 1410.0043614364824, + "y2": 1413.468745616916 + }, + { + "linetype": 0, + "x1": 14276.727207566939, + "x2": 51.96576270650439, + "y1": 1456.7735478723362, + "y2": 1460.2379320527698 + }, + { + "linetype": 0, + "x1": 14274.995015476721, + "x2": 50.23357061628667, + "y1": 1513.935886849491, + "y2": 1517.4002710299246 + } + ], + "settings": { + "aligner": "RomAlignerReliable", + "alignthreshold": 5, + "arch": "", + "autocomment": false, + "bitsize": 13, + "blue": 0, + "crosshaircolor": "#000000", + "gatorom": "-r 0 ", + "green": 70, + "inverted": false, + "linecolor": "#000000", + "red": 0, + "sampler": "Tall", + "samplersize": 87, + "selectioncolor": "#00ff00", + "showbits": false, + "showdamage": false, + "yararule": "" + } +} diff --git a/v20/images/activation_pla_01.pbm b/v20/images/activation_pla_01.pbm new file mode 100644 index 0000000..14dcb12 Binary files /dev/null and b/v20/images/activation_pla_01.pbm differ diff --git a/v20/images/activation_pla_01.png b/v20/images/activation_pla_01.png new file mode 100644 index 0000000..bcfb15e Binary files /dev/null and b/v20/images/activation_pla_01.png differ diff --git a/v20/images/microcode_bit_check.jpg b/v20/images/microcode_bit_check.jpg new file mode 100644 index 0000000..d5e1064 Binary files /dev/null and b/v20/images/microcode_bit_check.jpg differ diff --git a/v20/images/microcode_crop_01.jpg b/v20/images/microcode_crop_01.jpg new file mode 100644 index 0000000..04ec912 Binary files /dev/null and b/v20/images/microcode_crop_01.jpg differ diff --git a/v20/images/microcode_crop_01.jpg.json b/v20/images/microcode_crop_01.jpg.json new file mode 100644 index 0000000..18930e9 --- /dev/null +++ b/v20/images/microcode_crop_01.jpg.json @@ -0,0 +1,3476 @@ +{ + "00about": "Export from MaskROMTool by Travis Goodspeed", + "00github": "http://github.com/travisgoodspeed/maskromtool/", + "00imagefilename": "D:/newdev/my_projects/marty_docs/CPUs/CPU_V20/microcode_crop_01.jpg", + "00version": "2025.03.30", + "bitfixes": [ + ], + "cols": [ + { + "linetype": 1, + "x1": 92.49870866778849, + "x2": 93.48273748340326, + "y1": 6511.318672922941, + "y2": 20.664605127910363 + }, + { + "linetype": 1, + "x1": 147.60432234221568, + "x2": 148.58835115783046, + "y1": 6509.350615291712, + "y2": 18.696547496680978 + }, + { + "linetype": 1, + "x1": 195.82173430733945, + "x2": 196.8057631229542, + "y1": 6510.334644107326, + "y2": 19.68057631229567 + }, + { + "linetype": 1, + "x1": 252.8954056129962, + "x2": 253.87943442861098, + "y1": 6510.334644107326, + "y2": 19.68057631229567 + }, + { + "linetype": 1, + "x1": 301.11281757812, + "x2": 302.0968463937347, + "y1": 6510.334644107326, + "y2": 19.68057631229567 + }, + { + "linetype": 1, + "x1": 356.2184312525472, + "x2": 357.20246006816194, + "y1": 6508.366586476097, + "y2": 17.712518681066285 + }, + { + "linetype": 1, + "x1": 405.41987203328574, + "x2": 406.4039008489005, + "y1": 6509.350615291712, + "y2": 18.696547496680978 + }, + { + "linetype": 1, + "x1": 460.5254857077129, + "x2": 461.50951452332765, + "y1": 6510.334644107326, + "y2": 19.68057631229567 + }, + { + "linetype": 1, + "x1": 507.75886885722196, + "x2": 508.7428976728367, + "y1": 6509.350615291712, + "y2": 18.696547496680978 + }, + { + "linetype": 1, + "x1": 564.8325401628787, + "x2": 565.8165689784935, + "y1": 6510.334644107326, + "y2": 19.68057631229567 + }, + { + "linetype": 1, + "x1": 613.0499521280025, + "x2": 614.0339809436173, + "y1": 6510.334644107326, + "y2": 19.68057631229567 + }, + { + "linetype": 1, + "x1": 669.1395946180444, + "x2": 670.1236234336592, + "y1": 6510.334644107326, + "y2": 19.68057631229567 + }, + { + "linetype": 1, + "x1": 717.3570065831682, + "x2": 718.341035398783, + "y1": 6509.350615291712, + "y2": 18.696547496680978 + }, + { + "linetype": 1, + "x1": 772.4626202575954, + "x2": 773.4466490732102, + "y1": 6509.350615291712, + "y2": 18.696547496680978 + }, + { + "linetype": 1, + "x1": 820.6800322227192, + "x2": 821.664061038334, + "y1": 6510.334644107326, + "y2": 19.68057631229567 + }, + { + "linetype": 1, + "x1": 876.7696747127611, + "x2": 877.7537035283759, + "y1": 6510.334644107326, + "y2": 19.68057631229567 + }, + { + "linetype": 1, + "x1": 925.9711154934997, + "x2": 926.9551443091145, + "y1": 6509.350615291712, + "y2": 18.696547496680978 + }, + { + "linetype": 1, + "x1": 982.0607579835416, + "x2": 983.0447867991564, + "y1": 6509.350615291712, + "y2": 18.696547496680978 + }, + { + "linetype": 1, + "x1": 1030.2781699486654, + "x2": 1031.2621987642801, + "y1": 6510.334644107326, + "y2": 19.68057631229567 + }, + { + "linetype": 1, + "x1": 1086.3678124387075, + "x2": 1087.3518412543222, + "y1": 6510.334644107326, + "y2": 19.68057631229567 + }, + { + "linetype": 1, + "x1": 1132.6171667726016, + "x2": 1133.6011955882163, + "y1": 6511.318672922941, + "y2": 20.664605127910363 + }, + { + "linetype": 1, + "x1": 1188.7068092626437, + "x2": 1189.6908380782584, + "y1": 6513.28673055417, + "y2": 22.63266275913975 + }, + { + "linetype": 1, + "x1": 1237.9082500433822, + "x2": 1238.8922788589969, + "y1": 6511.318672922941, + "y2": 20.664605127910363 + }, + { + "linetype": 1, + "x1": 1293.0138637178093, + "x2": 1293.997892533424, + "y1": 6511.318672922941, + "y2": 20.664605127910363 + }, + { + "linetype": 1, + "x1": 1342.215304498548, + "x2": 1343.1993333141627, + "y1": 6512.302701738556, + "y2": 21.648633943525056 + }, + { + "linetype": 1, + "x1": 1398.3049469885898, + "x2": 1399.2889758042045, + "y1": 6510.334644107326, + "y2": 19.68057631229567 + }, + { + "linetype": 1, + "x1": 1445.538330138099, + "x2": 1446.5223589537136, + "y1": 6512.302701738556, + "y2": 21.648633943525056 + }, + { + "linetype": 1, + "x1": 1501.627972628141, + "x2": 1502.6120014437556, + "y1": 6510.334644107326, + "y2": 19.68057631229567 + }, + { + "linetype": 1, + "x1": 1549.8453845932645, + "x2": 1550.8294134088792, + "y1": 6512.302701738556, + "y2": 21.648633943525056 + }, + { + "linetype": 1, + "x1": 1604.9509982676918, + "x2": 1605.9350270833065, + "y1": 6512.302701738556, + "y2": 21.648633943525056 + }, + { + "linetype": 1, + "x1": 1653.9737535090226, + "x2": 1654.9577823246373, + "y1": 6511.200388129249, + "y2": 20.546320334218763 + }, + { + "linetype": 1, + "x1": 1709.3411037482167, + "x2": 1710.3251325638314, + "y1": 6510.193709033992, + "y2": 19.53964123896094 + }, + { + "linetype": 1, + "x1": 1757.6617003206045, + "x2": 1758.6457291362192, + "y1": 6510.193709033992, + "y2": 19.53964123896094 + }, + { + "linetype": 1, + "x1": 1814.035729655057, + "x2": 1815.0197584706716, + "y1": 6508.180350843476, + "y2": 17.526283048445293 + }, + { + "linetype": 1, + "x1": 1861.3496471321866, + "x2": 1862.3336759478013, + "y1": 6511.200388129249, + "y2": 20.546320334218763 + }, + { + "linetype": 1, + "x1": 1916.7169973713808, + "x2": 1917.7010261869955, + "y1": 6512.207067224508, + "y2": 21.552999429477495 + }, + { + "linetype": 1, + "x1": 1965.0375939437686, + "x2": 1966.0216227593833, + "y1": 6512.207067224508, + "y2": 21.552999429477495 + }, + { + "linetype": 1, + "x1": 2021.411623278221, + "x2": 2022.3956520938357, + "y1": 6511.200388129249, + "y2": 20.546320334218763 + }, + { + "linetype": 1, + "x1": 2067.7188616600924, + "x2": 2068.702890475707, + "y1": 6512.207067224508, + "y2": 21.552999429477495 + }, + { + "linetype": 1, + "x1": 2125.099570089803, + "x2": 2126.0835989054176, + "y1": 6511.200388129249, + "y2": 20.546320334218763 + }, + { + "linetype": 1, + "x1": 2172.413487566933, + "x2": 2173.3975163825476, + "y1": 6511.200388129249, + "y2": 20.546320334218763 + }, + { + "linetype": 1, + "x1": 2228.787516901385, + "x2": 2229.7715457169998, + "y1": 6510.193709033992, + "y2": 19.53964123896094 + }, + { + "linetype": 1, + "x1": 2277.108113473773, + "x2": 2278.0921422893875, + "y1": 6510.193709033992, + "y2": 19.53964123896094 + }, + { + "linetype": 1, + "x1": 2333.482142808225, + "x2": 2334.4661716238397, + "y1": 6509.187029938734, + "y2": 18.532962143703116 + }, + { + "linetype": 1, + "x1": 2381.802739380613, + "x2": 2382.7867681962275, + "y1": 6509.187029938734, + "y2": 18.532962143703116 + }, + { + "linetype": 1, + "x1": 2439.1834478103233, + "x2": 2440.167476625938, + "y1": 6509.187029938734, + "y2": 18.532962143703116 + }, + { + "linetype": 1, + "x1": 2483.477328001679, + "x2": 2484.4613568172936, + "y1": 6508.180350843476, + "y2": 17.526283048445293 + }, + { + "linetype": 1, + "x1": 2540.8580364313893, + "x2": 2541.842065247004, + "y1": 6508.180350843476, + "y2": 17.526283048445293 + }, + { + "linetype": 1, + "x1": 2589.178633003777, + "x2": 2590.162661819392, + "y1": 6510.193709033992, + "y2": 19.53964123896094 + }, + { + "linetype": 1, + "x1": 2645.5526623382293, + "x2": 2646.536691153844, + "y1": 6508.180350843476, + "y2": 17.526283048445293 + }, + { + "linetype": 1, + "x1": 2693.438155276782, + "x2": 2694.4221840923965, + "y1": 6509.142208585556, + "y2": 18.488140790524994 + }, + { + "linetype": 1, + "x1": 2749.32241632164, + "x2": 2750.3064451372547, + "y1": 6508.22607315859, + "y2": 17.572005363559583 + }, + { + "linetype": 1, + "x1": 2799.709864804709, + "x2": 2800.6938936203237, + "y1": 6509.142208585556, + "y2": 18.488140790524994 + }, + { + "linetype": 1, + "x1": 2853.761854995638, + "x2": 2854.7458838112525, + "y1": 6508.22607315859, + "y2": 17.572005363559583 + }, + { + "linetype": 1, + "x1": 2901.400897197812, + "x2": 2902.3849260134266, + "y1": 6510.974479439486, + "y2": 20.320411644454907 + }, + { + "linetype": 1, + "x1": 2958.201293669635, + "x2": 2959.18532248525, + "y1": 6510.974479439486, + "y2": 20.320411644454907 + }, + { + "linetype": 1, + "x1": 3005.8403358718097, + "x2": 3006.8243646874243, + "y1": 6510.974479439486, + "y2": 20.320411644454907 + }, + { + "linetype": 1, + "x1": 3061.724596916668, + "x2": 3062.7086257322826, + "y1": 6510.974479439486, + "y2": 20.320411644454907 + }, + { + "linetype": 1, + "x1": 3108.4475036918775, + "x2": 3109.431532507492, + "y1": 6510.974479439486, + "y2": 20.320411644454907 + }, + { + "linetype": 1, + "x1": 3165.2479001637007, + "x2": 3166.2319289793154, + "y1": 6510.974479439486, + "y2": 20.320411644454907 + }, + { + "linetype": 1, + "x1": 3213.80307779284, + "x2": 3214.787106608455, + "y1": 6510.974479439486, + "y2": 20.320411644454907 + }, + { + "linetype": 1, + "x1": 3269.6873388376985, + "x2": 3270.671367653313, + "y1": 6511.89061486645, + "y2": 21.23654707141941 + }, + { + "linetype": 1, + "x1": 3318.2425164668375, + "x2": 3319.226545282452, + "y1": 6510.05834401252, + "y2": 19.404276217489496 + }, + { + "linetype": 1, + "x1": 3373.2106420847313, + "x2": 3374.194670900346, + "y1": 6509.142208585556, + "y2": 18.488140790524994 + }, + { + "linetype": 1, + "x1": 3422.6819551408353, + "x2": 3423.66598395645, + "y1": 6510.05834401252, + "y2": 19.404276217489496 + }, + { + "linetype": 1, + "x1": 3477.650080758729, + "x2": 3478.6341095743437, + "y1": 6510.05834401252, + "y2": 19.404276217489496 + }, + { + "linetype": 1, + "x1": 3525.289122960903, + "x2": 3526.273151776518, + "y1": 6510.974479439486, + "y2": 20.320411644454907 + }, + { + "linetype": 1, + "x1": 3583.0056548596913, + "x2": 3583.989683675306, + "y1": 6509.142208585556, + "y2": 18.488140790524994 + }, + { + "linetype": 1, + "x1": 3629.728561634901, + "x2": 3630.7125904505156, + "y1": 6510.974479439486, + "y2": 20.320411644454907 + }, + { + "linetype": 1, + "x1": 3686.528958106724, + "x2": 3687.5129869223388, + "y1": 6510.05834401252, + "y2": 19.404276217489496 + }, + { + "linetype": 1, + "x1": 3735.0841357358636, + "x2": 3736.0681645514783, + "y1": 6510.974479439486, + "y2": 20.320411644454907 + }, + { + "linetype": 1, + "x1": 3790.052261353757, + "x2": 3791.0362901693716, + "y1": 6510.974479439486, + "y2": 20.320411644454907 + }, + { + "linetype": 1, + "x1": 3839.523574409861, + "x2": 3840.5076032254756, + "y1": 6510.974479439486, + "y2": 20.320411644454907 + }, + { + "linetype": 1, + "x1": 3893.5755646007897, + "x2": 3894.5595934164044, + "y1": 6510.05834401252, + "y2": 19.404276217489496 + }, + { + "linetype": 1, + "x1": 3940.2984713759993, + "x2": 3941.282500191614, + "y1": 6510.05834401252, + "y2": 19.404276217489496 + }, + { + "linetype": 1, + "x1": 3998.0150032747874, + "x2": 3998.999032090402, + "y1": 6509.142208585556, + "y2": 18.488140790524994 + }, + { + "linetype": 1, + "x1": 4045.6540454769615, + "x2": 4046.638074292576, + "y1": 6509.142208585556, + "y2": 18.488140790524994 + }, + { + "linetype": 1, + "x1": 4102.454441948785, + "x2": 4103.438470764399, + "y1": 6510.05834401252, + "y2": 19.404276217489496 + }, + { + "linetype": 1, + "x1": 4150.09348415096, + "x2": 4151.077512966574, + "y1": 6510.974479439486, + "y2": 20.320411644454907 + }, + { + "linetype": 1, + "x1": 4207.810016049748, + "x2": 4208.794044865363, + "y1": 6509.142208585556, + "y2": 18.488140790524994 + }, + { + "linetype": 1, + "x1": 4255.449058251922, + "x2": 4256.433087067537, + "y1": 6511.89061486645, + "y2": 21.23654707141941 + }, + { + "linetype": 1, + "x1": 4309.50104844285, + "x2": 4310.485077258465, + "y1": 6513.72288572038, + "y2": 23.06881792534932 + }, + { + "linetype": 1, + "x1": 4358.972361498954, + "x2": 4359.956390314569, + "y1": 6511.89061486645, + "y2": 21.23654707141941 + }, + { + "linetype": 1, + "x1": 4413.024351689884, + "x2": 4414.008380505498, + "y1": 6511.89061486645, + "y2": 21.23654707141941 + }, + { + "linetype": 1, + "x1": 4461.579529319022, + "x2": 4462.563558134637, + "y1": 6511.89061486645, + "y2": 21.23654707141941 + }, + { + "linetype": 1, + "x1": 4517.463790363881, + "x2": 4518.447819179496, + "y1": 6510.05834401252, + "y2": 19.404276217489496 + }, + { + "linetype": 1, + "x1": 4567.85123884695, + "x2": 4568.835267662565, + "y1": 6511.89061486645, + "y2": 21.23654707141941 + }, + { + "linetype": 1, + "x1": 4622.819364464844, + "x2": 4623.803393280458, + "y1": 6510.05834401252, + "y2": 19.404276217489496 + }, + { + "linetype": 1, + "x1": 4670.458406667018, + "x2": 4671.442435482632, + "y1": 6510.974479439486, + "y2": 20.320411644454907 + }, + { + "linetype": 1, + "x1": 4725.426532284911, + "x2": 4726.410561100526, + "y1": 6508.22607315859, + "y2": 17.572005363559583 + }, + { + "linetype": 1, + "x1": 4774.897845341015, + "x2": 4775.88187415663, + "y1": 6510.974479439486, + "y2": 20.320411644454907 + }, + { + "linetype": 1, + "x1": 4829.865970958909, + "x2": 4830.849999774524, + "y1": 6509.142208585556, + "y2": 18.488140790524994 + }, + { + "linetype": 1, + "x1": 4879.337284015013, + "x2": 4880.321312830628, + "y1": 6509.142208585556, + "y2": 18.488140790524994 + }, + { + "linetype": 1, + "x1": 4934.305409632907, + "x2": 4935.289438448522, + "y1": 6508.22607315859, + "y2": 17.572005363559583 + }, + { + "linetype": 1, + "x1": 4981.944451835081, + "x2": 4982.928480650696, + "y1": 6509.142208585556, + "y2": 18.488140790524994 + }, + { + "linetype": 1, + "x1": 5039.660983733869, + "x2": 5040.645012549484, + "y1": 6509.142208585556, + "y2": 18.488140790524994 + }, + { + "linetype": 1, + "x1": 5087.300025936043, + "x2": 5088.284054751658, + "y1": 6509.142208585556, + "y2": 18.488140790524994 + }, + { + "linetype": 1, + "x1": 5142.268151553937, + "x2": 5143.252180369552, + "y1": 6507.309937731626, + "y2": 16.65586993659508 + }, + { + "linetype": 1, + "x1": 5192.6556000370065, + "x2": 5193.639628852621, + "y1": 6509.142208585556, + "y2": 18.488140790524994 + }, + { + "linetype": 1, + "x1": 5247.623725654899, + "x2": 5248.607754470514, + "y1": 6509.142208585556, + "y2": 18.488140790524994 + }, + { + "linetype": 1, + "x1": 5294.346632430109, + "x2": 5295.330661245724, + "y1": 6508.22607315859, + "y2": 17.572005363559583 + }, + { + "linetype": 1, + "x1": 5350.230893474967, + "x2": 5351.214922290582, + "y1": 6506.393802304661, + "y2": 15.73973450963058 + }, + { + "linetype": 1, + "x1": 5398.786071104107, + "x2": 5399.770099919721, + "y1": 6509.142208585556, + "y2": 18.488140790524994 + }, + { + "linetype": 1, + "x1": 5453.754196722, + "x2": 5454.738225537615, + "y1": 6510.05834401252, + "y2": 19.404276217489496 + }, + { + "linetype": 1, + "x1": 5502.30937435114, + "x2": 5503.293403166755, + "y1": 6509.142208585556, + "y2": 18.488140790524994 + }, + { + "linetype": 1, + "x1": 5560.025906249928, + "x2": 5561.009935065543, + "y1": 6510.05834401252, + "y2": 19.404276217489496 + }, + { + "linetype": 1, + "x1": 5606.748813025137, + "x2": 5607.7328418407515, + "y1": 6510.05834401252, + "y2": 19.404276217489496 + }, + { + "linetype": 1, + "x1": 5664.465344923925, + "x2": 5665.44937373954, + "y1": 6509.142208585556, + "y2": 18.488140790524994 + }, + { + "linetype": 1, + "x1": 5710.27211627217, + "x2": 5711.256145087785, + "y1": 6509.142208585556, + "y2": 18.488140790524994 + }, + { + "linetype": 1, + "x1": 5767.072512743994, + "x2": 5768.056541559608, + "y1": 6509.142208585556, + "y2": 18.488140790524994 + }, + { + "linetype": 1, + "x1": 5814.711554946168, + "x2": 5815.6955837617825, + "y1": 6511.89061486645, + "y2": 21.23654707141941 + }, + { + "linetype": 1, + "x1": 5873.34422227192, + "x2": 5874.328251087535, + "y1": 6511.89061486645, + "y2": 21.23654707141941 + }, + { + "linetype": 1, + "x1": 5917.318722766236, + "x2": 5918.30275158185, + "y1": 6510.974479439486, + "y2": 20.320411644454907 + }, + { + "linetype": 1, + "x1": 5975.035254665024, + "x2": 5976.0192834806385, + "y1": 6509.142208585556, + "y2": 18.488140790524994 + }, + { + "linetype": 1, + "x1": 6022.674296867198, + "x2": 6023.658325682813, + "y1": 6509.142208585556, + "y2": 18.488140790524994 + }, + { + "linetype": 1, + "x1": 6079.4746933390215, + "x2": 6080.458722154636, + "y1": 6509.142208585556, + "y2": 18.488140790524994 + }, + { + "linetype": 1, + "x1": 6126.197600114231, + "x2": 6127.181628929846, + "y1": 6510.05834401252, + "y2": 19.404276217489496 + }, + { + "linetype": 1, + "x1": 6183.914132013019, + "x2": 6184.898160828634, + "y1": 6510.05834401252, + "y2": 19.404276217489496 + }, + { + "linetype": 1, + "x1": 6231.553174215193, + "x2": 6232.537203030808, + "y1": 6510.05834401252, + "y2": 19.404276217489496 + }, + { + "linetype": 1, + "x1": 6288.353570687017, + "x2": 6289.337599502632, + "y1": 6510.974479439486, + "y2": 20.320411644454907 + }, + { + "linetype": 1, + "x1": 6335.992612889191, + "x2": 6336.976641704806, + "y1": 6510.05834401252, + "y2": 19.404276217489496 + }, + { + "linetype": 1, + "x1": 6390.960738507085, + "x2": 6391.9447673227, + "y1": 6509.142208585556, + "y2": 18.488140790524994 + }, + { + "linetype": 1, + "x1": 6439.5159161362235, + "x2": 6440.499944951838, + "y1": 6508.22607315859, + "y2": 17.572005363559583 + }, + { + "linetype": 1, + "x1": 6495.400177181082, + "x2": 6496.384205996696, + "y1": 6509.142208585556, + "y2": 18.488140790524994 + }, + { + "linetype": 1, + "x1": 6543.039219383257, + "x2": 6544.023248198871, + "y1": 6509.142208585556, + "y2": 18.488140790524994 + }, + { + "linetype": 1, + "x1": 6599.8396158550795, + "x2": 6600.823644670694, + "y1": 6509.142208585556, + "y2": 18.488140790524994 + }, + { + "linetype": 1, + "x1": 6645.646387203325, + "x2": 6646.630416018939, + "y1": 6508.22607315859, + "y2": 17.572005363559583 + }, + { + "linetype": 1, + "x1": 6703.374643331798, + "x2": 6704.358672147413, + "y1": 6509.142208585556, + "y2": 18.488140790524994 + }, + { + "linetype": 1, + "x1": 7479.329625741376, + "x2": 7480.24576116834, + "y1": 6510.05834401252, + "y2": 20.154979393227222 + }, + { + "linetype": 1, + "x1": 7536.1300222131995, + "x2": 7537.046157640164, + "y1": 6510.974479439486, + "y2": 21.071114820192633 + }, + { + "linetype": 1, + "x1": 7584.685199842338, + "x2": 7585.601335269303, + "y1": 6510.974479439486, + "y2": 21.071114820192633 + }, + { + "linetype": 1, + "x1": 7639.653325460232, + "x2": 7640.569460887196, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 7688.208503089371, + "x2": 7689.124638516336, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 7744.09276413423, + "x2": 7745.008899561194, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 7791.731806336404, + "x2": 7792.647941763368, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 7848.532202808227, + "x2": 7849.448338235192, + "y1": 6508.22607315859, + "y2": 18.32270853929731 + }, + { + "linetype": 1, + "x1": 7896.171245010401, + "x2": 7897.087380437366, + "y1": 6510.05834401252, + "y2": 20.154979393227222 + }, + { + "linetype": 1, + "x1": 7952.05550605526, + "x2": 7952.971641482224, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 8000.610683684399, + "x2": 8001.526819111364, + "y1": 6508.22607315859, + "y2": 18.32270853929731 + }, + { + "linetype": 1, + "x1": 8056.494944729257, + "x2": 8057.411080156222, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 8103.217851504467, + "x2": 8104.1339869314315, + "y1": 6508.22607315859, + "y2": 18.32270853929731 + }, + { + "linetype": 1, + "x1": 8159.102112549325, + "x2": 8160.01824797629, + "y1": 6507.309937731626, + "y2": 17.406573112332808 + }, + { + "linetype": 1, + "x1": 8208.57342560543, + "x2": 8209.489561032395, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 8264.457686650288, + "x2": 8265.373822077254, + "y1": 6510.05834401252, + "y2": 20.154979393227222 + }, + { + "linetype": 1, + "x1": 8312.096728852463, + "x2": 8313.012864279426, + "y1": 6508.22607315859, + "y2": 18.32270853929731 + }, + { + "linetype": 1, + "x1": 8368.897125324285, + "x2": 8369.813260751249, + "y1": 6508.22607315859, + "y2": 18.32270853929731 + }, + { + "linetype": 1, + "x1": 8416.53616752646, + "x2": 8417.452302953425, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 8472.420428571319, + "x2": 8473.336563998284, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 8520.059470773493, + "x2": 8520.975606200456, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 8575.943731818352, + "x2": 8576.859867245315, + "y1": 6508.22607315859, + "y2": 18.32270853929731 + }, + { + "linetype": 1, + "x1": 8625.415044874455, + "x2": 8626.331180301418, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 8680.383170492349, + "x2": 8681.299305919314, + "y1": 6510.05834401252, + "y2": 20.154979393227222 + }, + { + "linetype": 1, + "x1": 8728.022212694523, + "x2": 8728.938348121486, + "y1": 6508.22607315859, + "y2": 18.32270853929731 + }, + { + "linetype": 1, + "x1": 8783.906473739382, + "x2": 8784.822609166346, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 8832.461651368521, + "x2": 8833.377786795485, + "y1": 6510.05834401252, + "y2": 20.154979393227222 + }, + { + "linetype": 1, + "x1": 8888.345912413379, + "x2": 8889.262047840344, + "y1": 6510.974479439486, + "y2": 21.071114820192633 + }, + { + "linetype": 1, + "x1": 8936.901090042518, + "x2": 8937.817225469484, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 8992.785351087377, + "x2": 8993.701486514343, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 9040.424393289552, + "x2": 9041.340528716515, + "y1": 6510.05834401252, + "y2": 20.154979393227222 + }, + { + "linetype": 1, + "x1": 9097.224789761374, + "x2": 9098.140925188338, + "y1": 6510.974479439486, + "y2": 21.071114820192633 + }, + { + "linetype": 1, + "x1": 9143.947696536585, + "x2": 9144.86383196355, + "y1": 6510.05834401252, + "y2": 20.154979393227222 + }, + { + "linetype": 1, + "x1": 9200.748093008408, + "x2": 9201.664228435373, + "y1": 6507.309937731626, + "y2": 17.406573112332808 + }, + { + "linetype": 1, + "x1": 9248.387135210582, + "x2": 9249.303270637545, + "y1": 6508.22607315859, + "y2": 18.32270853929731 + }, + { + "linetype": 1, + "x1": 9302.43912540151, + "x2": 9303.355260828474, + "y1": 6508.22607315859, + "y2": 18.32270853929731 + }, + { + "linetype": 1, + "x1": 9351.910438457615, + "x2": 9352.82657388458, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 9407.794699502472, + "x2": 9408.710834929436, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 9456.349877131612, + "x2": 9457.266012558575, + "y1": 6510.05834401252, + "y2": 20.154979393227222 + }, + { + "linetype": 1, + "x1": 9512.23413817647, + "x2": 9513.150273603434, + "y1": 6510.05834401252, + "y2": 20.154979393227222 + }, + { + "linetype": 1, + "x1": 9559.873180378645, + "x2": 9560.78931580561, + "y1": 6510.05834401252, + "y2": 20.154979393227222 + }, + { + "linetype": 1, + "x1": 9615.757441423504, + "x2": 9616.67357685047, + "y1": 6510.05834401252, + "y2": 20.154979393227222 + }, + { + "linetype": 1, + "x1": 9664.312619052642, + "x2": 9665.228754479605, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 9720.196880097501, + "x2": 9721.113015524465, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 9768.75205772664, + "x2": 9769.668193153604, + "y1": 6510.05834401252, + "y2": 20.154979393227222 + }, + { + "linetype": 1, + "x1": 9824.636318771498, + "x2": 9825.552454198463, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 9871.359225546708, + "x2": 9872.275360973672, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 9926.327351164602, + "x2": 9927.243486591567, + "y1": 6508.22607315859, + "y2": 18.32270853929731 + }, + { + "linetype": 1, + "x1": 9976.71479964767, + "x2": 9977.630935074634, + "y1": 6507.309937731626, + "y2": 17.406573112332808 + }, + { + "linetype": 1, + "x1": 10034.431331546459, + "x2": 10035.347466973424, + "y1": 6507.309937731626, + "y2": 17.406573112332808 + }, + { + "linetype": 1, + "x1": 10082.070373748633, + "x2": 10082.986509175596, + "y1": 6507.309937731626, + "y2": 17.406573112332808 + }, + { + "linetype": 1, + "x1": 10136.122363939561, + "x2": 10137.038499366525, + "y1": 6508.22607315859, + "y2": 18.32270853929731 + }, + { + "linetype": 1, + "x1": 10185.593676995666, + "x2": 10186.509812422632, + "y1": 6507.309937731626, + "y2": 17.406573112332808 + }, + { + "linetype": 1, + "x1": 10240.56180261356, + "x2": 10241.477938040523, + "y1": 6506.393802304661, + "y2": 16.490437685368306 + }, + { + "linetype": 1, + "x1": 10289.1169802427, + "x2": 10290.033115669663, + "y1": 6506.393802304661, + "y2": 16.490437685368306 + }, + { + "linetype": 1, + "x1": 10345.001241287557, + "x2": 10345.917376714522, + "y1": 6505.477666877696, + "y2": 15.574302258402895 + }, + { + "linetype": 1, + "x1": 10393.556418916696, + "x2": 10394.472554343662, + "y1": 6505.477666877696, + "y2": 15.574302258402895 + }, + { + "linetype": 1, + "x1": 10448.52454453459, + "x2": 10449.440679961554, + "y1": 6505.477666877696, + "y2": 15.574302258402895 + }, + { + "linetype": 1, + "x1": 10497.07972216373, + "x2": 10497.995857590693, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 10552.047847781623, + "x2": 10552.963983208589, + "y1": 6510.05834401252, + "y2": 20.154979393227222 + }, + { + "linetype": 1, + "x1": 10599.686889983797, + "x2": 10600.60302541076, + "y1": 6510.05834401252, + "y2": 20.154979393227222 + }, + { + "linetype": 1, + "x1": 10656.48728645562, + "x2": 10657.403421882584, + "y1": 6508.22607315859, + "y2": 18.32270853929731 + }, + { + "linetype": 1, + "x1": 10705.958599511725, + "x2": 10706.87473493869, + "y1": 6510.05834401252, + "y2": 20.154979393227222 + }, + { + "linetype": 1, + "x1": 10760.926725129619, + "x2": 10761.842860556582, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 10807.649631904827, + "x2": 10808.565767331791, + "y1": 6510.974479439486, + "y2": 21.071114820192633 + }, + { + "linetype": 1, + "x1": 10864.45002837665, + "x2": 10865.366163803614, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 10912.089070578824, + "x2": 10913.00520600579, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 10967.973331623683, + "x2": 10968.889467050649, + "y1": 6508.22607315859, + "y2": 18.32270853929731 + }, + { + "linetype": 1, + "x1": 11015.612373825858, + "x2": 11016.528509252821, + "y1": 6508.22607315859, + "y2": 18.32270853929731 + }, + { + "linetype": 1, + "x1": 11073.328905724646, + "x2": 11074.245041151611, + "y1": 6508.22607315859, + "y2": 18.32270853929731 + }, + { + "linetype": 1, + "x1": 11120.96794792682, + "x2": 11121.884083353783, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 11176.852208971679, + "x2": 11177.768344398643, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 11224.491251173853, + "x2": 11225.407386600818, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 11280.375512218712, + "x2": 11281.291647645678, + "y1": 6507.309937731626, + "y2": 17.406573112332808 + }, + { + "linetype": 1, + "x1": 11328.93068984785, + "x2": 11329.846825274813, + "y1": 6508.22607315859, + "y2": 18.32270853929731 + }, + { + "linetype": 1, + "x1": 11385.731086319674, + "x2": 11386.64722174664, + "y1": 6507.309937731626, + "y2": 17.406573112332808 + }, + { + "linetype": 1, + "x1": 11432.453993094883, + "x2": 11433.370128521849, + "y1": 6507.309937731626, + "y2": 17.406573112332808 + }, + { + "linetype": 1, + "x1": 11488.338254139742, + "x2": 11489.254389566708, + "y1": 6506.393802304661, + "y2": 16.490437685368306 + }, + { + "linetype": 1, + "x1": 11536.893431768882, + "x2": 11537.809567195847, + "y1": 6506.393802304661, + "y2": 16.490437685368306 + }, + { + "linetype": 1, + "x1": 11591.861557386776, + "x2": 11592.77769281374, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 11640.416735015913, + "x2": 11641.332870442879, + "y1": 6510.974479439486, + "y2": 21.071114820192633 + }, + { + "linetype": 1, + "x1": 11697.217131487738, + "x2": 11698.133266914701, + "y1": 6508.22607315859, + "y2": 18.32270853929731 + }, + { + "linetype": 1, + "x1": 11744.856173689912, + "x2": 11745.772309116877, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 11799.824299307806, + "x2": 11800.74043473477, + "y1": 6508.22607315859, + "y2": 18.32270853929731 + }, + { + "linetype": 1, + "x1": 11848.379476936945, + "x2": 11849.295612363909, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 11904.263737981802, + "x2": 11905.179873408768, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 11953.735051037907, + "x2": 11954.651186464871, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 12009.619312082765, + "x2": 12010.53544750973, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 12057.258354284939, + "x2": 12058.174489711902, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 12113.142615329798, + "x2": 12114.058750756762, + "y1": 6508.22607315859, + "y2": 18.32270853929731 + }, + { + "linetype": 1, + "x1": 12161.697792958937, + "x2": 12162.613928385901, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 12216.665918576831, + "x2": 12217.582054003797, + "y1": 6508.22607315859, + "y2": 18.32270853929731 + }, + { + "linetype": 1, + "x1": 12265.22109620597, + "x2": 12266.137231632936, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 12321.105357250828, + "x2": 12322.021492677792, + "y1": 6508.22607315859, + "y2": 18.32270853929731 + }, + { + "linetype": 1, + "x1": 12369.660534879968, + "x2": 12370.576670306931, + "y1": 6507.309937731626, + "y2": 17.406573112332808 + }, + { + "linetype": 1, + "x1": 12426.46093135179, + "x2": 12427.377066778754, + "y1": 6508.22607315859, + "y2": 18.32270853929731 + }, + { + "linetype": 1, + "x1": 12472.267702700035, + "x2": 12473.183838126999, + "y1": 6508.22607315859, + "y2": 18.32270853929731 + }, + { + "linetype": 1, + "x1": 12529.984234598824, + "x2": 12530.900370025789, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 12577.623276800998, + "x2": 12578.539412227961, + "y1": 6510.05834401252, + "y2": 20.154979393227222 + }, + { + "linetype": 1, + "x1": 12632.591402418891, + "x2": 12633.507537845857, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 12682.062715474996, + "x2": 12682.97885090196, + "y1": 6508.22607315859, + "y2": 18.32270853929731 + }, + { + "linetype": 1, + "x1": 12736.114705665925, + "x2": 12737.030841092888, + "y1": 6510.05834401252, + "y2": 20.154979393227222 + }, + { + "linetype": 1, + "x1": 12786.502154148993, + "x2": 12787.418289575959, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 12842.386415193852, + "x2": 12843.302550620818, + "y1": 6510.974479439486, + "y2": 21.071114820192633 + }, + { + "linetype": 1, + "x1": 12890.025457396026, + "x2": 12890.94159282299, + "y1": 6508.22607315859, + "y2": 18.32270853929731 + }, + { + "linetype": 1, + "x1": 12945.909718440884, + "x2": 12946.82585386785, + "y1": 6510.05834401252, + "y2": 20.154979393227222 + }, + { + "linetype": 1, + "x1": 12992.632625216094, + "x2": 12993.548760643058, + "y1": 6510.05834401252, + "y2": 20.154979393227222 + }, + { + "linetype": 1, + "x1": 13049.433021687917, + "x2": 13050.34915711488, + "y1": 6512.8067502934155, + "y2": 22.903385674122546 + }, + { + "linetype": 1, + "x1": 13096.155928463128, + "x2": 13097.072063890093, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 13152.95632493495, + "x2": 13153.872460361916, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 13201.51150256409, + "x2": 13202.427637991055, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 13257.395763608947, + "x2": 13258.31189903591, + "y1": 6510.05834401252, + "y2": 20.154979393227222 + }, + { + "linetype": 1, + "x1": 13303.202534957192, + "x2": 13304.118670384156, + "y1": 6508.22607315859, + "y2": 18.32270853929731 + }, + { + "linetype": 1, + "x1": 13361.835202282946, + "x2": 13362.75133770991, + "y1": 6508.22607315859, + "y2": 18.32270853929731 + }, + { + "linetype": 1, + "x1": 13409.47424448512, + "x2": 13410.390379912085, + "y1": 6507.309937731626, + "y2": 17.406573112332808 + }, + { + "linetype": 1, + "x1": 13465.358505529977, + "x2": 13466.27464095694, + "y1": 6507.309937731626, + "y2": 17.406573112332808 + }, + { + "linetype": 1, + "x1": 13512.997547732153, + "x2": 13513.913683159117, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 13569.797944203976, + "x2": 13570.71407963094, + "y1": 6507.309937731626, + "y2": 17.406573112332808 + }, + { + "linetype": 1, + "x1": 13618.353121833115, + "x2": 13619.269257260079, + "y1": 6508.22607315859, + "y2": 18.32270853929731 + }, + { + "linetype": 1, + "x1": 13673.32124745101, + "x2": 13674.237382877975, + "y1": 6508.22607315859, + "y2": 18.32270853929731 + }, + { + "linetype": 1, + "x1": 13721.876425080149, + "x2": 13722.792560507114, + "y1": 6507.309937731626, + "y2": 17.406573112332808 + }, + { + "linetype": 1, + "x1": 13778.676821551971, + "x2": 13779.592956978937, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 13825.39972832718, + "x2": 13826.315863754146, + "y1": 6508.22607315859, + "y2": 18.32270853929731 + }, + { + "linetype": 1, + "x1": 13880.367853945074, + "x2": 13881.283989372037, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 13928.923031574213, + "x2": 13929.839167001177, + "y1": 6509.142208585556, + "y2": 19.23884396626272 + }, + { + "linetype": 1, + "x1": 13984.807292619073, + "x2": 13985.723428046036, + "y1": 6508.22607315859, + "y2": 18.32270853929731 + }, + { + "linetype": 1, + "x1": 14034.278605675176, + "x2": 14035.19474110214, + "y1": 6508.22607315859, + "y2": 18.32270853929731 + }, + { + "linetype": 1, + "x1": 14090.162866720035, + "x2": 14091.079002146998, + "y1": 6507.309937731626, + "y2": 17.406573112332808 + }, + { + "linetype": 1, + "x1": 14138.718044349174, + "x2": 14139.634179776138, + "y1": 6505.477666877696, + "y2": 15.574302258402895 + }, + { + "linetype": 1, + "x1": 14192.770034540103, + "x2": 14193.686169967066, + "y1": 6504.561531450731, + "y2": 14.658166831438393 + } + ], + "rows": [ + { + "linetype": 0, + "x1": 14194.615665243075, + "x2": 7479.603027487876, + "y1": 62.977844199345355, + "y2": 65.92993064618967 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 67.94286460130141, + "y2": 69.134844682026 + }, + { + "linetype": 0, + "x1": 14193.631636427459, + "x2": 7478.61899867226, + "y1": 104.30705445516574, + "y2": 107.25914090201006 + }, + { + "linetype": 0, + "x1": 6702.503993914348, + "x2": 91.78246621579274, + "y1": 106.08622718448817, + "y2": 107.27820726521276 + }, + { + "linetype": 0, + "x1": 14194.615665243075, + "x2": 7479.603027487876, + "y1": 143.6682070797566, + "y2": 146.6202935266009 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 146.6135499291241, + "y2": 147.8055300098487 + }, + { + "linetype": 0, + "x1": 14194.615665243075, + "x2": 7479.603027487876, + "y1": 184.99741733557698, + "y2": 187.9495037824213 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 187.14087267376001, + "y2": 188.3328527544846 + }, + { + "linetype": 0, + "x1": 14195.599694058688, + "x2": 7480.58705630349, + "y1": 344.4100854651699, + "y2": 347.3621719120142 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 345.67422341012997, + "y2": 346.86620349085456 + }, + { + "linetype": 0, + "x1": 14194.615665243075, + "x2": 7479.603027487876, + "y1": 384.75526690537555, + "y2": 387.70735335221985 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 385.00956607404135, + "y2": 386.20154615476594 + }, + { + "linetype": 0, + "x1": 14194.615665243075, + "x2": 7479.603027487876, + "y1": 426.08447716119593, + "y2": 429.03656360804024 + }, + { + "linetype": 0, + "x1": 6704.887954075797, + "x2": 94.1664263772418, + "y1": 426.72886889940185, + "y2": 427.92084898012644 + }, + { + "linetype": 0, + "x1": 14193.631636427459, + "x2": 7478.61899867226, + "y1": 464.461600970172, + "y2": 467.4136874170163 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 466.06421156331317, + "y2": 467.25619164403776 + }, + { + "linetype": 0, + "x1": 14196.434576247962, + "x2": 7479.329625741376, + "y1": 513.0358391003393, + "y2": 515.784245381234 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 513.7434147922967, + "y2": 514.9353948730213 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7478.41349031441, + "y1": 552.4296624598297, + "y2": 555.1780687407244 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 555.4627176176572, + "y2": 556.6546976983818 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7478.41349031441, + "y1": 591.82348581932, + "y2": 594.5718921002147 + }, + { + "linetype": 0, + "x1": 6704.887954075797, + "x2": 94.1664263772418, + "y1": 593.606080200844, + "y2": 594.7980602815685 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 631.2173091788104, + "y2": 633.965715459705 + }, + { + "linetype": 0, + "x1": 6704.887954075797, + "x2": 94.1664263772418, + "y1": 635.3253830262045, + "y2": 636.517363106929 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7478.41349031441, + "y1": 792.4571443246314, + "y2": 795.205550605526 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 793.8587337625744, + "y2": 795.050713843299 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 832.7671031110865, + "y2": 835.5155093919811 + }, + { + "linetype": 0, + "x1": 6702.503993914348, + "x2": 91.78246621579274, + "y1": 833.1940764264857, + "y2": 834.3860565072102 + }, + { + "linetype": 0, + "x1": 3016.783482282509, + "x2": 3016.783482282509, + "y1": 865.1070280074841, + "y2": 865.1070280074841 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7478.41349031441, + "y1": 872.1609264705769, + "y2": 874.9093327514715 + }, + { + "linetype": 0, + "x1": 6702.503993914348, + "x2": 91.78246621579274, + "y1": 874.9133792518462, + "y2": 876.1053593325707 + }, + { + "linetype": 0, + "x1": 14193.686169967066, + "x2": 7476.58121946048, + "y1": 912.4708852570321, + "y2": 915.2192915379268 + }, + { + "linetype": 0, + "x1": 6702.503993914348, + "x2": 91.78246621579274, + "y1": 915.4407019964822, + "y2": 916.6326820772067 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 959.1937920322416, + "y2": 961.9421983131363 + }, + { + "linetype": 0, + "x1": 2445.591021482696, + "x2": 2445.591021482696, + "y1": 959.3815118288126, + "y2": 959.3815118288126 + }, + { + "linetype": 0, + "x1": 6702.503993914348, + "x2": 91.78246621579274, + "y1": 963.1199052254656, + "y2": 964.3118853061901 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 998.5876153917319, + "y2": 1001.3360216726265 + }, + { + "linetype": 0, + "x1": 6704.02524742546, + "x2": 93.303719726905, + "y1": 1001.2632678086524, + "y2": 1002.455247889377 + }, + { + "linetype": 0, + "x1": 14193.686169967066, + "x2": 7476.58121946048, + "y1": 1039.813709605152, + "y2": 1042.5621158860467 + }, + { + "linetype": 0, + "x1": 6702.503993914348, + "x2": 91.78246621579274, + "y1": 1041.7905905532882, + "y2": 1042.9825706340127 + }, + { + "linetype": 0, + "x1": 14192.770034540103, + "x2": 7475.665084033516, + "y1": 1079.2075329646425, + "y2": 1081.9559392455371 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 1084.7018734593735, + "y2": 1085.893853540098 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 1239.5312326834985, + "y2": 1242.2796389643931 + }, + { + "linetype": 0, + "x1": 6717.966373389789, + "x2": 71.44848458505567, + "y1": 1241.7565738643216, + "y2": 1241.7565738643216 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 1280.7573268969186, + "y2": 1283.5057331778132 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 1281.3785867789302, + "y2": 1282.5705668596547 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 1318.318879402479, + "y2": 1321.0672856833737 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 1323.0978896042907, + "y2": 1324.2898696850152 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 1359.5449736158994, + "y2": 1362.293379896794 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 1363.6252123489267, + "y2": 1364.8171924296512 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 1408.1001512450384, + "y2": 1410.848557525933 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 1410.1124354971855, + "y2": 1411.30441557791 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 1448.4101100314938, + "y2": 1451.1585163123884 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 1451.831738322546, + "y2": 1453.0237184032705 + }, + { + "linetype": 0, + "x1": 14193.686169967066, + "x2": 7476.58121946048, + "y1": 1489.6362042449139, + "y2": 1492.3846105258085 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 1492.359061067182, + "y2": 1493.5510411479065 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 1529.0300276044043, + "y2": 1531.778433885299 + }, + { + "linetype": 0, + "x1": 6704.887954075797, + "x2": 94.1664263772418, + "y1": 1531.6944037310932, + "y2": 1532.8863838118177 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7478.41349031441, + "y1": 1687.5214564693306, + "y2": 1690.2698627502252 + }, + { + "linetype": 0, + "x1": 6702.503993914348, + "x2": 91.78246621579274, + "y1": 1691.4197345481878, + "y2": 1692.6117146289123 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7478.41349031441, + "y1": 1727.8314152557857, + "y2": 1730.5798215366804 + }, + { + "linetype": 0, + "x1": 6702.503993914348, + "x2": 91.78246621579274, + "y1": 1729.5630971313744, + "y2": 1730.755077212099 + }, + { + "linetype": 0, + "x1": 14193.686169967066, + "x2": 7476.58121946048, + "y1": 1768.141374042241, + "y2": 1770.8897803231357 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 1768.8984397952859, + "y2": 1770.0904198760104 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7478.41349031441, + "y1": 1807.5351974017312, + "y2": 1810.2836036826259 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 1809.4257625399218, + "y2": 1810.6177426206464 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 1856.0903750308705, + "y2": 1858.8387813117652 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 1858.2969458496298, + "y2": 1859.4889259303543 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 1895.484198390361, + "y2": 1898.2326046712556 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 1897.6322885135412, + "y2": 1898.8242685942657 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 1933.9618863228864, + "y2": 1936.710292603781 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 1936.9676311774526, + "y2": 1938.1596112581772 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 1977.0202513902364, + "y2": 1979.768657671131 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 1978.6869340028131, + "y2": 1979.8789140835377 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 2135.5116802551624, + "y2": 2138.2600865360573 + }, + { + "linetype": 0, + "x1": 6704.887954075797, + "x2": 94.1664263772418, + "y1": 2138.4122648199077, + "y2": 2139.6042449006322 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 2176.7377744685828, + "y2": 2179.486180749477 + }, + { + "linetype": 0, + "x1": 6702.503993914348, + "x2": 91.78246621579274, + "y1": 2177.747607483819, + "y2": 2178.9395875645437 + }, + { + "linetype": 0, + "x1": 6702.503993914348, + "x2": 91.78246621579274, + "y1": 2218.2749302284547, + "y2": 2219.466910309179 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 2218.8800041089676, + "y2": 2221.6284103898624 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 2256.441556614528, + "y2": 2259.1899628954225 + }, + { + "linetype": 0, + "x1": 6702.503993914348, + "x2": 91.78246621579274, + "y1": 2258.8022529730906, + "y2": 2259.994233053815 + }, + { + "linetype": 0, + "x1": 14193.686169967066, + "x2": 7476.58121946048, + "y1": 2303.1644633897376, + "y2": 2305.912869670632 + }, + { + "linetype": 0, + "x1": 6702.503993914348, + "x2": 91.78246621579274, + "y1": 2306.4814562020742, + "y2": 2307.673436282799 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 2344.390557603158, + "y2": 2347.138963884053 + }, + { + "linetype": 0, + "x1": 6702.216425030902, + "x2": 91.49489733234714, + "y1": 2347.00877894671, + "y2": 2348.2007590274347 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 2385.616651816578, + "y2": 2388.3650580974727 + }, + { + "linetype": 0, + "x1": 6702.216425030902, + "x2": 91.49489733234714, + "y1": 2386.3441216106216, + "y2": 2387.536101691346 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 2423.1782043221388, + "y2": 2425.9266106030336 + }, + { + "linetype": 0, + "x1": 6703.737678542016, + "x2": 93.01615084346031, + "y1": 2427.7758555525365, + "y2": 2428.967835633261 + }, + { + "linetype": 0, + "x1": 14193.686169967066, + "x2": 7476.58121946048, + "y1": 2584.4180394679593, + "y2": 2587.166445748854 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 2585.4047950916274, + "y2": 2586.596775172352 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 2623.8118628274497, + "y2": 2626.560269108344 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 2625.9321178362634, + "y2": 2627.124097916988 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 2664.121821613905, + "y2": 2666.8702278947994 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 2666.4594405808994, + "y2": 2667.651420661624 + }, + { + "linetype": 0, + "x1": 14193.686169967066, + "x2": 7476.58121946048, + "y1": 2704.4317804003604, + "y2": 2707.180186681255 + }, + { + "linetype": 0, + "x1": 6702.503993914348, + "x2": 91.78246621579274, + "y1": 2705.794783244811, + "y2": 2706.9867633255353 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 2752.0708226025345, + "y2": 2754.819228883429 + }, + { + "linetype": 0, + "x1": 6704.887954075797, + "x2": 94.1664263772418, + "y1": 2752.2820063930694, + "y2": 2753.473986473794 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 2792.8093291377054, + "y2": 2794.00130921843 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7478.41349031441, + "y1": 2793.296916815955, + "y2": 2796.0453230968496 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7478.41349031441, + "y1": 2831.77460474848, + "y2": 2834.523011029375 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 2835.7206120437904, + "y2": 2836.912592124515 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 2873.0006989619005, + "y2": 2875.749105242795 + }, + { + "linetype": 0, + "x1": 6702.503993914348, + "x2": 91.78246621579274, + "y1": 2873.8639746269773, + "y2": 2875.055954707702 + }, + { + "linetype": 0, + "x1": 14196.434576247962, + "x2": 7479.329625741376, + "y1": 3030.5759923998617, + "y2": 3033.3243986807565 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 3032.397325363347, + "y2": 3033.5893054440717 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 3070.885951186317, + "y2": 3073.634357467212 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 3072.924648107983, + "y2": 3074.1166281887076 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7478.41349031441, + "y1": 3111.1959099727724, + "y2": 3113.9443162536672 + }, + { + "linetype": 0, + "x1": 6704.887954075797, + "x2": 94.1664263772418, + "y1": 3112.2599907718945, + "y2": 3113.451970852619 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7478.41349031441, + "y1": 3152.422004186192, + "y2": 3155.170410467087 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 3153.979293597255, + "y2": 3155.1712736779796 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7478.41349031441, + "y1": 3200.9771818153317, + "y2": 3203.7255880962266 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 3202.850476906963, + "y2": 3204.0424569876877 + }, + { + "linetype": 0, + "x1": 14196.434576247962, + "x2": 7479.329625741376, + "y1": 3236.7064634669623, + "y2": 3239.4548697478567 + }, + { + "linetype": 0, + "x1": 6702.503993914348, + "x2": 91.78246621579274, + "y1": 3242.185819570874, + "y2": 3243.3777996515987 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 3278.8486931073476, + "y2": 3281.597099388242 + }, + { + "linetype": 0, + "x1": 6702.503993914348, + "x2": 91.78246621579274, + "y1": 3279.1372020733365, + "y2": 3280.329182154061 + }, + { + "linetype": 0, + "x1": 14196.434576247962, + "x2": 7479.329625741376, + "y1": 3319.1586518938025, + "y2": 3321.9070581746973 + }, + { + "linetype": 0, + "x1": 6704.887954075797, + "x2": 94.1664263772418, + "y1": 3323.240465060146, + "y2": 3324.4324451408706 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 3478.566216185694, + "y2": 3481.314622466589 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 3479.389855635067, + "y2": 3480.5818357157914 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 3518.876174972149, + "y2": 3521.6245812530433 + }, + { + "linetype": 0, + "x1": 6702.503993914348, + "x2": 91.78246621579274, + "y1": 3521.1091584604274, + "y2": 3522.301138541152 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 3558.2699983316393, + "y2": 3561.018404612534 + }, + { + "linetype": 0, + "x1": 6702.503993914348, + "x2": 91.78246621579274, + "y1": 3560.444501124339, + "y2": 3561.6364812050633 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7478.41349031441, + "y1": 3597.6638216911297, + "y2": 3600.412227972024 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 3600.9718238689748, + "y2": 3602.1638039496993 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7478.41349031441, + "y1": 3647.1351347472337, + "y2": 3649.883541028128 + }, + { + "linetype": 0, + "x1": 6702.503993914348, + "x2": 91.78246621579274, + "y1": 3648.6510270979584, + "y2": 3649.843007178683 + }, + { + "linetype": 0, + "x1": 14196.434576247962, + "x2": 7479.329625741376, + "y1": 3687.445093533689, + "y2": 3690.1934998145834 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 3689.1783498425943, + "y2": 3690.370329923319 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 3727.7550523201444, + "y2": 3730.503458601039 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 3730.897652667955, + "y2": 3732.0896327486794 + }, + { + "linetype": 0, + "x1": 6702.503993914348, + "x2": 91.78246621579274, + "y1": 3767.8490351704168, + "y2": 3769.0410152511413 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7478.41349031441, + "y1": 3768.0650111065997, + "y2": 3770.813417387494 + }, + { + "linetype": 0, + "x1": 14193.686169967066, + "x2": 7476.58121946048, + "y1": 3927.472575398491, + "y2": 3930.2209816793857 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 3928.766346068236, + "y2": 3929.9583261489606 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7478.41349031441, + "y1": 3965.9502633310162, + "y2": 3968.698669611911 + }, + { + "linetype": 0, + "x1": 6702.503993914348, + "x2": 91.78246621579274, + "y1": 3971.677628974321, + "y2": 3972.8696090550457 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7478.41349031441, + "y1": 4007.176357544436, + "y2": 4009.924763825331 + }, + { + "linetype": 0, + "x1": 6703.120836228182, + "x2": 92.39930852962698, + "y1": 4009.820991557508, + "y2": 4011.0129716382326 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7478.41349031441, + "y1": 4046.5701809039265, + "y2": 4049.318587184821 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 4050.348314302144, + "y2": 4051.5402943828685 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7478.41349031441, + "y1": 4094.209223106101, + "y2": 4096.957629386996 + }, + { + "linetype": 0, + "x1": 6702.503993914348, + "x2": 91.78246621579274, + "y1": 4098.027517531127, + "y2": 4099.219497611852 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 4134.519181892556, + "y2": 4137.26758817345 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 4136.170880114314, + "y2": 4137.362860195039 + }, + { + "linetype": 0, + "x1": 14196.434576247962, + "x2": 7479.329625741376, + "y1": 4174.829140679011, + "y2": 4177.577546959906 + }, + { + "linetype": 0, + "x1": 6702.503993914348, + "x2": 91.78246621579274, + "y1": 4177.890182939675, + "y2": 4179.082163020399 + }, + { + "linetype": 0, + "x1": 14196.434576247962, + "x2": 7479.329625741376, + "y1": 4213.306828611537, + "y2": 4216.055234892431 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 4218.4175056843105, + "y2": 4219.609485765035 + }, + { + "linetype": 0, + "x1": 14193.686169967066, + "x2": 7476.58121946048, + "y1": 4373.630528330393, + "y2": 4376.378934611287 + }, + { + "linetype": 0, + "x1": 6702.503993914348, + "x2": 91.78246621579274, + "y1": 4375.758876339956, + "y2": 4376.950856420681 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7478.41349031441, + "y1": 4413.940487116848, + "y2": 4416.6888933977425 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 4416.286199084591, + "y2": 4417.478179165316 + }, + { + "linetype": 0, + "x1": 14196.434576247962, + "x2": 7479.329625741376, + "y1": 4453.334310476339, + "y2": 4456.082716757233 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 4456.813521829227, + "y2": 4458.005501909952 + }, + { + "linetype": 0, + "x1": 14196.434576247962, + "x2": 7479.329625741376, + "y1": 4494.560404689759, + "y2": 4497.308810970653 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 4496.148864493139, + "y2": 4497.340844573863 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7478.41349031441, + "y1": 4543.115582318898, + "y2": 4545.863988599793 + }, + { + "linetype": 0, + "x1": 6703.695973995073, + "x2": 92.97444629651727, + "y1": 4545.020047802847, + "y2": 4546.212027883572 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7477.497354887445, + "y1": 4583.425541105353, + "y2": 4586.173947386247 + }, + { + "linetype": 0, + "x1": 6702.503993914348, + "x2": 91.78246621579274, + "y1": 4584.355390466759, + "y2": 4585.547370547483 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7478.41349031441, + "y1": 4620.987093610914, + "y2": 4623.735499891808 + }, + { + "linetype": 0, + "x1": 6702.503993914348, + "x2": 91.78246621579274, + "y1": 4624.882713211395, + "y2": 4626.074693292119 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7480.24576116834, + "y1": 4663.129323251299, + "y2": 4664.961594105229 + }, + { + "linetype": 0, + "x1": 6702.503993914348, + "x2": 91.78246621579274, + "y1": 4665.410035956031, + "y2": 4666.602016036755 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7481.161896595306, + "y1": 4821.620752116225, + "y2": 4823.453022970155 + }, + { + "linetype": 0, + "x1": 6717.06196219251, + "x2": 69.63966219049689, + "y1": 4824.129326287175, + "y2": 4824.129326287175 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7481.161896595306, + "y1": 4862.846846329645, + "y2": 4864.679117183575 + }, + { + "linetype": 0, + "x1": 6716.157550995231, + "x2": 68.73525099321796, + "y1": 4863.01900777018, + "y2": 4863.01900777018 + }, + { + "linetype": 0, + "x1": 6716.157550995231, + "x2": 68.73525099321796, + "y1": 4903.717511647743, + "y2": 4903.717511647743 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7481.161896595306, + "y1": 4904.072940543066, + "y2": 4905.905211396996 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7481.161896595306, + "y1": 4941.634493048626, + "y2": 4943.466763902556 + }, + { + "linetype": 0, + "x1": 6715.253139797952, + "x2": 67.83083979593903, + "y1": 4944.416015525307, + "y2": 4944.416015525307 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7481.161896595306, + "y1": 4989.2735352508, + "y2": 4991.10580610473 + }, + { + "linetype": 0, + "x1": 6716.157550995231, + "x2": 68.73525099321796, + "y1": 4991.445397783824, + "y2": 4991.445397783824 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7480.24576116834, + "y1": 5028.667358610291, + "y2": 5030.499629464221 + }, + { + "linetype": 0, + "x1": 6716.157550995231, + "x2": 68.73525099321796, + "y1": 5030.335079266829, + "y2": 5030.335079266829 + }, + { + "linetype": 0, + "x1": 14193.686169967066, + "x2": 7479.329625741375, + "y1": 5069.8934528237105, + "y2": 5071.72572367764 + }, + { + "linetype": 0, + "x1": 6716.157550995231, + "x2": 68.73525099321796, + "y1": 5070.129171947114, + "y2": 5070.129171947114 + }, + { + "linetype": 0, + "x1": 14193.686169967066, + "x2": 7479.329625741375, + "y1": 5110.203411610166, + "y2": 5112.035682464096 + }, + { + "linetype": 0, + "x1": 6713.444317403393, + "x2": 66.02201740138025, + "y1": 5112.636498219235, + "y2": 5112.636498219235 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7481.161896595306, + "y1": 5268.694840475092, + "y2": 5270.527111329022 + }, + { + "linetype": 0, + "x1": 6702.60177409593, + "x2": 93.53268926570672, + "y1": 5273.257907571283, + "y2": 5273.219621574857 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7481.161896595306, + "y1": 5310.837070115477, + "y2": 5312.669340969407 + }, + { + "linetype": 0, + "x1": 6716.157550995231, + "x2": 69.63966219049689, + "y1": 5311.606961620656, + "y2": 5312.511372817935 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7480.24576116834, + "y1": 5351.147028901933, + "y2": 5352.9792997558625 + }, + { + "linetype": 0, + "x1": 6717.06196219251, + "x2": 70.54407338777582, + "y1": 5352.305465498219, + "y2": 5353.209876695498 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7481.161896595306, + "y1": 5390.5408522614225, + "y2": 5392.373123115352 + }, + { + "linetype": 0, + "x1": 6717.06196219251, + "x2": 70.54407338777582, + "y1": 5391.195146981224, + "y2": 5392.099558178503 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7481.161896595306, + "y1": 5438.1798944635975, + "y2": 5440.012165317527 + }, + { + "linetype": 0, + "x1": 6717.966373389789, + "x2": 71.44848458505476, + "y1": 5439.128940437021, + "y2": 5440.0333516343 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7481.161896595306, + "y1": 5477.5737178230875, + "y2": 5479.405988677017 + }, + { + "linetype": 0, + "x1": 6702.60177409593, + "x2": 93.53268926570672, + "y1": 5480.002288265026, + "y2": 5479.964002268601 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7481.161896595306, + "y1": 5518.799812036507, + "y2": 5520.632082890437 + }, + { + "linetype": 0, + "x1": 6702.60177409593, + "x2": 93.53268926570672, + "y1": 5522.116884332271, + "y2": 5522.0785983358455 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7481.161896595306, + "y1": 5559.109770822963, + "y2": 5560.942041676893 + }, + { + "linetype": 0, + "x1": 6703.134396609662, + "x2": 94.06531177943907, + "y1": 5560.4028807570385, + "y2": 5560.364594760613 + }, + { + "linetype": 0, + "x1": 14193.686169967066, + "x2": 7479.329625741375, + "y1": 5718.517335114854, + "y2": 5720.349605968784 + }, + { + "linetype": 0, + "x1": 6702.60177409593, + "x2": 93.53268926570672, + "y1": 5719.927865860235, + "y2": 5719.88957986381 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7481.161896595306, + "y1": 5756.99502304738, + "y2": 5758.8272939013095 + }, + { + "linetype": 0, + "x1": 6702.60177409593, + "x2": 93.53268926570672, + "y1": 5759.490062165828, + "y2": 5759.451776169402 + }, + { + "linetype": 0, + "x1": 6708.922261416998, + "x2": 77.77936296601001, + "y1": 5798.180185756858, + "y2": 5801.797830545975 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7480.24576116834, + "y1": 5798.2211172607995, + "y2": 5800.053388114729 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7481.161896595306, + "y1": 5839.447211474219, + "y2": 5841.279482328149 + }, + { + "linetype": 0, + "x1": 6702.60177409593, + "x2": 93.53268926570672, + "y1": 5841.166854538665, + "y2": 5841.128568542239 + }, + { + "linetype": 0, + "x1": 14193.686169967066, + "x2": 7479.329625741375, + "y1": 5885.253982822464, + "y2": 5887.086253676394 + }, + { + "linetype": 0, + "x1": 6708.922261416998, + "x2": 77.77936296601001, + "y1": 5888.621305484776, + "y2": 5892.238950273892 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7480.24576116834, + "y1": 5925.56394160892, + "y2": 5927.39621246285 + }, + { + "linetype": 0, + "x1": 6715.253139797952, + "x2": 75.0661293741723, + "y1": 5927.510986967781, + "y2": 5929.31980936234 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7480.24576116834, + "y1": 5964.95776496841, + "y2": 5966.79003582234 + }, + { + "linetype": 0, + "x1": 6702.60177409593, + "x2": 93.53268926570672, + "y1": 5968.786842621223, + "y2": 5968.748556624797 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7480.24576116834, + "y1": 6006.18385918183, + "y2": 6008.0161300357595 + }, + { + "linetype": 0, + "x1": 6716.157550995231, + "x2": 75.97054057145124, + "y1": 6006.194761131071, + "y2": 6008.9079947229075 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7480.24576116834, + "y1": 6165.591423473721, + "y2": 6167.423694327651 + }, + { + "linetype": 0, + "x1": 6715.253139797952, + "x2": 76.87495176873108, + "y1": 6166.275543049486, + "y2": 6168.988776641324 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7480.24576116834, + "y1": 6205.901382260176, + "y2": 6207.733653114106 + }, + { + "linetype": 0, + "x1": 6716.157550995231, + "x2": 77.77936296601001, + "y1": 6206.06963572977, + "y2": 6208.782869321608 + }, + { + "linetype": 0, + "x1": 14193.686169967066, + "x2": 7479.329625741375, + "y1": 6246.211341046632, + "y2": 6248.043611900562 + }, + { + "linetype": 0, + "x1": 6717.06196219251, + "x2": 78.68377416328894, + "y1": 6249.481373199171, + "y2": 6252.1946067910085 + }, + { + "linetype": 0, + "x1": 14193.686169967066, + "x2": 7479.329625741375, + "y1": 6285.605164406122, + "y2": 6287.437435260052 + }, + { + "linetype": 0, + "x1": 6716.157550995231, + "x2": 69.63966219049689, + "y1": 6288.371054682176, + "y2": 6288.371054682176 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7480.24576116834, + "y1": 6332.328071181331, + "y2": 6334.160342035261 + }, + { + "linetype": 0, + "x1": 6715.253139797952, + "x2": 68.73525099321796, + "y1": 6336.304848137973, + "y2": 6336.304848137973 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7480.24576116834, + "y1": 6374.470300821717, + "y2": 6376.3025716756465 + }, + { + "linetype": 0, + "x1": 6717.06196219251, + "x2": 70.54407338777582, + "y1": 6377.003352015537, + "y2": 6377.003352015537 + }, + { + "linetype": 0, + "x1": 14194.602305394032, + "x2": 7480.24576116834, + "y1": 6414.780259608172, + "y2": 6416.612530462102 + }, + { + "linetype": 0, + "x1": 6702.60177409593, + "x2": 93.53268926570672, + "y1": 6416.733000791, + "y2": 6416.694714794575 + }, + { + "linetype": 0, + "x1": 14195.518440820997, + "x2": 7479.329625741376, + "y1": 6454.174082967662, + "y2": 6456.922489248556 + }, + { + "linetype": 0, + "x1": 6702.60177409593, + "x2": 93.53268926570672, + "y1": 6455.018997215768, + "y2": 6454.980711219342 + } + ], + "settings": { + "aligner": "RomAlignerReliable", + "alignthreshold": 5, + "arch": "", + "autocomment": false, + "bitsize": 13, + "blue": 0, + "crosshaircolor": "#000000", + "gatorom": "-r 0 ", + "green": 70, + "inverted": false, + "linecolor": "#000000", + "red": 0, + "sampler": "Tall", + "samplersize": 87, + "selectioncolor": "#00ff00", + "showbits": false, + "showdamage": false, + "yararule": "" + } +} diff --git a/v20/images/microcode_rom.pbm b/v20/images/microcode_rom.pbm new file mode 100644 index 0000000..111defb Binary files /dev/null and b/v20/images/microcode_rom.pbm differ diff --git a/v20/images/microcode_rom.png b/v20/images/microcode_rom.png new file mode 100644 index 0000000..28cbfc4 Binary files /dev/null and b/v20/images/microcode_rom.png differ diff --git a/v20/images/pla_1.jpg b/v20/images/pla_1.jpg new file mode 100644 index 0000000..e8d80fc Binary files /dev/null and b/v20/images/pla_1.jpg differ diff --git a/v20/images/pla_2.jpg b/v20/images/pla_2.jpg new file mode 100644 index 0000000..d599e4c Binary files /dev/null and b/v20/images/pla_2.jpg differ diff --git a/v20/images/pla_3.jpg b/v20/images/pla_3.jpg new file mode 100644 index 0000000..99c3e28 Binary files /dev/null and b/v20/images/pla_3.jpg differ diff --git a/v20/images/pla_4.jpg b/v20/images/pla_4.jpg new file mode 100644 index 0000000..f3ee40c Binary files /dev/null and b/v20/images/pla_4.jpg differ diff --git a/v20/images/pla_5.jpg b/v20/images/pla_5.jpg new file mode 100644 index 0000000..4ed0d66 Binary files /dev/null and b/v20/images/pla_5.jpg differ diff --git a/v20/images/pla_locations.jpg b/v20/images/pla_locations.jpg new file mode 100644 index 0000000..0f2f2d2 Binary files /dev/null and b/v20/images/pla_locations.jpg differ diff --git a/v20/images/v20_die_shot_01.jpg b/v20/images/v20_die_shot_01.jpg new file mode 100644 index 0000000..545539c Binary files /dev/null and b/v20/images/v20_die_shot_01.jpg differ diff --git a/v20/images/v20_word_format.png b/v20/images/v20_word_format.png new file mode 100644 index 0000000..0c43356 Binary files /dev/null and b/v20/images/v20_word_format.png differ diff --git a/v20/models/activation_pla/labels.json b/v20/models/activation_pla/labels.json new file mode 100644 index 0000000..93d0b15 --- /dev/null +++ b/v20/models/activation_pla/labels.json @@ -0,0 +1,7 @@ +{ + "classes": [ + "0", + "1" + ], + "best_val_f1": 1.0 +} \ No newline at end of file diff --git a/v20/models/activation_pla/model.pt b/v20/models/activation_pla/model.pt new file mode 100644 index 0000000..46a9499 Binary files /dev/null and b/v20/models/activation_pla/model.pt differ diff --git a/v20/models/microcode/labels.json b/v20/models/microcode/labels.json new file mode 100644 index 0000000..824f755 --- /dev/null +++ b/v20/models/microcode/labels.json @@ -0,0 +1,7 @@ +{ + "classes": [ + "0", + "1" + ], + "best_val_f1": 0.9891304347826086 +} \ No newline at end of file diff --git a/v20/models/microcode/model.pt b/v20/models/microcode/model.pt new file mode 100644 index 0000000..220a638 Binary files /dev/null and b/v20/models/microcode/model.pt differ diff --git a/v20/scripts/bit_classifier.py b/v20/scripts/bit_classifier.py new file mode 100644 index 0000000..d99a661 --- /dev/null +++ b/v20/scripts/bit_classifier.py @@ -0,0 +1,501 @@ +#!/usr/bin/env python3 +""" +bit_classifier.py — Train and run a 0/1 bit classifier for microcode extraction + +- Folder-based training via torchvision.datasets.ImageFolder with subdirs '0' and '1' (must pre-sort ~1000 bits) +- Saves best model and labels.json +- Predictor accepts: single image, a directory of images, OR a .zip containing images +- Optional CSV output for predictions + +This software is released into the public domain as it was cobbled together from various tutorials. + +NOTE!!: How you install pytorch is important. If you just do 'pip install torch' you will get the CPU-accellerated (slow) version. + Follow the instructions on pytorch's website if you have an nVidia GPU so you get CUDA accelleration. + +Usage + Train: + python bit_classifier.py train --data ./data --out ./model_out --img-size 64 --grayscale + Predict (dir / file): + python bit_classifier.py predict --model-dir ./model_out --input ./some_dir --img-size 64 --grayscale + Predict (zip): + python bit_classifier.py predict --model-dir ./model_out --input ./images.zip --img-size 64 --grayscale --out-csv predictions.csv +""" + +import argparse +import csv +import io +import json +import os +from dataclasses import dataclass +from pathlib import Path +from typing import Tuple, List, Iterable + +import numpy as np +from PIL import Image +import torch +import torch.nn as nn +import torch.optim as optim +from torch.utils.data import DataLoader, Subset +from torchvision import datasets, transforms, models + + +# ---------------------------- +# Config / Utilities +# ---------------------------- + +@dataclass +class Config: + data_dir: Path + out_dir: Path + img_size: int = 64 + batch_size: int = 64 + epochs: int = 15 + lr: float = 1e-3 + weight_decay: float = 1e-4 + train_split: float = 0.8 + grayscale: bool = True + num_workers: int = 4 + seed: int = 42 + model: str = "cnn" # "cnn" or "resnet18" + freeze_backbone: bool = True # if using resnet18 + aug: bool = True + + +def set_seed(seed: int): + import random + random.seed(seed) + np.random.seed(seed) + torch.manual_seed(seed) + torch.cuda.manual_seed_all(seed) + torch.backends.cudnn.deterministic = False + torch.backends.cudnn.benchmark = True + + +# ---------------------------- +# Models +# ---------------------------- + +class TinyCNN(nn.Module): + def __init__(self, in_ch: int, num_classes: int = 2): + super().__init__() + self.features = nn.Sequential( + nn.Conv2d(in_ch, 32, 3, padding=1), nn.ReLU(inplace=True), + nn.Conv2d(32, 32, 3, padding=1), nn.ReLU(inplace=True), + nn.MaxPool2d(2), + + nn.Conv2d(32, 64, 3, padding=1), nn.ReLU(inplace=True), + nn.Conv2d(64, 64, 3, padding=1), nn.ReLU(inplace=True), + nn.MaxPool2d(2), + + nn.Conv2d(64, 128, 3, padding=1), nn.ReLU(inplace=True), + nn.MaxPool2d(2), + ) + # classifier will be adapted to img_size at runtime + self.classifier = nn.Identity() + + def adapt_fc(self, img_size: int, num_classes: int = 2): + dummy = torch.zeros(1, self.features[0].in_channels, img_size, img_size) + with torch.no_grad(): + feat = self.features(dummy) + n = feat.numel() + self.classifier = nn.Sequential( + nn.Flatten(), + nn.Linear(n, 128), + nn.ReLU(inplace=True), + nn.Dropout(0.25), + nn.Linear(128, num_classes), + ) + + def forward(self, x): + x = self.features(x) + return self.classifier(x) + + +def build_model(cfg: Config, in_channels: int, num_classes: int = 2) -> nn.Module: + if cfg.model == "resnet18": + m = models.resnet18(weights=models.ResNet18_Weights.DEFAULT) + if cfg.grayscale: + old = m.conv1 + m.conv1 = nn.Conv2d(1, old.out_channels, kernel_size=old.kernel_size, + stride=old.stride, padding=old.padding, bias=False) + with torch.no_grad(): + m.conv1.weight[:] = old.weight.mean(dim=1, keepdim=True) + if cfg.freeze_backbone: + for p in m.parameters(): + p.requires_grad = False + for p in m.layer4.parameters(): + p.requires_grad = True + m.fc = nn.Linear(m.fc.in_features, num_classes) + return m + else: + m = TinyCNN(in_channels, num_classes) + m.adapt_fc(cfg.img_size, num_classes) + return m + + +# ---------------------------- +# Data & Transforms +# ---------------------------- + +def make_transforms(cfg: Config) -> Tuple[transforms.Compose, transforms.Compose]: + to_gray = [transforms.Grayscale(num_output_channels=1)] if cfg.grayscale else [] + + train_tf = [*to_gray, transforms.Resize((cfg.img_size, cfg.img_size))] + if cfg.aug: + train_tf += [ + transforms.RandomApply([transforms.RandomRotation(5)], p=0.3), + transforms.RandomApply([transforms.ColorJitter(brightness=0.1, contrast=0.1)], p=0.3), + ] + train_tf += [transforms.ToTensor()] + + val_tf = [*to_gray, transforms.Resize((cfg.img_size, cfg.img_size)), transforms.ToTensor()] + return transforms.Compose(train_tf), transforms.Compose(val_tf) + + +def make_dataloaders(cfg: Config) -> Tuple[DataLoader, DataLoader, List[str], torch.Tensor]: + train_tf, val_tf = make_transforms(cfg) + + # Base just to get samples/targets and class names + base = datasets.ImageFolder(str(cfg.data_dir), transform=None) + class_names = base.classes + targets = np.array([s[1] for s in base.samples]) + + class_counts = np.bincount(targets, minlength=len(class_names)) + weights = 1.0 / np.maximum(class_counts, 1) + class_weights = torch.tensor(weights / weights.sum() * len(weights), dtype=torch.float32) + + indices = np.arange(len(base)) + rng = np.random.default_rng(cfg.seed) + rng.shuffle(indices) + split = int(cfg.train_split * len(indices)) + train_idx, val_idx = indices[:split], indices[split:] + + train_ds = datasets.ImageFolder(str(cfg.data_dir), transform=train_tf) + val_ds = datasets.ImageFolder(str(cfg.data_dir), transform=val_tf) + + train_subset = Subset(train_ds, train_idx.tolist()) + val_subset = Subset(val_ds, val_idx.tolist()) + + train_loader = DataLoader(train_subset, batch_size=cfg.batch_size, shuffle=True, + num_workers=cfg.num_workers, pin_memory=True) + val_loader = DataLoader(val_subset, batch_size=cfg.batch_size, shuffle=False, + num_workers=cfg.num_workers, pin_memory=True) + + return train_loader, val_loader, class_names, class_weights + + +# ---------------------------- +# Metrics +# ---------------------------- + +def confusion_matrix(y_true: np.ndarray, y_pred: np.ndarray, num_classes: int = 2) -> np.ndarray: + cm = np.zeros((num_classes, num_classes), dtype=int) + for t, p in zip(y_true, y_pred): + cm[t, p] += 1 + return cm + + +def metrics_from_logits(logits: torch.Tensor, y: torch.Tensor): + preds = logits.argmax(dim=1) + correct = (preds == y).sum().item() + total = y.numel() + + tp = ((preds == 1) & (y == 1)).sum().item() + fp = ((preds == 1) & (y == 0)).sum().item() + fn = ((preds == 0) & (y == 1)).sum().item() + + precision = tp / (tp + fp) if (tp + fp) else 0.0 + recall = tp / (tp + fn) if (tp + fn) else 0.0 + f1 = 2 * precision * recall / (precision + recall) if (precision + recall) else 0.0 + return correct, total, precision, recall, f1, preds + + +# ---------------------------- +# EarlyStopper +# ---------------------------- + +class EarlyStopper: + def __init__(self, patience: int = 3, min_delta: float = 0.0): + self.patience = patience + self.min_delta = min_delta + self.best = float("-inf") + self.num_bad = 0 + + def step(self, metric: float) -> bool: + """Return True if we should stop (no improvement for `patience` steps).""" + if metric > self.best + self.min_delta: + self.best = metric + self.num_bad = 0 + else: + self.num_bad += 1 + return self.num_bad >= self.patience + + +# ---------------------------- +# Train / Eval +# ---------------------------- + +def train_one_epoch(model, loader, device, optimizer, criterion): + model.train() + total_loss = 0.0 + total_correct = 0 + total_count = 0 + ps, rs, fs = [], [], [] + for x, y in loader: + x, y = x.to(device), y.to(device) + optimizer.zero_grad(set_to_none=True) + logits = model(x) + loss = criterion(logits, y) + loss.backward() + optimizer.step() + + total_loss += loss.item() * y.size(0) + correct, count, p, r, f1, _ = metrics_from_logits(logits, y) + total_correct += correct + total_count += count + ps.append(p); rs.append(r); fs.append(f1) + + return { + "loss": total_loss / max(total_count, 1), + "acc": total_correct / max(total_count, 1), + "precision": float(np.mean(ps)) if ps else 0.0, + "recall": float(np.mean(rs)) if rs else 0.0, + "f1": float(np.mean(fs)) if fs else 0.0, + } + + +def evaluate(model, loader, device, criterion): + model.eval() + total_loss = 0.0 + total_correct = 0 + total_count = 0 + ps, rs, fs = [], [], [] + all_preds = [] + all_labels = [] + with torch.no_grad(): + for x, y in loader: + x, y = x.to(device), y.to(device) + logits = model(x) + loss = criterion(logits, y) + total_loss += loss.item() * y.size(0) + correct, count, p, r, f1, preds = metrics_from_logits(logits, y) + total_correct += correct + total_count += count + ps.append(p); rs.append(r); fs.append(f1) + all_preds.append(preds.cpu().numpy()) + all_labels.append(y.cpu().numpy()) + + cm = confusion_matrix(np.concatenate(all_labels), np.concatenate(all_preds)) if total_count else np.zeros((2,2), dtype=int) + return { + "loss": total_loss / max(total_count, 1), + "acc": total_correct / max(total_count, 1), + "precision": float(np.mean(ps)) if ps else 0.0, + "recall": float(np.mean(rs)) if rs else 0.0, + "f1": float(np.mean(fs)) if fs else 0.0, + "confusion_matrix": cm.tolist(), + } + + +def save_checkpoint(model, out_dir: Path, class_names: List[str], best_metric: float): + out_dir.mkdir(parents=True, exist_ok=True) + torch.save(model.state_dict(), out_dir / "model.pt") + with open(out_dir / "labels.json", "w") as f: + json.dump({"classes": class_names, "best_val_f1": best_metric}, f, indent=2) + + +# ---------------------------- +# Prediction helpers (file/dir/zip) +# ---------------------------- + +IMG_EXTS = {".png", ".jpg", ".jpeg", ".bmp", ".tif", ".tiff"} + +def load_tensor_from_pil(img: Image.Image, img_size: int, grayscale: bool) -> torch.Tensor: + tf = transforms.Compose( + ([transforms.Grayscale(1)] if grayscale else []) + + [transforms.Resize((img_size, img_size)), transforms.ToTensor()] + ) + return tf(img).unsqueeze(0) + + +def load_image_from_path(path: Path, img_size: int, grayscale: bool) -> torch.Tensor: + img = Image.open(path).convert("RGB") + return load_tensor_from_pil(img, img_size, grayscale) + + +def load_image_from_bytes(data: bytes, img_size: int, grayscale: bool) -> torch.Tensor: + img = Image.open(io.BytesIO(data)).convert("RGB") + return load_tensor_from_pil(img, img_size, grayscale) + + +def iter_images_in_dir(path: Path) -> Iterable[Path]: + if path.is_dir(): + for ext in IMG_EXTS: + yield from path.rglob(f"*{ext}") + elif path.is_file() and path.suffix.lower() in IMG_EXTS: + yield path + + +def iter_images_in_zip(zip_path: Path) -> Iterable[Tuple[str, bytes]]: + import zipfile + with zipfile.ZipFile(zip_path, 'r') as zf: + for info in zf.infolist(): + name_lower = info.filename.lower() + if any(name_lower.endswith(ext) for ext in IMG_EXTS): + with zf.open(info, 'r') as f: + yield info.filename, f.read() + + +# ---------------------------- +# CLI entry points +# ---------------------------- + +def train_main(args): + cfg = Config( + data_dir=Path(args.data), + out_dir=Path(args.out), + img_size=args.img_size, + batch_size=args.batch_size, + epochs=args.epochs, + lr=args.lr, + weight_decay=args.weight_decay, + train_split=args.train_split, + grayscale=args.grayscale, + num_workers=args.num_workers, + seed=args.seed, + model=args.model, + freeze_backbone=args.freeze_backbone, + aug=not args.no_aug, + ) + set_seed(cfg.seed) + + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + train_loader, val_loader, class_names, class_weights = make_dataloaders(cfg) + + in_ch = 1 if cfg.grayscale else 3 + model = build_model(cfg, in_ch, num_classes=2).to(device) + + criterion = nn.CrossEntropyLoss(weight=class_weights.to(device)) + optimizer = optim.AdamW(filter(lambda p: p.requires_grad, model.parameters()), + lr=cfg.lr, weight_decay=cfg.weight_decay) + + best_f1 = -1.0 + stopper = EarlyStopper(patience=args.patience, min_delta=args.min_delta) + for epoch in range(1, cfg.epochs + 1): + tr = train_one_epoch(model, train_loader, device, optimizer, criterion) + va = evaluate(model, val_loader, device, criterion) + print(f"[Epoch {epoch:02d}] " + f"train: loss={tr['loss']:.4f} acc={tr['acc']:.4f} f1={tr['f1']:.4f} | " + f"val: loss={va['loss']:.4f} acc={va['acc']:.4f} f1={va['f1']:.4f}") + print(f" val precision={va['precision']:.4f} recall={va['recall']:.4f} " + f"cm={va['confusion_matrix']}") + + if va["f1"] > best_f1: + best_f1 = va["f1"] + save_checkpoint(model, cfg.out_dir, class_names, best_f1) + + if stopper.step(va["f1"]): + print(f"Early stopping: no val F1 improvement >= {args.min_delta} for {args.patience} epoch(s).") + break + + print(f"Best val F1: {best_f1:.4f}") + print(f"Saved best model to: {cfg.out_dir/'model.pt'}") + + +def predict_main(args): + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + model_dir = Path(args.model_dir) + with open(model_dir / "labels.json", "r") as f: + meta = json.load(f) + classes = meta["classes"] + + grayscale = args.grayscale + img_size = args.img_size + + arch = args.model + in_ch = 1 if grayscale else 3 + model = build_model(Config(data_dir=Path("."), out_dir=Path("."), img_size=img_size, + grayscale=grayscale, model=arch), in_ch, num_classes=len(classes)) + model.load_state_dict(torch.load(model_dir / "model.pt", map_location=device)) + model.to(device).eval() + + input_path = Path(args.input) + results = [] # list of (name, pred_label, p0, p1) + + with torch.no_grad(): + if input_path.suffix.lower() == ".zip": + for name, data in iter_images_in_zip(input_path): + x = load_image_from_bytes(data, img_size, grayscale).to(device) + logits = model(x) + probs = torch.softmax(logits, dim=1).cpu().numpy()[0] + pred_idx = int(np.argmax(probs)) + results.append((name, classes[pred_idx], float(probs[0]), float(probs[1]))) + else: + paths = list(iter_images_in_dir(input_path)) + if not paths: + raise SystemExit(f"No images found in '{input_path}'.") + for p in sorted(paths): + x = load_image_from_path(p, img_size, grayscale).to(device) + logits = model(x) + probs = torch.softmax(logits, dim=1).cpu().numpy()[0] + pred_idx = int(np.argmax(probs)) + results.append((str(p), classes[pred_idx], float(probs[0]), float(probs[1]))) + + for name, pred, p0, p1 in results: + print(f"{name}: pred={pred} P(0)={p0:.3f} P(1)={p1:.3f}") + + # Optional CSV + if args.out_csv: + with open(args.out_csv, "w", newline="") as f: + w = csv.writer(f) + w.writerow(["name", "pred", "P0", "P1"]) # keep headers simple + for row in results: + w.writerow(row) + print(f"Wrote CSV: {args.out_csv}") + + +def build_argparser(): + p = argparse.ArgumentParser(description="Train a 0/1 die-shot bit classifier.") + sub = p.add_subparsers(required=True, dest="cmd") + + pt = sub.add_parser("train", help="Train the model") + pt.add_argument("--data", required=True, help="Path with folders '0' and '1'") + pt.add_argument("--out", default="model_out", help="Output dir for model + labels.json") + pt.add_argument("--img-size", type=int, default=64) + pt.add_argument("--batch-size", type=int, default=64) + pt.add_argument("--epochs", type=int, default=15) + pt.add_argument("--lr", type=float, default=1e-3) + pt.add_argument("--weight-decay", type=float, default=1e-4) + pt.add_argument("--train-split", type=float, default=0.8) + pt.add_argument("--num-workers", type=int, default=4) + pt.add_argument("--seed", type=int, default=42) + pt.add_argument("--grayscale", action="store_true", help="Force 1-channel input") + pt.add_argument("--model", choices=["cnn", "resnet18"], default="cnn") + pt.add_argument("--freeze-backbone", action="store_true", help="Freeze resnet18 backbone") + pt.add_argument("--no-aug", action="store_true", help="Disable data augmentation") + pt.add_argument("--patience", type=int, default=3, help="Early stopping patience (epochs without val improvement)") + pt.add_argument("--min-delta", type=float, default=0.0, help="Minimum F1 improvement to reset patience") + + pp = sub.add_parser("predict", help="Run inference on an image, directory, or .zip of images") + pp.add_argument("--model-dir", default="model_out", help="Folder with model.pt and labels.json") + pp.add_argument("--input", required=True, help="Image path, directory, or .zip archive") + pp.add_argument("--img-size", type=int, default=64) + pp.add_argument("--grayscale", action="store_true") + pp.add_argument("--model", choices=["cnn", "resnet18"], default="cnn") + pp.add_argument("--out-csv", default=None, help="Optional path to write a CSV of predictions") + + return p + + +def main(): + parser = build_argparser() + args = parser.parse_args() + if args.cmd == "train": + train_main(args) + elif args.cmd == "predict": + predict_main(args) + else: + parser.print_help() + + +if __name__ == "__main__": + main() diff --git a/v20/scripts/extract_bits.py b/v20/scripts/extract_bits.py new file mode 100644 index 0000000..04a88d5 --- /dev/null +++ b/v20/scripts/extract_bits.py @@ -0,0 +1,157 @@ +#!/usr/bin/env python3 +""" +Export square crops around MaskROMTool bit coordinates into a single ZIP file. + +Usage: + python export_bit_windows_zip.py \ + --json bits.json \ + --image die.jpg \ + --zip_out bits.zip \ + --window_size 38 + +Notes: +- The input JSON is expected to have a large "bits" array with fields: x, y, value, ambiguous. +- Bits are sorted *column-first*, *bottom-up*. +- Logical coordinates are assigned so that (0,0) is the top-left of the bit grid. +- Each crop (window_size × window_size) is saved as bit_X_Y.png inside the ZIP. +""" + +import argparse +import json +import math +import os +import io +import zipfile +from dataclasses import dataclass +from statistics import mean +from typing import List, Tuple + +from PIL import Image + + +@dataclass +class Bit: + x: float + y: float + value: bool | None = None + ambiguous: bool | None = None + gx: int | None = None + gy: int | None = None + + +def parse_args() -> argparse.Namespace: + p = argparse.ArgumentParser(description="Export bit-centered crops into a single ZIP archive.") + p.add_argument("--json", required=True, help="Path to MaskROMTool JSON file.") + p.add_argument("--image", required=True, help="Path to source JPEG (very high resolution).") + p.add_argument("--zip_out", required=True, help="Output ZIP filename (e.g. bits.zip).") + p.add_argument("--window_size", type=int, required=True, help="Window size (pixels).") + p.add_argument("--tail_frac", type=float, default=0.05, + help="Fraction of largest x-diffs used for detecting column jumps (default: 0.05).") + return p.parse_args() + + +def load_bits(json_path: str) -> List[Bit]: + with open(json_path, "r", encoding="utf-8") as f: + data = json.load(f) + bits_json = data.get("bits") + if not isinstance(bits_json, list): + raise ValueError("JSON missing 'bits' array.") + return [Bit( + x=float(b["x"]), + y=float(b["y"]), + value=bool(b.get("value")) if "value" in b else None, + ambiguous=bool(b.get("ambiguous")) if "ambiguous" in b else None, + ) for b in bits_json] + + +def estimate_column_threshold(x_diffs: List[float], tail_frac: float) -> float: + if not x_diffs: + return 0.0 + diffs = sorted(abs(d) for d in x_diffs) + n = len(diffs) + if n == 1: + return diffs[0] / 2 if diffs[0] > 0 else 0.0 + cut = max(1, min(n - 1, int(math.floor((1.0 - tail_frac) * n)))) + small = diffs[:cut] + large = diffs[cut:] + if not large: + return (mean(small) if small else 0.0) * 3.0 + return (mean(small) + mean(large)) / 2.0 + + +def split_into_columns(bits: List[Bit], tail_frac: float) -> List[List[Bit]]: + x_diffs = [bits[i].x - bits[i - 1].x for i in range(1, len(bits))] + threshold = estimate_column_threshold(x_diffs, tail_frac) + columns: List[List[Bit]] = [] + current_col: List[Bit] = [bits[0]] + + for i in range(1, len(bits)): + dx = abs(bits[i].x - bits[i - 1].x) + if dx > threshold: + columns.append(current_col) + current_col = [bits[i]] + else: + current_col.append(bits[i]) + columns.append(current_col) + columns.sort(key=lambda col: mean(b.x for b in col)) + return columns + + +def assign_logical_grid(columns: List[List[Bit]]) -> Tuple[int, int]: + grid_width = len(columns) + grid_height_max = 0 + for gx, col in enumerate(columns): + col_sorted = sorted(col, key=lambda b: b.y) # top→bottom + for gy, b in enumerate(col_sorted): + b.gx = gx + b.gy = gy + grid_height_max = max(grid_height_max, len(col_sorted)) + columns[gx] = col_sorted + return grid_width, grid_height_max + + +def crop_with_padding(img: Image.Image, cx: int, cy: int, size: int) -> Image.Image: + half = size // 2 + left = cx - half + top = cy - half + right = left + size + bottom = top + size + src_w, src_h = img.size + src_box = (max(left, 0), max(top, 0), min(right, src_w), min(bottom, src_h)) + out = Image.new("RGB", (size, size), (0, 0, 0)) + dst_left = max(0, -left) + dst_top = max(0, -top) + if src_box[0] < src_box[2] and src_box[1] < src_box[3]: + region = img.crop(src_box) + out.paste(region, (dst_left, dst_top)) + return out + + +def main(): + args = parse_args() + bits = load_bits(args.json) + print(f"[info] Loaded {len(bits)} bits.") + + columns = split_into_columns(bits, args.tail_frac) + grid_w, grid_h_max = assign_logical_grid(columns) + print(f"[info] Detected grid {grid_w}×{grid_h_max}") + + img = Image.open(args.image).convert("RGB") + ws = args.window_size + ordered_bits = [b for col in columns for b in col] + + with zipfile.ZipFile(args.zip_out, "w", compression=zipfile.ZIP_DEFLATED) as zf: + for i, b in enumerate(ordered_bits, 1): + cx, cy = int(round(b.x)), int(round(b.y)) + crop = crop_with_padding(img, cx, cy, ws) + buf = io.BytesIO() + crop.save(buf, format="PNG") + zf.writestr(f"bit_{b.gx}_{b.gy}.png", buf.getvalue()) + if i % 500 == 0 or i == len(ordered_bits): + print(f"[progress] {i}/{len(ordered_bits)} written") + + print(f"[done] {len(ordered_bits)} images saved to {args.zip_out}") + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/v20/v20_activation_pla.txt b/v20/v20_activation_pla.txt new file mode 100644 index 0000000..8711b83 --- /dev/null +++ b/v20/v20_activation_pla.txt @@ -0,0 +1,257 @@ +00?00???0??00 +00?00???10?00 +00?000??11100 +00?000??11000 +00?0010011100 +00?0010111100 +00?0011011100 +00?0011?11101 +00?0011111100 +00?0100????00 +00?01010???00 +00?01011???00 +00?0110011?00 +00?0111????00 +00?0111????01 +00?100000??00 +00?100000??01 +00?1000010?00 +00?1000011?00 +00?100010??00 +00?100011?000 +00?1000110100 +00?1000111100 +00?10010???00 +00?1001100000 +00?1001100100 +00?1001101000 +00?1001101100 +00?1001101101 +00?1001110000 +00?1001110100 +00?1001111000 +00?1001111100 +00?1010000?00 +00?1010001?00 +0001010010?00 +1110001100010 +0011010010?00 +00?1010010?01 +0001010011?00 +0001010011?01 +0011010?11?00 +0011010011?01 +0011010011?10 +1110011000011 +00?1010100?00 +0001010101?00 +0011010101?00 +0011010101?01 +0001010110?00 +0011010110?00 +0011010110?01 +0001010111?00 +0001010111?01 +0011010111?01 +0011010111?10 +00?1011????00 +00?1100?01000 +00?1100001001 +00?1100101001 +00?1100001100 +00?1100101100 +00?1100010000 +00?1100010100 +00?1100011?00 +00?1100110000 +00?1100110100 +00?1100111000 +00?1100111100 +00?1101000?00 +00?1101001?00 +00?1101010000 +00?1101010001 +00?1101010100 +00?1101010101 +00?1101011100 +00?11011???00 +00?1110000?00 +00?111000??01 +00?1110001000 +00?1110001100 +00?1110010?00 +00?1110011?00 +00?1110100000 +00?1110100001 +00?1110100100 +00?1110101100 +00?1110101000 +00?1110101001 +00?1110110?00 +00?1110111?00 +010??00????00 +010??011???00 +010??010???00 +010??100???00 +010??100???01 +010??100???10 +010??101???00 +010??110???00 +010??110???01 +010??110???10 +010??110???11 +010??111???00 +010??111???01 +1110111100000 +1110111100001 +1111001000000 +1111001000001 +1111001000010 +1111001000011 +011??00????00 +011??010???00 +011??011???00 +011??100???00 +011??101???00 +011??11????00 +1110000001100 +1110000001101 +1110000000000 +1110000001000 +1110000001000 +1110000100000 +1110000100001 +1110001?00000 +1110001?00001 +1110001000010 +1110001?00011 +1110001?00100 +1000011?10010 +1110010000000 +1110010100000 +1110011?00000 +1110011?00001 +1110011?00010 +1110011000100 +1110011100011 +1110100000000 +1110100000001 +1110100100000 +1110110100000 +1110110100001 +1111000000000 +00?0110000000 +1110101100000 +1110101100001 +1110101100010 +1110101100011 +00?0110000100 +1110110000000 +1110110000001 +1110110000010 +1110110000011 +00?1100100000 +1110101000000 +1110101000001 +1110101000010 +1110101000011 +00?1100100100 +00?0110001000 +00?0110001001 +00?0110001010 +00?0110101000 +00?0110100000 +00?1100000?00 +00?011010?100 +0000110110?00 +0010110110?00 +0010110110?01 +0000110111?00 +0010110111?00 +0010110111?01 +1000001000?00 +1000001100?00 +1000001010?00 +1000001110?00 +1000001001?00 +1000001101?00 +1000001011?00 +1000001111?00 +10000100??000 +10000100??001 +1000010000010 +10000100??011 +10000100??100 +10000100??101 +1000010001010 +1000010011010 +1000010100000 +100001010?001 +100001010?010 +1000010101000 +1000011001100 +1000011?01101 +1000011?01110 +1000011?01111 +1000011?10000 +1000011?10001 +1000011101100 +1000011?00100 +1000011000101 +1000011?00110 +1000011?00111 +1110111000000 +1110111000001 +1110111000010 +1110111000011 +1110111000100 +1110111000101 +1110111000110 +1000011100101 +1001111111100 +1100000000000 +11001??????00 +11000???11000 +11000??000100 +1100011101000 +1100011001000 +1100010101000 +1100010001000 +110000?101000 +110000?001000 +1101110001100 +1101110101100 +1101110100100 +1101111100100 +11000???10000 +11000???10100 +11000??001100 +11000??101100 +11010??????00 +11011???11000 +11000??100100 +1100010011100 +1100010111100 +110000??11100 +1101100001100 +11011???01000 +11011???01001 +11011???11100 +1101100110100 +1101100110101 +11011???10000 +11011???10001 +1101100100100 +11011???00000 +11011???00001 +110110?010100 +1101110010100 +1101111010100 +110110?000100 +1101110000100 +1101111000100 +1101111000101 +1101101001100 +1101101101100 +1011111110100 +1011110110100 diff --git a/v20/v20_microcode.xlsx b/v20/v20_microcode.xlsx new file mode 100644 index 0000000..34f7e75 Binary files /dev/null and b/v20/v20_microcode.xlsx differ diff --git a/v20/v20_microcode_01.txt b/v20/v20_microcode_01.txt new file mode 100644 index 0000000..97c70af --- /dev/null +++ b/v20/v20_microcode_01.txt @@ -0,0 +1,116 @@ +001000000001000000000000001000000100000000101000010000000000100000000000000000000001000100000001000010000000010110101001100010100000000000001010000010000000001000100000000000000000000000000000000000000001010011100110111100100011000000001000100110111011101000 +000000000000000100100001001010110110110010101000000000101010001110000010001101100100011100000001000011000000000000100000111001100000010000000010000001110000010001111001001000000000010010000100010011011100000100100111101001110000000000000001000100000100011100 +010000000000000100110001101001010110001011001101001100001100010010000001100000100101110111010000000001001011010010001101100010100000000001101100000000000110010110010110010000000000000000000010001110110000000011000001111110100000000000001110101000000000110101 +000000000000011100000000011000001111100110011010010011001100001110100001000000011111011110010000100000000001010100101100101101000110100110001110000000111100000100111100000000000000001000110110000100001000111110110011111100000000000100001100111000000100011101 +011000101001000100000010001010100110001010010110010110110000110000000101011000100001011100010010001000000110100010000000110110000000101000101000000011110001011111010010110100001100000011001101011111101101000100100110111100100011000000010001100010111111011000 +001111101011000000000010011011100001101110100011010010100010111100000101110101100101011100010010001100101010000110111011011101100010100000111111111011110010001111000100100011111111111101111001100100000001010011000000000001000011001001010001100110111011101100 +110111101110001101000100001000000110110000010100100101101111001110000100011100011011010101111100000110110101001110110001111111000010010001011010000001110101101010111101001011111111111110111001111101101111111110110001111110100000110111101101101100011100100000 +110000010100011111111011001000010110001010110000100101101111001111110111111000111111111100011111011110110000101111100010001010010000011000000010111101111111010110111100000111111111001001111001100010111110000100110111111111000011111110011100101000000000001101 +000000101000000100000000000000000010001000010000000110010000000000000000000000001000000000000000000000100000000000001000000000000000000000000001100000000000000010000001100100000000000100000100000000001000000100000000000000000000000000000000000000000000000000 +000000000010000000000000000000000000110000000011000000000000000000000000001000010000000000010000000000000000000000010001100001000000000000000000000000000000000100000101011000000000000010001001000111010010000000000000010100000000000000000000000000011000100000 +000100000000000000000000000000000000000001000001101000100000010000000111010000000010000000100010001001010010000100001100000000000000000000101001100000000010000000001010010100000000000000001101110000000000010001000110000001010011001000010000000000000100001001 +110011101100000001111001110000010001010101000111011010000000000000000010010101100000000001101110011100101000001001001101100100000000000001000000000000000000000010000011001011111111100000000000000001010110101000000100000011011111111011100000000000000000000000 +010000101000000000000010000010100000001010111110000100110000010000000101011000101001011000010001001010000110100100101000010100000000001000101001010001110111110110110010110100001100000111001101011111100000010011000110010100100011000000011000100100011100111000 +001111101001000100100011010011010111111100001000010010001100110010000110111000110001011000000001000111101010000110001001100111100010110000111101111010000011001010111001101011111111101111111101100111011111010111100111111001110011001001010001100110100111111000 +101011101111001001110111100000100000111011011001101001000011011100000011111100111100100010001110000011011110001000111100011101100010010001011111010001110011100000100011011011111111111100110110000011011110101101100000000001000000110111110011000110111100001101 +001111111011001010000010110001110001011101101111111110100011110000001000111101100000100010000001100110001001110110011101100110010110101111001001111111000011111010000001001100000000100001000110000011000000111010000000000000100000000001100001010010111011110010 +011000101001000000000010000010100100010010000110011000100000110000000101011000100001011000010000001000100110110110000001110110100000001000101010000011110011111100010011011000001100100011001101011111101001010010000110111100100011000000011001100110111111011000 +001111101001000000000010000011110001011110101000010010100110111100000110110100100101011000000001000110101010000110100001011110100010100000111111111011110010011111111001111011111111110101001001110000001011010111100111111001110011001001010001100110111111111100 +101100000111001001110111000000100001110111110001011101000011001100000000111100111100000001001110001010010101011010110001111111100010010001110111111001110001110010100011011100000000111100110100101101011110101110100000000011110000110110110011000100011100101100 +001111111011001010011010100001110001001110110110110111100011111100001000111100000000100011100001000110001000110110110001001010010110101110000111111111111011110100000010010100000000001001110010011111001000010110100000000011000011110011100000010000000000010010 +000000101000000100000010000010000011010111000101001010100000110000000001011000100001011000010000001000100110100110101000110110100000001000101011111001100110100110100001001000000000111010111101000011010101101001000110110100100011000000011001100110111000001000 +000011101010000100000000000010110110110010100011000000100110011100000100110100100000011000010000000100101010000010111000111111100010110000101011111010000011000111010111011011001100011010110000010111011010100111100000111101100000001001010001000100011100111100 +001111101001001001000010000001100001111101110011011011100001011100000101011100001110100010100010001010011101000110101100110111100010010001111101111001110000011010001011111111111111101111110100001100001101100111100110000011000011001101110010000010100000001100 +111100000111001001110011000001100001100110011110010011000011110000001011111000000000100011101111011110101001101111111101101011000010101101001111111011000001101110100010010011111111001001110000111111101001111101100100000011111011111011100001010010111011100010 +011000000001000000000010001010000111010111001101011000100000100000000100000000101000011100010010001000000110010100101000010000100000100000101011111000000100000101100001001000001100111110110000010100011000111111100110010100100011000000001001100110111011101000 +000000000010000000100000001000000110100000000011000000001110011110000011001001010100000100000010001101000000000010111011110101100010000000011010000000000010000010111010010011110011100000001001000000001101000000100111111101100011000000000001000100011100001000 +110100000100001101110111001001010111011100110110010111001100001110000010100100101111110111111100000111101010001100100100010000100010000000001101111000000111010100010101101100000000000100001001110011110010011000010111111101000011111000001110101000000100011101 +001011111001010110001000101000111110110001000001001000001101111111111100100101011111111111110000100000010000000001001110101111000000010010000100000010000101001000011111011000000000100000001111010010010111010011010011111111101000000100011100111010100111101111 +011000000001000000000000000000000100001000011000010100010000000000000100001000001000000000000011000010000000010000000001000000000000100000000000000000000000000000000000100100001100000000000000010100100000010010000000101000000000000000010000000000000011000000 +000011101000000000100001010000000000000000001000000000001000001110000011101100010100000000000011001011000000000000101000000000000000000000010010000000110000000000001000000000110011100000000100100000000101000000000111000000010011001001000000000000000000000100 +100000000100000000110101100000000000000000001000100100000000000000000000100000010000000001001100000100100000011000000101000000100000000000000000000000000001000100000000000000000000000000000010000011010010001000010000000010110000110110100000000000000000100001 +000000010000000010001000010000001000010001000001001000000000001100000100000001100000000010000000100000010000010000001100001000000100010110000100000000011000000000000001001000000000000000001101000000000000000010000000000000000000000000010000000000000000010000 +000000101000000100000010000010100001011101011001001110010000110000000001011000101001011000000010000000100000010010101001110110100000100000100010000001110001111001010001101100000000111100111101010111111101111110100000100000000000000000011001000110100100010000 +001111101001000100000011001011000110000010101000000000100110111000000111111101110001011100010011001011001010000110101011110110000000000000101111111010010001011101101110010000001100101010110100110101000111000011000000101000000000001001010000100010100011100100 +001011101011001000000010100000100001101100100010110010100011011100000111111100110100000010000010001101110111000110110001111101100000010001110110000001110001101110101010110111111111101011111111110001111001110110110110000010000011001101110011000110111000100101 +111111111111011101110011101001111110010011010101001001001111110011111110011101111111111111111101110110111000111111110110101010010110111101000101111111101110111000111111011011111111101001111001011101011111000111110111111111111111111111111101111010111111111111 +001000000000000000000000000010100010000000101000000000000000110000000000001000100000011100000001000010000000110100101001000010100000001000101011111000010110010000110000010000000000000101000000001000101001000101100000100000000000000000011001100110100011100000 +001111101011000100000011010001000001111110101011010000100010101000000000101101100001011100010001000011101000000100010000010001100000110000000100000001000000001001010101001000001100011000110100100010011000100100100111010100110011001001000001000100011100100100 +010111101010001000100100101001010000000001001101001000000011000000000010100000000011100010100010000000001000010110010101001010000000000000101111111000000100111000110010010011111111010100000110111100100100010001000001111111000000110100101110101010100100111000 +000000010000001001110010011000011001100100001010010111000010001100000001010100011111100000000010111000001001110101000101000001010100001110001010000100011110010100111000000100000000100000000000100100110110111100000111111100011000001111101100111000000100011100 +000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000011000000100010000000000000010000000000101000001000000001100001000001000000000000000000001000110000001100000100010000000000000000000000000000000000000000000000000000 +000011101000000000000000000000000000100000000000000000000000010000000011000000000001000000000010001000000000000000010010000001100000100000000000111010000000000000011000000000000000000100000000010000000010000000000000010100100000000001000000100000000000000000 +000100000010000000000000000001000000100001100001001000000000000000000000000000000010000000000000000110100001000100000000010001100010000001000001000000110100101100100000000000000000000011000000100010110001000000010000000000000000000000000001000100011100001000 +110000000000000001100000000000000000000000000100000000000001001101010100110000000000000000000010100000010000000000101010000000000000110000000100111101000010010110000000000001010101000000001001111000100100000001000000000000000000000000010000000000000000010000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000001000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000100000 +000000000000000000000000000000000000000000000000000000000000000000000001001000000000000000000010000000000000000000000010000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100100000000000000000000000000000000000000000000000000000001000000000000000000000000010000000000000000000000000010000000000000000000000000000000000000000000000 +000000000000000000000001010000000000010001000001001000000000000001010101000100011000000000000000011000000000000000000010000000000000000000000000000000000000000000000001001010101010000000001001100000100000100000000000000000100000001110010000000000000000100000 +000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000011000000100010000000000000010000000000001000001000000001100001000001000000000000000000001000110000001100000000010000000000000000000000000000000000000000000000100000 +000011101000000000000000000000000000100000000000000000000100010000000010001000000001000000000000001000000000000000010010000001100000000000000000111010000000010000011000000000000000000100000000010000000010000000000000010100100000000001000000100000000000000000 +000100000010000000000010000001000000100001100001001000000000000000000000000000000010000000000000000010000001000100000000010001100000000001000001000000110100101100100000000000000000000011000000100010110001000000010000000000100000000000000001000100011100011000 +010000000000000000000001010000000000010001000101001000000001111101011101110000011001000000000000111000010000000100100010000000000000110000001100111111000110011100110001001011111111000000001000011000000100100001000000000000000000001100010000101000000111110010 +000000000000000000000000000000000000000100000000001000000000000000000000000000000000000000000011000000100010000000000000010000000000101000001000000001100001000000000000001000000000101000110000001100000000010000000000000000000000000000000000000000000000100000 +000011101000000000000000000000000000100000000000000000000100010000000011001000000001000000000010001000000000000000010010000001100000100000000000111010000000010000011000000000000000000101000000010000000010000000000000010100100000000001000000100000000000000000 +000100000010000000000010000001000000101001100001001000000000000000000000000000000010000000000000000110100001000100000000010001100010000001000001000000110100101100100000010000000000000011000000100010110001000000010000000000000000000000000001000100011100001000 +000000000000000000000001010000000001000100100000010000000001111101001101100000000001000000000010111000010000000100101010000000000000110000001100111111000100010100110000000000000000000000000001011000000100100001000000000000000000001100010000000000000000110010 +000000000000000000000000000000000000010101000001001000000000000000000000000000000000000000000010000000100010000000000000010000000000101000001000000000000000000001000000001000000000100000000000000100000000000000000000000000000000000000000000000000000000100000 +000000000000000000000000000000000001000100000000000000000100010000000001001000000000000000000010001000000000000000000000000000000000100000000000000000000000010000000000000000000000000101000000010000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000010000000000000001000100000000000000000000000000000000000000000000000000000000110100000000000000000010000100010000000000000000000000000000000000010110000000000000111000000100010100001000000010000000000100000000000000000000000000000010000 +110000000000000001100001010000000001010101100111011010000001111100011101110100011001000000000010011000010000000100101010000000000000110000001000000010000110001110110001001011111111000000001001010000000100100001000000000000100000001110010000101000000111110010 +000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000010000000100000000000000000010000000000100000000000000001100001000000000000000000000000100000000000001000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000100000000000000000000100010000000001001000000001000000000010001000000000000000010010000001100000000000000000111010000000000000010000000000000000000000000000010000000000000000000000010100100000000000000000100000000000000000 +000100000010000000000000000001000000100000000000000000000000000000000000000000000010000000000000000100100000000100000000010001000000000000000001000000110100101100100000000000000000000101000000000000000001000000000000000000000000000000000001000100011100001000 +110000000000000000000001000000000000000000000100000000000001110000011001000000000000000000000000001000010000000000100000000000000000110000000100111101000000010110000000000011111111000000001001000000000000000001000000000000100000000000000000000000000011010010 +001000000001000000000000000000000100000000000000010000000000100000000000000000000000000000000000000000000000000010000000100010000000000000001001111010000100001000000000000000000000000000000000000000000000000000000000101000000000000000000000000010100011000000 +000000000000000000000010000000100000100010100000000000100010001100000000000100000100000000000000000000000000000000100000011001100000000000000010000001110000000001000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000100 +000000000000000000000000000000000000000000000000000100000000000000000000000000000000000001000000000000000000000010000001100010000000000000001001111000000000010010000000000000000000000000000000001100000000000010000000000010100000000000000000000000000000100000 +000000000000000000000000000000000000100010010000000001000000001100000000000000000000000000000000000000000000000000100000001001000000000000000010000000111000000100000000000000000000001000110000000000001000000000100000000000000000000000000000000000000000000000 +010000000000000000000000000000000000000010000100000000100000000000000000001000000000000000010000001000000100000000000000000000000000000000000000000000000000000100000000000000000000001010110000000000000000000000000000000000000000000000000000000000000000000000 +000011101000000000000000000000000000000000000000000000000000000000000100100000000000000000000000000100001000000000000000000000000000000000000000000000000000000010000000000011000000000000000000000000000010000000000000000000000011001001010000000000000000000000 +100000000100000001000000000000000000000000010000000001000000000000000000000000000000000000001000000000000001001000000000000000000010000000010000000000000000000000000000000000000000001000110000000000000000000000000000000000000000000100000000000000000000000000 +000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000 +001000000001000000000010010010000101000000000000010000000000100000000100000001111000011000000000000010000000010100100000000000000001000000110010000000000000001000010000000000001100000000000000000000000000000001000000101000000000000000011101001110100011000000 +010100000000010000000000000000100010000010000110000000001010001110000000001100000100000000010000000001000000000000010000001000000000000000000000000000000000010000100010010011110011000001000000000000000000000000000111010100100011000000000000000001011100010100 +100011010010001000110001000101010000000000000000000001000000000000010000100000000010100011001100000000000000011000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000001000000000000011010000001111000010000000000000001000 +000000000100100011001100100000001000000000000000000000000000000000000000000010000000000000100000000000000000000001000100000000010100000000100000000100001000000001000000000000000000000000000010000000000000000000001000000000001100110000100000010000000000000000 +000000101000000000000000000100000000000000100000000000100000000000000001010000000001000000000000001100101011000000000000000100000000110001000000000000000010100010000000000000000000000110001001011111101100000010100000000000000000000000000000000000000000100000 +010000101000000100000010000010000001111001010101001110000000000000000111001001111000000000010011000010101111100000000000000010000000111001100000000000000011110100001101101100001100001100111001111111110000110011000000000000000000000000010100001000000000000000 +001011101001010000000000010000100000010011010001001000000100110000000100110000000000010000000001001010001001100010000000000000000011011001011000000010000011001010000001001011111111101111110000111000001011110110100000000000100000000001010000000011100011010000 +110111101110010101000010000111000001010101001111111010111010001110010010101000011011011000011111011010111111011100111000010100000010001001010011000000000101000110111101001011111111111011110100101011111101101100100000010100000011111111100001101000011100001000 +000000000000000000000000000000000000100000100000000000100000000000000001010000000001000000000000000000000010000000000000000100000000010000000000000000000000100000000000000000000000000110001001010111101100000010100000000000000000000000000000000000000000100000 +010000101000000100000010000010000001000000000100000010000000000000000111001000100000000000010000000000101110000000000000000011000001101000100000000000000011010100001100000000001100101000111001110110100000110011000000000000000000000000010000000000000000000000 +001011101001000000000000000000100000110011010001001000000100110000000100110000000000000000000001000010100001100010000000000001000010010001011000000010000010001010000001001011111111101101110000110000001011110110100000000000100000000001010000000010100011010010 +100111101110010001000010000001000001010101000011011010100010001100000010101000011011011000001111011010101101001100111100010100000011001001000011000000000101000100111001001011111111111001110100101011111100100100100000010100000011111111100001101000011100001000 +000000101000000000000000000010000000100000100000000000100000100000000000010000100001011000000000000100101000000000101000000000000000100000100010000000000010000010000000000000000000000100000000011000000100000000000000000000000000000000001001000110100000000000 +000000000000000000000000000000000001110001000101001010000110000000000001001000111001010000010011000010000101000000000010000001000000000001000000000000000000110100000001001000001100001100110000011001110000000010000000000000000000000000000000100000000000000000 +000011101000001000000000000110000000110011010001001000000000000000000000010000100000001010000000001000000000000100101000010101000011001001000100000000000001001010000001001011110011100001000000111000000011000000000000000000000000000001000011000100000000000010 +010000000000011101000000000000000001000100001110010010101010110011001000001000000000111010010000001000000010010011000111101100010010000000011010000000000000000010000100000000000000001011110000000000000101001000000000000000001000000010000000010010100000000010 +000000101000000000000000000010000000000000100000000000100000100000000001010000100001011000000000001100001011000000101000000000000000000000100010000000000010000000000000000000000000000100001001011111000100000000000000000000000000000000001001000110100000000000 +010000000000000100000000000000000001010001000101001010000110000000000101001000111001010000010000000000010110100000000010000000000000010001000000000000000000010100000001001000001100101000110000011001110000000001000000000000000000000000010000100000000000000000 +000011101000001000000000010010000000010011010001001000000000000000000000010000100000011010000000000010001000000100101000010101000011011001010100000000000001001010000001001011110011001011110000111000001011100100100000000000000000000001000011000100000000000010 +100011101100011001000000000010000001000100000010010010100010110001011000101000000000111010001101001010010010001011000011101100010010100000011010000000000000000000000000000011111111001110110000000000000101001000000000000000001000001111000000010010100000000010 +000000101000000000000000001000000000101000010000000100110000010000010011010000000001000000000001001100011111000010000011100000000000110000000001000010000100000001001100100100000000000110001001000011001000000000100000000000000000000000000000000000000000000000 +000000101000000000000000000010000001101000011000000100000100000000000000001001100001010000000000000000011010000000000010000000000010011000100000000000000010100000000000100100000000101100000000001100000010000001000000000000000000000000000000100000000000000010 +000010100000000000000000000110000000010001010001101000000001000001001000010000100000011000000000010011000011100000101010010100000010011000000000000000000000001000000001001000111100000110000000010000001000100100110000000000000000000001000001000100000000000011 +000000000000011000000000000110000001000100000010110010010010110001101000101000010000011010000001100010011110000010000011100100000011101110001010000000000001000000000000000000000000111010110000000000000101000000000000000000000011110010100000000010100000000010 +000000000000000000000000001100000001011101110001001100110000000000010010010000000001000000000001001000010000000010000011110100100000100001000001000011100111100011001101101100000000111110101001011100011100101001100000000000000000000000000000100000000000000000 +000000101000000000000000000010000111011001011101001110000100010000000001001001101000000000010000000000000101000110010000000110000010000001101001111010000111010100010011111100001100001000110000010101110010000010000000111100100000000000000001000100011100000010 +001111101011000000000010000001100001111111110011111010000100111101001000010100000110110000000000010001000010000010100010010101100001000001001000000010110001101110100001101111110000101101110000111000000011010000010000000001000000000001000000000010100011011101 +001111101011010001000010000011100001000100000010110010110011111100111000001000010001011001100000101000010010000100110000010110000010000110010111111111000101011110110010010000000000110011000000011100000100000000000000000010100011110011000001101010111111100010 +000000101000000000000000000100000000010101000000001000100000010000010001010000000001000000000001001000101110000000000011110100000000100001000000000001100001000001000101001000000000110110001001000000011100001000100000000000000000000000000000000000000000000000 +010000100000000100000000000000000101011000011101001100000100010000000100001001111000000000010010000000000011000010000000100100000010001001000000000010000000100000000101101100001100001100000000010100010000000001000000101000000000000000010100001000000000000010 +001010100001010000000010010000100001010101110001011010000101111101001000010100000100010000000000011011001010000010100010010000000011000000010000000010110000001100000001001011001111001110110000010000000000010000010000000000000000000001000000000011100011010101 +111011000101010101000010000110100001000100000110110010011011111110111000101000000000011001011100110010110110001000100001110110000010000110010010000011000000001100000110010000000000111010000000011100000100000000000000000010100010101111100000000010100011100010 +000000000000000000000010000000000001001000110001000100010000010000010110010000000001000000000000000000000101000000000011100100100000010000000001000000000100100011001000100100001100001110101001010100101000100001100000000000000000000000000000100000000000100000 +010000101000000100000010000010000010001001010100000110000000000010000110001000100000000000010001000000101001000100010000000010000000001000111001111000000111010000011110110100111111001100111001110111100000010010000110010100100011000000010001000100011100000010 +101111101011000000110000010001100000101010000010100000000101110001001100110000000010110000001101000001000011001010000010000001100001001001011000000010000011101010100000100111111111101111110100111000000001000010010000000001100000000001010000000010100011011001 +110111101110010111001010000111000000010001000101101000111010001110110010001000011011011000111100010000101111001100111000010100000010001001010111111100000101010110111101001011111111110011000100001001011100100100100000010100000011111111100001101000011100001000 +000000101000000000000000001100000001001101110001000100110000010000000011010000000001000000000001000100101011000010000000000000000000110001000000000010000000000000001001100100000000011010100000010011111100101011100000000000000000000000000000000000000000000000 +010000000000000100000010000000000001100000001101000010000000000000000001001001111000000000010011000000000111100000000000100100000010110001000000000000000000010100000010010000001100001000110000110001100000110001000000000000000000000000000100001000000000000010 +000011101000010000000000000000000000011011010011101010000101110000001000000000000110000000000000001010000001100000000000000100000010010001000000000000000000001010000001101111111111000101000000110000001011110100100000000000000000000001000000000011100011001100 +100000000000010001000000000010000001000100000010010010100010000000000010100000000010011001100011101010001001000000101001110010000000000110000010000000000000000100001010000011111111111000110000100010110100000000000000010100000000001111100000000000000000001000 +000000000000000000000000000000000001001101110001000100110000010000010000010000000001000000000000000000000110000000000011110100100000010000000000000011100111100001000000100100000000011110100000011100111100101011100000000000000000000000000000000000000000100000 +010000101000000100000010000010000001100000001100000010000100010000000011001001100000000000010011000010101100100100010000000010000000111001101001111010000111110100011110000000001100001000111001111111110010110000000000000000000000000000000000000000000000000000 +001111101011010000000010000001100000111011010011101010000101110001000100110000000000110000000001011011001011100010000010010001100010000001001000000010110010101010100001101011111111101101110000110000000011010010000000000000100000000001010000000011100011010000 +111111101111010101000010000011100001010101000111011010101011111110101010101000011011011000011110011000111111001100111000010100000010001111000111111111000101011110111101001011111111111001110100101011111101101100100000010100000011111111100001101000011100001010 diff --git a/v20/v20_pla3.txt b/v20/v20_pla3.txt new file mode 100644 index 0000000..fe3a04a --- /dev/null +++ b/v20/v20_pla3.txt @@ -0,0 +1,59 @@ +01 111100?? 00100000001000 +01 1111010? 00100000001000 +01 1111?0?? 00100000000100 +01 1111??0? 00100000000010 +01 1111?0?0 00100000000001 +01 1111?100 00100000000001 +01 00001111 00100000000001 +01 001??110 00100000000000 +01 01100100 00100000000001 +01 0110010? 00100000001000 +01 0100???? 00000000011100 +01 1111?11? 01000100011011 +01 1??????? 00000000100000 +01 00???0?? 01000101000000 +01 1000???? 00000100000000 +01 11000?0? 00000100000000 +01 110100?? 01000100000000 +01 11011??? 00000100000000 +01 01100?1? 00000100000000 +01 011010?1 00000100000100 +01 1000101? 01000001000000 +01 100011?1 00000010000000 +01 10001100 00000010000000 +01 00???00? 01000000000000 +01 10000??? 01000000000100 +01 11?0000? 01000001001110 +01 100011?0 00001001000001 +01 00???10? 01010000000000 +01 1010???? 01010000000000 +01 1110?1?? 01010000001111 +01 011011?? 01000000000110 +01 1010?11? 00000000001110 +01 001??111 10000000001010 +01 110101?? 10000000000000 +01 1100011? 01000110000000 +01 1000100? 01000111000000 +00 00110111 00100000000110 +00 11110011 00100000000101 +00 11111011 00100000000100 +00 01110110 00100000001011 +00 00111111 00100000001010 +00 01?????? 10000100000000 +00 11???110 10000000000000 +00 10?????? 10000100000000 +00 00???10? 10000101001100 +00 00???110 10000001000000 +00 11101101 00100000000001 +00 1101?011 10000000001111 +00 00??1001 00000000001101 +00 00100111 10000000001010 +00 0011?010 10000000000000 +00 000??010 10000000000000 +00 000??111 10000000000000 +11 0011???? 01010110000011 +11 00100??? 10000000001010 +01 000??111 00000000000001 +11 0001???? 01000100000000 +11 00101??? 01000110000000 +01 10110??? 10000000000000 \ No newline at end of file